
/*
			 - BIO WORMS -
			    Ver0.02
			for WonderWitch.
				- 2001.01/xx. By NoisyWitch
			(Used:Turbo C)
		HP:	http://user.parknet.co.jp/wanisan/
		E-mail:	wanisan@parknet.co.jp
*/
#include	<sys/bios.h>
#include	<sys/libwwc.h>
#include	"./wnwww.def"
	/*	--------------------------------	*/
#include	"./cgd/wbwww.DAT"						/* パタ−ンデ−タ */
#include	"./cgd/wbwww.mpd"						/* マップデ−タ */
	/*	--------------------------------	*/
u_short	palette_wbwww_c[] = {							/* パレットデ−タ */
		0x0333,0x0000,0x0000,0x0000,0x39AC,0x0B02,0x0280,0x0200,
		0x0990,0x001F,0x0000,0x0000,0x0000,0x0000,0x7FFF,0x0000,
		0x39AC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
		0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x001F,0x0000,
		0x39AC,0x3B5C,0x2AD9,0x2697,0x2255,0x1E13,0x19D1,0x158F,
		0x114D,0x0D0B,0x08C9,0x0487,0x0066,0x001E,0x7BDE,0x0000,
		0x39AC,0x0000,0x0000,0x0000,0x0000,0x0000,0x316B,0x2929,
		0x20E7,0x18C6,0x1484,0x0C63,0x0421,0x0000,0x7BDE,0x0000,
		0x39AC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
		0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7FFF,0x0000,
		0x39AC,0x6B16,0x5A92,0x4A0E,0x3DAB,0x3149,0x2907,0x20C5,
		0x1883,0x0175,0x00F0,0x008B,0x0026,0x54DE,0x7BDE,0x0000,
		0x39AC,0x1150,0x0CEC,0x08A9,0x0466,0x0023,0x0000,0x0000,
		0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7FFF,0x0000,
		0x39AC,0x39AC,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
		0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7FFF,0x0000,
		0x39AC,0x72C0,0x5A00,0x4160,0x28A0,0x001E,0x6B5A,0x5AD6,
		0x4A52,0x39CE,0x294A,0x18C6,0x0C63,0x035E,0x7BDE,0x0000,
		0x39AC,0x3B5C,0x2ABA,0x15B7,0x00D5,0x000C,0x7314,0x6290,
		0x520D,0x418A,0x3127,0x20A4,0x1041,0x54DE,0x7BDE,0x0000,
		0x39AC,0x479E,0x2ABA,0x161A,0x0136,0x00AD,0x7314,0x6290,
		0x520D,0x418A,0x3127,0x20A4,0x1041,0x035E,0x7BDE,0x0000,
		0x39AC,0x6B16,0x5A92,0x4A0E,0x3DAB,0x3149,0x2907,0x20C5,
		0x1883,0x008B,0x6B5A,0x1194,0x7C1F,0x0300,0x7FFF,0x0000,
		0x39AC,0x3B94,0x174C,0x0A28,0x0100,0x5AD6,0x39CE,0x18C6,
		0x627E,0x3918,0x20B3,0x144E,0x0809,0x0804,0x7BDE,0x0000,
		0x39AC,0x7FBC,0x6F57,0x5270,0x3168,0x18A2,0x03DE,0x02BE,
		0x01BE,0x7FFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
		0x39AC,0x7B80,0x6280,0x49A0,0x30C0,0x63DE,0x17DE,0x165C,
		0x0155,0x53BF,0x3ED9,0x25F2,0x152C,0x0046,0x7BDE,0x0000,
		0x39AC,0x0C63,0x2529,0x4210,0x5EF7,0x0C63,0x18C6,0x2529,
		0x35AD,0x4210,0x4E73,0x5EF7,0x6B5A,0x7BDE,0x0000,0x7BDE,
};
	/*	--------------------------------	*/
u_short	wput_myship_msd[][4]={							/* MyShipData */
	{ 0x0000+ wSPPAL8,0x0000+ wSPPAL8,0x0000+ wSPPAL8,0x0000+ wSPPAL8 },
	{ 0x0080+ wSPPAL8,0x0081+ wSPPAL8,0x0090+ wSPPAL8,0x0091+ wSPPAL8 },	/* Up */
	{ 0x0082+ wSPPAL8,0x0083+ wSPPAL8,0x0092+ wSPPAL8,0x0093+ wSPPAL8 },	/* Down */
	{ 0x0084+ wSPPAL8,0x0085+ wSPPAL8,0x0094+ wSPPAL8,0x0095+ wSPPAL8 },	/* Left */
	{ 0x0086+ wSPPAL8,0x0087+ wSPPAL8,0x0096+ wSPPAL8,0x0097+ wSPPAL8 }	/* Right */
};
u_short	wput_enemy_msd[][4]={							/* MyShipData */
	{ 0x0000+ wSPPALB,0x0000+ wSPPALB,0x0000+ wSPPALB,0x0000+ wSPPALB },
	{ 0x00A0+ wSPPALB,0x00A1+ wSPPALB,0x00B0+ wSPPALB,0x00B1+ wSPPALB },	/* Up */
	{ 0x00A2+ wSPPALB,0x00A3+ wSPPALB,0x00B2+ wSPPALB,0x00B3+ wSPPALB },	/* Down */
	{ 0x00A4+ wSPPALB,0x00A5+ wSPPALB,0x00B4+ wSPPALB,0x00B5+ wSPPALB },	/* Left */
	{ 0x00A6+ wSPPALB,0x00A7+ wSPPALB,0x00B6+ wSPPALB,0x00B7+ wSPPALB },	/* Right */
	{ 0x00A8+ wSPPALB,0x00A9+ wSPPALB,0x00B8+ wSPPALB,0x00B9+ wSPPALB },	/* UL */
	{ 0x00AA+ wSPPALB,0x00AB+ wSPPALB,0x00BA+ wSPPALB,0x00BB+ wSPPALB },	/* DL */
	{ 0x00AC+ wSPPALB,0x00AD+ wSPPALB,0x00BC+ wSPPALB,0x00BD+ wSPPALB },	/* DR */
	{ 0x00AE+ wSPPALB,0x00AF+ wSPPALB,0x00BE+ wSPPALB,0x00BF+ wSPPALB },	/* UR */
	{ 0x00E0+ wSPPALE,0x00E1+ wSPPALE,0x00F0+ wSPPALE,0x00F1+ wSPPALE },	/* Bomb1 */
	{ 0x00E2+ wSPPALE,0x00E3+ wSPPALE,0x00F2+ wSPPALE,0x00F3+ wSPPALE },	/* Bomb2 */
	{ 0x00E4+ wSPPALE,0x00E5+ wSPPALE,0x00F4+ wSPPALE,0x00F5+ wSPPALE },	/* Bomb3 */
	{ 0x00E6+ wSPPALE,0x00E7+ wSPPALE,0x00F6+ wSPPALE,0x00F7+ wSPPALE },	/* Bomb4 */
	{ 0x00E8+ wSPPALE,0x00E9+ wSPPALE,0x00F8+ wSPPALE,0x00F9+ wSPPALE },	/* Bomb5 */
	{ 0x00EA+ wSPPALE,0x00EB+ wSPPALE,0x00FA+ wSPPALE,0x00FB+ wSPPALE },	/* Bomb6 */
	{ 0x00EC+ wSPPALE,0x00ED+ wSPPALE,0x00FC+ wSPPALE,0x00FD+ wSPPALE },	/* Bomb7 */
	{ 0x00EE+ wSPPALE,0x00EF+ wSPPALE,0x00FE+ wSPPALE,0x00FF+ wSPPALE },	/* Bomb8 */
};
u_short	wscupd[]={
	  0,  1,  2,  4,  8, 16, 32, 64, 96,128,192,256,384,512,999,999,
	999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,
};
/*	--------------------------------	*/
#define		WAIT1SEC		75					/* 75Vで1Sec */
#define		GAME_EXET		0xFF
#define		BOPRI			0					/* Bombのプライオリティ */
#define		ENPRI			24					/* 敵関係のプライオリティ */
#define		MYPRI			120					/* 自分関係のプライオリティ */
#define		SHOOTMAX		4					/* 弾変数 */
#define		BNOMAX			8					/* Bomb最大数 */
#define		ENOMAX			32					/* 敵最大数 */
	/*	--------------------------------	*/
	u_char	_mesbuf[32+ 1];							/* 汎用メッセ−ジ */
	u_char	_linebuf[32* 2+ 1];						/* 汎用ライン表示 */
	/*	--------------------------------	*/
	int	cont_key, trg_key;
	short	wtimer;
	u_char	wCLOCK;
	u_char	game_state;							/*ゲームの状態*/
	u_char	game_mode;							/*ゲームモード*/
	u_char	wSYS_WD;							/*ゲ−ムスピ−ド*/
	/*	--------------------------------	*/
static	long	wsc, whi;
	short	mtime;
	u_short	mncmb, mmcmb;
	u_char	mctime;
	u_char	mlife, mshipno, mwave, mcou, mpx, mpy;
	u_char	enno;
struct	{									/* 弾変数 */
	u_char	life, cou, px, py;
	}	ms[SHOOTMAX];
	/*	--------------------------------	*/
struct	{									/* Bomb変数 */
	u_char	life, px, py;
	}	bo[BNOMAX];
	/*	--------------------------------	*/
struct	{									/* 敵変数 */
	u_char	life, cou, px, py,time;
	}	en[ENOMAX];
	/*	--------------------------------	*/
	/*	--------------------------------	*/
	/*	--------------------------------	*/
void	wput4x4(u_char n, u_char p, u_char x, u_char y)
{	if(!p){
				sprite_set_location(n+ 0, 224, 144);
				sprite_set_location(n+ 1, 224, 144);
				sprite_set_location(n+ 2, 224, 144);
	}else{
		switch(wCLOCK& 3){						/* 表示(ＳＰが足りないんで時分割) */
			case	0:
				sprite_set_char_location(n+ 0, wput_enemy_msd[p][0], x+  8, y+ 16);
				sprite_set_char_location(n+ 1, wput_enemy_msd[p][1], x+ 16, y+ 16);
				sprite_set_char_location(n+ 2, wput_enemy_msd[p][2], x+  8, y+ 24);
				break;
			case	1:
				sprite_set_char_location(n+ 0, wput_enemy_msd[p][0], x+  8, y+ 16);
				sprite_set_char_location(n+ 1, wput_enemy_msd[p][1], x+ 16, y+ 16);
				sprite_set_char_location(n+ 2, wput_enemy_msd[p][3], x+ 16, y+ 24);
				break;
			case	2:
				sprite_set_char_location(n+ 0, wput_enemy_msd[p][0], x+  8, y+ 16);
				sprite_set_char_location(n+ 1, wput_enemy_msd[p][2], x+  8, y+ 24);
				sprite_set_char_location(n+ 2, wput_enemy_msd[p][3], x+ 16, y+ 24);
				break;
			case	3:
				sprite_set_char_location(n+ 0, wput_enemy_msd[p][1], x+ 16, y+ 16);
				sprite_set_char_location(n+ 1, wput_enemy_msd[p][2], x+  8, y+ 24);
				sprite_set_char_location(n+ 2, wput_enemy_msd[p][3], x+ 16, y+ 24);
				break;
		}
	}
}
	/*	--------------------------------	*/
void	wbomb(u_char f, u_char x, u_char y)					/* Bomb表示 */
{
	int	i;
	u_char	p;
	for(i = 0; i < BNOMAX; i++){
		switch(bo[i].life){
			case	0x00:
				if(f){
					f--;
					bo[i].life	= 0x10;
					bo[i].px	= (rand()& 0x7)* 2+ x;
					bo[i].py	= (rand()& 0x7)* 2+ y;
				}
				p	= 0;
				break;
			default:
				bo[i].life--;
				p	= 16- (bo[i].life/ 2);
				break;
		}
		wput4x4(i* 3+ BOPRI, p, bo[i].px, bo[i].py);
	}
}
	/*	--------------------------------	*/
void	wput_str(u_short att, u_char scno, u_char px, u_char py)
{
	int	i	= 0;
	int	j	= 0;
	u_short	p;
	while(1){
		if(!_mesbuf[i])	break;
		_linebuf[j]	= _mesbuf[i];	j++;
		_linebuf[j]	= att/ 0x100;	j++;
		i++;
	}
	if(i)	screen_set_char(scno, px, py, i, 0x01, _linebuf);
}
	/*	--------------------------------	*/
int	wscput(short up)
{
		wsc	= wsc+ up;
		sprintf(_mesbuf, "SC:%06ld0", wsc);		wput_str(0x0000, SCREEN2, 0x01, 0x01);
	if(wsc > whi){
		whi	= wsc;
		sprintf(_mesbuf, "HI:%06ld0", whi);		wput_str(0x0000, SCREEN2, 0x12, 0x01);
		return( 1);
	}
		return( 0);
}
	/*	--------------------------------	*/
int	wmyhit(u_char x, u_char y)
{
	short	ex, ey, mx, my;
	if(mlife != 0x01)					return( 0);
	ex	= x;	ey	= y;	mx	= mpx;	my	= mpy;
	if((ex == mx)&&((ey- 4) <= my)&&((ey+ 4) >= my)){	return( 1);	}
	if((ey == my)&&((ex- 4) <= mx)&&((ex+ 4) >= mx)){	return( 1);	}
								return( 0);
}
	/*	--------------------------------	*/
int	wen_shit(u_char x, u_char y)						/* 弾当たり？ */
{
	int	i;
	short	ex, ey, sx, sy;

	ex	= x;	ey	= y;
	for(i = 0; i < SHOOTMAX; i++){
		if(ms[i].life == 0x01){
			sx	= ms[i].px;	sy	= ms[i].py;
			if((ex == sx)&&((ey- 6) <= sy)&&((ey+ 6) >= sy)){	ms[i].life	= 0x04;	return( 1);	}	/**/
			if((ey == sy)&&((ex- 6) <= sx)&&((ex+ 6) >= sx)){	ms[i].life	= 0x04;	return( 1);	}	/**/

		}
	}
	return( 0);
}
	/*	--------------------------------	*/
void	wputcomb()
{
	if(mctime){
		mctime--;
		if(!mctime){
			mncmb	= 1;
			sprintf(_mesbuf, "---");	wput_str(0x0000, SCREEN2, 0x0D, 0x11);
			return;
		}
	}
	if(mncmb > 1){
		sprintf(_mesbuf, "%03d",wscupd[mncmb]);	wput_str(0x0000, SCREEN2, 0x0D, 0x11);
	}
}
	/*	--------------------------------	*/
void	wen_move()
{
	int	i, n, p;
	short	a;
	a	= 0;
	for(i = 0; i < ENOMAX; i++){
		p	= 0;
		switch(en[i].life){
			case	0x01:
				if((!(en[i].px% 0x30))&&(!(en[i].py& 0xF))){
					if(rand()& 3){
						en[i].cou	= (rand()& 0x3)+ 1;
					}
				}
				p	= en[i].cou;
				switch(en[i].cou){
					case	1:						/* up */
						if(en[i].py)		en[i].py	= en[i].py- 1;
						break;
					case	2:						/* down */
						if(en[i].py < 0x60)	en[i].py	= en[i].py+ 1;
						break;
					case	3:						/* left*/
						if(en[i].px)		en[i].px	= en[i].px- 1;
						break;
					case	4:						/* right */
						if(en[i].px < 0xC0)	en[i].px	= en[i].px+ 1;
						break;
				}
				if((i& 3) == (wCLOCK& 3)){
					if(wmyhit(en[i].px, en[i].py)){
						game_state	= 0x50;
						mlife		= 0x04;
						mcou		= mcou | 0x80;
						wtimer		= 0x40;
					}
					if(wen_shit(en[i].px, en[i].py)){
						if(mctime){	mncmb++;	if(mncmb > mmcmb)	mmcmb	= mncmb;	}
						a	= a+ wscupd[mncmb];
						en[i].life	= 0x08;
						en[i].time	= 0x00;
						mctime		= 32;
						enno--;				/* 敵の残り数減らし */
					}
				}
			break;
			case	0x08:
				p	= en[i].time+ 0x09;
				if(wCLOCK& 1)	en[i].time++;
				if(en[i].time >= 8){
					p		= 0x00;
					en[i].life	= 0x00;
				}
			break;
		}
		n	= (31- i)* 3+ ENPRI;
		n	= i* 3+ ENPRI;
		wput4x4(n, p, en[i].px, en[i].py);
	}
	if(a)	wscput(a);
}
	/*	--------------------------------	*/
int	wmy_time(short td, u_char scno, u_char px, u_char py)
{
	mtime	= mtime+ td;
	if(mtime <    0)	mtime	=    0;
	if(mtime > 9999)	mtime	= 9999;
	sprintf(_mesbuf, "%02d:%02d", mtime/ 100, (mtime% 100));
	wput_str(0x0000, scno, px, py);
	if((!mtime)&&(td))	return(-1);
				return( 0);
}
	/*	--------------------------------	*/
void	wmy_shoot()
{
	u_char	f, i;
	f	= 1;
	for(i = 0; i < SHOOTMAX; i++){
		switch(ms[i].life){
			case	0x00:
				sprite_set_location(MYPRI+ 4+ i, 224, 144);
				if((mlife == 0x01)&&(f)&&(trg_key& (KEY_A|KEY_B))){
					f		= 0x00;
					ms[i].life	= 0x01;
					ms[i].cou	= mcou;
					ms[i].px	= mpx;
					ms[i].py	= mpy;
				}
			break;
			case	0x01:
				switch(ms[i].cou){
					case	1:						/* up */
						if(ms[i].py > 1){
							ms[i].py	= ms[i].py- 2;
						}else{
							ms[i].py	= 0x00;
							ms[i].life	= 0x04;
						}
						sprite_set_char_location(MYPRI+ 4+ i, 0x00C0+ wSPPAL9, ms[i].px+ 12, ms[i].py+ 20);
						break;
					case	2:						/* down */
						if(ms[i].py < 0x5F){
							ms[i].py	= ms[i].py+ 2;
						}else{
							ms[i].py	= 0x60;
							ms[i].life	= 0x04;
						}
						sprite_set_char_location(MYPRI+ 4+ i, 0x00C1+ wSPPAL9, ms[i].px+ 12, ms[i].py+ 20);
						break;
					case	3:						/* left*/
						if(ms[i].px > 1){
							ms[i].px	= ms[i].px- 2;
						}else{
							ms[i].px	= 0x00;
							ms[i].life	= 0x04;
						}
						sprite_set_char_location(MYPRI+ 4+ i, 0x00C2+ wSPPAL9, ms[i].px+ 12, ms[i].py+ 20);
						break;
					case	4:						/* right */
						if(ms[i].px < 0xBF){
							ms[i].px	= ms[i].px+ 2;
						}else{
							ms[i].px	= 0xC0;
							ms[i].life	= 0x04;
						}
						sprite_set_char_location(MYPRI+ 4+ i, 0x00C3+ wSPPAL9, ms[i].px+ 12, ms[i].py+ 20);
						break;
				}
			break;
			case	0x04:
			case	0x05:
			case	0x06:
			case	0x07:
			case	0x08:
			case	0x09:
				sprite_set_char_location(MYPRI+ 4+ i, 0x00C2+ wSPPAL9+ (ms[i].life/ 2), ms[i].px+ 12, ms[i].py+ 20);
				ms[i].life++;
			break;
			case	0x0A:
				sprite_set_location(MYPRI+ 4+ i, 224, 144);
				ms[i].life	= 0x00;
			break;
		}
	}
}
	/*	--------------------------------	*/





	/*	--------------------------------	*/
void	wmy_move()
{
	if(mlife != 0x01)	return;
	if((!(mpx% 0x30))&&(!(mpy& 0xF))){
		switch(mcou){
			case	1:						/* up */
				if(cont_key& KEY_X4)	mcou	= 3;
				if(cont_key& KEY_X2)	mcou	= 4;
				if(cont_key& KEY_X3)	mcou	= 2;
				break;
			case	2:						/* down */
				if(cont_key& KEY_X4)	mcou	= 3;
				if(cont_key& KEY_X2)	mcou	= 4;
				if(cont_key& KEY_X1)	mcou	= 1;
				break;
			case	3:						/* left*/
				if(cont_key& KEY_X1)	mcou	= 1;
				if(cont_key& KEY_X3)	mcou	= 2;
				if(cont_key& KEY_X2)	mcou	= 4;
				break;
			case	4:						/* right */
				if(cont_key& KEY_X1)	mcou	= 1;
				if(cont_key& KEY_X3)	mcou	= 2;
				if(cont_key& KEY_X4)	mcou	= 3;
				break;
		}
	}
		switch(mcou){
			case	1:						/* up */
				if(mpy)		mpy	= mpy- 1;
				break;
			case	2:						/* down */
				if(mpy < 0x60)	mpy	= mpy+ 1;
				break;
			case	3:						/* left*/
				if(mpx)		mpx	= mpx- 1;
				break;
			case	4:						/* right */
				if(mpx < 0xC0)	mpx	= mpx+ 1;
				break;
		}
}
	/*	--------------------------------	*/
void	wput_map(u_char no, u_char py){						/* ＭＡＰ表示 */
	int	x, y;
	switch(no){
		case	0x00:							/* 表示 */
			for(y = 0; y < 8; y++){
				screen_set_char(SCREEN1, 0,  2+ y, 0x1C, 0x1, (wbwww_map+ ((2+  y)* 0x20)));
				screen_set_char(SCREEN1, 0, 16- y, 0x1C, 0x1, (wbwww_map+ ((16- y)* 0x20)));
				sys_wait(6);
			}
			break;
		case	0x01:							/* 消去 */
			for(y = 0; y < 8; y++){
				screen_set_char(SCREEN1, 0,  9- y, 0x1C, 0x1, wbwww_map);
				screen_set_char(SCREEN1, 0,  9+ y, 0x1C, 0x1, wbwww_map);
				sys_wait(6);
			}
			break;
		case	0x04:							/* 消去 */
				screen_set_char(SCREEN1, 0,  9- py, 0x1C, 0x1, wbwww_map);
				screen_set_char(SCREEN1, 0,  9+ py, 0x1C, 0x1, wbwww_map);
			break;
	}
}
	/*	--------------------------------	*/
void	wput_myship(u_char no, u_char cou)					/* 自分表示 */
{
	if(cou >= 0x80){
		if(wCLOCK& 0x04)	cou	= 0x00;				/* 点滅 */
	}
	cou	= cou& 0x7F;
	sprite_set_char_location(no+ 0, wput_myship_msd[cou][0], mpx+  8, mpy+ 16);
	sprite_set_char_location(no+ 1, wput_myship_msd[cou][1], mpx+ 16, mpy+ 16);
	sprite_set_char_location(no+ 2, wput_myship_msd[cou][2], mpx+  8, mpy+ 24);
	sprite_set_char_location(no+ 3, wput_myship_msd[cou][3], mpx+ 16, mpy+ 24);
}
	/*	--------------------------------	*/
int	wVkey()									/* ＫＥＹ入力 */
{
	int		key	= key_press_check();
	int		old, work;
	old		= cont_key;
	cont_key	= key;
	work		= (old^ cont_key);
	trg_key		= (work& cont_key);
}
	/*	--------------------------------	*/
void	main(void)
{
	int	i, j, k, l;
	u_char	wf;

	if ( wwc_get_hardarch() == HARDARCH_WS ){				/* カラースワンの確認 */
			text_screen_init();					/* 旧スワンならお知らせを出して終了 */
			text_put_string( 0, 6, "　　　　　　　−　ＢＩＯ　　ＷＯＲＭＳ　−" );
			text_put_string( 0, 9, "　　　　　　２００１　Ｎｏｉｓｙ　Ｗｉｔｃｈ" );
			text_put_string( 0,10, "　　　　Ａｌｌ　Ｒｉｇｈｔｓ　Ｒｅｓｅｒｖｅｄ．" );
			text_put_string( 0,14, "　このＳＯＦＴはＷｏｎｄｅｒＳｗａｎＣｏｌｏｒ専用です。" );
			text_put_string( 0,16, "　　　　旧ＷｏｎｄｅｒＳｗａｎでは実行できません。" );
			key_wait();
		return;
	}
	/*	--------------------------------	*/
	lcd_set_sleep(0);
	wwc_set_color_mode( COLOR_MODE_16COLOR );
	wwc_clear_font();
	screen_set_scroll(SCREEN1, 4, 4);
	screen_set_scroll(SCREEN2, 4, 4);
	/*	--------------------------------	*/
	wwc_font_set_colordata( 0x000, 256, wbwww );				/* フォント定義 */
	sprite_set_range(  0, 128);
	/*	--------------------------------	*/
	for ( i = 0; i < 16; i++ ) {						/* カラーのパレットを設定 */
		for ( j = 0; j < 16; j ++ ){					/* 5BitColor(0BGR)をWSに変換している */
			k	= palette_wbwww_c[i* 16+ j];			/* (SFCエディタ−作ったから。でも色味悪いのは失敗 */
			l	= (k & 0x001E/ 2)* 0x100+ (k & 0x03C0/ 4)+ (k & 0x7800/ 8)/ 0x100;
			wwc_palette_set_color( i, j, l );
		}
	}
	/*	--------------------------------	*/
	display_control(0x0000+ DCM_SPR+ DCM_SCR1+ DCM_SCR2 );
	screen_fill_char( SCREEN1, 0, 0, 32, 32, 0x000 );
	screen_fill_char( SCREEN2, 0, 0, 32, 32, 0x000 );
	for(i = 0; i < 128; i++)	sprite_set_location(i, 224, 144);
	lcd_set_sleep(1);
	/*	--------------------------------	*/
		wSYS_WD		=   1;
		game_state	=   0x00;					/*ゲームの状態*/
		game_mode	=   0;						/*ゲームモード*/
	/*	--------------------------------	*/
	/*	--------------------------------	*/
	/*	--------------------------------	*/
	while(game_state != GAME_EXET) {
		wVkey();
		sys_wait(wSYS_WD);
		wCLOCK++;
		if(cont_key& (KEY_Y1| KEY_Y2| KEY_Y3| KEY_Y4))	game_state	= GAME_EXET;
	/*	--------------------------------	*/
	switch(game_state){
		case	0x00:							/* Game Init. */
			wsc		= 0;	whi	= 5000;
			mctime		= 0;
			mncmb		= 1;	mmcmb		= 1;
			mwave		= 1;
			mshipno		= 2;
			mtime		= 9999;
			game_state	= 0x10;
			break;
	/*	--------------------------------	*/
		case	0x10:							/* Title Init. */
			for(i = 0; i < 128; i++)	sprite_set_location(i, 224, 144);
			screen_fill_char( SCREEN1, 0, 0, 32, 32, 0x000 );
			screen_fill_char( SCREEN2, 0, 0, 32, 32, 0x000 );
			sprintf(_mesbuf, "SC:%06ld0", wsc);		wput_str(0x0000, SCREEN2, 0x01, 0x01);
			wmy_time( 0, SCREEN2, 0x0c, 0x01);
			sprintf(_mesbuf, "HI:%06ld0", whi);		wput_str(0x0000, SCREEN2, 0x12, 0x01);
			sprintf(_mesbuf, "SHIP:%02d", mshipno);		wput_str(0x0000, SCREEN2, 0x01, 0x11);
			sprintf(_mesbuf, "[ %03d ]", mmcmb);		wput_str(0x0000, SCREEN2, 0x0B, 0x11);
			sprintf(_mesbuf, "WAVE:%02d", mwave);		wput_str(0x0000, SCREEN2, 0x15, 0x11);
			sprintf(_mesbuf, "   - BIO WORMS -");		wput_str(0x0000, SCREEN1, 0x05, 0x06);
			sprintf(_mesbuf, "  2001 NOISYWITCH");		wput_str(0x0000, SCREEN1, 0x05, 0x0E);
			sprintf(_mesbuf, "ALL RIGHTS RESERVED");	wput_str(0x0000, SCREEN1, 0x05, 0x0F);
			game_state++;
			break;
	/*	--------------------------------	*/
		case	0x11:
			if(!(wCLOCK& 0x20)){
				sprintf(_mesbuf, "PUSH       BUTTON");	wput_str(0x0000, SCREEN1, 0x06, 0x0B);
				sprintf(_mesbuf, "START");		wput_str(0x0200, SCREEN1, 0x0B, 0x0B);
			}else{
				sprintf(_mesbuf, "                 ");	wput_str(0x0000, SCREEN1, 0x06, 0x0B);
			}
			if(trg_key& (KEY_START|KEY_A|KEY_B))	game_state++;
			break;
	/*	--------------------------------	*/
		case	0x12:							/* Game Restart. */
			wsc		= 0;
			mctime		= 0;
			mncmb		= 1;	mmcmb		= 1;
			mwave		= 1;
			mshipno		= 2;
			mtime		= 9999;
			game_state	= 0x40;
			break;
	/*	--------------------------------	*/
		case	0x40:							/* Wave Start! */
			mlife	= 1;	mcou	= 3;	mpx	= 0xC0;	mpy	= 0x60;
			mtime	= 9999;
			mctime	= 0;	mncmb	= 1;	mmcmb	= 1;
			for(i = 0; i < 128; i++)	sprite_set_location(i, 224, 144);
			screen_fill_char( SCREEN1, 0, 0, 32, 32, 0x000 );
			sprintf(_mesbuf, "SC:%06ld0", wsc);		wput_str(0x0000, SCREEN2, 0x01, 0x01);
			wmy_time( 0, SCREEN2, 0x0c, 0x01);
			sprintf(_mesbuf, "HI:%06ld0", whi);		wput_str(0x0000, SCREEN2, 0x12, 0x01);
			sprintf(_mesbuf, "SHIP:%02d", mshipno);		wput_str(0x0000, SCREEN2, 0x01, 0x11);
			sprintf(_mesbuf, "[ --- ]");			wput_str(0x0000, SCREEN2, 0x0B, 0x11);
			sprintf(_mesbuf, "WAVE:%02d", mwave);		wput_str(0x0000, SCREEN2, 0x15, 0x11);
			for(i = 0; i < ENOMAX; i++)	en[ i].life	= 0x00;
			enno	=  mwave* 5;	if(enno > ENOMAX)	enno	= ENOMAX;
			for(i = 0; i < enno; i++){
				en[ i].life	= 0x01;	en[ i].cou	= (rand()& 0x3)+ 1;
				en[i].px	= (i% 5)* 0x30;	en[i].py	= (i/ 5)* 0x10;
			}
			for(i = 0; i < SHOOTMAX; i++)	ms[i].life	= 0x00;
			for(i = 0; i < BNOMAX; i++)	bo[i].life	= 0x00;
			sprintf(_mesbuf, "GET READY ?");		wput_str(0x0000, SCREEN1, 0x09, 0x09);
			wtimer	= 0x40;
			game_state++;
			break;
		case	0x41:							/* Wait. */
			wtimer--;
			if((wtimer < 0x20)&&(trg_key& (KEY_START|KEY_A|KEY_B)))	wtimer	= 0;
			if(!wtimer){
				wput_map(0x00, 0);
				game_state++;
			}
			break;
		case	0x42:							/* Play Loop */
			wputcomb();
			if(wmy_time(-4, SCREEN2, 0x0c, 0x01)){			/* 時間切れ？ */
						sprintf(_mesbuf, "TIME UP !");		wput_str(0x0200, SCREEN2, 0x0A, 0x09);
						game_state	= 0x50;
						mlife		= 0x04;
						mcou		= mcou | 0x80;
						wtimer		= 0x40;
			}
			wmy_move();
			wmy_shoot();
			wen_move();
			wput_myship(  MYPRI+ 0, mcou);				/* 自分表示 */
			if(!enno){
				sprintf(_mesbuf, "WAVE CLEAR!");		wput_str(0x0000, SCREEN2, 0x09, 0x09);
				wf		= 0x00;
				game_state	= 0x60;			/* WAVE Clear */
			}
			break;
	/*	--------------------------------	*/
		case	0x50:							/* Bomb */
							wf	= 0x00;
			if(wtimer > 0x08){
				if(!(wtimer& 0x3))	wf	= 1;
			}else{
				mcou	= 0x00;
			}
			wbomb(wf, mpx- 8, mpy- 8);				/* Bomb表示 */
			wputcomb();
			wmy_shoot();
			wen_move();
			wput_myship(  MYPRI+ 0, mcou);				/* 自分表示 */
			wtimer--;
			if(!wtimer){
				wf	= 0x00;
				game_state++;
			}
			break;
		case	0x51:
			wbomb(0x00, 0, 0);					/* Bomb表示 */
			wput_map(0x04, wf);					/* ＭＡＰ消し表示 */
			wen_move();
			if(!(wCLOCK& 0x3)){
				wf++;
				if(wf >= 8)	game_state++;
			}
			break;
		case	0x52:
			if(mshipno){
				mshipno--;
				sprintf(_mesbuf, "         ");		wput_str(0x0200, SCREEN2, 0x0A, 0x09);
				game_state	= 0x40;				/* Go */
			}else{
				wen_move();
				wtimer	= 0xC0;
				sprintf(_mesbuf, "GAME OVER");		wput_str(0x0000, SCREEN2, 0x0A, 0x09);
				game_state++;
			}
			break;
		case	0x53:
			wen_move();
			wtimer--;
			if((wtimer < 0x40)&&(trg_key& (KEY_START|KEY_A|KEY_B)))	wtimer	= 0;
			if(!wtimer)	game_state	= 0x10;			/* Go ReStart. */
			break;
	/*	--------------------------------	*/
		case	0x60:							/* Wave Clear! */
			wmy_move();
			wmy_shoot();
			wput_myship(  MYPRI+ 0, mcou);				/* 自分表示 */
			wput_map(0x04, wf);					/* ＭＡＰ消し表示 */
			wen_move();
			if(!(wCLOCK& 0x3)){
				wf++;
				if(wf >= 8)	game_state++;
			}
			break;
		case	0x61:							/* Wave Clear! */
			for(i = 0; i < 128; i++)	sprite_set_location(i, 224, 144);
			sys_wait(WAIT1SEC* 1);
			sprintf(_mesbuf, "           ");		wput_str(0x0000, SCREEN2, 0x09, 0x09);
			sprintf(_mesbuf, "- RESULT! -");		wput_str(0x0000, SCREEN1, 0x09, 0x06);
			sys_wait(WAIT1SEC* 1);
			wtimer	= 0;
			while(1){						/* Time Bonus */
				wtimer	= wtimer+ mwave;
				sprintf(_mesbuf, "TIMER:   %4d0*%2d", wtimer, mwave);	wput_str(0x0000, SCREEN1, 0x06, 0x09);
				wscput(mwave);
				if(wmy_time(-10, SCREEN2, 0x0c, 0x01))	break;	/* 時間切れ？ */
			}
			sys_wait(WAIT1SEC/ 2);
			sprintf(_mesbuf, "MAX COMB:%4d0*%2d",wscupd[mmcmb], mwave);	wput_str(0x0000, SCREEN1, 0x06, 0x0B);
			sys_wait(wscupd[mmcmb]* mwave);
			wscput(mwave* 2);
			mwave++;
			sys_wait(WAIT1SEC* 2);
			game_state	= 0x40;				/* Go */
			break;
	/*	--------------------------------	*/
		default:
			if(cont_key& KEY_START)	game_state	= GAME_EXET;
			break;
	}
	/*	--------------------------------	*/
	/*	--------------------------------	*/
	/*	--------------------------------	*/
	}
	/*	--------------------------------	*/
}
