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

  タイトル ： スプライトを拡大縮小させる
  編集履歴 ： 98-04-24 製作開始
              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_TEXNAME g_TexName[] = {"walmap.pvr", NJD_TEXATTR_GLOBALINDEX, 0};

static NJS_TEXLIST g_TexList = {g_TexName, TEXTURE_NUM};
static NJS_TEXMEMLIST g_Texture[TEXTURE_NUM];

/* スプライトデータ */

static NJS_SPRITE g_Sprite;    /* スプライトデータを保持する */

/* スプライトのアニメーションデータをセット */
static NJS_TEXANIM g_SpriteAnim[] = {                      
    {256, 256, 128, 128, 0, 0, 255, 255, 0, 0}, 
};

static NJS_VERTEX_BUF *vbuf;

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

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

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

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

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

void njUserInit (void)
{
    /* 画面モードの決定 */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);

    /* 頂点の最大数分バッファをアロケートする */
    njInitVertexBuffer(VERTEX_MAX * 64 / 4, 0, VERTEX_MAX * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    vbuf = syMalloc( sizeof( NJS_VERTEX_BUF ) * 4096 );
    njInitTextureBuffer( ( Sint8 * )vbuf, 0x800*10 ); 

    /* テクスチャの数だけデータ領域を確保 */
    njInitTexture(g_Texture, TEXTURE_NUM);
    /* 指定したテクスチャリストにあるテクスチャデータを */
    /* キャッシュメモリにロード */   
    njLoadTexture(&g_TexList);  
                                
    njSetTexture(&g_TexList);   /* カレントのテクスチャリストを設定 */
    njSetTextureNum(0);       /* ０番テクスチャをカレントテクスチャにセット*/

    /* スプライトデータの初期化 */
    g_Sprite.p.x = 160.0F;  /* 表示位置 */
    g_Sprite.p.y = 120.0F;
    g_Sprite.sx  = 1.F;    /* 拡大縮小率 */
    g_Sprite.sy  = 1.F;
    g_Sprite.tlist = &g_TexList; /* 使用するテクスチャリスト */
    g_Sprite.tanim = g_SpriteAnim;  /* アニメーションを定義 */

    /* 背景を設定 */
    /* 左上 右上 左下 のカラーを指定 */
    njSetBackColor(0xffc00000, 0xff00c000, 0xff0000c0); 

    /* テキストのカラーを設定 */
    njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0xc0));
}


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

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

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

Sint32 njUserMain(void)
{
    NJS_PERIPHERAL *per;

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

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

	/* ポーズ状態によって処理を切り替える */
	if (!g_bPause) {
		ActivePhase();
	} else {
		PausePhase();
	}

    /* デバッグ情報の表示 */
    njPrintC(NJM_LOCATION(6, 5), "Ninja Sample Sprite Zoom");
    
    return NJD_USER_CONTINUE;
}


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

    ActivePhase --- アクティブ処理関数

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

void ActivePhase(void)
{
    static Angle ang = NJM_DEG_ANG(0.0F);

    /* 拡大縮小率を変化させる*/
    ang += 100;
    g_Sprite.sx = njSin(ang) + 0.5F;
    g_Sprite.sy = njCos(ang) + 0.5F;

    /* スプライトの描画 */
    njDrawSprite2D(&g_Sprite, 0, -150.0F, 0);

	/* デバッグ情報の表示 */    
    njPrintC(NJM_LOCATION(5, 8), "sx = ");
    njPrintF(NJM_LOCATION(10, 8), g_Sprite.sx, 1);
    njPrintC(NJM_LOCATION(5, 9), "sy = ");
    njPrintF(NJM_LOCATION(10, 9), g_Sprite.sy, 1);
}


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

    PausePhase --- ポーズ処理関数

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

void PausePhase(void)
{
    NJS_POINT2COL pc;
    NJS_POINT2    p[4];
    NJS_COLOR     col[4];
    static int	  timer = 0;
        
    /* スプライトの描画 */
    njDrawSprite2D(&g_Sprite, 0, -150.0F, 0);

    /* セーバー用スプライトの設定 */
    pc.p   = p;
    pc.col = col;
    pc.tex = NULL;
    pc.num = 4;
    
    p[0].x = 0;
    p[0].y = 0;
    col[0].color = 0xff000000;

    p[1].x = 0;
    p[1].y = 480;
    col[1].color = 0xff000000;

    p[2].x = 640;
    p[2].y = 480;
    col[2].color = 0xff000000;

    p[3].x = 640;
    p[3].y = 0;
    col[3].color = 0xff000000;

    /* セーバー用ポリゴンの描画 */
    njDrawPolygon2D(&pc, 4, -2.0F, NJD_FILL);

	/* コマーシャルの表示 */
	
	timer++;
	njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0x00));
	if (timer > 720) {
		timer = 0;
	}
					
	njPrintColor(ARGB(0xff, 0xc0, 0xc0, 0xc0));				
	/* ポーズのお知らせ */
    njPrintC(NJM_LOCATION(19, 15), "PAUSE");
}


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

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

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

void njUserExit(void)
{
	njExitPrint();
    njExitTexture();
    syFree(vbuf);
    /* システムの終了処理を行います 必ず最後に呼び出してください */
    njExitSystem(); 
}
