 /****************************************************************************
  ****************************************************************************
  ****                                                                    **** 
  ****               Ｎ．Ｂａｂａ Original Board Game                     **** 
  ****                                                                    **** 
  ****                                                                    **** 
  ****               Ｌｉｑｕｉｄ  Ｍｅｔａｌ  Ｂａｔｔｌｅ               **** 
  ****                                                                    **** 
  ****                                                                    **** 
  ****                                               Ver 1.0              **** 
  ****                                                                    **** 
  ****                                                                    **** 
  ****************************************************************************
  ****************************************************************************/


#include <stdio.h>
#include <conio.h>
#include <strings.h>
#include <stdlib.h>
#include <memory.h>
#include <snd.h>
#include <msdos.cf>
#include "graph.h"
#include "eup.h"
#include "pcm.h"
#include "pad.h"
#include "baba.h"
#include "canmove.h"
#include "mind_1_2.h"


/*  関数のプロトタイプ宣言	*/
void	ginit();
void	meminit();
void	memget();
void	memfree();
void	gload();
void	eupload();
void	sndload();
void	palinit();
void	speed(int);
void	opload();
void	opening();
void	bgmsel();
void	drawboard();
void	setg();
void	wait(int);
void	start();
void	gset(int ,int ,int );
void	gset2(int ,int ,int );
void	game();
int	getfing();
void	mvpos();
void	mvpos2();
int	putfing();
void	move();
void	eat();
void	onboard();
void	grend();
int	end_game();


#define	W1		  3000
#define	W2		 30000
#define	W3		100000
#define	W4		  6000

#define	GOKKUN		1797
#define BUBBLE		 247
#define	BIYON		2696
#define OKENAI		3155
#define	SLOW		0
#define	FAST		1


int	board[49],
	_board[49]={			/*  ボードの状態	*/
	  2, 1, 0, 0, 0,21,26,
	  5, 1, 0, 0, 0,21,24,
	  7, 1, 0, 0, 0,21,23,
	  9, 1, 0, 0, 0,21,29,
	  3, 1, 0, 0, 0,21,27,
	  4, 1, 0, 0, 0,21,25,
	  6, 1, 0, 0, 0,21,22},
	gbd;

char	work[EgbWorkSize];		/*  EGB作業域		*/
char	ebuf[4000];			/*  baba()用		*/
char	*eupbuf1,*eupbuf2;
char	*gdata;
char	*eg;
char	*gokkun;
char	*bubble;
char	*biyon;
char	*okenai;
FILE	*fp;
int	flen1,flen2;
int	i,t,j;
int	ed=0;
int	pl=0,vs=1;
int	select=0;
int	mode;
int	eupsize,eupsign;
int	stick,trig;
int	gx=3,gy=3 , px,py;


void main()
{
	speed(FAST);
	memget();
	eup_init();
	ginit();

	EGB_writePage(work,1);
	baba(work,ebuf);
	gload();
	eupload();
	sndload();
	for(;;){
	  speed(FAST);
	  meminit();
	  opload();
	  while(SND_eup_stat_flag());
	  SND_eup_play_stop();
	  EGB_writePage(work,1);
	  EGB_color(work,1,0);
	  EGB_clearScreen(work);

	  speed(SLOW);
	  opening();
	  if(select==5)break;
	  palinit();
	  drawboard();
	  setg();
	  start();
	  game();
	  SND_eup_play_stop();
	}

	speed(FAST);
	memfree();
	eup_term();
	exit(0);
}



void ginit()
{
	EGB_init(work,EgbWorkSize);
	EGB_resolution(work,0,3);
	EGB_resolution(work,1,3);
	EGB_writePage(work,1);
	EGB_displayStart(work,0,0,0);
	EGB_displayStart(work,1,0,0);
	EGB_displayStart(work,2,1,1);
	EGB_displayStart(work,3,640,480);
	EGB_writePage(work,0);
	EGB_displayStart(work,0,0,0);
	EGB_displayStart(work,1,0,0);
	EGB_displayStart(work,2,1,1);
	EGB_displayStart(work,3,640,480);
	EGB_displayPage(work,1,3);
}


void meminit()
{
	memcpy(board,_board,49*4);
	ed=0;
	pl=0,vs=1;
	select=0;
	gx=3;
	gy=3;
}


void memget()
{
	if((eupbuf1= malloc( 50000))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
	if((eupbuf2= malloc( 50000))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
	if((gdata  = malloc( 88064))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
	if((eg     = malloc(  4096))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
	if((gokkun = malloc(GOKKUN))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
	if((bubble = malloc(BUBBLE))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
	if((biyon  = malloc(BIYON ))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
	if((okenai = malloc(OKENAI))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
}


void memfree()
{
	free(eupbuf1);
	free(eupbuf2);
	free(eg    );
	free(gdata );
	free(gokkun);
	free(bubble);
	free(biyon );
	free(okenai);
}


void gload()
{
	fp=fopen("liquid\\koma.dat","rb");
	fread(gdata,1,88064,fp);
	fclose(fp);
}


void eupload()
{
	fp = fopen("liquid\\liquid.eup","rb");
	fseek(fp,0,SEEK_END);
	flen1 = (unsigned int)ftell(fp);
	fseek(fp,0,SEEK_SET);
	fread(eupbuf1,1,flen1,fp);
	fclose(fp);

	fp = fopen("liquid\\bgm1.eup","rb");
	fseek(fp,0,SEEK_END);
	flen2 = (unsigned int)ftell(fp);
	fseek(fp,0,SEEK_SET);
	fread(eupbuf2,1,flen2,fp);
	fclose(fp);
}


void sndload()
{
	fp=fopen("liquid\\gokkun.snd","rb");
	fread(gokkun,1,GOKKUN,fp);
	fclose(fp);

	fp=fopen("liquid\\bubble.snd","rb");
	fread(bubble,1,BUBBLE,fp);
	fclose(fp);

	fp=fopen("liquid\\biyon.snd","rb");
	fread(biyon,1,BIYON,fp);
	fclose(fp);

	fp=fopen("liquid\\okenaiyo.snd","rb");
	fread(okenai,1,OKENAI,fp);
	fclose(fp);
}


void palinit()
{
	EGB_writePage(work,1);
	g_palette16(work, 0, 0, 0, 0);
	g_palette16(work, 1, 0, 4, 8);
	g_palette16(work, 2, 8, 1, 0);
	g_palette16(work, 3, 8, 6,10);
	g_palette16(work, 4, 0, 8, 0);
	g_palette16(work, 5, 0, 8, 8);
	g_palette16(work, 6, 8, 8, 0);
	g_palette16(work, 7,11,11,11);
	g_palette16(work, 8, 1, 1, 1);
	g_palette16(work, 9, 0, 7,15);
	g_palette16(work,10,15, 2, 0);
	g_palette16(work,11, 9, 4,12);
	g_palette16(work,12, 0,15, 0);
	g_palette16(work,13, 0,15,15);
	g_palette16(work,14,15,15, 0);
	g_palette16(work,15,15,15,15);
	EGB_writePage(work,0);
	g_palette16(work, 0, 0, 0, 0);
	g_palette16(work, 1, 0, 4, 8);
	g_palette16(work, 2, 8, 1, 0);
	g_palette16(work, 3, 8, 6,10);
	g_palette16(work, 4, 0, 8, 0);
	g_palette16(work, 5, 0, 8, 8);
	g_palette16(work, 6, 8, 8, 0);
	g_palette16(work, 7,11,11,11);
	g_palette16(work, 8, 1, 1, 1);
	g_palette16(work, 9, 0, 7,15);
	g_palette16(work,10,15, 2, 0);
	g_palette16(work,11, 9, 4,12);
	g_palette16(work,12, 0,15, 0);
	g_palette16(work,13, 0,15,15);
	g_palette16(work,14,15,15, 0);
	g_palette16(work,15,15,15,15);

	if((select==1)||(select==3)){
	  EGB_writePage(work,1);
	  g_palette16(work, 4, 0, 8, 8);
	  EGB_writePage(work,0);
	  g_palette16(work, 4, 0, 8, 8);
	  }
}


void speed(int spd)
{
	_outp(0x05ec,spd);
}


void opload()
{
char	*grp;

	if((grp = malloc(132+153600))==0){
	  printf("メモリが足りません\n");
	  exit(-1);
	  }
	EGB_displayPage(work,1,2);
	EGB_writePage(work,0);
	fp=fopen("liquid\\liquid.dat","rb");	/*  ファイルのオープン	*/
	fread(grp,1,(132+153600),fp);		/*  データのロード	*/
	fclose(fp);
	EGB_palette(work,1,grp);
	g_put(work,0,0,639,480,&grp[132]);	/*  表示		*/
	free(grp);
}


void opening()
{
rtn:
	EGB_displayPage(work,1,3);
	EGB_writePage(work,0);
	SND_eup_loop_set(0);
	eup_set("liquid\\",eupbuf1,flen1,&eupsign);
	SND_eup_play_start(&eupbuf1[2048+6],flen1-2048-6,eupsign);

	EGB_writeMode(work,0);
	EGB_textSpace(work,0);
	EGB_textZoom(work,0, 8,16);
	EGB_textZoom(work,1,16,16);
	EGB_fontStyle(work,8);
	EGB_paintMode(work,0x22);
	EGB_color(work,0,15);
	EGB_color(work,2,8);
	g_box(work,207,303,432,401);
	EGB_paintMode(work,0x222);
	EGB_writeMode(work,6);
	EGB_color(work,0,15);
	EGB_color(work,1,2);

	g_print(work,224,320,"Nomal Mode   1P v.s. COM");
	g_print(work,224,336,"Special Mode 1P v.s. COM");
	g_print(work,224,352,"Nomal Mode   1P v.s. 2P");
	g_print(work,224,368,"Special Mode 1P v.s. 2P");
	EGB_color(work,1,6);
	g_print(work,224,384,"  ＢＧＭ  Ｓｅｌｅｃｔ");
	g_print(work,224,400,"      Ｅｘｉｔ！！");

	EGB_displayPage(work,1,3);
	EGB_writePage(work,0);

	select=0;
	EGB_color(work,0,1);
	EGB_color(work,2,8);
	EGB_writeMode(work,4);
	EGB_paintMode(work,0x22);

	g_box(work,208,304,431,320);
	for(;;){
	  pad2(0,&stick,&trig);
	  if((stick&0x01)!=0){
	    g_box(work,208,304+(select*16),431,320+(select*16));
	    select--;
	    if(select<0) select=0;
	    g_box(work,208,304+(select*16),431,320+(select*16));
	    for(;;){
	      pad2(0,&stick,&trig);
	      if((stick&0x01)==0) break;
	      }
	    }
	  if((stick&0x02)!=0){
	    g_box(work,208,304+(select*16),431,320+(select*16));
	    select++;
	    if(select>5) select=5;
	    g_box(work,208,304+(select*16),431,320+(select*16));
	    for(;;){
	      pad2(0,&stick,&trig);
	      if((stick&0x02)==0) break;
	      }
	    }
	  if((trig &0x01)!=0) break;
	  if(SND_eup_stat_flag()==0){
	    select=10;
	    break;
	    }
	  }
	SND_eup_play_stop();
	SND_pcm_sound_delete(-1);
	pcm_init(1);

	if(select==4){
	  bgmsel();
	  goto rtn;
	  }

	EGB_color(work,1,0);
	EGB_clearScreen(work);
	mode = select%2;
	vs = select/2;
}


void bgmsel()
{
char	bgmfn[5][30]={
		"liquid\\bgm1.eup",
		"liquid\\bgm2.eup",
		"liquid\\bgm3.eup",
		"liquid\\bgm4.eup",
		"liquid\\bgm5.eup"};

	SND_eup_loop_set(1);
	EGB_writeMode(work,0);
	EGB_textSpace(work,0);
	EGB_textZoom(work,0, 8,16);
	EGB_textZoom(work,1,16,16);
	EGB_fontStyle(work,8);
	EGB_color(work,2,8);
	EGB_color(work,0,15);
	EGB_paintMode(work,0x22);
	g_box(work,207,303,432,401);
	EGB_writeMode(work,6);
	EGB_paintMode(work,0x222);
	EGB_color(work,0,15);
	EGB_color(work,1,2);

	g_print(work,224,320,"        ＢＧＭ１");
	g_print(work,224,336,"        ＢＧＭ２");
	g_print(work,224,352,"        ＢＧＭ３");
	g_print(work,224,368,"        ＢＧＭ４");
	g_print(work,224,384,"        ＢＧＭ５");
	EGB_color(work,1,5);
	g_print(work,224,400,"  B:タイトルへ  A:選択       ");

	EGB_displayPage(work,1,3);
	EGB_writePage(work,0);

	select=0;
	EGB_color(work,0,1);
	EGB_color(work,2,8);
	EGB_writeMode(work,4);
	EGB_paintMode(work,0x22);

	g_box(work,208,304,431,320);
	for(;;){
	  pad2(0,&stick,&trig);
	  if((stick&0x01)!=0){
	    g_box(work,208,304+(select*16),431,320+(select*16));
	    select--;
	    if(select<0) select=0;
	    g_box(work,208,304+(select*16),431,320+(select*16));
	    for(;;){
	      pad2(0,&stick,&trig);
	      if((stick&0x01)==0) break;
	      }
	    }
	  if((stick&0x02)!=0){
	    g_box(work,208,304+(select*16),431,320+(select*16));
	    select++;
	    if(select>4) select=4;
	    g_box(work,208,304+(select*16),431,320+(select*16));
	    for(;;){
	      pad2(0,&stick,&trig);
	      if((stick&0x02)==0) break;
	      }
	    }
	  if((trig &0x02)!=0) break;
	  if((trig &0x01)!=0){
	    SND_eup_play_stop();
	    fp = fopen(bgmfn[select],"rb");
	    fseek(fp,0,SEEK_END);
	    flen2 = (unsigned int)ftell(fp);
	    fseek(fp,0,SEEK_SET);
	    fread(eupbuf2,1,flen2,fp);
	    fclose(fp);
	    
	    eup_set("liquid\\",eupbuf2,flen2,&eupsign);
	    SND_eup_play_start(&eupbuf2[2048+6],flen2-2048-6,eupsign);
	    }
	  }
	SND_eup_play_stop();
	SND_pcm_sound_delete(-1);
	pcm_init(1);
}


void drawboard()
{
	EGB_writePage(work,1);
	EGB_writeMode(work,0);
	EGB_color(work,1,0);
	EGB_clearScreen(work);
	EGB_writePage(work,0);
	EGB_color(work,1,0);
	EGB_clearScreen(work);

	EGB_color(work,0,4);
	EGB_color(work,2,4);
	EGB_paintMode(work,0x20);
	g_box(work,72,96,567,463);

	EGB_color(work,0,7);
	EGB_paintMode(work,0x02);
	g_box(work,95,111,544,448);
	for(i=0;i<7;i++){
	  for(t=0;t<7;t++){
	    g_box(work,96+(t*64),112+(i*48),159+(t*64),159+(i*48));
	    }
	  }
	g_get(work,96, 80,159,143,&eg[   0]);
	g_get(work,96,128,159,191,&eg[2048]);
}


void setg()
{
char	level[9][7]={
	  "ＬＶ１","ＬＶ２","ＬＶ３","ＬＶ４",
	  "ＬＶ５","ＬＶ６","ＬＶ７","ＬＶ８"," KING "
	  };

	EGB_writeMode(work,0);
	EGB_writeMode(work,6);
	EGB_color(work,0,7);
	EGB_color(work,2,4);
	EGB_paintMode(work,0x222);
	EGB_textSpace(work,0);
	EGB_textZoom(work,0, 8,16);
	EGB_textZoom(work,1,16,16);
	EGB_fontStyle(work,8);

	for(i=0;i<9;i++){
	  g_box(work,  0,52*i+28, 63,52*i+51+28);
	  g_box(work,576,52*i+28,639,52*i+51+28);
	  }

	EGB_paintMode(work,0x222);
	EGB_color(work,0,15);
	EGB_color(work,1,8);

	g_put(work,0,-1,63,62,&gdata[2048*8]);
	g_put(work,0,0,63,63,&gdata[2048*8]);
	g_print(work,8,34,level[8]);
	for(i=0;i<8;i++){
	  for(t=0;t<2;t++){
	    g_put(work,0,52*(i+1)+t-1,63,52*(i+1)+t+62,&gdata[2048*i]);
	    }
	  g_print(work,8,34+(i+1)*52,level[i]);
	  }
	g_put(work,576,-1,639,62,&gdata[2048*(8+21)]);
	g_put(work,576,0,639,63,&gdata[2048*(8+21)]);
	g_print(work,584,34,level[8]);
	for(i=0;i<8;i++){
	  for(t=0;t<2;t++){
	    g_put(work,576,52*(i+1)+t-1,639,52*(i+1)+t+62,&gdata[2048*(i+21)]);
	    }
	  g_print(work,584,34+(i+1)*52,level[i]);
	  }
}


void wait(int wait)
{
int	rp,muda=0;

	for(rp=0;rp<wait;rp++) muda=muda*muda*muda*muda*muda;
}


void start()
{
int	moph[8]={20,19,14,13,12,18,10,9};
int	x,y;

	EGB_color(work,0,0);
	EGB_color(work,2,0);
	EGB_paintMode(work,0x20);

	for(t=0;t<2;t++){
	  for(i=0;i<7;i++){
	    x=96+(t*64);
	    y=80+(i*48);
	    EGB_writePage(work,1);
	    EGB_writeMode(work,0);
	    for(j=0;j<8;j++){
	      g_put(work,x,y,x+63,y+63,&gdata[2048*moph[j]]);
	      wait(W1);
	      }
	    g_box(work,x,y,x+63,y+63);
	    EGB_writePage(work,0);
	    EGB_writeMode(work,6);
	    SND_pcm_play_stop(71);
	    pcm_play(71,127,bubble);
	    gset(board[i*7+t],x,y);
	    wait(W1);
	    }
	  }

	for(t=5;t<7;t++){
	  for(i=0;i<7;i++){
	    x=96+(t*64);
	    y=80+(i*48);
	    EGB_writePage(work,1);
	    EGB_writeMode(work,0);
	    for(j=0;j<8;j++){
	      g_put(work,x,y,x+63,y+63,&gdata[2048*(moph[j]+21)]);
	      wait(W1);
	      }
	    g_box(work,x,y,x+63,y+63);
	    EGB_writePage(work,0);
	    EGB_writeMode(work,6);
	    SND_pcm_play_stop(71);
	    pcm_play(71,127,bubble);
	    gset(board[i*7+t],x,y);
	    wait(W1);
	    }
	  }
	eup_set("liquid\\",eupbuf2,flen2,&eupsign);
	SND_eup_play_start(&eupbuf2[2048+6],flen2-2048-6,eupsign);
	pcm_init(1);
	SND_eup_loop_set(1);
}


void gset(int num,int x,int y)
{
	if(num< 20) g_put(work,x,y,x+63,y+63,&gdata[2048*(num-1)]);
	if(num>=20) g_put(work,x,y,x+63,y+63,&gdata[2048* num   ]);
}


void gset2(int num,int x,int y)
{
	if(num< 20) g_put(work,x,y,x+63,y+15,&gdata[2048*(num-1)]);
	if(num>=20) g_put(work,x,y,x+63,y+15,&gdata[2048* num   ]);
}


void game()
{
int	ret;

	for(;;){
	  EGB_writePage(work,0);
	  EGB_writeMode(work,0);
	  EGB_writeMode(work,6);
	  EGB_textSpace(work,0);
	  EGB_textZoom(work,0, 8,16);
	  EGB_textZoom(work,1,16,16);
	  EGB_fontStyle(work,8);
	  EGB_paintMode(work,0x222);
	  EGB_color(work,1,8);
	  EGB_color(work,0,14);
	  if(vs==5) g_print(work,248,32,"ＤＥＭＯ  ＰＬＡＹ");
	  if(pl==0){
	    EGB_paintMode(work,0x22);
	    EGB_color(work,0,9);
	    EGB_color(work,2,9);
	    g_box(work,256,32,384,49);
	    EGB_fontStyle(work,8);
	    EGB_paintMode(work,0x222);
	    EGB_writeMode(work,6);
	    EGB_color(work,0,15);
	    EGB_color(work,1,8);
	    g_print(work,256,48,"Ｐｌａｙｅｒ　１");
	    }
	  if(pl==1){
	    EGB_paintMode(work,0x22);
	    EGB_color(work,0,10);
	    EGB_color(work,2,10);
	    g_box(work,256,32,384,49);
	    EGB_fontStyle(work,8);
	    EGB_paintMode(work,0x222);
	    EGB_writeMode(work,6);
	    EGB_color(work,0,15);
	    EGB_color(work,1,8);
	    g_print(work,256,48,"Ｐｌａｙｅｒ　２");
	    }

	  for(;;){
	    if(vs==5){
	      if(mind(work,board,&gx,&gy,&px,&py,pl,mode,vs)==1) return;
	      ret = canmove(board,gx,gy,px,py,pl);
	      break;
	      }
	    else if((vs==0)&&(pl==1)){
	      mind(work,board,&gx,&gy,&px,&py,pl,mode,vs);
	      ret = canmove(board,gx,gy,px,py,pl);
	      break;
	      }
	    else{
	      for(;;){
	        if(getfing()==1){
	          ed=1;
	          goto end;
	          }
	        if((board[gy*7+gx]<(pl*20+1))||(board[gy*7+gx]>(pl*20+9))){
	          SND_pcm_play_stop(71);
	          pcm_play(71,127,biyon);
	          wait(W2);
	          }
	        else break;
	        }
	      px=gx;
	      py=gy;
	      EGB_writePage(work,0);
	      EGB_writeMode(work,4);
	      EGB_color(work,0,8);
	      EGB_color(work,2,8);
	      EGB_paintMode(work,0x20);
	      g_box(work,pl*576,18+(board[gy*7+gx]-pl*20-(board[gy*7+gx]-pl*20==9)*9)*52 , pl*576+63,36+(board[gy*7+gx]-pl*20-(board[gy*7+gx]-pl*20==9)*9)*52);
	      EGB_writePage(work,1);
	      EGB_writeMode(work,0);
	      EGB_writeMode(work,6);
	      SND_pcm_play_stop(71);
	      pcm_play(71,127,bubble);
	      mvpos();
	      gset(board[gy*7+gx],96+gx*64,80+gy*48);

	      for(;;){
	        i=putfing();
	        ret = canmove(board,gx,gy,px,py,pl);
	        if(i==1) break;
	        if(ret>=0) break;
	        SND_pcm_play_stop(71);
	        pcm_play(71,127,okenai);
	        wait(W3);
	        }
	      EGB_writePage(work,1);
	      EGB_writeMode(work,0);
	      EGB_color(work,1,0);
	      EGB_clearScreen(work);
	      EGB_writePage(work,0);
	      EGB_writeMode(work,4);
	      EGB_color(work,0,8);
	      EGB_color(work,2,8);
	      EGB_paintMode(work,0x20);
	      g_box(work,pl*576,18+(board[gy*7+gx]-pl*20-(board[gy*7+gx]-pl*20==9)*9)*52 , pl*576+63,36+(board[gy*7+gx]-pl*20-(board[gy*7+gx]-pl*20==9)*9)*52);
	      if(i!=1) break;
	      }
	    }

	  move();
	  if(ret==1) eat();
	  if(ret==0) onboard();

end:
	  if(ed==1) return;

	  pl = (pl==0);
	  gx = px;
	  gy = py;
	  }
}


int getfing()
{
	EGB_writePage(work,1);
	g_put(work,96+gx*64,80+gy*48,159+gx*64,143+gy*48,&gdata[2048*42]);

	EGB_writeMode(work,0);
	EGB_writeMode(work,6);
	EGB_color(work,0,0);
	EGB_color(work,2,0);
	EGB_paintMode(work,0x20);
	for(;;){
	  for(;;){
	    pad2(0,&stick,&trig);
	    if((stick!=0)||(trig!=0))break;
	    }
	  g_box(work,96+gx*64,80+gy*48,159+gx*64,143+gy*48);

	  if((stick&0x10)!=0){
	    if(end_game()==1) return 1;
	    }
	  if((stick&0x01)!=0){
	    gy--;
	    if(gy<0)gy=0;
	    }
	  if((stick&0x02)!=0){
	    gy++;
	    if(gy>6)gy=6;
	    }
	  if((stick&0x04)!=0){
	    gx--;
	    if(gx<0)gx=0;
	    }
	  if((stick&0x08)!=0){
	    gx++;
	    if(gx>6)gx=6;
	    }
	  if((trig &0x03)==1) break;
	  if((trig &0x03)==3){
	    mvpos2();
	    for(;;){
	      pad2(0,&stick,&trig);
	      if((stick!=0)||(trig!=0))break;
	      }
	    EGB_writePage(work,1);
	    EGB_writeMode(work,0);
	    EGB_color(work,1,0);
	    EGB_clearScreen(work);
	    EGB_writeMode(work,0);
	    EGB_writeMode(work,6);
	    EGB_color(work,0,0);
	    EGB_color(work,2,0);
	    EGB_paintMode(work,0x20);
	    }

	  g_put(work,96+gx*64,80+gy*48,159+gx*64,143+gy*48,&gdata[2048*42]);
	  wait(W2);
	  }
	return 0;
}


void mvpos()
{
int	mpx,mpy,ret;

	speed(FAST);
	EGB_penSize(work,4);
	for(mpx=0;mpx<7;mpx++){
	  for(mpy=0;mpy<7;mpy++){
	    ret = canmove(board,gx,gy,mpx,mpy,pl);
	    if((ret==0)||(ret==1)){
	      EGB_writePage(work,1);
	      EGB_writeMode(work,0);
	      EGB_writeMode(work,6);
	      EGB_color(work,0,15);
	      EGB_color(work,2,0);
	      EGB_paintMode(work,0x2);
	      g_ellipse(work,128+mpx*64,136+mpy*48,16,12);
	      }
	    if(ret==-2){
	      EGB_writePage(work,1);
	      EGB_writeMode(work,0);
	      EGB_writeMode(work,6);
	      EGB_color(work,0,14);
	      EGB_color(work,2,0);
	      EGB_paintMode(work,0x2);
	      g_line(work,104+mpx*64,118+mpy*48,151+mpx*64,153+mpy*48);
	      g_line(work,104+mpx*64,153+mpy*48,151+mpx*64,118+mpy*48);
	      }
	    }
	  }
	speed(SLOW);
	wait(W2);
	EGB_penSize(work,1);
}


void mvpos2()
{
int	mpx,mpy,ret,ply;

	if(board[gy*7+gx]==0) return;
	speed(FAST);
	EGB_penSize(work,4);
	for(mpx=0;mpx<7;mpx++){
	  for(mpy=0;mpy<7;mpy++){
	    if((board[gy*7+gx]<(pl*20+1))||(board[gy*7+gx]>(pl*20+9)))
	      ply=(pl==0);
	    else
	      ply=pl;
	    ret = canmove(board,gx,gy,mpx,mpy,ply);
	    if((ret==0)||(ret==1)){
	      EGB_writePage(work,1);
	      EGB_writeMode(work,0);
	      EGB_writeMode(work,6);
	      EGB_color(work,0,7);
	      EGB_color(work,2,0);
	      EGB_paintMode(work,0x2);
	      g_ellipse(work,128+mpx*64,136+mpy*48,16,12);
	      }
	    if(ret==-2){
	      EGB_writePage(work,1);
	      EGB_writeMode(work,0);
	      EGB_writeMode(work,6);
	      EGB_color(work,0,6);
	      EGB_color(work,2,0);
	      EGB_paintMode(work,0x2);
	      g_line(work,104+mpx*64,118+mpy*48,151+mpx*64,153+mpy*48);
	      g_line(work,104+mpx*64,153+mpy*48,151+mpx*64,118+mpy*48);
	      }
	    }
	  }
	speed(SLOW);
	wait(W2);
	EGB_penSize(work,1);
}


int putfing()
{
	EGB_writePage(work,1);
	EGB_writeMode(work,4);
	g_put(work,96+px*64,80+py*48,159+px*64,143+py*48,&gdata[2048*42]);

	for(;;){
	  for(;;){
	    pad2(0,&stick,&trig);
	    if((stick!=0)||(trig!=0))break;
	    }
	  g_put(work,96+px*64,80+py*48,159+px*64,143+py*48,&gdata[2048*42]);

	  if((stick&0x01)!=0){
	    py--;
	    if(py<0)py=0;
	    }
	  if((stick&0x02)!=0){
	    py++;
	    if(py>6)py=6;
	    }
	  if((stick&0x04)!=0){
	    px--;
	    if(px<0)px=0;
	    }
	  if((stick&0x08)!=0){
	    px++;
	    if(px>6)px=6;
	    }
	  if((trig &0x03)!=0) break;

	  g_put(work,96+px*64,80+py*48,159+px*64,143+py*48,&gdata[2048*42]);
	  wait(W2);
	  }
	if((trig&0x02)!=0) return 1;
	return 0;
}


void move()
{
int	mx,my , fx,fy;
int	fly[14]={0,32,48,56,60,62,63,64,63,62,60,56,48,32};

	mx = 96+gx*64;
	my = 80+gy*48;

	gbd = board[gy*7+gx];
	board[gy*7+gx] = 0;

	EGB_writePage(work,0);
	EGB_writeMode(work,0);
	g_put(work,mx,my,mx+63,my+63,&eg[2048*(gy>0)]);
	EGB_writeMode(work,6);
	if(gy>0){if(board[(gy-1)*7+gx]!=0) gset( board[(gy-1)*7+gx],mx,my-48);}
	if(gy<6){if(board[(gy+1)*7+gx]!=0) gset2(board[(gy+1)*7+gx],mx,my+48);}

	EGB_writePage(work,1);
	EGB_writeMode(work,0);
	for(i=0;i<5;i++){
	  g_put(work,mx,my,mx+63,my+63,&gdata[2048*(pl*21+9+i)]);
	  wait(W4);
	  }
	SND_pcm_play_stop(71);
	pcm_play(71,127,biyon);

	EGB_color(work,0,0);
	EGB_color(work,2,0);
	EGB_paintMode(work,0x20);
	for(i=0;i<14;i++){
	  fx=mx+64*(px-gx)/14*i;
	  fy=my+48*(py-gy)/14*i-fly[i];
	  g_put(work,fx,fy,fx+63,fy+63,&gdata[2048*(pl*21+14)]);
	  wait(W4);
	  g_box(work,fx,fy,fx+63,fy+63);
	  }
}


void eat()
{
int	mx,my;
int	mop[8]={15,16,17,18,12,18,10,9};

	mx = 96+px*64;
	my = 80+py*48;
	EGB_writePage(work,1);
	EGB_writeMode(work,0);
	EGB_color(work,0,0);
	EGB_color(work,2,0);
	EGB_paintMode(work,0x20);

	g_put(work,mx,my-12,mx+63,my+63-12,&gdata[2048*(pl*21+mop[0])]);
	wait(W4);
	g_box(work,mx,my-12,mx+63,my+63-12);
	g_put(work,mx,my- 6,mx+63,my+63- 6,&gdata[2048*(pl*21+mop[1])]);
	wait(W4);
	g_box(work,mx,my- 6,mx+63,my+63- 6);

	EGB_writePage(work,0);
	EGB_writeMode(work,0);
	g_put(work,mx,my,mx+63,my+63,&eg[2048*(py>0)]);
	EGB_writeMode(work,6);
	if(py>0){if(board[(py-1)*7+px]!=0) gset( board[(py-1)*7+px],mx,my-48);}
	if(py<6){if(board[(py+1)*7+px]!=0) gset2(board[(py+1)*7+px],mx,my+48);}

	EGB_writePage(work,1);
	EGB_writeMode(work,0);
	for(i=2;i<8;i++){
	  g_put(work,mx,my,mx+63,my+63,&gdata[2048*(pl*21+mop[i])]);
	  if(i==3){
	    SND_pcm_play_stop(71);
	    pcm_play(71,127,gokkun);
	    }
	  wait(W2);
	  }
	if(board[py*7+px]%20==9) ed=1;
	if(gbd%20==9){
	  board[py*7+px] = 9+pl*20;
	  }
	else{
	  board[py*7+px] = gbd+(mode==0)+(mode==1)*(board[py*7+px]-(pl==0)*20);
	  if(board[py*7+px]-pl*20>=9) board[py*7+px]=8+pl*20;
	  }
	EGB_color(work,1,0);
	EGB_clearScreen(work);
	EGB_writePage(work,0);
	EGB_writeMode(work,6);
	gset(board[py*7+px],mx,my);	
	if(py<6) if(board[(py+1)*7+px]!=0) gset2(board[(py+1)*7+px],mx,my+48);

	if(ed==1) grend();	
}


void onboard()
{
int	mx,my;
int	mop[6]={13,18,12,18,10,9};

	mx = 96+px*64;
	my = 80+py*48;
	EGB_writePage(work,1);
	EGB_writeMode(work,0);
	for(i=0;i<6;i++){
	  g_put(work,mx,my,mx+63,my+63,&gdata[2048*(pl*21+mop[i])]);
	  if(i==1){
	    SND_pcm_play_stop(71);
	    pcm_play(71,127,biyon);
	    }
	  wait(W4);
	  }
	board[py*7+px] = gbd;
	EGB_color(work,1,0);
	EGB_clearScreen(work);
	EGB_writePage(work,0);
	EGB_writeMode(work,6);
	gset(board[py*7+px],mx,my);	
	if(py<6){if(board[(py+1)*7+px]!=0) gset2(board[(py+1)*7+px],mx,my+48);}
}


void grend()
{
int	mop[8]={9,10,11,12,13,14,19,20};
int	mx,my , rp1;

	for(i=0;i<7;i++){
	  for(t=0;t<7;t++){
	    if(((board[t*7+i]-pl*20<1)||(board[t*7+i]-pl*20>9))&&(board[t*7+i]!=0)){
	      mx = 96+i*64;
	      my = 80+t*48;
	      EGB_writePage(work,0);
	      EGB_writeMode(work,0);
	      g_put(work,mx,my,mx+63,my+63,&eg[2048*(t>0)]);
	      EGB_writeMode(work,6);
	      if(t>0){if(board[(t-1)*7+i]!=0) gset( board[(t-1)*7+i],mx,my-48);}
	      if(t<6){if(board[(t+1)*7+i]!=0) gset2(board[(t+1)*7+i],mx,my+48);}
	      board[t*7+i]=0;

	      EGB_writePage(work,1);
	      EGB_writeMode(work,0);
	      EGB_color(work,0,0);
	      EGB_color(work,2,0);
	      EGB_paintMode(work,0x20);
	      for(rp1=0;rp1<8;rp1++){
	        g_put(work,mx,my,mx+63,my+63,&gdata[2048*(mop[rp1]+(pl==0)*21)]);	        
	        if(rp1==5){
	          SND_pcm_play_stop(71);
	          pcm_play(71,127,bubble);
	          }
	        wait(W1);
	        }
	      g_box(work,mx,my,mx+63,my+63);
	      }
	    }
	  }
}

int end_game()
{
int	stick,trig;

	EGB_writePage(work,1);
	EGB_writeMode(work,0);
	EGB_color(work,0,7);
	EGB_color(work,2,8);
	EGB_paintMode(work,0x22);
	g_box(work,271,199,368,248);

	EGB_paintMode(work,0x222);
	EGB_writeMode(work,6);
	EGB_color(work,0,15);
	EGB_color(work,1,5);
	g_print(work,272,216,"終了しますか");
	EGB_color(work,1,2);
	g_print(work,272,232,"　A:Ｙｅｓ");
	g_print(work,272,248,"　B: Ｎｏ");

	for(;;){
	  pad2(0,&stick,&trig);
	  if((trig&0x03)!=0) break;
	  }
	EGB_color(work,0,0);
	EGB_color(work,2,0);
	EGB_paintMode(work,0x20);
	g_box(work,271,199,368,248);

	if((trig&0x01)!=0) return 1;
	return 0;
}