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

	「いぬ　れんだ」
		2001 1/31     BlueSky

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


#include <stdio.h>
#include <sys/bios.h>
#include <sys/fcntl.h>
#include <stdlib.h>


/*キャラクターデータ */
#include "pict.h"

/* パレットSET用マクロ（パレット番号順にa,b,c,dを指定） */
#define SetPl(a,b,c,d) (((d)<<12) | ((c)<<8) | ((b)<<4) | (a))

/* 処理段階 */
#define PHASE_END 0			/* プログラム終了 */
#define PHASE_TITLE 1		/* タイトル画面 */
#define PHASE_MAIN 2		/* メイン */
#define PHASE_CLEAR	 3		/* クリア */
#define PHASE_OVER 99		/* GAMEOVER */

/* 固有グローバル変数 */
static	int		g_nGamePhase;						/* 処理段階データ */
static  int		RunTime;
/* 関数定義 */
static	void PutTitle();		/* タイトル処理 */
static  void GameTest();		/* テスト処理 */
static	void PutGameOver();		/* ゲームオーバー処理 */
static	void PutGameClear();	/* ゲームクリア処理 */
static	void ClearScreen(int);	/* 画面クリア */
static	void InEffect(int);		/* フェードイン */
static	void OutEffect(int);	/* フェードアウト */
static	int KeyDown( int nKey );	/* キー押しチェック */
static	int KeyUp( int nKey );		/* キー離しチェック */
void PutText(int, int, WORD, unsigned char*);	/* フォント描画関数 */

/* キーが押された瞬間のチェック */
int KeyDown( int nKey )
{
	static int _key = 0;
	int nKeyDown;
	
	nKeyDown = (nKey ^ _key) & nKey;
	_key = nKey;
	return nKeyDown;
}

/* キーが離された瞬間のチェック */
int KeyUp( int nKey )
{
	static int _key = 0;
	int nKeyUp;
	
	nKeyUp = (nKey ^ _key) & (~nKey);
	_key = nKey;
	return nKeyUp;
}

/* スクリーン(nScreen)にキャラを敷き詰める */
void ClearScreen(int nScreen)
{
	screen_fill_char(nScreen, 0, 0, 32, 32, 0x0000);
}

/* フォントをwFont番からキャラクタ設定して描画 */
void PutText(int nX, int nY, WORD wFont, unsigned char *s)
{
    WORD wCode;
	int nCount = 0;
	unsigned char *pTmp = s;	/* 文字列のアドレス保存 */

	while ((wCode = *s++) != 0x00)	/* 文字数をカウント（2バイト文字含む） */
	{
		if(wCode >= 0x80) s++;
		nCount++;
    }

	text_window_init(nX, nY, nCount, 1, wFont);	/* nCount分、領域を確保 */
	text_put_string(0, 0, pTmp);
}

/*メイン*/
void main(int argc, char *argv[])
{
	/*スプライト用x,y座標*/
	unsigned char x, y;
	/*大きいサイズのキャラクタ表示用*/
	int dx, nKey;
	
	/* キー履歴初期化 */
	nKey = key_press_check();
	KeyDown(nKey);
	KeyUp(nKey);

	/*ディスプレイ設定*/
	display_control(0);/*SPR/SCR2/SCR1 ALL OFF*/

	/*スクロール値初期化*/
	screen_set_scroll(SCREEN1, 0, 0);
	screen_set_scroll(SCREEN2, 0, 0);

	/*FONT LOAD*/
	/*0番にbmp_clearを割り当て*/
	font_set_colordata(0, 1, bmp_clear);
	/*1番にbmp_winup_mを割り当て*/
	font_set_colordata(1, wan1_width * wan1_height, bmp_wan1);

	/*SCR LOAD*/
	/*まず、画面全体をクリア（0番のキャラでフィル）*/
	screen_fill_char(SCREEN1, 0, 0, 32, 32, 0x0000);

	/*LCD階調データ初期化*/
	lcd_set_color(0x6420, 0xfca8);

	/*パレット初期化*/
	/*SCREEN用 0番*/
	palette_set_color(0, 0x7650);
	/*スプライト用0番*/
	palette_set_color(8, 0x7650);
	palette_set_color(1, SetPl(7, 4, 2, 0));	/* カーソル用パレット */
	text_set_palette(0);
	
	/*スプライト用x,y座標*/
	x = y = 0;
	/*スプライト定義*/
	for (dx = 0; dx < wan1_height * wan1_width; dx++){
		sprite_set_char(0+dx, /*CFM_SPR_UPPER |*/ 1+dx);
	}

	/*レンジ設定*/
	sprite_set_range(0,wan1_height*wan1_width);

	/*ディスプレイ設定*/
	display_control(DCM_SPR + DCM_SCR1);	/*　SPR / SCR1表示 */
	
	/* テキスト表示に用いるスクリーンを設定 */
	text_set_screen(SCREEN1);

/* メインループ */
	g_nGamePhase = PHASE_TITLE;
	while(g_nGamePhase != PHASE_END)
	{
		switch(g_nGamePhase)
		{
		case PHASE_TITLE:				/* タイトル画面処理 */
			PutTitle();
			break;
		case PHASE_MAIN:				/* ゲーム中 */
			GameTest();
			break;
		case PHASE_CLEAR:				/* ゲームクリア */
			PutGameClear();
			g_nGamePhase = PHASE_TITLE;
			break;
		case PHASE_OVER:				/* ゲームオーバー処理 */
			PutGameOver();
			g_nGamePhase = PHASE_TITLE;
			break;
		default:						/* エラー */
			g_nGamePhase = PHASE_END;
			break;
		}
	}

/* 終了処理 */
    bios_exit();

}


/* タイトル表示処理 */
void PutTitle()
{
	int nKey, nKeyDown, nKeyUp, nMenu, cnt,dx,dy,nX,nY;
	BOOL bFlag = TRUE;
	
	nX = 16;
	nY = 60;
	
	/* 画面初期化 */
	sys_wait(1);
	ClearScreen(SCREEN1);
	
	cnt = 0;
	for (dy = 0; dy < wan1_height; dy++){
		for (dx = 0; dx < wan1_width; dx++,cnt++){
			sprite_set_location(0+cnt,nX+15+dx*8,nY+dy*8);
		}
	}
	sys_wait(2);
		
	nMenu = 0;
	PutText(10, 5, 440, "いぬ　れんだ");
	PutText(10, 8, 450, "ゲームスタート★");
	PutText(10, 10, 500, "−−−終了−−−");

	while(bFlag)
	{
		/* キー入力判定 */
		nKey = key_press_check();
		nKeyDown = KeyDown(nKey);
		nKeyUp = KeyUp(nKey);

		if((nKeyDown & KEY_UP1) || (nKeyDown & KEY_DOWN1))
		{
			nMenu ^= 1;
			nY = nMenu * 16 + 50;
			for (dy = 0,cnt = 0; dy < wan1_height; dy++){
				for (dx = 0; dx < wan1_width; dx++,cnt++){
				sprite_set_location(0+cnt,nX+15+dx*8,nY+dy*8);
				}
			}
		}
		if((nKeyDown & KEY_A) || (nKeyDown & KEY_START))
		{
			bFlag = FALSE;
			switch(nMenu)
			{
			case 0:
				g_nGamePhase = PHASE_MAIN;
				RunTime=0;
				break;
			case 1:
				g_nGamePhase = PHASE_END;
				break;
			}
		}

		/* VSYNC待ち */
		sys_wait(1);

		/* メニュー表示 */
		cursor_set_location(9 ,8 + nMenu * 2, 10 ,1);
		cursor_display(1);
    }
	cursor_display(0);


}
/* テスト処理 */
void GameTest()
{
	int nKey, nKeyDown, nKeyUp, nX, nY,dx,dy,cnt;
	BOOL bFlag = TRUE;
	/* 画面初期化 */
	sys_wait(1);
	ClearScreen(SCREEN1);
	PutText(17, 15, 500, "STARTで終了");
	nX = 10;
	nY = 60;
	PutText(10, 2, 460, "Time=");
	while(bFlag)
	{
		/* キー入力判定 */
		nKey = key_press_check();
		nKeyDown = KeyDown(nKey);
		nKeyUp = KeyUp(nKey);

		if((nKeyDown & KEY_A)||(nKeyDown & KEY_B)){
			PutText(5, 15, 410, "ボタンはなせ");
			if(nX<164)nX += 2;
			else{
			bFlag = FALSE;
			g_nGamePhase = PHASE_CLEAR;
			}
		}
		if((nKeyUp & KEY_A)||(nKeyUp & KEY_B))	PutText(5, 15, 410, "ボタン押せ  ");

		if(nKeyDown & KEY_START){
			bFlag = FALSE;
			g_nGamePhase = PHASE_OVER;
		}
		RunTime += 1;

		text_window_init(16, 2, 3, 1, 470);
		text_put_numeric(0, 0, 3, NUM_PADZERO, RunTime/10);

		/* VSYNC待ち */
		sys_wait(1);

		/* 表示処理 */
		
		for (dy = 0,cnt = 0; dy < wan1_height; dy++){
			for (dx = 0; dx < wan1_width; dx++,cnt++){
			sprite_set_location(0+cnt,nX+15+dx*8,nY+dy*8);
			}
		}
	}
}

/* ゲームオーバー表示処理 */
void PutGameOver()
{
	int nKey, nKeyDown, nKeyUp;
	BOOL bFlag = TRUE;
	
	/* 画面初期化 */
	sys_wait(1);
	ClearScreen(SCREEN1);		/* テキストをクリア */

	/* 表示処理 */
	PutText(9, 6, 490, "GAME  OVER");
	PutText(9, 15, 500, "STARTでMENUへ");

	while(bFlag)
	{
		/* キー入力判定 */
		nKey = key_press_check();
		nKeyDown = KeyDown(nKey);
		nKeyUp = KeyUp(nKey);
		if(nKeyDown & KEY_START) bFlag = FALSE;

		/* VSYNC待ち */
		sys_wait(1);

	}

}

/* ゲームクリア表示処理 */
void PutGameClear()
{
	int nKey, nKeyDown, nKeyUp;
	BOOL bFlag = TRUE;
	
	/* 画面初期化 */
	sys_wait(1);
	ClearScreen(SCREEN1);		/* テキストをクリア */

	/* 表示処理 */
	PutText(9, 6, 480, "GAME  CLEAR");
	PutText(9, 15, 500, "STARTでMENUへ");
	
	PutText(10, 2, 460, "Time=");	
	text_window_init(16, 2, 3, 1, 470);
	text_put_numeric(0, 0, 3, NUM_PADZERO, RunTime/10);

	while(bFlag)
	{
		/* キー入力判定 */
		nKey = key_press_check();
		nKeyDown = KeyDown(nKey);
		nKeyUp = KeyUp(nKey);
		if(nKeyDown & KEY_START) bFlag = FALSE;

		/* VSYNC待ち */
		sys_wait(1);

	}

}

