/************************************************************
  Ninja Sample
  COPYRIGHT (C) SEGA ENTERPRISES, LTD.

  タイトル ： スクロールを拡大縮小する
              scroll
  編集履歴 ： 98-04-27 製作開始
              98-06-19 SET5対応
              98-09-16 テクスチャバッファ確保のサイズ変更
              99-04-05 appends the English comments
************************************************************/

#include <shinobi.h>
#include <njdef.h>

void main(void)
{
#ifdef __GNUC__
	shinobi_workaround();
#endif
    njSetBorderColor( 0x00000000 );
    njUserInit();
    while (njUserMain() == NJD_USER_CONTINUE) {
        njWaitVSync();
    }
    njUserExit();
}


/* グローバルセクション */
/* global data          */

#define VERTEX_MAX  1000     /* 頂点の最大数          */
                             /* maximum vertex number */
/* テクスチャデータ */
/* texture data */
#define TEXTURE_NUM  1  /* テクスチャデータの数       */
                        /* the number of texture data */
static NJS_VERTEX_BUF *vbuf;

/* キャッシュメモリに読み込まれるテクスチャを定義          */
/* defines the textuer data that loads to the cache memory */
static NJS_TEXNAME g_TexName[] = {"tex.pvr", NJD_TEXATTR_GLOBALINDEX, 0};
static NJS_TEXLIST g_TexList = {g_TexName, TEXTURE_NUM};
static NJS_TEXMEMLIST g_Texture[TEXTURE_NUM];

/* スクロール用データ */
/* scroll data        */
#define MAP_CELL_WIDTH  5
#define MAP_CELL_HEIGHT 4

static Uint32 g_Map[MAP_CELL_HEIGHT][MAP_CELL_WIDTH] = {
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0),
                                NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0)},
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0),
                                NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0)},
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0),
                                NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0)},
    {NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0),
                                NJM_MAP(0, 0, 0), NJM_MAP(0, 0, 0)},
};

static NJS_SCROLL g_Scroll;

/* ポーズ判定フラグ */
/* pause flag       */
Bool g_bPause = FALSE;

/* ポーズ時処理関数 */
/* pause function   */
void PausePhase(void);
/* アクティブ時処理関数 */
/* active (not pause) function */
void ActivePhase(void);

/***************************************************************************

	njSetBorderColor( 0x00000000 );
    njUserInit --- Ninjaシステム初期化関数
                   initialize
***************************************************************************/

void njUserInit (void)
{
    /* 画面モードの決定 */
    /* Initializes the Dreamcast H/W and readies the SEGA library */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);

    vbuf = (NJS_VERTEX_BUF *)syMalloc(sizeof (NJS_VERTEX_BUF) * VERTEX_MAX);

    /* テクスチャバッファの確保 */
    /* sets necessary memory for work area of a texture */
    njInitTextureBuffer((Sint8 *)vbuf,0x800*10);

    /* 頂点の最大数分バッファをアロケートする */
    /* allocates the buffers for registration of vertex data */
    njInitVertexBuffer(VERTEX_MAX * 64 / 4, 0, VERTEX_MAX * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );

    /* テクスチャのロードとセットアップ */
    /* loads and sets up the texture */

    njInitTexture(g_Texture, TEXTURE_NUM);  /* テクスチャデータ領域を確保 */
                                            /* sets the area used for storing texture information */
    njLoadTexture(&g_TexList);  /* テクスチャリストにあるテクスチャデータを*/
                                /* テクスチャメモリにロード */
                                /* loads the texture to cache memory */

    /* スクロールのセットアップ */
    /* sets up scroll data */
    g_Scroll.celps = 128;           /* セルのピクセルサイズ */
                                    /* scroll cell size     */
    g_Scroll.mapw = MAP_CELL_WIDTH; /* マップの横方向のセルの個数 */
                                    /* scroll map width           */
    g_Scroll.maph = MAP_CELL_HEIGHT;/* マップの縦方向のセルの個数 */
                                    /* scroll map height          */
    g_Scroll.sw = 0;                /* スクロール面の描画横方向の大きさ */
                                    /* currentry unused                 */
    g_Scroll.sh = 0;                /* スクロール面の描画縦方向の大きさ */
                                    /* currentry unused                 */
    g_Scroll.list = &g_TexList;     /* テクスチャリストを指定 */
                                    /* Texture list pointer   */
    g_Scroll.map = (Uint32 *)g_Map; /* マップ配列を指定   */
                                    /*  Map array pointer */
    g_Scroll.px = 0.0F;             /* スクロール画面の移動座標           */
    g_Scroll.py = 0.0F;             /* scroll surface movement coordinate */
    g_Scroll.bx = 0.0F;             /* マップの書き始めの座標 */
    g_Scroll.by = 0.0F;             /* map home coordinates   */
    g_Scroll.pr = -100.0F;          /* スクロールのプライオリティ（優先順位）*/
                                    /* priority                              */
    g_Scroll.sflag = OFF;           /* 拡縮をするかしないかのフラグ  */
                                    /* scale flag (do not use scale) */
    g_Scroll.mflag = OFF;           /* 回転をするかしないかのフラグ               */
                                    /* rotation matrix flag (do not use rotation) */
    g_Scroll.colmode = NJD_COLOR_MODE_PACKED_TEXTURE;/* カラーモードの指定 */
                                                     /* scroll color mode  */
    g_Scroll.sclc.argb.a = 255;     /* スクロール全体にかけるカラー */
    g_Scroll.sclc.argb.r = 255;     /* scroll screen vertex color   */
    g_Scroll.sclc.argb.g = 255;
    g_Scroll.sclc.argb.b = 255;

    /* 背景を設定 */
    /* sets the background */
    /* 左上 右上 左下 のカラーを指定 */
    /* sets the colors of upper left, upper right and lower left */
    njSetBackColor(0xffc00000, 0xff00c000, 0xff0000c0);
    /* テキストのカラーを指定 */
    /* sets the text color */
    njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0xc0));
}


/***************************************************************************

    njUserMain --- Ninjaシステムメイン関数

***************************************************************************/

Sint32 njUserMain(void)
{
    NJS_PERIPHERAL *per;

    /* ジョイスティックポート１のペリフェラル情報を取得 */
    /* gets the peripheral infomation */
    per = njGetPeripheral(NJD_PORT_A0);

    /* ボタンが押されたかどうかチェック */
    /* checks the start button */
    if (per->press & NJD_DGT_ST) {
        g_bPause = !g_bPause;
    }

	if (!g_bPause) {
	    /* スクロールの描画 */
		/* draws a 2D scroll surface */
   		njDrawScroll(&g_Scroll);
	} else {
	    njPrintC(NJM_LOCATION(19, 15), "PAUSE");
	}

    /* デバッグ情報の表示 */
    /* prints the sample program name */
    njPrintC(NJM_LOCATION(10, 6), "Ninja Sample SCROLL");

    return NJD_USER_CONTINUE;
}


/***************************************************************************

    njUserExit --- Ninjaシステム終了関数
                   exit
***************************************************************************/

void njUserExit(void)
{
	njExitPrint();
    njExitTexture();
    sbExitSystem(); /* システムの終了処理を行います */
                    /* exits the system    */

}