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

#include "blocks.h"

#define NULLFONTSIZE		1
#define FULLFONTSIZE		1
#define BLOCKFONTSIZE		2*2*2*3	/*	２＊２のフォントが２つ分でひとつのブロックで、それが３つ。*/
#define NUMBERFONTSIZE		2*2*10	/*　２＊２のフォントが0から9までの１０通り*/
#define STOPFONTSIZE		stop_width		*stop_height
#define TITLEFONTSIZE		title_width		*title_height
#define GAMEOVERFONTSIZE	gameover_width	*gameover_height
#define OVERDASHFONTSIZE	overDash_width	*overDash_height/*星マークのこと*/
#define LABELFONTSIZE		label_width		*label_height
#define NAMEFONTSIZE		name_width		*name_height

#define NULLFONT		0
#define FULLFONT		NULLFONT	+NULLFONTSIZE
#define BLOCKFONT		FULLFONT	+FULLFONTSIZE
#define NUMBERFONT		BLOCKFONT	+BLOCKFONTSIZE
#define STOPFONT		NUMBERFONT	+NUMBERFONTSIZE
#define TITLEFONT		STOPFONT	+STOPFONTSIZE
#define GAMEOVERFONT	TITLEFONT	+TITLEFONTSIZE
#define OVERDASHFONT	GAMEOVERFONT+GAMEOVERFONTSIZE
#define LABELFONT		OVERDASHFONT+OVERDASHFONTSIZE
#define NAMEFONT		LABELFONT	+LABELFONTSIZE

#define LABELKETA		label_height
#define SCOREKETA		7
#define LEVELKETA		3
#define DASHKETA		3
#define GETKETA			6

#define	LABELSPRITE		0
#define SCORESPRITE		LABELKETA+LABELSPRITE
#define LEVELSPRITE		SCOREKETA*4+SCORESPRITE
#define DASHSPRITE		LEVELKETA*4+LEVELSPRITE
#define GETSPRITE		DASHKETA*4+DASHSPRITE
#define STARSPRITE		GETKETA*4+GETSPRITE

#define SPRITEEND		STARSPRITE

#define MoveBLOCK	1
#define StillBLOCK	2
#define TopBLOCK	3

#define BLOCKPALETTE	512		/*１番のパレット。ﾌﾞﾛｯｸの番号*/
#define SKELTONFONT		2048	/*４番のパレット。スプライトのときは１２番。透き通すときはこれを使っている*/
#define FRONTVIEW		8192	/*スプライトがスクリーン２よりも手前に表示される*/

#define SCREEN_WIDTH	17
#define SCREEN_HEIGHT	9


int timing;/*スクロールしている量。*/

int dash;/*連続で強制スクロールした回数*/
int maxdash;/*過去のdashの最高値*/

long score;
long level;/*ゲームレベル*/
int scrollwait;/*スクロールスピード*/

int scrolls;/*スクロール回数（１０で０に戻る）*/
int caution;/*0＝通常	1＝危険信号*/

long dashvisual;/*0＝通常	1以上＝ゲットポイントの表示が消える時刻*/
int starvisible;/*0＝通常	1＝★表示*/

int blockscounter;/*画面内にあるブロックを数えている*/

int gamemode;/*１＝通常		０＝練習モード（レベルが１のまま上がらない）*/

char map[SCREEN_WIDTH][SCREEN_HEIGHT];/*今の画面*/
char kmap[SCREEN_WIDTH][SCREEN_HEIGHT];/*画面変化前の記憶*/


/*関数の宣言*/
void mapdraw(void);
void chardraw(int,int,int,char);
void upmove(int);
void leftmove(int);
void rightmove(int);
void downmove(int);
void numbervisual(long,int,int);
void TITLE(void);
void gamestop(void);
void gameover(void);
void erasebefore(void);
void getting(void);
int scroll(int);


/*関数郡*/

void erasebefore()
{
	int x;
	int y;
	for (y=0;y<SCREEN_HEIGHT;y++){
		for(x=0;x<SCREEN_WIDTH;x++){kmap[x][y]=map[x][y];}
	}
}



/*移動関数・先端ブロックを動かすときのみ、ｘ＞＝2となる*/
void upmove(int blocknumber)
{
	int x;
	int y;
	int j;

	if (blocknumber==3){j=2;}else{j=0;}
erasebefore();
	for (y=0;y<SCREEN_HEIGHT;y++){
		for(x=SCREEN_WIDTH-3;x>=j;x--){
			if(map[x][y]==blocknumber && map[x+1][y]==0 && map[x+2][y]==0){ map[x+1][y]=blocknumber;map[x][y]=0;}
		}
	}
mapdraw();
}

void leftmove(int blocknumber)
{	
	int x;
	int y;
	int j;

	if (blocknumber==3){j=3;}else{j=1;}
erasebefore();
	for (y=1;y<SCREEN_HEIGHT;y++){
		for(x=j;x<SCREEN_WIDTH;x++){
			if(map[x][y]==blocknumber && map[x][y-1]==0 && map[x-1][y-1]==0 && map[x+1][y-1]==0) { map[x][y-1]=blocknumber;map[x][y]=0; }
		}
	}
mapdraw();
}

void rightmove(int blocknumber)
{
	int x;
	int y;
	int j;

	if (blocknumber==3){j=3;}else{j=1;}
erasebefore();
	for (y=SCREEN_HEIGHT-2;y>=0;y--){	
		for(x=j;x<SCREEN_WIDTH;x++){
			if(map[x][y]==blocknumber && map[x][y+1]==0 && map[x-1][y+1]==0 && map[x+1][y+1]==0) { map[x][y+1]=blocknumber;map[x][y]=0; }
		}
	}
mapdraw();
}

void downmove(int blocknumber)
{
	int x;
	int y;
	int j;
	
	if (blocknumber==3){j=3;}else{j=2;}
erasebefore();
	for (y=0;y<SCREEN_HEIGHT;y++){
		for(x=j;x<SCREEN_WIDTH;x++){
			if(map[x][y]==blocknumber && map[x-1][y]==0 && map[x-2][y]==0){ map[x-1][y]=blocknumber;map[x][y]=0; }
		}
	}
mapdraw();
}


void mapdraw()
{
	int x;
	int y;

	/*はじめに、すべてのつながりを初期化する。ｘ＜＝1のブロックは起点になるため残しとく*/
	for (y=0;y<SCREEN_HEIGHT;y++){
		for(x=2;x<SCREEN_WIDTH;x++){
			if (map[x][y]!=0){map[x][y]=MoveBLOCK;}
		}
	}
/*決定ブロックのみを検出。その中から先端ブロックを検出*/
						/*下の２列だけは普通の処理をしない*/
		if (map[1][0]==MoveBLOCK && (map[0][1]==StillBLOCK || map[0][1]==TopBLOCK))	{map[1][0]=StillBLOCK;}
	for (y=1;y<SCREEN_HEIGHT-1;y++){
		if (map[1][y]==MoveBLOCK && (map[0][y-1]==StillBLOCK || map[0][y-1]==TopBLOCK || map[0][y+1]==StillBLOCK || map[0][y+1]==TopBLOCK) )	{map[1][y]=StillBLOCK;}
	}
		if (map[1][SCREEN_HEIGHT-1]==MoveBLOCK && (map[0][SCREEN_HEIGHT-2]==StillBLOCK || map[0][SCREEN_HEIGHT-2]==TopBLOCK))	{map[1][SCREEN_HEIGHT-1]=StillBLOCK;}

		for (y=0;y<SCREEN_HEIGHT;y++){
			if (map[0][y]==TopBLOCK) 	{map[0][y]=StillBLOCK;}
			if (map[1][y]==TopBLOCK) 	{map[1][y]=StillBLOCK;}			
		}

		
	for(x=2;x<SCREEN_WIDTH;x++){
		if (map[x][0]==MoveBLOCK && (map[x-1][1]==StillBLOCK || map[x-1][1]==TopBLOCK) && map[x-2][0]==0)	{map[x][0]=StillBLOCK;}
		if (map[x][0]==MoveBLOCK && map[x-1][1]<=MoveBLOCK && (map[x-2][0]==StillBLOCK || map[x-2][0]==TopBLOCK))	{map[x][0]=StillBLOCK;}
		
		for (y=1;y<SCREEN_HEIGHT-1;y++){
			if (map[x][y]==MoveBLOCK && ((map[x-1][y-1]==StillBLOCK || map[x-1][y-1]==TopBLOCK || map[x-1][y+1]==StillBLOCK || map[x-1][y+1]==TopBLOCK) && map[x-2][y]==0) ){map[x][y]=StillBLOCK;}
			if (map[x][y]==MoveBLOCK && (map[x-1][y-1]<=MoveBLOCK && map[x-1][y+1]<=MoveBLOCK && (map[x-2][y]==StillBLOCK || map[x-2][y]==TopBLOCK) ))	{map[x][y]=StillBLOCK;}
		}
		if (map[x][SCREEN_HEIGHT-1]==MoveBLOCK && (map[x-1][SCREEN_HEIGHT-2]==StillBLOCK || map[x-1][SCREEN_HEIGHT-2]==TopBLOCK) && map[x-2][SCREEN_HEIGHT-1]==0)	{map[x][SCREEN_HEIGHT-1]=StillBLOCK;}
		if (map[x][SCREEN_HEIGHT-1]==MoveBLOCK && map[x-1][SCREEN_HEIGHT-2]<=MoveBLOCK && (map[x-2][SCREEN_HEIGHT-1]==StillBLOCK || map[x-2][SCREEN_HEIGHT-1]==TopBLOCK))	{map[x][SCREEN_HEIGHT-1]=StillBLOCK;}
	}

	/*先端ブロックを検出*/

	for(x=0;x<SCREEN_WIDTH-2;x++){
		if (map[x][0]==StillBLOCK && map[x+1][1]!=StillBLOCK && map[x+2][0]!=StillBLOCK)	{map[x][0]=TopBLOCK;}
		for (y=1;y<SCREEN_HEIGHT-1;y++){
			if (map[x][y]==StillBLOCK && map[x+1][y-1]!=StillBLOCK && map[x+1][y+1]!=StillBLOCK && map[x+2][y]!=StillBLOCK) {map[x][y]=TopBLOCK;}
		}
		if (map[x][SCREEN_HEIGHT-1]==StillBLOCK && map[x+1][SCREEN_HEIGHT-2]!=StillBLOCK && map[x+2][SCREEN_HEIGHT-1]!=StillBLOCK)	{map[x][SCREEN_HEIGHT-1]=TopBLOCK;}
	}

		if (map[SCREEN_WIDTH-2][0]==StillBLOCK && map[SCREEN_WIDTH-1][1]!=StillBLOCK)	{map[SCREEN_WIDTH-2][0]=TopBLOCK;}
		for (y=1;y<SCREEN_HEIGHT-1;y++){
			if (map[SCREEN_WIDTH-2][y]==StillBLOCK && map[SCREEN_WIDTH-1][y-1]!=StillBLOCK && map[SCREEN_WIDTH-1][y+1]!=StillBLOCK) {map[SCREEN_WIDTH-2][y]=TopBLOCK;}
		}
		if (map[SCREEN_WIDTH-2][SCREEN_HEIGHT-1]==StillBLOCK && map[SCREEN_WIDTH-1][SCREEN_HEIGHT-2]!=StillBLOCK)	{map[SCREEN_WIDTH-2][SCREEN_HEIGHT-1]=TopBLOCK;}


	/*画面をけす*/
	for (y=0;y<SCREEN_HEIGHT;y++){
			if(kmap[1][y]!=0 && kmap[1][y]!=map[1][y]){screen_fill_char(SCREEN1, 0 , y*2 , 2, 2, 0 ); }
	}
	for (y=0;y<SCREEN_HEIGHT;y++){
		for(x=2;x<SCREEN_WIDTH;x++){
			if(kmap[x][y]!=0 && kmap[x][y]!=map[x][y]){screen_fill_char(SCREEN1, (x*2)-4 , y*2 , 4, 2, 0 ); }
		}
	}

	screen_set_scroll(SCREEN1,timing,0);
	
	caution=0;
	for (y=0;y<SCREEN_HEIGHT;y++){
		for(x=0;x<SCREEN_WIDTH;x++){
			if((map[x][y]==MoveBLOCK && x<4) || (map[x][y]==TopBLOCK && x<3)){caution=1;}
			if(map[x][y]!=0){ chardraw(SCREEN1,x,y,map[x][y]); }
		}
	}
}

int scroll()
{
	int x;
	int y;
	int b;

	timing+=4;
	
	if (timing>=16){
		timing=0;

		for (y=0;y<SCREEN_HEIGHT;y++){
			if (map[1][y]==MoveBLOCK || map[1][y]==TopBLOCK || map[0][y]==MoveBLOCK || map[0][y]==TopBLOCK){return 1;}
			if (map[0][y]==StillBLOCK){score+=level;blockscounter--;}
		}

		erasebefore();

		for(x=0;x<SCREEN_WIDTH-1;x++){
			for (y=0;y<SCREEN_HEIGHT;y++){
				map[x][y]=map[x+1][y];
			}
		}
		for (y=0;y<SCREEN_HEIGHT;y++){
			if (blockscounter>20){b=8;}else{if(blockscounter>10){b=4;}else{b=2;}}

			map[SCREEN_WIDTH-1][y]=0;
			if(rand() % b==1 && map[SCREEN_WIDTH-2][y]==0){map[SCREEN_WIDTH-1][y]=1;blockscounter++;}
		}

		mapdraw();

		/*得点に関する処理はスクロールしたときに。	*/
		scrolls++;
		if (scrolls>=10){
			scrolls-=10;
			if(gamemode)level++;
		}
		
		
		/*強制スクロールだった場合、ダッシュ回数を足す*/
		if (dash!=0){
			dash++;
			if(dash>maxdash)maxdash=dash;
		}
		
		/*レベル80までは45から5。それからレベル100までは5から1。それからレベル130までは1。以降0。*/
		if (level<=80){scrollwait=45-level/2;}else{
			if (level<=100){scrollwait=21-level/5;}else{
				if (level<=130){scrollwait=1;}else{scrollwait=0;}
			}
		}
		if(!gamemode)scrollwait=200;
	}
	screen_set_scroll(SCREEN1,timing,0);
}

void chardraw (int screen,int x,int y,char chartype)
{
/*chardraw (スクリーン, ｘ座標,ｙ座標,キャラタイプ  1＝未決定、2＝決定、3＝先端*/
/*表示は半分ずつ。*/
int a;
a=--chartype*8;

x*=2;
y*=2;
x-=2;
	if(x<=32 && x>=0){
	screen_fill_char(screen, x  , y  , 1, 1, a+BLOCKFONT+BLOCKPALETTE );
	screen_fill_char(screen, x+1, y  , 1, 1, a+BLOCKFONT+BLOCKPALETTE+1 );
	screen_fill_char(screen, x  , y+1, 1, 1, a+BLOCKFONT+BLOCKPALETTE+2 );
	screen_fill_char(screen, x+1, y+1, 1, 1, a+BLOCKFONT+BLOCKPALETTE+3 );
	}

	if(x<=34 && x>=2){
	screen_fill_char(screen, x-2  , y  , 1, 1, a+BLOCKFONT+BLOCKPALETTE+4 );
	screen_fill_char(screen, x-2+1, y  , 1, 1, a+BLOCKFONT+BLOCKPALETTE+5 );
	screen_fill_char(screen, x-2  , y+1, 1, 1, a+BLOCKFONT+BLOCKPALETTE+6 );
	screen_fill_char(screen, x-2+1, y+1, 1, 1, a+BLOCKFONT+BLOCKPALETTE+7 );
	}

}

void numbervisual(long number,int keta,int spritenum)
{
	char numstring[8];
	int a;
	int k;
	int i;
	int j;
	int c;

	k=keta-sprintf(numstring, "%lu", number);

	for(a=0;a<k;a++){/*無い桁を０で埋める*/
		j=a*4+spritenum;
			for (c=0;c<4;c++){
				sprite_set_char(j+c,NUMBERFONT+c+SKELTONFONT+FRONTVIEW);
			}
	}

	for(a=0;a<keta-k;a++){
		i=NUMBERFONT+(numstring[a]-48)*4;
		j=(k+a)*4+spritenum;
			for (c=0;c<4;c++){
				sprite_set_char(j+c,i+c+SKELTONFONT+FRONTVIEW);
			}
	}
}

void getting()
{

	long getscore;
	int k;
	int a;

	getscore=(dash-10)*(dash-10)*level;

		if(getscore<10)			k=1;else
		if(getscore<100)		k=2;else
		if(getscore<1000)		k=3;else
		if(getscore<10000)		k=4;else
		if(getscore<100000)		k=5;else
		if(getscore<1000000)	k=6;else
		if(getscore<10000000)	k=7;

				/*得点ゲット時のスプライトの位置決め*/

	for (a=0;a<GETKETA;a++){
		sprite_set_char_location(a*4  +GETSPRITE,SKELTONFONT,150,42+a*10);	
		sprite_set_char_location(a*4+1+GETSPRITE,SKELTONFONT,158,42+a*10);
		sprite_set_char_location(a*4+2+GETSPRITE,SKELTONFONT,150,50+a*10);
		sprite_set_char_location(a*4+3+GETSPRITE,SKELTONFONT,158,50+a*10);
	}
	numbervisual(getscore,k,GETSPRITE);

	dashvisual=sys_get_tick_count()+150;

			/*強制ダッシュエンドの場合に数字横に星マークを表示*/
	if(dash-10==level){
		sprite_set_range(0,STARSPRITE+4);/*星も表示*/
		starvisible=1;
		sprite_set_char(  STARSPRITE,OVERDASHFONT  +SKELTONFONT);	
		sprite_set_char(1+STARSPRITE,OVERDASHFONT+1+SKELTONFONT);
		sprite_set_char(2+STARSPRITE,OVERDASHFONT+2+SKELTONFONT);
		sprite_set_char(3+STARSPRITE,OVERDASHFONT+3+SKELTONFONT);

	}else{sprite_set_range(0,GETSPRITE+GETKETA*4);/*GETSPRITEも表示*/}

	score+=getscore;

}

void MAINCODE ()
{
	int a;
	int x;
	int y;
	int key;
	int col;
	int bbb;

	int Xkeypush;/*Ｘキーを押してるか離してるか*/
	int keywait=7;/*キー反応のよさ*/
	long kwaiter=0;/*キー反応を待つ*/
	long swaiter=0;/*スクロール反応を待つ*/

	sprite_set_range(0,GETSPRITE);/*GETSPRITE未満のスプライト表示*/

	map[0][4]=StillBLOCK;
	map[2][4]=StillBLOCK;
	map[4][4]=StillBLOCK;
	map[6][4]=TopBLOCK;
	blockscounter=4;

	for (a=0;a<10;a++){
		x=(rand() % 6)+7;
		y=rand() % 9;
		if(map[x][y]==0 && map[x-1][y]==0 && map[x+1][y]==0){map[x][y]=MoveBLOCK;blockscounter++;}
	}

	mapdraw();

	while( 1 ){

if (kwaiter+keywait<=sys_get_tick_count()){

	kwaiter=sys_get_tick_count();
	key = key_press_check();

	
	if(key & KEY_START)	{gamestop();}

		if(key & KEY_Y1 && (key & KEY_Y3)==0){leftmove(MoveBLOCK);}
		if(key & KEY_Y3 && (key & KEY_Y1)==0){rightmove(MoveBLOCK);}
		if(key & KEY_Y4 && (key & KEY_Y2)==0){downmove(MoveBLOCK);}
		if(key & KEY_Y2 && (key & KEY_Y4)==0){upmove(MoveBLOCK);}

		if(key & KEY_X2 && key >= KEY_Y1 && key <= KEY_Y4<<1 && dash==0) {
			if(maxdash==0)maxdash=1;
			dash=1;keywait=3;
			Xkeypush=5;/*ダッシュ中のトップブロックの移動を防ぐ*/
			palette_set_color(1,1+16*3+256*5+4096*7);/*ダッシュ時のパレット*/
		}
		else{
			if(dash>0 && (dash<level+10 || !gamemode) && key & KEY_X2)	
				{timing+=16;swaiter=0;}
			else{
				if(gamemode && dash>=11)getting();
				if(dash!=0)Xkeypush=0;
				dash=0;
				keywait=6;
			}
		}
		
		if(Xkeypush!=5){
		switch (key){
			case KEY_X1:	if (Xkeypush!=1) { leftmove(TopBLOCK);	Xkeypush=1;}break;
			case KEY_X2:	if (Xkeypush!=2) { upmove(TopBLOCK);	Xkeypush=2;}break;
			case KEY_X3:	if (Xkeypush!=3) { rightmove(TopBLOCK);	Xkeypush=3;}break;
			case KEY_X4:	if (Xkeypush!=4) { downmove(TopBLOCK);	Xkeypush=4;}break;

			default:Xkeypush=0;
		}
		}

}

	if(dashvisual!=0) {
			bbb=(int)( dashvisual-sys_get_tick_count() )/4;
		if(bbb>0){
			for (a=0;a<GETKETA;a++){
				sprite_set_location(a*4  +GETSPRITE,190-bbb,42+a*10);
				sprite_set_location(a*4+1+GETSPRITE,198-bbb,42+a*10);
				sprite_set_location(a*4+2+GETSPRITE,190-bbb,50+a*10);
				sprite_set_location(a*4+3+GETSPRITE,198-bbb,50+a*10);
			}

			if(starvisible==1){
				sprite_set_location(  STARSPRITE,190-bbb,32);
				sprite_set_location(1+STARSPRITE,198-bbb,32);
				sprite_set_location(2+STARSPRITE,190-bbb,40);
				sprite_set_location(3+STARSPRITE,198-bbb,40);
			}

		}else{
				sprite_set_range(0,GETSPRITE);/*GETSPRITE未満のスプライト表示*/
				starvisible=0;
				dashvisual=0;
			}
	}

		numbervisual(score,SCOREKETA,SCORESPRITE);
		numbervisual(level,LEVELKETA,LEVELSPRITE);
		numbervisual(dash,DASHKETA,DASHSPRITE);

		if (caution==1){
			switch(sys_get_tick_count() & 16){
				case 0:	display_control(5);break;
				case 16:display_control(7);break;
			}
		}else{	display_control(5);}

		
		
		/*鼓動のところ*/
	if(gamemode){
		col=sys_get_tick_count() % (scrollwait+30);

		if(col<=10)	palette_set_color(1,1+16*3+256*5+4096*7); else /*濃度0	標準*/
		if(col<=17)	palette_set_color(1,1+16*4+256*5+4096*7); else /*濃度1*/
		if(col<=24)	palette_set_color(1,1+16*5+256*5+4096*7); else /*濃度2*/
		if(col<=28)	palette_set_color(1,1+16*6+256*5+4096*7); else /*濃度3*/
		if(col<=30)	palette_set_color(1,1+16*4+256*5+4096*7); else /*濃度1*/
					palette_set_color(1,1+16*3+256*5+4096*7);	   /*濃度0*/
	}



		if (swaiter+scrollwait<=sys_get_tick_count()){
			swaiter=sys_get_tick_count();
			if(scroll()==1){gameover();break;}/*ゲームオーバー判定*/
		}
	
		if(gamemode==2)break;
	}

}

void init ()
{
	
	display_control(7);
	srand( sys_get_tick_count() );
	lcd_set_segments(2);/*縦マーク表示*/

	font_set_monodata	(NULLFONT		,NULLFONTSIZE		,bmp_null	);
	font_set_monodata	(FULLFONT		,FULLFONTSIZE		,bmp_full	);
	font_set_colordata	(BLOCKFONT		,BLOCKFONTSIZE		,bmp_blocks	);
	font_set_monodata	(NUMBERFONT		,NUMBERFONTSIZE		,bmp_num	);
	font_set_monodata	(STOPFONT		,STOPFONTSIZE		,bmp_stop	);
	font_set_monodata	(TITLEFONT		,TITLEFONTSIZE		,bmp_title	);
	font_set_monodata	(GAMEOVERFONT	,GAMEOVERFONTSIZE	,bmp_gameover);
	font_set_monodata	(OVERDASHFONT	,OVERDASHFONTSIZE	,bmp_overDash);
	font_set_monodata	(LABELFONT		,LABELFONTSIZE		,bmp_label	);
	font_set_monodata	(LABELFONT		,LABELFONTSIZE		,bmp_label	);
	font_set_monodata	(NAMEFONT		,NAMEFONTSIZE		,bmp_name	);

}
void START()
{
	int x;
	int y;
	int a;

	display_control(7);
	sprite_set_range(0,0);
	screen_set_scroll(SCREEN1,0,0);
	screen_set_scroll(SCREEN2,0,0);
	screen_fill_char(SCREEN1,0,0,32,32,0);
	screen_fill_char(SCREEN2,0,0,32,32,SKELTONFONT);

	/*とりあえずスプライトの内容を消しとく*/
	for(a=0;a<SPRITEEND;a++){sprite_set_char(a,SKELTONFONT);}

	score=0;
	level=1;
	dash=0;
	maxdash=0;
	timing=0;
	scrolls=0;
	caution=0;
	dashvisual=0;



					/*ラベルの位置決め*/
	for (a=0;a<2;a++){sprite_set_char_location(a+LABELSPRITE,LABELFONT+a+SKELTONFONT+FRONTVIEW,216,15+a*8);}
	for (a=2;a<4;a++){sprite_set_char_location(a+LABELSPRITE,NULLFONT+SKELTONFONT			  ,216,33+(a-2)*8);}
	for (a=4;a<6;a++){sprite_set_char_location(a+LABELSPRITE,LABELFONT+a+SKELTONFONT+FRONTVIEW,216,49+(a-4)*8);}
	for (a=6;a<LABELKETA;a++){sprite_set_char_location(a+LABELSPRITE,LABELFONT+a+SKELTONFONT+FRONTVIEW,216,127+(a-6)*8);}

					/*得点スプライトの位置決め*/
	for (a=0;a<SCOREKETA;a++){
		sprite_set_location(a*4  +SCORESPRITE,203,68+a*10);
		sprite_set_location(a*4+1+SCORESPRITE,211,68+a*10);
		sprite_set_location(a*4+2+SCORESPRITE,203,76+a*10);
		sprite_set_location(a*4+3+SCORESPRITE,211,76+a*10);
	}

					/*Ｌｅｖｅｌスプライトの位置決め*/
	for (a=0;a<LEVELKETA;a++){
		sprite_set_location(a*4  +LEVELSPRITE,203,-6+a*10);	
		sprite_set_location(a*4+1+LEVELSPRITE,211,-6+a*10);
		sprite_set_location(a*4+2+LEVELSPRITE,203,2+a*10);
		sprite_set_location(a*4+3+LEVELSPRITE,211,2+a*10);
	}

					/*ＤＡＳＨスプライトの位置決め*/
	for (a=0;a<DASHKETA;a++){
		sprite_set_location(a*4  +DASHSPRITE,203,31+a*10);	
		sprite_set_location(a*4+1+DASHSPRITE,211,31+a*10);
		sprite_set_location(a*4+2+DASHSPRITE,203,39+a*10);
		sprite_set_location(a*4+3+DASHSPRITE,211,39+a*10);
	}

	numbervisual(score,SCOREKETA,SCORESPRITE);
	numbervisual(level,LEVELKETA,LEVELSPRITE);
	numbervisual(dash,DASHKETA,DASHSPRITE);

	for (x=0;x<SCREEN_WIDTH;x++){	
		for (y=0;y<SCREEN_HEIGHT;y++){
			map[x][y]=0;
		}
	}

}

void main ()
{	
	init();

while(1){
	START();
	TITLE();
	MAINCODE();
}

}

void gamestop()
{
	int x;
	int y;
	int key;
		display_control(7);
		
		for (x=0;x<stop_width;x++){	
			for (y=0;y<stop_height;y++){
				screen_fill_char(SCREEN2, x+14  , y+1  , 1, 1, STOPFONT+x+y*stop_width );
			}
			sys_wait(2);
		}

		while(1){
			key=key_wait();
			if (key==KEY_START)	{display_control(5);sys_wait(20);break;}
			if (key==KEY_B)		{gamemode=2;break;}/*gamemodeを一時的に2にしてあとでMAINCODE内でタイトルに抜ける*/
		}
		screen_fill_char(SCREEN2,0,0,32,32,1+SKELTONFONT);
}


void gameover()
{

	int x;
	int y;
	int a;

		display_control(7);

		for (x=0;x<gameover_width;x++){	
			for (y=0;y<gameover_height;y++){
				screen_fill_char(SCREEN2, x+17  , y  , 1, 1, GAMEOVERFONT+x+y*gameover_width );
			}
		}
			screen_fill_char(SCREEN2, 10 , 0 , 7, 18,NULLFONT);

					/*ラベルの位置決め*/
		for (a=0;a<2;a++){			sprite_set_location(a+LABELSPRITE,121,24+a*8);}
		for (a=2;a<4;a++){	   sprite_set_char_location(a+LABELSPRITE,LABELFONT+a+SKELTONFONT+FRONTVIEW,85,8+(a-2)*8);}
		for (a=4;a<6;a++){			sprite_set_location(a+LABELSPRITE, 85,24+(a-4)*8);}
		for (a=6;a<LABELKETA;a++){	sprite_set_location(a+LABELSPRITE,103,24+(a-6)*8);}

					/*Ｌｅｖｅｌスプライトの位置決め*/
		for (a=0;a<LEVELKETA;a++){
			sprite_set_location(a*4  +LEVELSPRITE,118,40+a*10);
			sprite_set_location(a*4+1+LEVELSPRITE,126,40+a*10);
			sprite_set_location(a*4+2+LEVELSPRITE,118,48+a*10);
			sprite_set_location(a*4+3+LEVELSPRITE,126,48+a*10);
		}
					/*得点スプライトの位置決め*/
		for (a=0;a<SCOREKETA;a++){
			sprite_set_location(a*4  +SCORESPRITE,100,40+a*10);
			sprite_set_location(a*4+1+SCORESPRITE,108,40+a*10);
			sprite_set_location(a*4+2+SCORESPRITE,100,48+a*10);
			sprite_set_location(a*4+3+SCORESPRITE,108,48+a*10);
		}
					/*ＤＡＳＨスプライトの位置決め*/
		for (a=0;a<DASHKETA;a++){
			sprite_set_location(a*4  +DASHSPRITE, 82,40+a*10);
			sprite_set_location(a*4+1+DASHSPRITE, 90,40+a*10);
			sprite_set_location(a*4+2+DASHSPRITE, 82,48+a*10);
			sprite_set_location(a*4+3+DASHSPRITE, 90,48+a*10);
		}
		numbervisual(maxdash,DASHKETA,DASHSPRITE);

	while(1){
			if (key_wait()==KEY_START){break;}
	}
}


void TITLE()
{
	int x;
	int y;
	int key;
	int yure=30;
	long time=0;

		screen_set_scroll(SCREEN1, 16,0);
		screen_set_scroll(SCREEN2,100,0);

		palette_set_color(1,1+16*3+256*5+4096*7);/*ブロックのパレットを初期化*/

		for (y=0;y<SCREEN_HEIGHT;y++){
			for (x=1&y;x<SCREEN_WIDTH+1;x+=2){
				if((rand() % 3)!=1){chardraw(SCREEN1,x,y,2);}
			}
		}

		for (y=0;y<name_height;y++){
			screen_fill_char(SCREEN1, 2 , y , 1, 1, NAMEFONT+y);
		}

		for (x=0;x<title_width;x++){
			for (y=0;y<title_height;y++){
				screen_fill_char(SCREEN2, x+14  , y  , 1, 1, TITLEFONT+x+y*title_width+SKELTONFONT);
			}
		}

		for(x=100;x>0;x-=8){
			screen_set_scroll(SCREEN2,x,0);
			sys_wait(1);
		}

	while (1){
		key=key_press_check();
		if(key>=16 || key==KEY_START){gamemode=1;break;}
		if(key==KEY_A)	{gamemode=0;break;}
		if(key==KEY_B)	{bios_exit();}

		if (time+10<=sys_get_tick_count() && yure>=4)	{time=sys_get_tick_count();yure-=2;}
	
		screen_set_scroll(SCREEN2,rand() % yure-yure/2,rand() % yure-yure/2);

	}
	
		screen_fill_char(SCREEN2,0,0,32,32,1+SKELTONFONT);
		screen_set_scroll(SCREEN2,0,0);
		display_control(5);
		
		while(1){if(key_press_check()!=KEY_START)break;}

		screen_fill_char(SCREEN1,0,0,32,32,0);
		screen_set_scroll(SCREEN1, 0,0);
}

