/* SubMarine	by kazuya*/
#include <stdio.h>
#include <sys/bios.h>
#include <sys/fcntl.h>
#include <stdlib.h>
#include <il_sound.h>
#include "submarine.h"


/*--------スプライトx個(縦×横)をまとめて表示。この場合、一マス専用*/
/*（スプライト番号 ,X座標 ,Y座標 ,キャラ番号）*/
void sprite_set_locx(int iSpn ,int iLx ,int iLy ,int iCn)
{
	int iX,iY,iN=0;

	for(iY=0 ;iY<MAS_PIX ;iY+=CHR_PIX)
	{
		for(iX=0 ;iX<MAS_PIX/*１マスの一辺[16]*/ ;iX+=CHR_PIX/* １キャラクタの1辺[8]*/)
		{
		    sprite_set_char(iSpn+iN ,(CPN_MY-CPN_SP)<< 9 | iCn+iN);
		    sprite_set_location(iSpn+iN ,iLx+iX ,iLy+iY);	/*スプライト位置指定*/
			iN++;
		}
	}
}

/* ------------ 値0〜X-1と循環させる関数 */
/*  引数(補正したい値 ,循環させたい範囲X) */
int fncLoop(int iArg ,int iPitch)
{
	if(iArg < 0)
		iArg = iArg + iPitch;

	if(iArg >= iPitch)
		iArg = iArg - iPitch * (iArg / iPitch);

	return(iArg);
}

/*--------------------仮想マップチェック*/
/*（Ｘ座標, Ｙ座標）*/
int fncMap(int iX ,int iY)
{
	int iCx1,iCy1,iCx2,iCy2;
	int iCtl,iCtr,iCbl,iCbr;

	/*主人公の4隅に接触している背景をチェック*/
	iCx1 = fncLoop(iX + 2,MAP_WIDTH*MAS_PIX) / MAS_PIX;	/*座標→マス目変換*/
	iCy1 = fncLoop(iY +6,MAP_HEIGHT*MAS_PIX) / MAS_PIX;	/*座標→マス目変換*/
	iCx2 = fncLoop(iX+MAS_PIX-3 ,MAP_WIDTH*MAS_PIX) / MAS_PIX;	/*座標→マス目変換*/
	iCy2 = fncLoop(iY+MAS_PIX-3 ,MAP_HEIGHT*MAS_PIX) / MAS_PIX;	/*座標→マス目変換*/
	iCtl = cMap[iCy1][iCx1]-'0';	/*左上*/
	iCtr = cMap[iCy1][iCx2]-'0';	/*右上*/
	iCbl = cMap[iCy2][iCx1]-'0';	/*左下*/
	iCbr = cMap[iCy2][iCx2]-'0';	/*右下*/

	if(iCtl == BG_WALL)	/*壁判定*/
	{
		return(iCtl);
	}else if(iCtr == BG_WALL)
	{
		return(iCtr);
	}else if(iCbl == BG_WALL)
	{
		return(iCbl);
	}else if(iCbr == BG_WALL)
	{
		return(iCbr);
	}

	if(iCtl == BG_TANK)	/*タンク判定*/
	{
		cMap[iCy1][iCx1] = '0';
		return(iCtl);
	}else if(iCtr == BG_TANK)
	{
		cMap[iCy1][iCx2] = '0';
		return(iCtr);
	}else if(iCbl == BG_TANK)
	{
		cMap[iCy2][iCx1] = '0';
		return(iCbl);
	}else if(iCbr == BG_TANK)
	{
		cMap[iCy2][iCx2] = '0';
		return(iCbr);
	}

	if(iCtl == BG_BOX)	/*宝箱判定*/
	{
		cMap[iCy1][iCx1] = '0';
		return(iCtl);
	}else if(iCtr == BG_BOX)
	{
		cMap[iCy1][iCx2] = '0';
		return(iCtr);
	}else if(iCbl == BG_BOX)
	{
		cMap[iCy2][iCx1] = '0';
		return(iCbl);
	}else if(iCbr == BG_BOX)
	{
		cMap[iCy2][iCx2] = '0';
		return(iCbr);
	}

	return(BG_NONE);
}


/*メーター描写*/
void materWrite(int iMy)/*char配列番号でのその画面の一番上をもらう*/
{
	int iTy;	/*テンポラリ*/

	for(iTy=0;iTy<LCD_CHAR_HEIGHT;iTy++)
	{
		screen_set_char(SCREEN1, 27, fncLoop(iMy + iTy,32), 1, 1, wCnBg[WALL_SQ]);
		if(iTy == LCD_CHAR_HEIGHT - 1)screen_set_char(SCREEN1, 27, fncLoop(iMy + iTy,32), 1, 1, wCnMt[1]);
		else if(iMater < iTy)screen_set_char(SCREEN1, 27, fncLoop(iMy + iTy,32), 1, 1, wCnMt[0]);
	}
}

/*スクロール時に波を描写 char座標でもらう*/
void waveWrite(int iTx, int iTy)
{
	if(cMap[fncLoop(iTy / MAS_CX, MAP_HEIGHT)][iTx / MAS_CX] == '3'){
		screen_set_char(SCREEN1, iTx, fncLoop(iTy, 32), 1, 1, wCnBg[WAVE]);
		screen_set_char(SCREEN1, iTx+1, fncLoop(iTy, 32), 1, 1, wCnBg[WAVE]);
		screen_set_char(SCREEN1, iTx, fncLoop(iTy+1, 32), 1, 1, wCnBg[WALL_SQ]);
		screen_set_char(SCREEN1, iTx+1, fncLoop(iTy+1, 32), 1, 1, wCnBg[WALL_SQ]);
	}
}

/*マップを一行描写する*/
/*(Ｙの１キャラクタ（８ｘ８）座標)*/
void blockWrite(int iTy){
	int iTx;	/*テンポラリ*/

	/*背景をスクリーンに敷き詰める*/
	for(iTx=0 ;iTx<LCD_CHAR_WIDTH ;iTx+=MAS_CX)
	{
		    if(cMap[fncLoop(iTy / MAS_CX, MAP_HEIGHT)][iTx / MAS_CX] == '2'){
			/*左に壁がある。*/
			if(cMap[iTy / MAS_CX][fncLoop(iTx / MAS_CX - 1, MAP_WIDTH)] == '2')
			{
				/*左上タイル描写*/
				/*もし上にタイルが有れば、*/
				if(cMap[fncLoop(iTy / MAS_CX - 1, MAP_HEIGHT)][iTx / MAS_CX] == '2'){
					screen_set_char(SCREEN1, iTx, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_SQ]);
				/*上に無ければ*/
				} else {
					screen_set_char(SCREEN1, iTx, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_U]);
				}
				/*左下タイル描写*/
				/*もし下にタイルが有れば、*/
				if(cMap[fncLoop(iTy / MAS_CX + 1, MAP_HEIGHT)][iTx / MAS_CX] == '2'){
					screen_set_char(SCREEN1, iTx, fncLoop(iTy + 1, 32), 1, 1, wCnBg[WALL_SQ]);
				/*下に無ければ*/
				} else {
					screen_set_char(SCREEN1, iTx, fncLoop(iTy + 1, 32), 1, 1, wCnBg[WALL_D]);
				}
			/*左に壁が無い*/
			}else {
				/*左上タイル描写*/
				/*もし上にタイルが有れば、*/
				if(cMap[fncLoop(iTy / MAS_CX - 1, MAP_HEIGHT)][iTx / MAS_CX] == '2'){
					screen_set_char(SCREEN1, iTx, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_L]);
				/*上に無ければ*/
				} else {
					screen_set_char(SCREEN1, iTx, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_UL]);
				}
				/*左下タイル描写*/
				/*もし下にタイルが有れば、*/
				if(cMap[fncLoop(iTy / MAS_CX + 1, MAP_HEIGHT)][iTx / MAS_CX] == '2'){
					screen_set_char(SCREEN1, iTx, fncLoop(iTy + 1, 32), 1, 1, wCnBg[WALL_L]);
				/*下に無ければ*/
				} else {
					screen_set_char(SCREEN1, iTx, fncLoop(iTy + 1, 32), 1, 1, wCnBg[WALL_DL]);
				}
			}
			/*右に壁がある。*/
			if(cMap[iTy / MAS_CX][fncLoop(iTx / MAS_CX + 1, MAP_WIDTH)] == '2')
			{
				/*右上タイル描写*/
				/*もし上にタイルが有れば、*/
				if(cMap[fncLoop(iTy / MAS_CX - 1, MAP_HEIGHT)][iTx/ MAS_CX] == '2'){
					screen_set_char(SCREEN1, iTx + 1, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_SQ]);
				/*上に無ければ*/
				} else {
					screen_set_char(SCREEN1, iTx + 1, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_U]);
				}
				/*右下タイル描写*/
				/*もし下にタイルが有れば、*/
				if(cMap[fncLoop(iTy / MAS_CX + 1, MAP_HEIGHT)][iTx / MAS_CX] == '2'){
					screen_set_char(SCREEN1, iTx + 1, fncLoop(iTy + 1, 32), 1, 1, wCnBg[WALL_SQ]);
				/*下に無ければ*/
				} else {
					screen_set_char(SCREEN1, iTx + 1, fncLoop(iTy + 1, 32), 1, 1, wCnBg[WALL_D]);
				}
			/*右に壁が無い*/
			}else {
				/*右上タイル描写*/
				/*もし上にタイルが有れば、*/
				if(cMap[fncLoop(iTy / MAS_CX - 1, MAP_HEIGHT)][iTx / MAS_CX] == '2'){
					screen_set_char(SCREEN1, iTx + 1, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_R]);
				/*上に無ければ*/
				} else {
					screen_set_char(SCREEN1, iTx + 1, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_UR]);
				}
				/*右下タイル描写*/
				/*もし下にタイルが有れば、*/
				if(cMap[fncLoop(iTy / MAS_CX + 1, MAP_HEIGHT)][iTx / MAS_CX] == '2'){
					screen_set_char(SCREEN1, iTx + 1, fncLoop(iTy + 1, 32), 1, 1, wCnBg[WALL_R]);
				/*下に無ければ*/
				} else {
					screen_set_char(SCREEN1, iTx + 1, fncLoop(iTy + 1, 32), 1, 1, wCnBg[WALL_DR]);
				}
			}
		}
		if(cMap[iTy / MAS_CX][iTx / MAS_CX] == '0') {
			screen_set_char(SCREEN1, iTx, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_SQ]);
			screen_set_char(SCREEN1, iTx+1, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_SQ]);
			screen_set_char(SCREEN1, iTx, fncLoop(iTy+1, 32), 1, 1, wCnBg[WALL_SQ]);
			screen_set_char(SCREEN1, iTx+1, fncLoop(iTy+1, 32), 1, 1, wCnBg[WALL_SQ]);
		}
		waveWrite(iTx,iTy);

		/*アイテム描写*/
		if(cMap[iTy / MAS_CX][iTx / MAS_CX] == '1')
			screen_set_char(SCREEN1, iTx, fncLoop(iTy, 32), 2, 2, wCnItem[ITEM_TN]);
		if(cMap[iTy / MAS_CX][iTx / MAS_CX] == '9')
			screen_set_char(SCREEN1, iTx, fncLoop(iTy, 32), 2, 2, wCnItem[ITEM_BOX]);
	}
}


/*スクロール時に暗闇を描写 char座標でもらう*/
void darkWrite(int iTy)
{
	int iTx;/*テンポラリ*/

	for(iTx=0; iTx<LCD_CHAR_WIDTH; iTx++)/**/
	{
		screen_set_char(SCREEN2, iTx, fncLoop(iTy, 32), 1, 1, wCnBg[WALL_B + dMap[iTy][iTx]]);
		screen_set_char(SCREEN2, iTx, fncLoop(iTy+1, 32), 1, 1, wCnBg[WALL_B + dMap[iTy+1][iTx]]);
	}
}

/*ＸＹ座標をChar座標に直して明かりを書く*/
void lightWrite(int iMx, int iMy, int iVector, int iLight)
{
	int iTx, iTr, flag;	/*テンポラリ*/
	int iCx, iCy, iC2x, iC2y;

	iCy = iMy/CHR_PIX+1;

	if(!iVector){
		iCx = iMx/CHR_PIX+1;
		for(iTr=(-L_ANGLE); iTr<L_ANGLE+1; iTr++)
		{
			flag = 0;
			for(iTx=0; flag==0 && iTx > -L_RANGE; iTx--)
			{
				iC2x = fncLoop(iCx+iTx,32);
				iC2y = fncLoop(iCy+iTr*iTx/10,MAP_HEIGHT*MAS_CX);
				if(dMap[iC2y][iC2x] == 0)
				{
					dMap[iC2y][iC2x]=1;
					screen_set_char(SCREEN2, iC2x, fncLoop(iC2y, 32), 1, 1, wCnBg[WALL_CLR]);
				}
				if(cMap[iC2y/MAS_CX][iC2x/MAS_CX] == '2')flag=1;
			}
		}
	}else{
		iCx = iMx/CHR_PIX;
		for(iTr=(-L_ANGLE); iTr<L_ANGLE+1; iTr++)
		{
			flag = 0;
			for(iTx=0; flag==0 && iTx < L_RANGE; iTx++)
			{
				iC2x = fncLoop(iCx+iTx,32);
				iC2y = fncLoop(iCy+iTr*iTx/10,MAP_HEIGHT*MAS_CX);
				if(dMap[iC2y][iC2x] == 0)
				{
					dMap[iC2y][iC2x]=1;
					screen_set_char(SCREEN2, iC2x, fncLoop(iC2y, 32), 1, 1, wCnBg[WALL_CLR]);
				}
				if(cMap[iC2y/MAS_CX][iC2x/MAS_CX] == '2')flag=1;
			}
		}
	}
}

void lcdSet(int iT)
{
	lcd_set_color(0x6420 | iT, 0xfca8);
}
/* ----------縦画面下切り替え サブルーチン*/
/*  (自機Ｘ座標 ,現階層)*/
void downScroll(int iMx ,int iMy)
{
	int iT, iJ;
	for(iT = 0;iT < MAP_SCR;iT++)/*変更中*/
	{
		/*１マス分描写*/
		blockWrite((iMy/MAS_PIX + iT + 1) * MAS_CX);
		materWrite(fncLoop((iMy/MAS_PIX + iT - 7) * MAS_CX, 32));
		darkWrite((iMy/MAS_PIX + iT + 1) * MAS_CX);
		

		/*１マス分スクロール*/
		/*for(iJ = 0; iJ < MAS_PIX; iJ++)
		{
			screen_set_scroll(SCREEN1,0,fncLoop(iMy-128+iT*MAS_PIX+iJ+1, 256));
			screen_set_scroll(SCREEN2,0,fncLoop(iMy-128+iT*MAS_PIX+iJ+1, 256));
			sprite_set_locx(SPN_MY  ,(int)iMx ,MAS_PIX*MAP_SCR-iT*MAS_PIX-iJ ,CHN_MY);
			sys_wait(1);
		}*/
		screen_set_scroll(SCREEN1,0,fncLoop(iMy-128+iT*MAS_PIX+16, 256));
		screen_set_scroll(SCREEN2,0,fncLoop(iMy-128+iT*MAS_PIX+16, 256));
		sprite_set_locx(SPN_MY  ,(int)iMx ,MAS_PIX*MAP_SCR-iT*MAS_PIX-16 ,CHN_MY);
		sprite_set_locx(SPN_BOX  ,(int)iMx ,MAS_PIX*MAP_SCR-iT*MAS_PIX+1 ,CHN_IT + MAS_CHR);
		sys_wait(1);
	}
	lcdSet(iMy/(MAP_SCR*MAS_PIX*3));
}

/* ----------縦画面上切り替え サブルーチン*/
/*  (自機Ｘ座標 ,現階層)*/
void upScroll(int iMx ,int iMy ,int deep)
{
	int iT, iJ;
	for(iT = MAP_SCR-1;iT >= 0;iT--)
	{
		/*１マス分描写*/
		blockWrite((deep*8 + iT) * MAS_CX);
		materWrite(fncLoop((deep*8 + iT) * MAS_CX, 32));
		darkWrite((deep*8 + iT) * MAS_CX);
		

		/*１マス分スクロール*/
		/*for(iJ = MAS_PIX-1; iJ >= 0; iJ--)
		{
			screen_set_scroll(SCREEN1,0,fncLoop(deep*128+iT*MAS_PIX+iJ, 256));
			screen_set_scroll(SCREEN2,0,fncLoop(deep*128+iT*MAS_PIX+iJ, 256));
			sprite_set_locx(SPN_MY  ,(int)iMx ,MAS_PIX*MAP_SCR-iT*MAS_PIX-iJ ,CHN_MY);
			sys_wait(1);
		}*/
		screen_set_scroll(SCREEN1,0,fncLoop(deep*128+iT*MAS_PIX, 256));
		screen_set_scroll(SCREEN2,0,fncLoop(deep*128+iT*MAS_PIX, 256));
		sprite_set_locx(SPN_MY  ,(int)iMx ,MAS_PIX*MAP_SCR-iT*MAS_PIX-16 ,CHN_MY);
		sprite_set_locx(SPN_BOX  ,(int)iMx ,MAS_PIX*MAP_SCR-iT*MAS_PIX+1 ,CHN_IT + MAS_CHR);
		sys_wait(1);
	}
	lcdSet(iMy/(MAP_SCR*MAS_PIX*3));
}
/*暗闇初期化*/
void dark_ini()
{
	int iTx;
	int iTy;

	for(iTy=0 ;iTy < MAP_HEIGHT*MAS_CX; iTy++)
		for(iTx=0 ;iTx < MAP_WIDTH*MAS_CX;iTx++)
			dMap[iTy][iTx] = 0;

	for(iTy=0 ;iTy < (MAP_SCR+1)*MAS_CX; iTy++)
		for(iTx=0 ;iTx < MAP_WIDTH*MAS_CX;iTx++)
			dMap[iTy][iTx] = 1;

	for(iTy=0 ;iTy < MAP_HEIGHT*MAS_CX; iTy++)
		dMap[iTy][27] = 1;
}

/*初期化*/
void ini(void)
{
	int iTx, iTy;

	/*音設定*/
	if(open_sound_il(&soundIL) != E_FS_SUCCESS) {
                /* ドライバが存在しない */
                return;
        }
        sounddrv_init();                    /* ドライバ用ワークの確保 */
        sound_open();                       /* HBLANK割り込みを開始 */
        parse_mml(_engine,	"o4<A32", 1);       /* ヒープ領域へ演奏データを格納 */
	parse_mml(_beep, 	"C", 2);       /* ヒープ領域へ演奏データを格納 */
	parse_mml(_gameover, 	"o4ccddeeffedc", 3);       /* ヒープ領域へ演奏データを格納 */
	parse_mml(_clear, 	"o4gffffeeeeddec", 4);       /* ヒープ領域へ演奏データを格納 */

	/*パレット設定(キャラクタパレット番号，LCDカラーパレット番号)*/
	palette_set_color(CPN_MY, 0x0740);

	/* LCD階調データ初期化 */
	lcd_set_color(0x6420, 0xfca8);
	  /*（LCDカラーパレット番号000-011のLCD階調，
	      LCDカラーパレット番号100-111のLCD階調 ）*/

	/* ディスプレイ設定 */
	display_control(DCM_SPR + DCM_SCR1 + DCM_SCR2);	/* SPR/SCR1表示 */
	text_screen_init();

   	/* スプライト設定（スプライト番号 ,スプライト個数）*/
    	sprite_set_range(SPN_ST, SP_MAX );

    	/*キャラクタ設定(キャラ番号 ,キャラ数 ,キャラデータ) */
    	font_set_colordata(CHN_MY ,CHX_MY ,cChrMy);   /* 主人公 */
    	font_set_colordata(CHN_BG ,CHX_BG ,cChrBg);   /* 背景 */
	font_set_colordata(CHN_MT ,CHX_MT ,cChrMt);   /* メーター */
	font_set_colordata(CHN_CS ,CHX_CS ,cChrCs);   /* カーソル */
	font_set_colordata(CHN_IT ,CHX_IT ,cChrItem);   /* アイテム */

	/*背景分のスクリーンキャラクタテーブルを作成*/
	for(iTx=0 ;iTx<BG_MAX ;iTx++)
		wCnBg[iTx][0] = (CPN_BG << 9) | CHN_BG + iTx;

	/*メーター分のスクリーンキャラクタテーブルを作成*/
	for(iTx=0 ;iTx<MT_MAX ;iTx++)
		wCnMt[iTx][0] = (CPN_MT << 9) | CHN_MT + iTx;

	/*アイテム分のスクリーンキャラクタテーブルを作成*/
	for(iTx=0 ;iTx<IT_MAX ;iTx++)
		for(iTy=0 ;iTy<MAS_CHR ;iTy++)
			wCnItem[iTx][iTy] = (CPN_IT << 9) | CHN_IT + iTy + (iTx*MAS_CHR);

	/*背景描写*/
	for(iTy=0 ;iTy<LCD_CHAR_WIDTH ;iTy+=2)
		blockWrite(iTy);

	/*暗闇描写*/
	dark_ini();

	/* メーター描写 */
	materWrite(0);

	for(iTy=0 ;iTy<LCD_CHAR_WIDTH ;iTy+=2)
		darkWrite(iTy);

	/* メーター描写 */
	materWrite(0);
}

void gameover()
{
	parse_mml(_clear, "l16o4ccddeeffl8edc", 1);
	se_play(_clear,0);

	sys_wait(10);
	lcd_set_color(0x6420, 0xfca8);
	sys_wait(10);
	lcd_set_color(0x7531, 0xfdb9);
	sys_wait(10);
	lcd_set_color(0x8642, 0xfeca);
	sys_wait(10);
	lcd_set_color(0xba98, 0xfedc);
	sys_wait(10);
	lcd_set_color(0xddcc, 0xffee);
	sys_wait(10);
	lcd_set_color(0xeeee, 0xffff);
	sys_wait(10);
	lcd_set_color(0xffff, 0xffff);
	sys_wait(10);
	lcd_set_color(0x6420, 0xfca8);

	
	text_screen_init();
	text_set_screen(1);
	text_put_string(9,10,"GAME OVER");
	key_wait();

	/*画面を塗りつぶす*/
	/*ＬＣＤセットし直し*/
	/*ゲームオーバー、HitAnyKeyの文字表示*/
	/*終了*/
	
}
void gameclear()
{
	parse_mml(_gameover, "l16o4gffffeeeeddec", 1);
	se_play(_gameover,0);

	sys_wait(10);
	lcd_set_color(0x6420, 0xfca8);
	sys_wait(10);
	lcd_set_color(0x6420, 0xeca8);
	sys_wait(10);
	lcd_set_color(0x5310, 0xdb97);
	sys_wait(10);
	lcd_set_color(0x3210, 0x7654);
	sys_wait(10);
	lcd_set_color(0x1100, 0x3322);
	sys_wait(10);
	lcd_set_color(0x1111, 0x0000);
	sys_wait(10);
	lcd_set_color(0x0000, 0x0000);
	sys_wait(10);
	lcd_set_color(0x6420, 0xfca8);

	
	text_screen_init();
	text_set_screen(1);
	text_put_string(7,10,"CONGRATULATION!");
	key_wait();
	/*画面を塗りつぶす*/
	/*ＬＣＤセットし直し*/
	/*ゲームオーバー、HitAnyKeyの文字表示*/
	/*終了*/
	
}
/*----------------------メインプログラム*/
void main(int argc, char *argv[]) {
	int iMac=0;	/*主人公アニメ用カウンタ*/
	int iMap=0;	/*主人公アニメ用パターン*/
	int iVector=0;	/*主人公の向き*/
	int iVecB=0;	/*主人公の一歩前の向き*/
	int iTac=0;	/*カーソルアニメ用カウンタ*/
	int iTap=0;	/*カーソルアニメ用パターン*/
	int iAir=LCD_PIXEL_HEIGHT - 2 - AIR_B;	/*空気の残量*/
	int iTank=0;	/*空気タンクの大きさ*/
	int iKey;		/*キー入力データ*/
	int iFr = 0;		/*フロア*/
	int iBox = 0;	/*宝箱を持っているかどうか判定*/
	double iMx=120.0,iMy=70.0;	/*主人公座標*/
	double iVx=0, iVy=0;	/*主人公スピード*/
	float iVr=0;		/*主人公アニメーションスピード*/
	int iTx,iTy;	/*テンポラリ*/

	ini();

	/*-------------メインループ*/
	for(;;)
	{
		sys_wait(1);	/*ループ内でウエイト*/

		/*----主人公アニメ処理------*/
		iMac=fncLoop(iMac+1 , 90 - (int)iVr);	/* アニメカウンタ加算ループ */
		if(iMac==0)
			iMap=fncLoop(iMap+1 ,MY_APT);	/* アニメパターン加算ループ */

		/*----カーソルアニメ処理------*/
		iTac=fncLoop(iTac+1 , 50);	/* アニメカウンタ加算ループ */
		if(iTac==0)
		{
			iTap=fncLoop(iTap+1 ,CS_APT);	/* アニメパターン加算ループ */
			iAir++;
		}

		/*空気が少ない時に警告*/
		if(!se_check() && iAir > 120)
		{
			parse_mml(_beep, "C", 1);
			se_play(_beep,0);	/*--------画面が点滅する様に工夫しよう！-----------------*/
		}
 
		/*空気が無くなると死ぬ*/
		if(iAir > 144){
			gameover();
			break;
		}

		/*-----------主人公のキー処理*/
		iKey = key_press_check();
    		if (iKey & KEY_START)
		{
			sound_close();		/* HBLANK割り込み停止 */
        		sounddrv_release();	/* ドライバ用ワークの開放 */
	    		break; 			/*プログラム終了*/
		}

		

		/*-----キャラ移動 */
	    	if(iKey & KEY_LEFT1)
		{
			iVecB = iVector;			/*左移動*/
			iVector = 0;
			iVx-=MOVE;
			iVr+=ROLL;
			if(!se_check())
			{
				parse_mml(_engine,"o4<A32", 1);       /* ヒープ領域へ演奏データを格納 */
				se_play(_engine, 0);   /* 演奏開始 */
			}
		}
   		if(iKey & KEY_RIGHT1)
		{
			iVecB = iVector;			/*右移動*/
			iVector = 1;
			iVx+=MOVE;
			iVr+=ROLL;
			if(!se_check())
			{
				parse_mml(_engine,"o4<A32", 1);       /* ヒープ領域へ演奏データを格納 */
				se_play(_engine, 0);   /* 演奏開始 */
			}
		}
	    	if(iKey & KEY_UP1)
		{					/*上移動*/
			iVy-=MOVE;
			
		}
   		if(iKey & KEY_DOWN1)
		{					/*下移動*/
			iVy+=MOVE;
		}

		/*座標の移動or跳ね返り*/
		if(fncMap(iMx+iVx,iMy) == BG_WALL)
		{
			iVx = -iVx;
			iMx+=iVx;
		}
		else
		{
			iMx+=iVx;
		}
		if(fncMap(iMx,iMy+iVy) == BG_WALL)
		{
			iVy = -iVy;
			iMy+=iVy;
		}
		else
		{
			iMy+=iVy;
		}

		/*----------海面に触れたら空気補給------*/
   		if(iMy < 3 * MAS_PIX)
		{
			if(iBox == 1){
				gameclear();
				break;
			}

			iVy = 0.1;
			iAir = LCD_PIXEL_HEIGHT - 2 -(AIR_B + iTank*TANK);
		}

		iTx = fncMap(iMx+iVx,iMy+iVy);
		/*----------宝箱に触れたら空気回復＆アイテム消去＆フラグ立て------*/
		if(iTx == 9)
		{
			parse_mml(_get, "l16o4gab>cd1", 1);
			se_play(_get,0);

			iAir = LCD_PIXEL_HEIGHT - 2 -(AIR_B + iTank*TANK);	/*空気回復*/
			
			blockWrite(fncLoop(iMy / MAS_PIX, MAP_HEIGHT) * MAS_CX);/*２ライン描写*/
			blockWrite(fncLoop(iMy / MAS_PIX, MAP_HEIGHT) * MAS_CX + 2);
			materWrite(fncLoop(iFr * 8 * MAS_CX, 32));
			iBox = 1;
		}

		/*----------タンクに触れたら空気回復＆最大値上昇＆アイテム消去------*/
		if(iTx == BG_TANK)
		{
			parse_mml(_get, "l16o4gab>cd1", 1);
			se_play(_get,0);

			iTank++;
			iMater = LCD_CHAR_HEIGHT - 7 - iTank;
			iAir = LCD_PIXEL_HEIGHT - 2 -(AIR_B + iTank*TANK);	/*空気回復*/
			
			/*iCx1 = fncLoop(iX + 2,MAP_WIDTH*MAS_PIX) / MAS_PIX;	/*座標→マス目変換*/
			/*iCy1 = fncLoop(iY +6,MAP_HEIGHT*MAS_PIX) / MAS_PIX;	/*座標→マス目変換*/
			
			blockWrite(fncLoop(iMy / MAS_PIX, MAP_HEIGHT) * MAS_CX);/*２ライン描写*/
			blockWrite(fncLoop(iMy / MAS_PIX, MAP_HEIGHT) * MAS_CX + 2);
			materWrite(fncLoop(iFr * 8 * MAS_CX, 32));
		}

		/*１画面下に移動*/
		if(iMy > (iFr + 1) * MAP_SCR * MAS_PIX)
		{
			iFr++;
			downScroll((int)iMx,(int)iMy);
		}
		/*１画面上に移動*/
		if(iMy < iFr * MAP_SCR * MAS_PIX)
		{
			iFr--;
			upScroll((int)iMx,(int)iMy,iFr);
		}

		/*速度更新*/
		iVx = iVx * BRAKE;
		iVy = iVy * BRAKE;
		iVr = iVr * BRAKE;

		/*----主人公表示(スプライト番号 ,X座標 ,Y座標 ,キャラ番号）*/
    		sprite_set_locx(SPN_MY  ,(int)iMx ,fncLoop((int)iMy,MAS_PIX*MAP_SCR) ,iMap*MAS_CHR+CHN_MY + iVector*16);
		if((iMx/CHR_PIX != (iMx+iVx)/CHR_PIX) || (iMy/CHR_PIX != (iMy+iVy)/CHR_PIX) || (iVector != iVecB))lightWrite((int)iMx,(int)iMy,iVector,0);
		if(iBox == 1)sprite_set_locx(SPN_BOX  ,(int)iMx ,fncLoop((int)iMy,MAS_PIX*MAP_SCR)+MAS_PIX+1 ,CHN_IT + MAS_CHR);
		else sprite_set_locx(SPN_BOX  ,0,145 ,CHN_IT + MAS_CHR);
		/*カーソル表示*/
		sprite_set_char(SPN_CS ,(CPN_CS-CPN_SP)<< 9 | CHN_CS + iTap);
		sprite_set_location(SPN_CS ,216 ,iAir);
	}
}