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

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

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

void main(void)
{
	njSetBorderColor( 0x00000000 );
    njUserInit();
    while (njUserMain() == NJD_USER_CONTINUE) {
        njWaitVSync();
    }
    njUserExit();
}


/* グローバルセクション */
#define VERTEX_MAX  1000     /* 頂点の最大数 */

/* テクスチャデータ */
#define TEXTURE_NUM  1  /* テクスチャデータの数 */

static NJS_VERTEX_BUF *vbuf;

/* キャッシュメモリに読み込まれるテクスチャを定義 */
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];

/* スクロール用データ */
#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;

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

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

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

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

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

void njUserInit (void)
{
    /* 画面モードの決定 */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* 旧型コントロールボックスへの対応 */
/*	pdSetMode(PDD_MODE_TYPE_A);*/
	
    vbuf = (NJS_VERTEX_BUF *)syMalloc(sizeof (NJS_VERTEX_BUF) * VERTEX_MAX);
    /* テクスチャバッファの確保 */
    njInitTextureBuffer((Sint8 *)vbuf,0x800*10);
    /* 頂点の最大数分バッファをアロケートする */
    njInitVertexBuffer(VERTEX_MAX * 64 / 4, 0, VERTEX_MAX * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );

    /* テクスチャのロードとセットアップ */
    njInitTexture(g_Texture, TEXTURE_NUM);  /* テクスチャデータ領域を確保 */
    njLoadTexture(&g_TexList);  /* テクスチャリストにあるテクスチャデータを*/
                                /* テクスチャメモリにロード */
    /* スクロールのセットアップ */
    g_Scroll.celps = 128;           /* セルのピクセルサイズ */
    g_Scroll.mapw = MAP_CELL_WIDTH; /* マップの横方向のセルの個数 */
    g_Scroll.maph = MAP_CELL_HEIGHT;/* マップの縦方向のセルの個数 */
    g_Scroll.sw = 0;                /* スクロール面の描画横方向の大きさ */
    g_Scroll.sh = 0;                /* スクロール面の描画縦方向の大きさ */
    g_Scroll.list = &g_TexList;     /* テクスチャリストを指定 */
    g_Scroll.map = (Uint32 *)g_Map; /* マップ配列を指定 */
    g_Scroll.px = 0.0F;             /* スクロール画面の移動座標 */
    g_Scroll.py = 0.0F;
    g_Scroll.bx = 0.0F;             /* マップの書き始めの座標 */
    g_Scroll.by = 0.0F;                 
    g_Scroll.pr = -100.0F;          /* スクロールのプライオリティ（優先順位）*/
    g_Scroll.sflag = OFF;           /* 拡縮をするかしないかのフラグ */
    g_Scroll.mflag = OFF;           /* 回転をするかしないかのフラグ */
    g_Scroll.colmode = NJD_COLOR_MODE_PACKED_TEXTURE;/* カラーモードの指定 */
    g_Scroll.sclc.argb.a = 255;     /* スクロール全体にかけるカラー */
    g_Scroll.sclc.argb.r = 255;
    g_Scroll.sclc.argb.g = 255;
    g_Scroll.sclc.argb.b = 255;

    /* 背景を設定 */
    /* 左上 右上 左下 のカラーを指定 */
    njSetBackColor(0xffc00000, 0xff00c000, 0xff0000c0); 
    /* テキストのカラーを指定 */
    njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0xc0));
}


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

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

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

Sint32 njUserMain(void)
{
    NJS_PERIPHERAL *per;

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

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

	if (!g_bPause) {
	    /* スクロールの描画 */
   		njDrawScroll(&g_Scroll);
	} else {
	    njPrintC(NJM_LOCATION(19, 15), "PAUSE");
	}	
	
    /* デバッグ情報の表示 */
    njPrintC(NJM_LOCATION(10, 6), "Ninja Sample SCROLL");
    
    return NJD_USER_CONTINUE;
}


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

    njUserExit --- Ninjaシステム終了関数

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

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