#include "bury.h" 

/*使用スプライト
1〜4　　自機
5〜9　　得点表示
10〜14　  残機表示
15〜23　  メッセージ表示
24〜43　  敵弾
46〜62　  弾
64〜120   敵
121〜124　アイテムボックス
125〜128　アイテム
*/

kyara  jiki = {64,80, 1, NORMAL, 9, 9, DEFAULT, 3, 15, 0,0};
kyara  teki[TEKI_KAZU];
kyara3 teki_tama[T_TAMA_KAZU] = {
/*		 x,y 移動量 s_no  状態*/
/* 0*/	{0,0, 0,0,  24,  FALSE},/* 1*/	{0,0, 0,0,  25,  FALSE},
/* 2*/	{0,0, 0,0,  26,  FALSE},/* 3*/	{0,0, 0,0,  27,  FALSE},
/* 4*/	{0,0, 0,0,  28,  FALSE},/* 5*/	{0,0, 0,0,  29,  FALSE},
/* 6*/	{0,0, 0,0,  30,  FALSE},/* 7*/	{0,0, 0,0,  31,  FALSE},
/* 8*/	{0,0, 0,0,  32,  FALSE},/* 9*/	{0,0, 0,0,  33,  FALSE},
/*10*/	{0,0, 0,0,  34,  FALSE},/*11*/	{0,0, 0,0,  35,  FALSE},
/*12*/	{0,0, 0,0,  36,  FALSE},/*13*/	{0,0, 0,0,  37,  FALSE},
/*14*/	{0,0, 0,0,  38,  FALSE},/*15*/	{0,0, 0,0,  39,  FALSE},
/*16*/	{0,0, 0,0,  40,  FALSE},/*17*/	{0,0, 0,0,  41,  FALSE},
/*18*/	{0,0, 0,0,  42,  FALSE},/*19*/	{0,0, 0,0,  43,  FALSE},
};
/*弾のデータ*/
kyara2 tama[TAMA_KAZU] = {
/*0*/	{0, 0, 0, 46, FALSE, 0},/*1*/	{0, 0, 0, 47, FALSE, 0},
/*2*/	{0, 0, 0, 48, FALSE, 0},/*3*/	{0, 0, 0, 49, FALSE, 0},
/*4*/	{0, 0, 0, 50, FALSE, 0},/*5*/	{0, 0, 0, 51, FALSE, 0},
/*6*/	{0, 0, 0, 52, FALSE, 0},/*7*/	{0, 0, 0, 53, FALSE, 0},
/*8*/	{0, 0, 0, 54, FALSE, 0},/*9*/	{0, 0, 0, 55, FALSE, 0},
/*10*/	{0, 0, 0, 56, FALSE, 0},/*11*/	{0, 0, 0, 57, FALSE, 0},
/*12*/	{0, 0, 0, 58, FALSE, 0},/*13*/	{0, 0, 0, 59, FALSE, 0},
/*14*/	{0, 0, 0, 60, FALSE, 0},/*15*/	{0, 0, 0, 61, FALSE, 0},
/*16*/	{0, 0, 0, 61, FALSE, 0},/*17*/	{0, 0, 0, 62, FALSE, 0},
};
kyara4 item = {0,0, ITEM, P, FALSE};

void stage(void)
{
	unsigned old_ten=9999, ten=0;
	int      dx, dy, timer=0;
	char     i, j, link, speed=2, shot=2, tama_ct=0, scr1_x=0;

	map1_set_data();
	zanki_set();

	while (1) {
		/*イベント制御*/
		if (timer >=  0) {
			map1_phase(timer++);
			if (timer == B(700)) {timer = B(65);}
		}


		/*自機描画、点の更新、スクロール*/
		if (jiki_set() == NG)	 {return;}
		if (jiki.mode  == BREAK) {speed = 2; shot = 2;}
		sys_wait(2);
		screen_set_scroll(SCREEN1, scr1_x+=2, 0);
		if (old_ten != ten) {ten_view(ten); old_ten = ten;}
		
		teki_tama_view();
		tama_view();
		
		/*敵の処理*/
		for (i=0; i<TEKI_KAZU; i++) {
			if (teki_view(i) == NG) {continue;}
			teki[i].pal[0] = teki[i].pal[1];
			/*弾が敵に当たったかの判定*/
			for (j=0; j<TAMA_KAZU; j++) {
				if (tama[j].mode != TURUE) {continue;}
					
				if ( (((tama[j].x+4 - teki[i].x) & 0xf0) == 0) && (((tama[j].y+4 - teki[i].y) & 0xf0) == 0) ) {
					tama[j].mode = MEITYU;

					/*リンクしている場合、リンクしている敵全てにダメージ*/
					if (teki[i].link_size == 0) {
						teki[i].pal[0] = 15;
						teki[i].ap--;
					}
					else {
						for (link=0; link<teki[i].link_size; link++) {
							teki[ teki[i].link_no+link ].pal[0] = 15;
							teki[ teki[i].link_no+link ].ap--;
						}
					}
				}
			}
			/*耐久力が0以下になっていたら爆発*/
			if (teki[i].ap >= 245) {
				if (teki[i].mode == ITEM_BOX) {
					item.x = teki[i].x;
					item.y = teki[i].y;
					item.mode = TURUE;
					}
				else if (teki[i].mode == BOSS) {
					ten       += 200;
					timer      = -1;
					jiki.mode  = END;
				}
				teki[i].timer = 15;
				teki[i].mode = BREAK;
				ten += 100;
			}

			/*敵が自機に当たったかの判定*/
			if (jiki.mode == DEFAULT) {
				if (teki[i].mode != ITEM_BOX) {
					dx = teki[i].x-(jiki.x+7);
					dy = teki[i].y-(jiki.y+7);
					if ( (-16 < dx) && (dx < 2) && (-16 < dy) && (dy < 2) ) {
						jiki.mode = BREAK;
						jiki.ap--;
					}
				}
			}
		}

		/*アイテム*/
		if (item.mode == TURUE) {
			if (--item.x+16 > 240) {item.mode = FALSE;}
		
			if (jiki.mode == DEFAULT || jiki.mode == MUTEKI) {
				dx = item.x-(jiki.x+7);
				dy = item.y-(jiki.y+7);
				if ( (-16 < dx) && (dx < 2) && (-16 < dy) && (dy < 2) ) {
					if (item.k_no == P)	 {
						if (shot < 4)    {shot++;}
						else		     {ten += 500;}
						}
					else if (item.k_no == S)	 {
						if (speed < 4 )  {speed++;}
						else		     {ten += 500;}
						}
					else if (item.k_no == ONEUP) {
						if (jiki.ap < 5) {jiki.ap++; zanki_set();}
						else			 {ten += 2000;}
					}
					item.x = 224;
					item.mode = FALSE;
				}
			}

			spr_set_view(ITEM);
		}

		/*キー入力*/
		if (jiki.mode == DEFAULT || jiki.mode == MUTEKI) {
			unsigned key= key_press_check();

			if		(key & KEY_START) {while (key_press_check() & KEY_START){}return;}
			if		(key & KEY_Y1) {jiki.y-=speed; if (jiki.y >= 245) {jiki.y=  0;} jiki.k_no= LEFT;}
			else if (key & KEY_Y3) {jiki.y+=speed; if (jiki.y >= 128) {jiki.y=128;} jiki.k_no=RIGHT;}
			if		(key & KEY_Y4) {jiki.x-=speed; if (jiki.x >= 245) {jiki.x=  0;}}
			else if (key & KEY_Y2) {jiki.x+=speed; if (jiki.x >= 198) {jiki.x=200;}}

			/*ショット1*/
			if (key & KEY_X3) {
				if (timer % 6 == 0) {
					switch (shot) {
					case 2:
						if ((tama_ct+=2) >= TAMA_KAZU-2) {tama_ct = 0;}
						tama_set(jiki.x+12, jiki.y,   0, tama_ct  );
						tama_set(jiki.x+12, jiki.y+8, 0, tama_ct+1);
						break;
					case 3:
						if ((tama_ct+=3) >= TAMA_KAZU-3) {tama_ct = 0;}
						tama_set(jiki.x+8,  jiki.y+2, -2, tama_ct+1);
						tama_set(jiki.x+12, jiki.y+4,  0, tama_ct+2);
						tama_set(jiki.x+8,  jiki.y+6,  2, tama_ct+3);
						break;
					case 4:
						if ((tama_ct+=4) >= TAMA_KAZU-4) {tama_ct = 0;}
						tama_set(jiki.x+8,  jiki.y-2,  -2, tama_ct+1);
						tama_set(jiki.x+12, jiki.y,     0, tama_ct+2);
						tama_set(jiki.x+12, jiki.y+8,   0, tama_ct+3);
						tama_set(jiki.x+8,  jiki.y+10,  2, tama_ct+4);
						break;
					default:
						break;					
					}
				}
			}
		}
	}
}

void tama_view(void)
{
	int i;

	/*弾*/
	for (i=0; i<TAMA_KAZU; i++) {
		/*弾の移動*/
		if (tama[i].mode == TURUE) {
			tama[i].y += tama[i].s_y;
			if (tama[i].x < 224) {tama[i].x    += 11   ;}
			else				 {tama[i].mode  = FALSE;}
			sprite_set_location(tama[i].s_no, tama[i].x, tama[i].y);
		}
		/*着弾時のエフェクト*/
		else if (tama[i].mode  == MEITYU) {
			if  (tama[i].timer <= 2) {
				sprite_set_char( tama[i].s_no, (HIBANA(tama[i].timer) | PALETTE(8)) );
				tama[i].timer++;
			}
			else if (tama[i].timer == 3) {
				tama[i].y = 224;
				tama[i].mode = FALSE;
				sprite_set_location(tama[i].s_no, tama[i].x, tama[i].y );
			}
		}
	}
}

void teki_tama_view(void)
{
	extern kyara  jiki;
	extern kyara3 teki_tama[T_TAMA_KAZU];
	int    i;

	for (i=0; i<T_TAMA_KAZU; i++) {
		if (teki_tama[i].mode == FALSE) {continue;}

		/*弾が画面の外に出たら、それ以上移動させない*/
		if (teki_tama[i].x+8 > 232 || teki_tama[i].y+8 > 152) {
			teki_tama[i].mode = FALSE;
		}
		else {
			teki_tama[i].x += teki_tama[i].s_x;
			teki_tama[i].y += teki_tama[i].s_y;
			sprite_set_location(teki_tama[i].s_no, teki_tama[i].x, teki_tama[i].y);
		}

		/*敵弾が自機に当たったかの判定*/
		if (jiki.mode == DEFAULT) {
			if ( ((( (teki_tama[i].x+4)-(jiki.x+4) ) & 0xf8) == 0) && ((( (teki_tama[i].y+4)-(jiki.y+4) ) & 0xf8) == 0) ) {
				jiki.mode = BREAK;
				jiki.ap--;
			}
		}
	}
}
