/******************************************************************/
//	権兵衛＆カラス −ＰＲＯ６８Ｋ
//	　　Ｉ／Ｏ別冊 ＭＺ８０活用研究よりの移植
//  Ａｒｒａｎｅｄ　１９９７  ｂｙ  ＡＩＧ−ＳＯＦＴ
//	ただしプログラムは１００％オリジナル
/******************************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	// exit
#include <process.h>
#include <ctype.h>
#include <conio.h>
#include <jfctype.h>
#include <iocslib.h>
#include <audio.h>
#include "defines.h"
#include "doslibm.h"
#include "aigtext.h"
#include "amacro.h"
#include "ascreen.h"
#include "astdio.h"
#include "aenv.h"
#include "await.h"
#include "anum.h"
#include "abuff.h"
#include "font.h"
#include "akey.h"
#include "skey.h"

char prog[]="@@> GONBE.C : 1997/11/09 SUN : GAME : GONBE";

/******************************************************************/
/* 定数定義 */

#define RECHIGH	"GONBE.HSC"	/* ハイ・スコア ファイル名 */

/******************************************************************/
/* グローバル変数 */

unchar *exec;			/* PANIC 起動プログラム */

/******************************************************************/
/* 定数＆変数定義 */

#define GWX	96			/* 実画面横幅 */
#define GWY	31			/* 実画面縦幅 */
#define WX	40			/* ゲーム画面横幅 */
#define WY	25			/* ゲーム画面縦幅 */
// ゲームキャラクターの表示は全て全角なので、画面幅はGWX/2
#define	CX	((GWX/2-WX)/2*2)	/* ゲーム画面を実画面の真ん中に持ってくる */
#define	CY	((GWY-WY)/2)		/* ゲーム画面を実画面の真ん中に持ってくる */

#define	SX	0	/* 画面枠 */
#define	SY	0
#define	EX	32
#define	EY	24
#define	SSX	(SX+2)	/* キャラクター動作領域 */
#define	SSY	(SY+1)
#define	EEX	(EX-2)
#define	EEY	(EY-2)

#define	JIMEN	'.'
#define	TANE	'｡'
#define	KARASU	'+'
#define	NEMURI	'#'	/* 眠っている烏 */
#define	MAN	'm'
#define	KUSURI	'@'	/* 眠り薬 */
// A〜Z : 成長している植物
#define	MI	'i'	/* 実 */
#define	KABE	'k'	/* 回りの壁 */

int	mx,my;		// 人の座標
int	fkusuri;	// 眠り薬を置いているかどうか

int	kx,ky;		// 烏の座標
int	fnemuri,dir,move;	// 眠っているかどうか,移動方向,移動歩数

int	sco;		// 得点
#define	HMAX	5	// 上位何位まで記録するか(<10)
int	hsc[HMAX];	// 上位スコア

#define	TMAX	1000	// 時間
int	wt;		// ウエイト

// ADPCM用変数
unchar	*PCMkarasu,*PCMnemuri,*PCMappl,*PCMtane,*PCMmi,*PCMbell;
int	 LENkarasu, LENnemuri, LENappl, LENtane, LENmi, LENbell;

#define	MZ_LOCATE(x,y)	B_LOCATE(CX+(x)*2,CY+(y))

/******************************************************************/

void WaitPCM()
{
	while (a_stat()); // 音が止まるまで待つ
}

void PCMplay(unchar *pcm,int len,int fq)
// ADPCMを鳴らす
{
	if (len>0) {
	    int f=0;
		if (fq<0) {f=1; fq=-fq;}
		a_play(pcm,len,fq,3,len);
		if (!f) WaitPCM(); // 音が止まるまで待つ
	}
}

void FreePCM(unchar *buff)
// バッファーの解放
{
	if (buff!=NULL) free(buff);
}

/******************************************************************/

int center(int y,unchar *mes)
// メッセージをセンタリングで表示
{
int x;
	x=(EX*2-SX*2+1-strlen(mes))/2; /* センタリング */
	B_LOCATE(CX+x,y+CY);
	B_PRINT(mes);
	return(x);
}

void message(unchar *mes,int tim)
/* メッセージを指定回数点滅表示する */
{
int i,j,x;
#define	MSY	(SSY+(EEY-SSY)/2)
	x=CX+(EX*2-SX*2+1-strlen(mes))/2; /* センタリング */
	for (j=SX+1;j<=EX-1;j++) {
		B_LOCATE(CX+j*2,MSY);
		B_PUTC(L'　');
	}
	for (i=0;i<tim;i++) {
		WaitPCM();
		B_LOCATE(x,MSY); B_PRINT(mes);
		PCMplay(PCMbell,(i==tim-1? LENbell:LENbell/3),-4);
		vwait(20);
		for (j=SX+1;j<=EX-1;j++) {
			B_LOCATE(CX+j*2,MSY);
			B_PUTC(L'　');
		}
		vwait(5);
	}
	// 最後の音は延ばす
}

/******************************************************************/

// 特殊キャラクター
static struct FNTBUF
f_ebeb = {16,16
	,{
	0x00,0x00,0x07,0xe0,0x07,0xe0,0x07,0xe0,
	0x07,0xe0,0x01,0x80,0x01,0x80,0x3f,0xfc,
	0x01,0x80,0x01,0x80,0x03,0xc0,0x06,0x60,
	0x0c,0x30,0x18,0x18,0x30,0x0c,0x00,0x00}
},
f_ec60 = {16,16
	,{
	0x07,0xe0,0x0f,0xf0,0x0f,0xf0,0x0f,0xf0,
	0x07,0xe0,0x73,0xce,0xff,0xff,0xff,0xff,
	0xff,0xff,0xff,0xff,0xf9,0x9f,0x71,0x8e,
	0x03,0xc0,0x03,0xc0,0x07,0xe0,0x07,0xe0}
},
f_ec66 = {16,16
	,{
	0x33,0x33,0x33,0x33,0xcc,0xcc,0xcc,0xcc,
	0x33,0x33,0x33,0x33,0xcc,0xcc,0xcc,0xcc,
	0x33,0x33,0x33,0x33,0xcc,0xcc,0xcc,0xcc,
	0x33,0x33,0x33,0x33,0xcc,0xcc,0xcc,0xcc}
};

static unchar tvram[WY][WX];

void printxy(int x,int y,short c)
// 内部処理キャラクターと表示キャラクターの変換を行いながら表示する
{
_FNTBUF *font,font0;
int cc=0;
	/* 仮想テキストＶＲＡＭに出力 */
	if (c>=0) {
		if (tvram[y][x]==c) return; // 前の表示と同じなら再表示しない
	} else c=-c;
	tvram[y][x]=c;
	
	/* 座標変換 */
	MZ_LOCATE(x,y);
	
	/* キャラクター変換 */
	switch (c) {
		// 半角全角変換
		default  :cc=hantozen(c); break;
		
		/* 外字変換 */
		case MAN :font=&f_ebeb; break;
		case MI  :font=&f_ec60; break;
		case KABE:font=&f_ec66; break;
	}
	if (cc!=0) {
		// 普通文字
		B_PUTC(cc);
	} else {
		if (B_COLOR(-1)!=TWHITE) {
			// フォントが加工される時はバッファーにコピーしてから行う
			font0=*font; // 構造体のコピー
			font=&font0;
		}
		// 外字
		fontset(font);
		FONTPUT2(font);
	}
}

int scrn(int x,int y)
/* 仮想テキストＶＲＡＭを読み出す */
{
	return(tvram[y][x]);
}

void init_tvram()
/* 仮想テキストＶＲＡＭ初期化 */
{
int x,y;
	for (y=0;y<WY;y++) {
		for (x=0;x<WX;x++) tvram[y][x]=' ';
	}
}

void pop_tvram()
/* 仮想テキストＶＲＡＭ表示 */
{
int x,y;
	for (y=0;y<WY;y++) {
		for (x=0;x<WX;x++) printxy(x,y,-tvram[y][x]);
	}
}

/******************************************************************/

void print_score(unchar *mes,int y,int sco)
{
	MZ_LOCATE(EX+2,y);
	B_PRINT(mes);
	MZ_LOCATE(EX+4,y+1);
	print_decII(sco,'0',5);
}

void PrScore(int sc)
// 得点加算＆表示
{
	sco+=sc;
	print_score("ＳＣＯＲＥ",6,sco);
}

void PrRANK(int rnk)
{
	MZ_LOCATE(EX+2,9);
	B_PRINT("ＲＡＮＫ ");
	B_PUTC(rnk>=HMAX? L'？':L'１'+rnk);
}

void PrTime(int tm)
{
	print_score("ＴＩＭＥ",11,tm);
}

/******************************************************************/

void title(int mode)
// 初期画面作成
{
int x,y;
	// 画面クリア
	if (!mode) {
		cls();
		init_tvram();
	}
	
	B_COLOR(TCYAN|HLIGHT|REVERSE);
	center(-2,"＊＊　権兵衛＆カラス − ＰＲＯ６８Ｋ　＊＊");
	B_COLOR(TWHITE);
	
	MZ_LOCATE(EX+1, 0); B_PRINT("＊＊＊＊＊＊＊");
	MZ_LOCATE(EX+1, 1); B_PRINT("　権兵衛");
	MZ_LOCATE(EX+1, 2); B_PRINT("　 　＆");
	MZ_LOCATE(EX+1, 3); B_PRINT("　 　 カラス");
	MZ_LOCATE(EX+1, 4); B_PRINT("＊＊＊＊＊＊＊");
	MZ_LOCATE(EX+1,14); B_PRINT("＃＃＃＃＃＃＃");
	
	B_COLOR(TWHITE|REVERSE);
	MZ_LOCATE(EX+4,17); B_PRINT("↑");
	MZ_LOCATE(EX+3,18); B_PRINT("←");
	MZ_LOCATE(EX+5,18); B_PRINT("→");
	MZ_LOCATE(EX+4,19); B_PRINT("↓");
	B_COLOR(TWHITE);
	MZ_LOCATE(EX+4,16); B_PRINT("８");
	MZ_LOCATE(EX+2,18); B_PRINT("４");
	MZ_LOCATE(EX+6,18); B_PRINT("６");
	MZ_LOCATE(EX+4,20); B_PRINT("２");
	printxy(EX+4,18,MAN);
	MZ_LOCATE(EX+2,22); B_PRINT("５＝眠り薬");
	
	PrScore(0);
	PrRANK(HMAX);
	PrTime(0);
	
	for (y=SY;y<=EY;y++) { // 縦壁
		printxy(SX,y,KABE);
		printxy(EX,y,KABE);
	}
	for (x=SX+1;x<=EX-1;x++) { // 横壁
		printxy(x,SY,KABE);
		printxy(x,EY,KABE);
	}
}

void InitJimen()
// 地面の初期化
{
int x,y;
	for (y=SY+2;y<=EY-1;y+=2) {
		for (x=SSX;x<=EEX;x+=2) {
			printxy(x,y,JIMEN);
		}
	}
}

/******************************************************************/

int getky()
/* キー入力：複数キーの設定を可能にするため */
/* でも基本操作はテンキーで行う */
/* 一応JOYSTICK対応だよ */
{
int c,js;
	c=inkey2(1,0);
	if (c==0) { /* not key enter */
		/* JOY STICK input */
		js=JOYGET(0)&JOYGET(1);
		if ((js&BIT6)==0) c='5';
		if ((js&BIT5)==0) c='5';
		if ((js&BIT3)==0) c='6';
		if ((js&BIT2)==0) c='4';
		if ((js&BIT1)==0) c='2';
		if ((js&BIT0)==0) c='8';
	}
	
	switch (c) { /* カーソルキー対応コード変換 */
		case SKleft: /* left */
			c='4';
			break;
		case SKup: /* up */
			c='8';
			break;
		case SKright: /* right */
			c='6';
			break;
		case SKdown: /* down */
			c='2';
			break;
	}
	
	c&=0xff;
	switch (c) {
		/* 向き変更 */
		case ' ':c='5'; break;
		/* その他 */
		case '!':/* BREAK */
			curon();
			exit(1);
			/* なんとサブルーチンからexit()しているのだ。 */
			/* あまりお勧めは出来ない技だからみなさんはまねしないでね！ */
		case 0x0d:/* PANIC */
			curon();
			cls();
			spawnlp(P_WAIT,exec,exec,NULL,NULL);
			CRTMOD(16); // cwidth(96);
			cls();
			pop_tvram();
			title(1); /* タイトル表示 */
		case ESC:/* PAUSE */
			curon();
			center(WY+2,"ＰＡＵＳＥ");
			KFLUSHGC(); // キー入力待ち
			center(WY+2,"　　　　　");
			curoff();
			break;
	}
	return(c);
}

/******************************************************************/

void plant()
// 植物を育てる・枯らす
{
int x,y,c,cc;
	for (y=SY+2;y<=EY-1;y+=2) {
	    for (x=SSX;x<=EEX;x+=2) {
		//if (x==mx && y==my+1) continue; // 蒔いた直後の種は育たない
		cc=0;
		// 次のキャラクターの設定
		c=scrn(x,y);
		switch (c) {
			case TANE:cc='A';   break; // 種が発芽
			case 'Z' :cc=MI;    break; // 植物の成長
			case MI  :cc=JIMEN; // 実の後は枯れるだけ
				if (rand2(100)>20) continue; // 枯れない
				break;
			default:
				if (c>='A' && c<='Z'-1) cc=c+1;
				break;
		}
		if (cc!=0) { // 変化する時
			c=rand2(100);
			if (c<1) printxy(x,y,JIMEN); // 枯れた
			else
			if (c>=35) printxy(x,y,cc);  // 育った
			// else 育たない
		}
	    }
	}
}

/******************************************************************/

int SetHosuu()
// カラスの移動歩数を設定する
{
	return(3+rand2(3));
}

void InitKarasu()
// カラスの初期状態設定
{
	kx=EX-2; ky=SY+1; // 烏の初期座標
	printxy(kx,ky,KARASU);
	move=SetHosuu();
	dir='2'+rand2(2)*2; // 移動方向最初は'2'または'4'のみ
	fnemuri=0;
}

void MoveKarasu()
// カラスの移動
{
int c,x,y,cc;
	if (fnemuri>0) {fnemuri--; return;} // 眠っている
	if (--move==0) { // 移動方向変更
		move=SetHosuu(); // 移動歩数
		dir='2'+rand2(4)*2; // 移動方向:'2''4''6''8'
	}
	x=kx; y=ky;
	switch (dir) {
		case '8': // 上
			if (y>SSY) y-=2;
			break;
		case '2': // 下
			if (y<EEY-1) y+=2; // 一番下の地面の上まで
			break;
		case '6': // 右
			if (x<EEX) x+=2;
			break;
		case '4': // 左
			if (x>SSX) x-=2;
			break;
	} // 移動しないときもある
	if (scrn(x,y)==MAN) return; // 移動先に人がいる : 動けない
	if (kx!=x || ky!=y) printxy(kx,ky,' ');
	kx=x; ky=y;
	cc=KARASU;
	c=scrn(x,y+1); // 移動先の地面は何？
	switch (c) {
	    case KUSURI: // 眠り薬を食べた
		PCMplay(PCMnemuri,LENnemuri,-4);
		cc=NEMURI;
		fnemuri=20+rand2(5);  // 眠っている時間
		printxy(x,y+1,JIMEN); // 薬を消す
		fkusuri=0;
		break;
	    default:
		if (!(c>='A' && c<='Z')) break;
		// 種、植物、実を食べた
	    case TANE:
	    case MI:
		PCMplay(PCMkarasu,LENkarasu,-4);
		printxy(x,y+1,JIMEN);
		break;
	    //実は最下行ではKABEになる
	}
//	WaitPCM(); <- PCM8対応のためコメントにする
	printxy(x,y,cc);
}

/******************************************************************/

void InitMan()
{
	mx=SX+2; my=SY+1; // 人の初期座標
	printxy(mx,my,MAN);
	fkusuri=0; // 眠り薬は置いてない
}

void MoveMan()
// 人の移動
{
int x,y,fm=0;
	x=mx; y=my;
	switch (getky()) {
		case '5': // 眠り薬
			if (fkusuri||sco<10) beep(); // 薬は置けない
			else {
				PCMplay(PCMtane,LENtane,-3);
				PrScore(-10);
				printxy(x,y+1,KUSURI);
				//WaitPCM(); PCM8対応のため
				fkusuri=1;
			}
			return;
		case '8': // 上
			if (y>SSY) y-=2;
			break;
		case '2': // 下
			if (y<EEY-1) y+=2; // 一番下の地面の上まで
			break;
		case '6': // 右
			if (x<EEX) x+=2;
			break;
		case '4': // 左
			if (x>SSX) x-=2;
			break;
	}
	// 移動先は何？
	switch (scrn(x,y)) {
		case NEMURI:
		case KARASU:
			return; // カラス->移動できない
	}
	if (mx!=x || my!=y) {
		printxy(mx,my,' ');
		fm=1; // 移動した
	}
	mx=x; my=y;
	printxy(x,y,MAN);
	switch (scrn(x,y+1)) { // 地面は何？（移動してない時もあり）
	    case KUSURI:// 眠り薬 -> 拾う
		if (fm) { // 移動した時のみ
			PCMplay(PCMmi,LENmi,-4);
			printxy(x,y+1,JIMEN); // 薬を消す
			fkusuri=0;
		}
		break;
	    case JIMEN: // 地面
		if (sco>0) {
			// 歩くときに種を蒔く
			PCMplay(PCMtane,LENtane,-4);
			PrScore(-1);
			printxy(x,y+1,TANE);
		} // ０点以下の時は種を蒔けない
		break;
	    case MI: // 実
		PCMplay(PCMmi,LENmi,-4);
		PrScore(50);
		printxy(x,y+1,JIMEN);
		break;
	    //実は最下行ではKABEになる
	}
//	WaitPCM(); <- PCM8対応のためコメントにする
}

/******************************************************************/

void NowHiScore(int y,int r)
// 現在のハイスコア表示
{
int x,i;
	B_COLOR(TYELLOW|HLIGHT|REVERSE);
	x=center(y,"ＨＩ−ＳＣＯＲＥ");
	for (i=0;i<HMAX;i++) {
		B_LOCATE(CX+x+3,CY+y+2+i);
		B_COLOR(i==r? TCYAN|REVERSE:TWHITE);
		B_PUTC(L'１'+i);
		B_PUTC(L'　');
		print_decII(hsc[i],'0',5);
		B_COLOR(TWHITE);
	}
}

int PrHiScore(int h)
// 上位記録を表示（ランクイン判定付き）
{
int i,j,r=HMAX;
static struct XLINEPTR txx={1,CX*8+(SX+2)*8,0,(EX-1-(SX+1)+1)*16,0x0000};
static struct YLINEPTR txy={1,0,(CY+SY+1)*16 ,(EY-1-(SY+1)+1)*16,0x0000};
	// ハイスコアは[0]>>...>>[4]の順に並んでいる
	// 今回のスコアがどこに入るか
	for (i=0;i<HMAX;i++) {
		if (h>hsc[i]) { // 後のものを入れ換える
			for (j=HMAX-1;j>i;j--) {
				hsc[j]=hsc[j-1];
			}
			hsc[i]=h;
			r=i;
			break;
		}
	}
	// 下画面を網で消す
	for (i=(SY+1)*16;i<=EY*16-1;i+=2) {
		txx.y=CY*16+i;
		txx.vram_page=1;
		TXXLINE(&txx);
		txx.vram_page=0;
		TXXLINE(&txx);
	}
	for (i=(SX+2)*16;i<=EX*16-1;i+=2) {
		txy.x=CX*8+i;
		txy.vram_page=1;
		TXYLINE(&txy);
		txy.vram_page=0;
		TXYLINE(&txy);
	}
	// 表示
	if (r==0) PCMplay(PCMappl,LENappl,-4); // 第１位
	NowHiScore(5,r);
	PrRANK(r);
	//WaitPCM();
	// 0なら最上位、HMAXならランク外
	return(i);
}

/******************************************************************/

int SelectWait()
// ウエイト選択
{
int c,wt;
	cls();
	MZ_LOCATE(9,2);
	               B_PRINT("−−　ゲーム スピード 選択　−−");
	MZ_LOCATE(10,4); B_PRINT("ゆっくり − − − − Ｓlow");
	MZ_LOCATE(10,5); B_PRINT("普通     − − − − Ｎormal");
	MZ_LOCATE(10,6); B_PRINT("速い　   − − − − Ｆast");
	MZ_LOCATE(10,7); B_PRINT("暴走！！ − − − − Ｂousou");
	MZ_LOCATE(9,9);
		       B_PRINT(" ＜Ｓ＞＜Ｎ＞＜Ｆ＞＜Ｂ＞を押す ");
	c=B_LOCATE(-1,-1); // カーソル退避
	NowHiScore(12,-1); // ハイスコア表示
	B_LOCATE(c>>16,c&0xffff); // カーソル復帰
	do {
		c=KFLUSHGC(); // toupperマクロ化対応
		wt=0;
		switch (toupper(c)) {
			case 'S':wt=18; break;
			case 'N':wt=13; break;
			case 'F':wt=8 ; break;
			case 'B':wt=4 ; break;
			case ESC:wt=-1; break;
			default:beep(); break;
		}
	} while (wt==0);
	return(wt);
}

void Setumei()
// 説明画面・・・のはずだったけど面倒なのでスタート画面にする
{
#define MSX ((EX-SX)/2-1)
time_t tm,tim,stime;
int LENp1,LENp2;
unchar *PCMp1,*PCMp2;
	LENp1=fmalloc(&PCMp1,"PREL_C5.PCM" ,0,0);
	LENp2=fmalloc(&PCMp2,"PREL_C6.PCM" ,0,0);
	stime=-1;
	secwait(1);
	MZ_LOCATE(MSX,EY+1); B_PRINT("開始 ");
	time(&tm);
	while (time(&tim),(tim=3-(tim-tm))>0) {
		if (tim!=stime) {
			a_end();
			MZ_LOCATE(MSX+3,EY+1); B_PUTC(L'０'+(int)tim); B_PRINT(" 秒前");
			PCMplay(PCMp1,LENp1,-4);
			stime=tim;
		}
	}
	MZ_LOCATE(MSX,EY+1); B_PRINT("開始！！"); eline();
	PCMplay(PCMp2,LENp2,4);
	MZ_LOCATE(MSX,EY+1); eline();
	FreePCM(PCMp1);
	FreePCM(PCMp2);
}

/******************************************************************/

void main(int argc,unchar *argv[])
{
int ret,i,tm,j;
FILE *fp;
	for (i=0;i<HMAX;i++) hsc[i]=0; /* ハイスコアクリア */
	fp=fopen(RECHIGH,"rb");
	if (fp!=NULL) { /* hi-score read */
		fread(&hsc,sizeof(hsc),1,fp);
		fclose(fp);
	}
	
	/* 乱数初期化 */
	srand2();
	
	/* PANIC起動プログラム名 */
	exec=getenv2("PANIC","COMMAND.X");
	
	/* ADPCM読み込み */
	LENappl  =fmalloc(&PCMappl  ,"APL.PCM"   ,0,0);
	LENtane  =fmalloc(&PCMtane  ,"HIQ.PCM"   ,0,0);
	LENkarasu=fmalloc(&PCMkarasu,"crow1.PCM" ,0,0);
	LENnemuri=fmalloc(&PCMnemuri,"crow2.PCM" ,0,0);
	LENmi    =fmalloc(&PCMmi    ,"rhiq.PCM"  ,0,0);
	LENbell  =fmalloc(&PCMbell  ,"perc00.PCM",0,0);
	
	// 画面関係
	CRTMOD(16); // cwidth(96);
	help_set(argv[0],0);
	
	do {
		/* 初期化 */
		wt=SelectWait(); // ウエイト選択
		if (wt<=0) exit(1); // 中断
		curoff();	// cursor off
		sco=100;	// 100からスタート（種を蒔くため）
		title(0);
		InitJimen();
		InitMan();
		InitKarasu();
		Setumei();	// 説明画面->スタート
		tm=TMAX;
		PrTime(tm);
		j=1;
		do { /* ゲーム本体 */
			if (j==1||j==5) plant();
			if ((j%3)==0) MoveKarasu();
			MoveMan();
			if (++j>=10) j=0;
			PrTime(tm);
			vwait(wt);
		} while (--tm>=0);
		
		/* ゲーム終了 */
		B_COLOR(TYELLOW|HLIGHT);
		message("☆☆ ＧＡＭＥ　ＯＶＥＲ ☆☆",5);
		B_COLOR(TWHITE);
		PrHiScore(sco);
		center(20,"もう一度しますか？");
		curon();
		do {
			ret=KFLUSHGC(); // toupperマクロ化対応
			ret=toupper(ret);
		} while (ret!='Y' && ret!='N' && ret!=0x1b);
		a_end();
	} while (ret=='Y');
	
	crlf();
	fp=fopen(RECHIGH,"wb");
	if (fp!=NULL) { /* hi-score write */
		fwrite(&hsc,sizeof(hsc),1,fp);
		fclose(fp);
	}
	/* ADPCMバッファー開放 */
	FreePCM(PCMappl);
	FreePCM(PCMtane);
	FreePCM(PCMkarasu);
	FreePCM(PCMnemuri);
	FreePCM(PCMmi);
	FreePCM(PCMbell);
	exit(0);
}

/******************************************************************/
