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

  タイトル ： スクロールの表示（プライオリティの変更）
  編集履歴 ： 98-04-28 製作開始
              98-04-30 pvrファイルのパスの変更
                       不必要な機能の削除
              98-04-30 スクロール絵の変更
              98-04-30 プライオリティチェンジの方法を変更
              98-05-12 コーディング規約に合わせる
              98-05-15 SET2/4切り替えマクロを追加
              98-05-25 SET4コンパイル時のバグを修正
              98-06-18 SET5対応
              98-07-08 C0焼き付き問題に対応（ポーズ追加）
              98-09-16 テクスチャバッファ確保のサイズ変更
************************************************************/

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

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

#define MAX_VERTEXES 10000
#define TEX_NUM 2000

static NJS_VERTEX_BUF *VBuf;

/* スクロールで使うテクスチャの設定 */
static NJS_TEXNAME Texture0[] = {
    {"mae00.pvr", NJD_TEXATTR_GLOBALINDEX, 1000}, /* 00 */
    {"mae01.pvr", NJD_TEXATTR_GLOBALINDEX, 1001}, /* 01 */
    {"mae02.pvr", NJD_TEXATTR_GLOBALINDEX, 1002}, /* 02 */
    {"mae03.pvr", NJD_TEXATTR_GLOBALINDEX, 1003}, /* 03 */
    {"mae04.pvr", NJD_TEXATTR_GLOBALINDEX, 1004}, /* 04 */
    {"mae05.pvr", NJD_TEXATTR_GLOBALINDEX, 1005}, /* 05 */
    {"mae06.pvr", NJD_TEXATTR_GLOBALINDEX, 1006}, /* 06 */
    {"mae07.pvr", NJD_TEXATTR_GLOBALINDEX, 1007}, /* 07 */
    {"mae08.pvr", NJD_TEXATTR_GLOBALINDEX, 1008}, /* 08 */
    {"mae09.pvr", NJD_TEXATTR_GLOBALINDEX, 1009}, /* 09 */
    {"mae10.pvr", NJD_TEXATTR_GLOBALINDEX, 1010}, /* 10 */
    {"mae11.pvr", NJD_TEXATTR_GLOBALINDEX, 1011}, /* 11 */
    {"mae12.pvr", NJD_TEXATTR_GLOBALINDEX, 1012}, /* 12 */
    {"mae13.pvr", NJD_TEXATTR_GLOBALINDEX, 1013}, /* 13 */
    {"mae14.pvr", NJD_TEXATTR_GLOBALINDEX, 1014}, /* 14 */
    {"mae15.pvr", NJD_TEXATTR_GLOBALINDEX, 1015}, /* 15 */
    {"mae16.pvr", NJD_TEXATTR_GLOBALINDEX, 1016}, /* 16 */
    {"mae17.pvr", NJD_TEXATTR_GLOBALINDEX, 1017}, /* 17 */
    {"mae18.pvr", NJD_TEXATTR_GLOBALINDEX, 1018}, /* 18 */
    {"mae19.pvr", NJD_TEXATTR_GLOBALINDEX, 1019}, /* 19 */
    {"mae20.pvr", NJD_TEXATTR_GLOBALINDEX, 1020}, /* 20 */
    {"mae21.pvr", NJD_TEXATTR_GLOBALINDEX, 1021}, /* 21 */
    {"mae22.pvr", NJD_TEXATTR_GLOBALINDEX, 1022}, /* 22 */
    {"mae23.pvr", NJD_TEXATTR_GLOBALINDEX, 1023}, /* 23 */
    {"mae24.pvr", NJD_TEXATTR_GLOBALINDEX, 1024}, /* 24 */
    {"mae25.pvr", NJD_TEXATTR_GLOBALINDEX, 1025}, /* 25 */
    {"mae26.pvr", NJD_TEXATTR_GLOBALINDEX, 1026}, /* 26 */
    {"mae27.pvr", NJD_TEXATTR_GLOBALINDEX, 1027}, /* 27 */
};

static NJS_TEXLIST Texlist0 = {Texture0, 28};

/* スクロール１で使うテクスチャの設定 */
static NJS_TEXNAME Texture1[] = {
    {"mae00.pvr", NJD_TEXATTR_GLOBALINDEX, 1100}, /* 00 */
    {"mae01.pvr", NJD_TEXATTR_GLOBALINDEX, 1101}, /* 01 */
    {"mae02.pvr", NJD_TEXATTR_GLOBALINDEX, 1102}, /* 02 */
    {"mae03.pvr", NJD_TEXATTR_GLOBALINDEX, 1103}, /* 03 */
    {"mae04.pvr", NJD_TEXATTR_GLOBALINDEX, 1104}, /* 04 */
    {"mae05.pvr", NJD_TEXATTR_GLOBALINDEX, 1105}, /* 05 */
    {"mae06.pvr", NJD_TEXATTR_GLOBALINDEX, 1106}, /* 06 */
    {"mae07.pvr", NJD_TEXATTR_GLOBALINDEX, 1107}, /* 07 */
    {"mae08.pvr", NJD_TEXATTR_GLOBALINDEX, 1108}, /* 08 */
    {"mae09.pvr", NJD_TEXATTR_GLOBALINDEX, 1109}, /* 09 */
    {"mae10.pvr", NJD_TEXATTR_GLOBALINDEX, 1110}, /* 10 */
    {"mae11.pvr", NJD_TEXATTR_GLOBALINDEX, 1111}, /* 11 */
    {"mae12.pvr", NJD_TEXATTR_GLOBALINDEX, 1112}, /* 12 */
    {"mae13.pvr", NJD_TEXATTR_GLOBALINDEX, 1113}, /* 13 */
    {"mae14.pvr", NJD_TEXATTR_GLOBALINDEX, 1114}, /* 14 */
    {"mae15.pvr", NJD_TEXATTR_GLOBALINDEX, 1115}, /* 15 */
    {"mae16.pvr", NJD_TEXATTR_GLOBALINDEX, 1116}, /* 16 */
    {"mae17.pvr", NJD_TEXATTR_GLOBALINDEX, 1117}, /* 17 */
    {"mae18.pvr", NJD_TEXATTR_GLOBALINDEX, 1118}, /* 18 */
    {"mae19.pvr", NJD_TEXATTR_GLOBALINDEX, 1119}, /* 19 */
    {"mae20.pvr", NJD_TEXATTR_GLOBALINDEX, 1120}, /* 20 */
    {"mae21.pvr", NJD_TEXATTR_GLOBALINDEX, 1121}, /* 21 */
    {"mae22.pvr", NJD_TEXATTR_GLOBALINDEX, 1122}, /* 22 */
    {"mae23.pvr", NJD_TEXATTR_GLOBALINDEX, 1123}, /* 23 */
    {"mae24.pvr", NJD_TEXATTR_GLOBALINDEX, 1124}, /* 24 */
    {"mae25.pvr", NJD_TEXATTR_GLOBALINDEX, 1125}, /* 25 */
    {"mae26.pvr", NJD_TEXATTR_GLOBALINDEX, 1126}, /* 26 */
    {"mae27.pvr", NJD_TEXATTR_GLOBALINDEX, 1127}, /* 27 */
};

static NJS_TEXLIST Texlist1 = {Texture1, 28};

static NJS_TEXMEMLIST Texmemlist[TEX_NUM];

/* NJM_MAP(n, u, v) n:テクスチャ番号 u:テクスチャＵ座標 v:テクスチャＶ座標 */
static Uint32 Map0[4][7] = {
    { NJM_MAP(0, 0, 0), NJM_MAP(1, 0, 0), NJM_MAP(2, 0, 0),
      NJM_MAP(3, 0, 0), NJM_MAP(4, 0, 0), NJM_MAP(5, 0, 0),
      NJM_MAP(6, 0, 0), },
    { NJM_MAP(7, 0, 0), NJM_MAP(8, 0, 0), NJM_MAP(9, 0, 0),
      NJM_MAP(10, 0, 0), NJM_MAP(11, 0, 0), NJM_MAP(12, 0, 0),
      NJM_MAP(13, 0, 0), },
    { NJM_MAP(14, 0, 0), NJM_MAP(15, 0, 0), NJM_MAP(16, 0, 0),
      NJM_MAP(17, 0, 0), NJM_MAP(18, 0, 0), NJM_MAP(19, 0, 0),
      NJM_MAP(20, 0, 0), },
    { NJM_MAP(21, 0, 0), NJM_MAP(22, 0, 0), NJM_MAP(23, 0, 0),
      NJM_MAP(24, 0, 0), NJM_MAP(25, 0, 0), NJM_MAP(26, 0, 0),
      NJM_MAP(27, 0, 0), },
};
static Uint32 Map1[4][7] = {
    { NJM_MAP(0, 0, 0), NJM_MAP(1, 0, 0), NJM_MAP(2, 0, 0),
      NJM_MAP(3, 0, 0), NJM_MAP(4, 0, 0), NJM_MAP(5, 0, 0),
      NJM_MAP(6, 0, 0), },
    { NJM_MAP(7, 0, 0), NJM_MAP(8, 0, 0), NJM_MAP(9, 0, 0),
      NJM_MAP(10, 0, 0), NJM_MAP(11, 0, 0), NJM_MAP(12, 0, 0),
      NJM_MAP(13, 0, 0), },
    { NJM_MAP(14, 0, 0), NJM_MAP(15, 0, 0), NJM_MAP(16, 0, 0),
      NJM_MAP(17, 0, 0), NJM_MAP(18, 0, 0), NJM_MAP(19, 0, 0),
      NJM_MAP(20, 0, 0), },
    { NJM_MAP(21, 0, 0), NJM_MAP(22, 0, 0), NJM_MAP(23, 0, 0),
      NJM_MAP(24, 0, 0), NJM_MAP(25, 0, 0), NJM_MAP(26, 0, 0),
      NJM_MAP(27, 0, 0), },
};
static NJS_SCROLL Scroll0;
static NJS_SCROLL Scroll1;

PDS_PERIPHERAL* Per;

void PauseMode(void);

static void swapF(Float *fl1, Float *fl2);

/************************************************************
  初期化
************************************************************/
void njUserInit(void)
{
    /* システムを初期化 */
    sbInitSystem(NJD_RESOLUTION_640x480_NTSCI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    VBuf = (NJS_VERTEX_BUF *)syMalloc(sizeof (NJS_VERTEX_BUF) * MAX_VERTEXES);
    /* バックグラウンドカラーを設定 */
    njSetBackColor(ARGB(0, 0, 128, 0),
        ARGB(0, 0, 128, 0), ARGB(0, 128, 0, 0));
    /* テクスチャバッファの確保 */
    njInitTextureBuffer((Sint8 *)VBuf,0x800*100);

    /* 頂点データ登録用バッファをアロケート */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    /* テクスチャ情報を格納する領域を設定 */
    njInitTexture(Texmemlist, TEX_NUM);
    /* テクスチャをロードする */
    njLoadTexture(&Texlist0);
    njLoadTexture(&Texlist1);
    /* スクロール０の設定 */
    Scroll0.celps = 128;            /* セルのサイズ */
    Scroll0.mapw = 7;               /* マップの横のセルの個数(128*7) */
    Scroll0.maph = 4;               /* マップの縦のセルの個数(128*4) */
    Scroll0.list = &Texlist0;       /* テクスチャリスト */
    Scroll0.map = (Uint32 *)Map0;   /* マップ配列 */
    Scroll0.mflag = OFF;            /* マトリックスフラグ */
    Scroll0.sflag = OFF;            /* スケールフラグ */
    Scroll0.pr = -100.0F;           /* プライオリティ */
    Scroll0.px = 0.0F;              /* 移動ｘ */
    Scroll0.py = 0.0F;              /* 移動ｙ */
    Scroll0.sclc.argb.a = 255;      /* 全体にかけるＡ */
    Scroll0.sclc.argb.r = 150;      /* 全体にかけるＲ */
    Scroll0.sclc.argb.g = 150;      /* 全体にかけるＧ */
    Scroll0.sclc.argb.b = 150;      /* 全体にかけるＢ */
    Scroll0.colmode = NJD_COLOR_MODE_PACKED_TEXTURE_TRANS; /* カラーモード */

    /* スクロール１の設定 */
    Scroll1.celps = 128;            /* セルのサイズ */
    Scroll1.mapw = 7;               /* マップの横のセルの個数(128*7) */
    Scroll1.maph = 4;               /* マップの縦のセルの個数(128*4) */
    Scroll1.list = &Texlist1;       /* テクスチャリスト */
    Scroll1.map = (Uint32 *)Map1;   /* マップ配列 */
    Scroll1.mflag = OFF;            /* マトリックスフラグ */
    Scroll1.sflag = OFF;            /* スケールフラグ */
    Scroll1.pr = -200.0F;           /* プライオリティ */
    Scroll1.px = -50.0F;            /* 移動ｘ */
    Scroll1.py = -25.0F;            /* 移動ｙ */
    Scroll1.sclc.argb.a = 255;      /* 全体にかけるＡ */
    Scroll1.sclc.argb.r = 150;      /* 全体にかけるＲ */
    Scroll1.sclc.argb.g = 150;      /* 全体にかけるＧ */
    Scroll1.sclc.argb.b = 0;        /* 全体にかけるＢ */
    Scroll1.colmode = NJD_COLOR_MODE_PACKED_TEXTURE_TRANS; /* カラーモード */

    /* デバッグ文字の色 */
    njPrintColor(ARGB(255, 150, 150, 150));
}

/************************************************************
  定期実行されるメイン処理
************************************************************/
Sint32 njUserMain(void)
{
    static int frame = 0;

    static Bool pauseMode = FALSE;

    /* 情報の表示 */
    njPrintC(NJM_LOCATION(4, 6), "NINJA SCROLL PRIORITY TEST");
    njPrintC(NJM_LOCATION(4, 8), "Press Start Button To Pause");
    if (Scroll0.pr > Scroll1.pr) {
        njPrintC(NJM_LOCATION(4, 10), "WHITE <--HIGH    YELLOW");
    }
    else {
        njPrintC(NJM_LOCATION(4, 10), "WHITE    HIGH--> YELLOW");
    }

    /* ペリフェラルチェック */
    Per = (PDS_PERIPHERAL *) pdGetPeripheral(PDD_PORT_A0);
    if (Per->press & PDD_DGT_ST) { /* スタートボタンが押された */
        pauseMode = !pauseMode;
    }

    /* ポーズ画面を作る */
    if (pauseMode == TRUE) {
        Scroll0.sclc.argb.a = 64;
        Scroll1.sclc.argb.a = 64;

        PauseMode();
    }
    else {
        Scroll0.sclc.argb.a = 255;
        Scroll1.sclc.argb.a = 255;
    }

    /* １秒経ったらスクロールのプライオリティを変更 */
    if (pauseMode == FALSE) {
        frame++;
        if (frame == 60) {
            swapF(&Scroll0.pr, &Scroll1.pr);
            frame = 0;
        }
    }

    njDrawScroll(&Scroll0); /* スクロール０を表示 */
    njDrawScroll(&Scroll1); /* スクロール１を表示 */

    return NJD_USER_CONTINUE;
}

/************************************************************
  実行終了時に呼び出される終了処理
************************************************************/
void njUserExit(void)
{
	njExitPrint();
    njExitTexture();
    syFree(VBuf);
    sbExitSystem();
}

/************************************************************
  ２つのfloat値を入れ替える
************************************************************/
void swapF(Float *f1, Float *f2)
{
    Float tmp;
    tmp = *f1;
    *f1 = *f2;
    *f2 = tmp;
}

/************************************************************
  ポーズ時に呼び出される処理
************************************************************/
void PauseMode(void)
{
    static Sint16 interval = 0;
    static Bool display = TRUE;

    interval++;
    if (interval >= 30) {
        display = !display;
        interval = 0;
    }
    if (display == TRUE) {
        njPrintSize(32);
        njPrintC(NJM_LOCATION(7, 6),"PAUSE!");
        njPrintSize(8);
    }
}
