/*	=================================================================================================
		プリンメーカー	for WonderSwan
					Programed By K.Tadamori		2000/12/23 - 
	-------------------------------------------------------------------------------------------------
			ゲーム本体です
	=================================================================================================	*/
/*#define _DEBUG_*/						/*	デバッグモードで起動する	*/

/*	-------------------------------------------------------------------------------------------------
 *		構築
	-------------------------------------------------------------------------------------------------	*/
#include <stdio.h>
#include <sys/bios.h>

#include "game.h"
#include "common.h"
#include "sprite.h"
#include "key.h"
#include "bg.h"
#include "palet.h"


/*	-------------------------------------------------------------------------------------------------
 *		グローバル変数
	-------------------------------------------------------------------------------------------------	*/
extern MAIN_REG	g_Reg;										/*	ゲーム全体で使うグローバルな変数		*/
extern void	(*g_GameProc)(void);							/*	ゲームの進行状況を制御します。			*/
extern char	g_Buf[256];										/*	グローバル文字列用汎用変数				*/

extern unsigned char ucChrBelt[][16];
extern unsigned char ucChrFloor[][16];
extern unsigned char ucChrMaterial[][16];
extern unsigned char ucChrHuman[][16];
extern unsigned char ucChrPlate[][16];
extern unsigned char ucChrTableUnder[][16];
extern unsigned char ucChrFilterLeft[][16];
extern unsigned char ucChrFilterRight[][16];
extern unsigned char ucChrTableLeft[][16];
extern unsigned char ucChrRefrigerator[][16];
extern unsigned char ucChrOven[][16];
extern unsigned char ucChrMark[][16];
extern unsigned char ucChrShortTable[][16];
extern unsigned char ucChrStopGage[][16];
extern unsigned char ucChrTrashBox[][16];
extern unsigned char ucChrPudding[][16];
extern unsigned char ucChrReady[][16];
extern unsigned char ucChrMiss[][16];
extern unsigned char ucChrGO[][16];
extern unsigned char ucChrPause[][16];
extern unsigned char ucChrGameOver[][16];

/*	-------------------------------------------------------------------------------------------------
 *		ローカル定数
	-------------------------------------------------------------------------------------------------	*/
#define PLAYER_SPEED	2
#define PLAYER_MAXGET_MATERIAL	5

#define SCORE_PUDDING	10
#define SCORE_RECEIVE	8
#define SCORE_ONESTEP	5
#define SCORE_LEVELUP	100

#define PUDDING_NUMBER	10
#define PUDDING_STATUS_NOUSE	0
#define PUDDING_STATUS_MOVE		1
#define PUDDING_STATUS_SPLASHES	2
#define PUDDING_STATUS_POPUP	3

#define TIME_TABLE_SIZE	8

#define RETURNTHING_DIVIDE	20

#define LEVELUP_SPEED	4000
#define LEVELUP_MAX		8

#define SCREEN_WIDTH	28
#define SCREEN_HEIGHT	18

#define BELT_NUMBER		5
#define BELT_X			3
#define BELT_Y			4
#define BELT_LENGTH		10
#define BELT_CHRTOP		2

#define MATERIAL_KIND_NUMBER	7						/*	コンベアに流れる材料の数		*/
#define MATERIAL_EFFECTIVE_NUMBER	5					/*	実際にプリンの材料になる種類数	*/
#define MATERIAL_NUMBER			10						/*	一度に出すことの出来る素材の数	*/

#define MATERIAL_STATUS_NOUSE		0
#define MATERIAL_STATUS_CONVEYER	1
#define MATERIAL_STATUS_DROP		2
#define MATERIAL_STATUS_GARBAGE		3
#define MATERIAL_STATUS_REUSE		4

#define EMPLOYEE_NUMBER	5
#define EMPLOYEE_SPAN	32
#define EMPLOYEE_SPEED	1

#define EMPLOYEE_FREE	0								/*	従業員は空いている				*/
#define EMPLOYEE_CARRY	1								/*	材料を運搬中					*/
#define EMPLOYEE_WAIT	2								/*	材料を置いていいタイミング待ち	*/
#define EMPLOYEE_EXIT	3								/*	倉庫へ戻る						*/

#define CATCH_RECV	0
#define CATCH_BACK	1

#define CONTENT_NO			0
#define CONTENT_MATERIAL	1
#define CONTENT_DRIP		2
#define CONTENT_PUDDING		3

#define FILTRATION_SPEED		180				/*	こすスピード			*/
#define FILTRATION_MAX_DRIP_VAL	10				/*	こされた材料の入る量	*/
#define HOSE_ANIME_TIME			10

#define OVEN_PAT_NUMBER	4						/*	パターン数				*/
#define OVEN_TIMER			500					/*	焼くのに必要な時間		*/
#define OVEN_STATUS_OPEN	0
#define OVEN_STATUS_CLOSE	1
#define OVEN_STATUS_WAIT	2

#define REFRIGERATOR_TIMER			180			/*	プリンを冷やすのに必要な時間	*/
#define REFRIGERATOR_STATUS_OPEN	0
#define REFRIGERATOR_STATUS_CLOSE	1
#define REFRIGERATOR_STATUS_WAIT	2

#define STOP_ONESIZE	8						/*	停止タイマーのステップ数	*/
#define STOP_GAGESIZE	8
#define STOP_TOTALGAGESIZE	(STOP_ONESIZE * STOP_GAGESIZE)
#define STOP_GAGE_X		16
#define STOP_GAGE_Y		1

#define STOP_STATUS_NONSTOP	0
#define STOP_STATUS_STOP	1
#define STOP_STATUS_DISABLE	2

#define VECTOR_UP		0
#define VECTOR_DOWN		1
#define VECTOR_LEFT		2
#define VECTOR_RIGHT	3

#define MESSAGE_FREE			0				/*	メッセージ表示状態	*/
#define MESSAGE_READY_MOVE		1
#define MESSAGE_READY_WAIT		2
#define MESSAGE_GO_WAIT			3
#define MESSAGE_MISS_WAIT		4
#define MESSSGE_GAMEOVER		5

#define TOUCH_SPACE			0
#define TOUCH_WORKSPACE		1				/*	材料を受けたりする場所	*/
#define TOUCH_FILTRATION	2				/*	こし作業場所			*/
#define TOUCH_DRIP			3				/*	こされた物を受け取る場所*/
#define TOUCH_OVEN			4				/*	オーブンで焼く場所		*/
#define TOUCH_GRILLEDUP		5				/*	焼き上がり				*/
#define TOUCH_REFRIGERATOR	6				/*	冷蔵庫					*/

#define TOUCH_BLOCK			16
unsigned char ucTouchMap[][SCREEN_WIDTH] = {			/*	あたり判定用マップ							*/
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x05,0x05,0x05,0x00,0x00,0x04,0x04,0x04 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },
	{ 0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x00,0x02,0x02,0x02 },
	{ 0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
	{ 0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
};

/*	-------------------------------------------------------------------------------------------------
 *		ローカル構造体宣言
	-------------------------------------------------------------------------------------------------	*/
typedef struct{
	int iX, iY, iVector;
	int iAnime, iAnimeTime;

	int	iCatchMode;									/*	手の状態	0 - 受け状態 / 1 - 跳ね返し状態	*/
	int	iCatchVector;

	int	iContent;									/*	持っている物 / 0 - 空の鍋 / 1 - 材料が入っている / 2 - こした後 / 3 - 焼き終わったプリン	*/
	int iContentVal;

	int	iStopFlag;
	int	iStopTimer;

	int iPanX, iPanY, iPanYY;
	int	iMaterialCnt[MATERIAL_EFFECTIVE_NUMBER];							/*	受けた材料の量								*/
} PLAYER;

typedef struct{
	int	iStatus[EMPLOYEE_NUMBER];
	int	iX[EMPLOYEE_NUMBER], iY[EMPLOYEE_NUMBER];
	int iVector[EMPLOYEE_NUMBER];
	int iMaterialKind[EMPLOYEE_NUMBER];
	int	iConveyerNo[EMPLOYEE_NUMBER];

	int iAnimeNo[EMPLOYEE_NUMBER];
	int iAnimeTime[EMPLOYEE_NUMBER];

	int	iSpanTimer;
} EMPLOYEE;

typedef struct{
	int	iY;
	int iYAdd;
} BELT;

typedef struct{
	int iStatus;
	int	iX, iY;
	int	iXX, iYY;
	int	iKind;
} MATERIAL;

typedef struct{											/*	同時落下を防ぐためのタイムテーブル			*/
	unsigned char	ucTimeTable[TIME_TABLE_SIZE];
	int	iCounter;
} TIMETBL;

typedef	struct{											/*	ゲームレベル								*/
	int	iLevel;
	int	iTimer;
} LEVEL;

typedef struct{
	int	iY;
	int iYY;
	int	iMoveFlag;
} ICON;

typedef struct{
	int	iTimer;											/*	こしスピード管理用							*/
	int iMaterialVal;									/*	こす材料の量								*/
	int	iDripVal;										/*	こした材料の量								*/
	int	iMaxValue;										/*	分量表示用									*/
	int	iHoseAniTime;
	int	iHoseAniNo;
} FILTRATION;

typedef struct{
	int iStatus;
	int	iTimer;											/*	冷やし時間管理用							*/
	int iPuddingVal;									/*	冷蔵庫に入れたプリンの量					*/

	int	iAniTime;
	int iAniNo;
} REFRIGERATOR;

typedef struct{
	int iStatus;
	int iPuddingVal;									/*	焼いているプリンの量						*/
	int	iGrilledUpVal;									/*	焼き上がったプリン							*/
	int	iTimer;											/*	やき上がり管理用							*/

	int	iAniTime;
	int	iAniNo;
} OVEN;

typedef struct{
	int iStatus;
	int	iX, iY, iXX, iYY;
	int	iTableNo;
	int	iAniTimer;
	int iAniNo;
} PUDDING;

typedef struct{											/*	表示物関連									*/
	int	iMarkerY, iMarkerTimer;

	int iMessageStatus;
	int	iMessageX, iMessageY, iMessageXX, iMessageYY;
	int	iMessageXBack, iMessageYBack;
	int	iMessageTimer;
} INFO;

typedef struct{											/*	返却物	*/
	int iKind;
	int	iValue;
	int iX, iY;
	int iXX, iYY;
	int	iOffsetY, iOffsetYY;							/*	放物線を描かせるオフセット	*/
	int	iTimer;
} RETURNTHING;

typedef struct{
	int iAniNo;
	int iAniTimer;
} TRASHBOX;

typedef struct{
	int			iScore, iHiScore;
	int			iNameEntryFlag;							/*	HiScore ランカーに入ったか？				*/
	int			iTransparencyFlag;						/*	擬似半透明処理用							*/
	int			iPlayer;								/*	残機										*/
	int			iEventStop;								/*	動きを止めるフラグ							*/

	PLAYER		player;									/*	プレイヤー									*/
	EMPLOYEE	employee;
	BELT		belt[BELT_NUMBER];
	MATERIAL	material[MATERIAL_NUMBER];
	TIMETBL		timeTbl;
	LEVEL		level;
	ICON		icon[MATERIAL_KIND_NUMBER];
	FILTRATION	filtration;
	REFRIGERATOR	refrigerator;
	OVEN		oven;
	PUDDING		pudding[PUDDING_NUMBER];
	INFO		info;
	RETURNTHING	returnThing;
	TRASHBOX	trashBox;
} GAME_REG;


/*	-------------------------------------------------------------------------------------------------
 *		ローカル変数
	-------------------------------------------------------------------------------------------------	*/
GAME_REG	l_Game;

/*	-------------------------------------------------------------------------------------------------
 *		ローカル関数
	-------------------------------------------------------------------------------------------------	*/
void Game_Main_Ready();
void Game_Main();
void BeltConveyer();
void DisplayInfo();
void DeskMask();
void Player();
void Employee();
void Oven();
void Refrigerator();
void Filtration();
void Material();
int IsTimingCheck( int iConveyerNo );
void CheckMarkTiming( int iConveyerNo );
void AddMaterial( int iConveyerNo, int iMaterialKind );
void Manager();
void DrawMaterialValue();
void SetConveyerSpeed();
void EntryEmployee();
void DrawDripper();
void DrawPlate( int iTableNo, int iPuddingVal );
void DrawFilter( int iHoseNo, int iMaterialVal );
void DrawOven( int iAniNo );
void DrawRefrigerator( int iAniNo );
void DrawStopGage();
void PreparationReady();
void DrawMessage();
void AddPudding( int iTableNo );
void Pudding();
void PuddingMoveComp( int iTableNo );
void DrawScore();
void AddReturnThing( int iKind, int iValue, int iStartX, int iStartY );
void ReturnThing();
void ReturnThingTerm( int iKind );
void TrashBoxPutIn();
void TrashBox();
void PreparationMiss();
void ReTry();
void InitGameReg();

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			ゲーム開始するときに呼びます
 *			初期化等もここで行われます。
	-------------------------------------------------------------------------------------------------	*/
void Game_Start()
{
	int i, j;

	/*	変数の初期化		*/
	SetConveyerSpeed();

	l_Game.iHiScore = g_Reg.iHiScore[RANKER_NUMBER-1];
	l_Game.iScore = 0;
	l_Game.iTransparencyFlag = 0;
	l_Game.level.iTimer = 0;
	l_Game.level.iLevel = 1;
	l_Game.iEventStop = FALSE;
	l_Game.iNameEntryFlag = FALSE;
#ifndef _DEBUG_
	l_Game.iPlayer = 2;
#else
	l_Game.iPlayer = 0;
#endif

	/*	キャラ設定			*/
	sprite_SetCharacter( PUDDING_CHRTOP, 4, ucChrPudding );
	sprite_SetCharacter( FLOOR_CHRTOP, 16, ucChrFloor );
	sprite_SetCharacter( DESK_UNDER_CHRTOP, 16, ucChrTableUnder );
	sprite_SetCharacter( MATERIAL_CHRTOP, 32, ucChrMaterial );
	sprite_SetCharacter( HUMAN_CHRTOP, 96, ucChrHuman );
	sprite_SetCharacter( PLATE_CHRTOP, 24, ucChrPlate );
	sprite_SetCharacter( MARK_CHRTOP, 12, ucChrMark );
	sprite_SetCharacter( DESK_TOP_CHRTOP, 16, ucChrShortTable );
	sprite_SetCharacter( GAGE_CHRTOP, 9, ucChrStopGage );
	sprite_SetCharacter( TRASHBOX_CHRTOP, 16, ucChrTrashBox );

	/*	変数の初期化	*/
	InitGameReg();

	/*	画面設定			*/
	sprite_Off();
	bg_Off( SCREEN1 );
	bg_Off( SCREEN2 );

	bg_SetOffset( SCREEN1, 0, 0 );
	bg_SetOffset( SCREEN2, 0, 0 );
	bg_Clear( SCREEN2, 0| BG_PALe );
	/*	床の描画		*/
	for( i = 0; i < 14; i++ ){
		for( j = 0; j < 9; j++ ){
			bg_Set( SCREEN1, i*2, j*2,		FLOOR_CHRTOP	| BG_PAL8 );
			bg_Set( SCREEN1, i*2+1, j*2,	FLOOR_CHRTOP+1	| BG_PAL8 );
			bg_Set( SCREEN1, i*2,   j*2+1,	FLOOR_CHRTOP+8	| BG_PAL8 );
			bg_Set( SCREEN1, i*2+1, j*2+1,	FLOOR_CHRTOP+9	| BG_PAL8 );
		}
	}

	/*	コンベアの描画		*/
	for( i = 0; i < BELT_NUMBER; i++ ){
		for( j = 0; j < BELT_LENGTH; j++ ){
			bg_Set( SCREEN2, BELT_X+i*3, BELT_Y+j, BELT_CHRTOP+i*2| BG_PAL8 );
			bg_Set( SCREEN2, BELT_X+i*3+1, BELT_Y+j, BELT_CHRTOP+1+i*2| BG_PAL8 );
		}
	}

	/*	机の描画		*/
	for( i = 0; i < 8; i++ ){
		for( j = 0; j < 2; j++ ){
			bg_Set( SCREEN2, 20+i, 7+j, DESK_TOP1_CHRTOP+i+j*8| BG_PALe );
			bg_Set( SCREEN2, 20+i, 9+j, DESK_UNDER_CHRTOP+i+j*8| BG_PALe );

			bg_Set( SCREEN2, 20+i, 12+j, DESK_TOP2_CHRTOP+i+j*8| BG_PALe );
			bg_Set( SCREEN2, 20+i, 14+j, DESK_UNDER_CHRTOP+i+j*8| BG_PALe );
		}
	}

	/*	冷蔵庫の描画	*/
	for( i = 0; i < 4; i++ ){
		for( j = 0; j < 4; j++ ){
			bg_Set( SCREEN2, 20+i, 2+j, DESK_TOP_CHRTOP+i+j*4| BG_PALe );
			bg_Set( SCREEN2, 24+i, 2+j, REFRIGERATOR_CHRTOP+i+j*4| BG_PALe );
		}
	}


	/*	最終準備		*/
	DrawMaterialValue();
	DrawPlate( 0, 0 );
	DrawPlate( 1, 0 );
	DrawFilter( 0, 0 );
	DrawOven( 0 );
	DrawRefrigerator( 0 );
	DrawScore();

	sprite_On();
	bg_On( SCREEN1 );
	bg_On( SCREEN2 );

	PreparationReady();
	g_GameProc = Game_Main_Ready;						/*	メインループ指定							*/
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			ゲームのメインです
	-------------------------------------------------------------------------------------------------	*/
void Game_Main_Ready()		/*	開始予告状態のゲームループ	*/
{
	DrawMessage();										/*	開始予告表示								*/
	BeltConveyer();										/*	ベルトコンベアー							*/
	ReturnThing();										/*	返却物										*/
	DeskMask();											/*	机のマスク									*/
	Player();											/*	主人公										*/
	Oven();												/*	オーブン									*/
	Refrigerator();										/*	冷蔵庫										*/
	Filtration();										/*	こし作業									*/
	Pudding();											/*	プリン										*/
	TrashBox();											/*	ごみ箱										*/
	DisplayInfo();										/*	得点等の表示								*/
	DrawStopGage();										/*	ストップゲージ								*/
	Manager();											/*	全体の管理									*/
}

void Game_Main()			/*	通常ゲームループ			*/
{
	int iKey;

	DrawMessage();										/*	開始予告表示								*/
	BeltConveyer();										/*	ベルトコンベアー							*/
	ReturnThing();										/*	返却物										*/
	DeskMask();											/*	机のマスク									*/
	Player();											/*	主人公										*/
	Material();											/*	材料										*/
	Employee();											/*	従業員										*/
	Oven();												/*	オーブン									*/
	Refrigerator();										/*	冷蔵庫										*/
	Filtration();										/*	こし作業									*/
	Pudding();											/*	プリン										*/
	TrashBox();											/*	ごみ箱										*/
	DisplayInfo();										/*	得点等の表示								*/
	DrawStopGage();										/*	ストップゲージ								*/
	Manager();											/*	全体の管理									*/

	/* Debug	*/
	iKey = key_PushDown();
	if( iKey & KEY_START ){ 
		g_Reg.iGameLoop = FALSE;
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			ベルトコンベアーの処理を行います
	-------------------------------------------------------------------------------------------------	*/
void BeltConveyer()
{
	int i;
	if( l_Game.player.iStopFlag != STOP_STATUS_STOP && l_Game.iEventStop == FALSE ){
		/*	ベルトコンベアーを動かす	*/
		for( i = 0; i < BELT_NUMBER; i++ ){
			l_Game.belt[i].iY += l_Game.belt[i].iYAdd;
			l_Game.belt[i].iY = l_Game.belt[i].iY % 64;
			sprite_SetCharacter( BELT_CHRTOP+i*2, 2, ucChrBelt[ (l_Game.belt[i].iY/8)*2 ] );
		}

		/*	タイムテーブル（素材の同時落下を防ぐため）の管理	*/
		l_Game.timeTbl.iCounter++;
		if( l_Game.timeTbl.iCounter >= 64 ){				/*	64 フレームごとに管理する					*/
			l_Game.timeTbl.iCounter = 0;
			for( i = 0; i < TIME_TABLE_SIZE-1; i++ ){
				l_Game.timeTbl.ucTimeTable[i] = l_Game.timeTbl.ucTimeTable[i+1];
			}
			l_Game.timeTbl.ucTimeTable[TIME_TABLE_SIZE-1] = 0;
		}
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void DisplayInfo()
{
	int i;
	/*	食材アイコンの描画	*/
	for( i = 0; i < MATERIAL_EFFECTIVE_NUMBER; i++ ){
		if( l_Game.iEventStop == FALSE ){
			if( l_Game.icon[i].iMoveFlag ){
				l_Game.icon[i].iY += l_Game.icon[i].iYY;
				l_Game.icon[i].iYY ++;
				if( l_Game.icon[i].iY > 0 ){
					l_Game.icon[i].iY = 0;
					l_Game.icon[i].iMoveFlag = FALSE;
				}
			}
		}
		sprite_Set( 32+i, 0, 8+i*16 + l_Game.icon[i].iY/4, SP_PAL6 );
	}

	/*	タイミングフラグ	*/
#ifdef _DEBUG_
	for( i = 0; i < TIME_TABLE_SIZE; i++ ){
		if( l_Game.timeTbl.ucTimeTable[TIME_TABLE_SIZE-i-1] ){
			bg_Text( SCREEN2, 17, 4+i, "1", BG_PALe );
		} else {
			bg_Text( SCREEN2, 17, 4+i, "0", BG_PALe );
		}
	}
#endif

	/*	目的地マーカーの描画	*/
	switch( l_Game.player.iContent ){
		case	CONTENT_MATERIAL:
			sprite_Set( 24, 200, 120 + l_Game.info.iMarkerY, SP_PAL6 | CFM_SPR_UPPER);
			break;
		case	CONTENT_DRIP:
			if( l_Game.oven.iPuddingVal == 0 ){
				sprite_Set( 24, 200, 80 + l_Game.info.iMarkerY, SP_PAL6 | CFM_SPR_UPPER);
			}
			/*	忙しいマーク	*/
			if( l_Game.iTransparencyFlag ){
				if( l_Game.oven.iPuddingVal ){
					sprite_Set( 26, 200, 56, SP_PAL6 | CFM_SPR_UPPER);
				}
			}
			break;
		case	CONTENT_PUDDING:
			if( l_Game.refrigerator.iPuddingVal == 0){
				sprite_Set( 24, 200, 40 + l_Game.info.iMarkerY, SP_PAL6 | CFM_SPR_UPPER);
			}
			/*	忙しいマーク	*/
			if( l_Game.iTransparencyFlag ){
				if( l_Game.refrigerator.iPuddingVal ){
					sprite_Set( 26, 200, 24, SP_PAL6 | CFM_SPR_UPPER);
				}
			}
			break;
	}
	if( l_Game.player.iContent != CONTENT_NO && l_Game.iEventStop == FALSE ){
		l_Game.info.iMarkerTimer++;
		if( l_Game.info.iMarkerTimer > 8 ){
			l_Game.info.iMarkerTimer = 0;
			l_Game.info.iMarkerY --;
			if( l_Game.info.iMarkerY < 0 ){
				l_Game.info.iMarkerY = 5;
			}
		}
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			手なべに受けた材料の分量を表示する
	-------------------------------------------------------------------------------------------------	*/
void DrawMaterialValue()
{
	int i, iPal;

	l_Game.player.iContentVal = 0;
	l_Game.player.iContent = CONTENT_NO;
	iPal = BG_PALd;
	if( l_Game.player.iMaterialCnt[0] != 0 ){
		for( i = 0; i < 4; i++ ){
			if( l_Game.player.iMaterialCnt[i] != l_Game.player.iMaterialCnt[i+1] ){
				break;
			}
		}
		if( i == 4 ){
			iPal = BG_PALb;
			l_Game.player.iContentVal = l_Game.player.iMaterialCnt[0];
			l_Game.player.iContent = CONTENT_MATERIAL;
		}
	}

	for( i = 0; i < 5; i++ ){
		sprintf( g_Buf, "%d", l_Game.player.iMaterialCnt[i] );
		bg_Text( SCREEN1, 2, 2+i*2, g_Buf, iPal );
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			机の後ろに主人公が隠れるようにスプライトで隠す(時間ないので、ごまかしですー(^-^;)
	-------------------------------------------------------------------------------------------------	*/
void DeskMask()
{
	if( l_Game.player.iX > 136 ){						/*	152 = 机と主人公がかさなる座標				*/
		if( l_Game.player.iY >= 32 ){
			if( l_Game.player.iY <= 48 ){
				sprite_Set( 0x30, 160, 56, 0 );
				return;
			}
		}
		if( l_Game.player.iY >= 72 ){
			if( l_Game.player.iY <= 88 ){
				sprite_Set( 0x31, 160, 96, 0 );
				return;
			}
		}
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			主人公の制御を行います
	-------------------------------------------------------------------------------------------------	*/
void Player()
{
	int iKey, iKeyDown, i, j, iImageNo, iParam, iPanParam;
	int iPanImageNo;
	iKeyDown = key_PushDown();
	iKey = key_Press();

	/*	*/
	if( l_Game.iEventStop ){
		iKey = 0;
	}

	/*	移動		*/
	if( iKey & KEY_UP1 ){
		l_Game.player.iY -= PLAYER_SPEED;
		l_Game.player.iVector = VECTOR_UP;
		l_Game.player.iAnimeTime++;
	}
	if( iKey & KEY_DOWN1 ){
		l_Game.player.iY += PLAYER_SPEED;
		l_Game.player.iVector = VECTOR_DOWN;
		l_Game.player.iAnimeTime++;
	}
	if( iKey & KEY_LEFT1 ){
		l_Game.player.iX -= PLAYER_SPEED;
		l_Game.player.iVector = VECTOR_LEFT;
		l_Game.player.iCatchVector = VECTOR_LEFT;
		l_Game.player.iAnimeTime++;
	}
	if( iKey & KEY_RIGHT1 ){
		l_Game.player.iX += PLAYER_SPEED;
		l_Game.player.iVector = VECTOR_RIGHT;
		l_Game.player.iCatchVector = VECTOR_RIGHT;
		l_Game.player.iAnimeTime++;
	}

	/*	移動範囲制限	*/
	if( l_Game.player.iX > SCREEN_WIDTH*8-16 ){				/*	16 = 主人公の幅		*/
		l_Game.player.iX = SCREEN_WIDTH*8-16;
	}
	if( l_Game.player.iY > SCREEN_HEIGHT*8-24 ){			/*	24 = 主人公の高さ	*/
		l_Game.player.iY = SCREEN_HEIGHT*8-24;
	}

	i = (l_Game.player.iX+8)/8;
	j = (l_Game.player.iY+16)/8;
	if( ucTouchMap[j][i] >= TOUCH_BLOCK ){
		l_Game.player.iY += PLAYER_SPEED;
	}
	j = (l_Game.player.iY+23)/8;
	if( ucTouchMap[j][i] >= TOUCH_BLOCK ){
		l_Game.player.iY -= PLAYER_SPEED;
	}
	i = (l_Game.player.iX)/8;
	j = (l_Game.player.iY+20)/8;
	if( ucTouchMap[j][i] >= TOUCH_BLOCK ){
		l_Game.player.iX += PLAYER_SPEED;
	}
	i = (l_Game.player.iX+15)/8;
	if( ucTouchMap[j][i] >= TOUCH_BLOCK ){
		l_Game.player.iX -= PLAYER_SPEED;
	}

	/*	手にもっている物	*/
	iPanImageNo = 14;
	if( l_Game.player.iContent == CONTENT_DRIP || l_Game.player.iContent == CONTENT_PUDDING ){
		iPanImageNo = l_Game.player.iContentVal;
		if( iPanImageNo > 4 ){ iPanImageNo = (iPanImageNo-4)%2 + 4;	}
		iPanImageNo += 40;
	}

	/*	Aボタンの処理	*/
	l_Game.player.iCatchMode = CATCH_RECV;
	if( iKey & KEY_A ){
		i = (l_Game.player.iX + 8)/8;
		j = (l_Game.player.iY + 16)/8;
		switch(ucTouchMap[j][i]){
			case	TOUCH_WORKSPACE:
				l_Game.player.iCatchMode = CATCH_BACK;
				iPanImageNo = 15;
				break;

			case	TOUCH_FILTRATION:
				if( l_Game.player.iVector == VECTOR_UP ){
					if( l_Game.player.iContentVal && l_Game.player.iContent == CONTENT_MATERIAL ){
						l_Game.filtration.iMaterialVal += l_Game.player.iContentVal;
						l_Game.filtration.iMaxValue = l_Game.filtration.iMaterialVal;

						for( i = 0; i < 5; i++ ){
							l_Game.player.iMaterialCnt[i] = 0;
						}
						l_Game.player.iContentVal = 0;
						l_Game.player.iContent = CONTENT_NO;
						DrawMaterialValue();

						l_Game.iScore += SCORE_ONESTEP;
						DrawScore();
					}
				}
				break;

			case	TOUCH_DRIP:
				if( l_Game.player.iVector == VECTOR_UP ){
					if( l_Game.filtration.iDripVal ){
						switch( l_Game.player.iContent ){
							case CONTENT_PUDDING:
								AddReturnThing( CONTENT_PUDDING, l_Game.player.iContentVal, l_Game.player.iX, l_Game.player.iY );
								l_Game.player.iContent = CONTENT_NO;
								l_Game.player.iContentVal = 0;
								break;
							case CONTENT_DRIP:
								l_Game.filtration.iDripVal += l_Game.player.iContentVal;
								break;
						}

						l_Game.player.iContent = CONTENT_DRIP;
						l_Game.player.iContentVal = l_Game.filtration.iDripVal;
						l_Game.filtration.iDripVal = 0;
						DrawPlate( 1, 0 );
					}
				}
				break;

			case	TOUCH_OVEN:
				if( l_Game.player.iVector == VECTOR_UP ){
					if( l_Game.oven.iPuddingVal == 0 && l_Game.player.iContentVal && l_Game.player.iContent == CONTENT_DRIP ){
						l_Game.oven.iPuddingVal = l_Game.player.iContentVal;
						l_Game.player.iContent = CONTENT_NO;
						l_Game.player.iContentVal = 0;

						l_Game.oven.iTimer = 0;
						l_Game.oven.iStatus = OVEN_STATUS_CLOSE;
						l_Game.oven.iAniNo = OVEN_PAT_NUMBER-1;
						l_Game.oven.iAniTime = 0;
						DrawOven( OVEN_PAT_NUMBER-1 );

						l_Game.iScore += SCORE_ONESTEP;
						DrawScore();
					}
				}
				break;

			case	TOUCH_GRILLEDUP:
				if( l_Game.player.iVector == VECTOR_UP && l_Game.oven.iGrilledUpVal ){
					switch( l_Game.player.iContent ){
						case CONTENT_PUDDING:
							l_Game.oven.iGrilledUpVal += l_Game.player.iContentVal;
							break;

						case CONTENT_DRIP:
							AddReturnThing( CONTENT_DRIP, l_Game.player.iContentVal, l_Game.player.iX, l_Game.player.iY );
							l_Game.player.iContent = CONTENT_NO;
							l_Game.player.iContentVal = 0;
							break;
					}
					l_Game.player.iContent = CONTENT_PUDDING;
					l_Game.player.iContentVal = l_Game.oven.iGrilledUpVal;
					l_Game.oven.iGrilledUpVal = 0;
					DrawPlate( 0, 0 );
				}
				break;

			case	TOUCH_REFRIGERATOR:
				if( l_Game.player.iVector == VECTOR_UP ){
					if( l_Game.refrigerator.iPuddingVal == 0 && l_Game.player.iContent == CONTENT_PUDDING ){
						l_Game.refrigerator.iPuddingVal = l_Game.player.iContentVal;
						l_Game.refrigerator.iStatus = REFRIGERATOR_STATUS_CLOSE;
						l_Game.refrigerator.iAniNo = 2;
						l_Game.refrigerator.iAniTime = 0;
						l_Game.refrigerator.iTimer = 0;

						l_Game.player.iContentVal = 0;
						l_Game.player.iContent = CONTENT_NO;
						DrawRefrigerator(2);

						l_Game.iScore += SCORE_ONESTEP;
						DrawScore();
					}
				}
				break;
		}
	}

	/*	Bボタンの処理	*/
	if( iKey & KEY_B ){
		if( l_Game.player.iStopFlag != STOP_STATUS_DISABLE ){
			l_Game.player.iStopFlag = STOP_STATUS_STOP;
			l_Game.player.iStopTimer--;
			if( l_Game.player.iStopTimer <= 0 ){
				l_Game.player.iStopFlag = STOP_STATUS_DISABLE;
			}
		}
	} else {
		l_Game.player.iStopFlag = STOP_STATUS_NONSTOP;
	}
	if( l_Game.player.iStopFlag != STOP_STATUS_STOP ){
		if( l_Game.player.iStopTimer < STOP_TOTALGAGESIZE && l_Game.iEventStop == FALSE ){
			l_Game.player.iStopTimer++;
		}
	}
	
	/*	お鍋の処理		*/
	if( l_Game.player.iCatchVector == VECTOR_LEFT ){
		l_Game.player.iPanX = l_Game.player.iX - 16;
	} else {
		l_Game.player.iPanX = l_Game.player.iX + 16;
	}
	l_Game.player.iPanY = l_Game.player.iY;
/*
	if( l_Game.player.iX < 136 ){
		if( l_Game.player.iContent != CONTENT_NO && l_Game.player.iContent != CONTENT_MATERIAL ){
			AddReturnThing( l_Game.player.iContent, l_Game.player.iContentVal, l_Game.player.iX, l_Game.player.iY );
			l_Game.player.iContent = CONTENT_NO;
			l_Game.player.iContentVal = 0;
		}
	}
*/

	/*	アニメーション	*/
	if( l_Game.player.iAnimeTime > 5 ){
		l_Game.player.iAnimeTime = 0;
		l_Game.player.iAnime++;
		if( l_Game.player.iAnime > 1 ){
			l_Game.player.iAnime = 0;
		}
	}

	/*	スプライト		*/
	iParam = SP_PAL4;
	iPanParam = SP_PAL6 | CFM_SPR_UPPER;

	switch( l_Game.player.iVector ){
		case	VECTOR_UP:
			iImageNo = 2;
			break;
		case	VECTOR_DOWN:
			iImageNo = 4;
			break;
		case	VECTOR_LEFT:
			iImageNo = 0;
			iParam = iParam | CFM_FLIP_H;
			break;
		case	VECTOR_RIGHT:
			iImageNo = 0;
			break;
	}
	if( l_Game.player.iX > l_Game.player.iPanX ){
		iPanParam = iPanParam | CFM_FLIP_H;
	}

	iImageNo += l_Game.player.iAnime;
	sprite_Set( iImageNo, l_Game.player.iX, l_Game.player.iY, iParam );
	sprite_Set( iPanImageNo, l_Game.player.iPanX, l_Game.player.iPanY, iPanParam );
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			従業員を動かす
	-------------------------------------------------------------------------------------------------	*/
void Employee()
{
	int i, iPatNo, iParam;

	/*	出現処理	*/
	if( l_Game.iEventStop == FALSE ){
		l_Game.employee.iSpanTimer++;
		if( l_Game.employee.iSpanTimer >= EMPLOYEE_SPAN ){
			l_Game.employee.iSpanTimer = 0;
			if( l_Game.level.iLevel + 2 > (rand()%10) ){
				EntryEmployee();
			}
		}
	}

	/*	従業員の処理	*/
	for( i = 0; i < EMPLOYEE_NUMBER; i++ ){
		if( l_Game.iEventStop == FALSE ){
			switch( l_Game.employee.iStatus[i] )
			{
				case	EMPLOYEE_CARRY:
					if( l_Game.employee.iVector[i] == VECTOR_RIGHT ){
						l_Game.employee.iX[i] += EMPLOYEE_SPEED;
						if( l_Game.employee.iX[i] >= (24 + l_Game.employee.iConveyerNo[i]*24) ){
							l_Game.employee.iVector[i] = VECTOR_DOWN;
							l_Game.employee.iAnimeNo[i] = 2;
						}

						/*	アニメーション	*/
						l_Game.employee.iAnimeTime[i]++;
						if( l_Game.employee.iAnimeTime[i] > 5 ){
							l_Game.employee.iAnimeTime[i] = 0;
							l_Game.employee.iAnimeNo[i]++;
							if( l_Game.employee.iAnimeNo[i] >= 2 ){
								l_Game.employee.iAnimeNo[i] = 0;
							}
						}
					} else {
						l_Game.employee.iY[i] += 1;
						if( l_Game.employee.iY[i] >= 24 ){
							l_Game.employee.iStatus[i] = EMPLOYEE_WAIT;
						}

						/*	アニメーション	*/
						l_Game.employee.iAnimeTime[i]++;
						if( l_Game.employee.iAnimeTime[i] > 5 ){
							l_Game.employee.iAnimeTime[i] = 0;
							l_Game.employee.iAnimeNo[i]++;
							if( l_Game.employee.iAnimeNo[i] >= 4 ){
								l_Game.employee.iAnimeNo[i] = 2;
							}
						}
					}
					break;

				case	EMPLOYEE_WAIT:
					if( IsTimingCheck(l_Game.employee.iConveyerNo[i]) ){
						AddMaterial( l_Game.employee.iConveyerNo[i], l_Game.employee.iMaterialKind[i] );
						l_Game.employee.iStatus[i] = EMPLOYEE_EXIT;
						l_Game.employee.iVector[i] = VECTOR_UP;
						l_Game.employee.iAnimeNo[i] = 4;
					}
					break;

				case	EMPLOYEE_EXIT:
					if( l_Game.employee.iVector[i] == VECTOR_UP ){
						l_Game.employee.iY[i] -= 1;
						if( l_Game.employee.iY[i] <= (20 - l_Game.employee.iConveyerNo[i]*2) ){
							l_Game.employee.iVector[i] = VECTOR_LEFT;
							l_Game.employee.iAnimeNo[i] = 0;
						}

						/*	アニメーション	*/
						l_Game.employee.iAnimeTime[i]++;
						if( l_Game.employee.iAnimeTime[i] > 5 ){
							l_Game.employee.iAnimeTime[i] = 0;
							l_Game.employee.iAnimeNo[i]++;
							if( l_Game.employee.iAnimeNo[i] >= 6 ){
								l_Game.employee.iAnimeNo[i] = 4;
							}
						}
					} else {
						l_Game.employee.iX[i] -= EMPLOYEE_SPEED;
						if( l_Game.employee.iX[i] <= 16 ){
							l_Game.employee.iStatus[i] = EMPLOYEE_FREE;
						}

						/*	アニメーション	*/
						l_Game.employee.iAnimeTime[i]++;
						if( l_Game.employee.iAnimeTime[i] > 5 ){
							l_Game.employee.iAnimeTime[i] = 0;
							l_Game.employee.iAnimeNo[i]++;
							if( l_Game.employee.iAnimeNo[i] >= 2 ){
								l_Game.employee.iAnimeNo[i] = 0;
							}
						}
					}
					break;
			}
		}

		/*	描画	*/
		if( l_Game.employee.iStatus[i] != EMPLOYEE_FREE ){
			iPatNo = 8 + l_Game.employee.iAnimeNo[i];
			iParam = 0;
			if( l_Game.employee.iVector[i] == VECTOR_LEFT ){
				iParam = iParam | CFM_FLIP_H; 
			}
			sprite_Set( iPatNo, l_Game.employee.iX[i], l_Game.employee.iY[i], iParam );

			if( l_Game.employee.iStatus[i] != EMPLOYEE_EXIT ){
				sprite_Set( 32+l_Game.employee.iMaterialKind[i], l_Game.employee.iX[i], l_Game.employee.iY[i]-16, SP_PAL6 );
			}
		}
	}

}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void EntryEmployee()
{
	int i, j, iConveyerNo, iKind;
	/*	空いている従業員を探す	*/
	for( i = 0; i < EMPLOYEE_NUMBER; i++ ){
		if( l_Game.employee.iStatus[i] == EMPLOYEE_FREE ){ break;	}
	}
	if( i == EMPLOYEE_NUMBER ){ return;	}

	/*	コンベアー自体が使用済みならパスする	*/
	iConveyerNo = rand() % BELT_NUMBER;
	for( j = 0; j < EMPLOYEE_NUMBER; j++ ){
		if( l_Game.employee.iStatus[j] == EMPLOYEE_CARRY || l_Game.employee.iStatus[j] == EMPLOYEE_WAIT ){
			if( l_Game.employee.iConveyerNo[j] == iConveyerNo ){
				return;
			}
		}
	}

	/*	同じ材料が出すぎていないかチェック	*/
	iKind = rand() % MATERIAL_KIND_NUMBER;
	if( iKind < MATERIAL_EFFECTIVE_NUMBER ){
		if( l_Game.player.iMaterialCnt[iKind] >= PLAYER_MAXGET_MATERIAL ){
			return;
		}
	}

	/*	準備をする	*/
	l_Game.employee.iStatus[i] = EMPLOYEE_CARRY;
	l_Game.employee.iX[i] = 16;
	l_Game.employee.iY[i] = 20 - i*2;
	l_Game.employee.iConveyerNo[i] = iConveyerNo;
	l_Game.employee.iMaterialKind[i] = iKind;
	l_Game.employee.iVector[i] = VECTOR_RIGHT;
	l_Game.employee.iAnimeNo[i] = 0;
	l_Game.employee.iAnimeTime[i] = 0;

	if( l_Game.icon[iKind].iMoveFlag == FALSE ){
		l_Game.icon[iKind].iMoveFlag = TRUE;
		l_Game.icon[iKind].iYY = -5;
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void Refrigerator()
{
	if( l_Game.iEventStop ){
		return;
	}

	switch( l_Game.refrigerator.iStatus ){
		case REFRIGERATOR_STATUS_OPEN:
			l_Game.refrigerator.iAniTime++;
			if( l_Game.refrigerator.iAniTime >= 30 ){
				l_Game.refrigerator.iAniTime=0;
				l_Game.refrigerator.iAniNo++;
				if( l_Game.refrigerator.iAniNo >= 2 ){
					l_Game.refrigerator.iStatus = REFRIGERATOR_STATUS_WAIT;
					AddPudding(0);
				}
				DrawRefrigerator( l_Game.refrigerator.iAniNo );
			}
			break;

		case REFRIGERATOR_STATUS_CLOSE:
			if( l_Game.refrigerator.iAniNo ){
				/*	まだ扉が閉まっていない	*/
				l_Game.refrigerator.iAniTime++;
				if( l_Game.refrigerator.iAniTime > 30 ){
					l_Game.refrigerator.iAniTime=0;
					l_Game.refrigerator.iAniNo--;
					DrawRefrigerator( l_Game.refrigerator.iAniNo );
				}
			} else {
				if( l_Game.refrigerator.iPuddingVal ){
					l_Game.refrigerator.iTimer ++;
					if( l_Game.refrigerator.iTimer >= REFRIGERATOR_TIMER ){
						l_Game.refrigerator.iStatus = REFRIGERATOR_STATUS_OPEN;
						l_Game.refrigerator.iAniTime = 0;
					}
				}
			}
			break;
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void Oven()
{
	if( l_Game.iEventStop ){
		return;
	}

	switch( l_Game.oven.iStatus ){
		case	OVEN_STATUS_OPEN:
			l_Game.oven.iAniTime++;
			if( l_Game.oven.iAniTime >= 20 ){
				l_Game.oven.iAniTime = 0;
				l_Game.oven.iAniNo++;
				if( l_Game.oven.iAniNo >= 3 ){
					l_Game.oven.iStatus = OVEN_STATUS_WAIT;
					AddPudding( 1 );
				}
				DrawOven( l_Game.oven.iAniNo );
			}
			break;

		case	OVEN_STATUS_CLOSE:
			if( l_Game.oven.iAniNo ){
				l_Game.oven.iAniTime++;
				if( l_Game.oven.iAniTime >= 20 ){
					l_Game.oven.iAniTime = 0;
					l_Game.oven.iAniNo--;
					DrawOven( l_Game.oven.iAniNo );
				}
			} else {
				if( l_Game.oven.iPuddingVal ){
					l_Game.oven.iTimer++;
					if( l_Game.oven.iTimer >= OVEN_TIMER ){
						l_Game.oven.iStatus = OVEN_STATUS_OPEN;
						l_Game.oven.iAniTime = 0;
					}
				}
			}
			break;
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void Filtration()
{
	int	iMaterial, iHose;

	if( l_Game.iEventStop ){
		return;
	}

	if( l_Game.filtration.iMaterialVal && l_Game.filtration.iDripVal <= FILTRATION_MAX_DRIP_VAL ){
		l_Game.filtration.iTimer++;
		if( l_Game.filtration.iTimer >= FILTRATION_SPEED ){
			l_Game.filtration.iTimer = 0;
			l_Game.filtration.iMaterialVal--;
			l_Game.filtration.iHoseAniTime = 1;
		}
	}
	/*	材料の残量処理	*/
	iMaterial = 0;
	if( l_Game.filtration.iMaxValue ){
		iMaterial = l_Game.filtration.iMaterialVal * 3 / l_Game.filtration.iMaxValue;
		if( l_Game.filtration.iMaterialVal == 0 ){
			l_Game.filtration.iMaxValue = 0;
		}
	}

	/*	ホースのアニメーション	*/
	iHose = 0;
	if( l_Game.filtration.iHoseAniTime ){
		l_Game.filtration.iHoseAniTime++;
		if( l_Game.filtration.iHoseAniTime >= 30 ){
			l_Game.filtration.iHoseAniTime = 1;
			l_Game.filtration.iHoseAniNo++;
			if( l_Game.filtration.iHoseAniNo >= 4 ){
				l_Game.filtration.iHoseAniTime = 0;
				l_Game.filtration.iHoseAniNo = 0;
				AddPudding( 2 );
			}
		}
	}


	DrawFilter( l_Game.filtration.iHoseAniNo, iMaterial );
}

void DrawDripper()
{
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			材料の処理を行います
	-------------------------------------------------------------------------------------------------	*/
void Material()
{
	int	i;

	for( i = 0; i < MATERIAL_NUMBER; i++ ){
		if( l_Game.iEventStop == FALSE ){
			switch( l_Game.material[i].iStatus ){
				case	MATERIAL_STATUS_CONVEYER:			/*	コンベアに乗っているとき					*/
					if( l_Game.player.iStopFlag != STOP_STATUS_STOP ){
						l_Game.material[i].iY += l_Game.material[i].iYY;
						if( l_Game.material[i].iY >= 96*8 ){
							l_Game.material[i].iStatus = MATERIAL_STATUS_DROP;
							l_Game.material[i].iY = l_Game.material[i].iY / 8;
							l_Game.material[i].iYY = 0;
						}
					}
					break;

				case	MATERIAL_STATUS_DROP:				/*	落下している時								*/
					if( (l_Game.material[i].iX-8 <= l_Game.player.iPanX)
						&&(l_Game.material[i].iX+8 >= l_Game.player.iPanX)
						&&(l_Game.material[i].iY >= l_Game.player.iPanY-8)
						&&(l_Game.material[i].iY <= l_Game.player.iPanY+8) ){
							/*	ヒットした	*/
							if( l_Game.player.iCatchMode == CATCH_BACK ){
								if( l_Game.material[i].iKind < MATERIAL_EFFECTIVE_NUMBER ){
									l_Game.material[i].iStatus = MATERIAL_STATUS_REUSE;
									l_Game.material[i].iYY = -4*4;
								} else {
									l_Game.material[i].iStatus = MATERIAL_STATUS_GARBAGE;
									switch( l_Game.material[i].iX ){
										case	24:
											l_Game.material[i].iXX = -2;
											l_Game.material[i].iYY = -6;
											break;
										case	48:
											l_Game.material[i].iXX = -3;
											l_Game.material[i].iYY = -8;
											break;
										case	72:
											l_Game.material[i].iXX = -3;
											l_Game.material[i].iYY = -12;
											break;
										case	96:
											l_Game.material[i].iXX = -4;
											l_Game.material[i].iYY = -12;
											break;
										case	120:
											l_Game.material[i].iXX = -4;
											l_Game.material[i].iYY = -15;
											break;
									}
								}
								l_Game.iScore += SCORE_RECEIVE;
								DrawScore();
							} else {
								/*	もし手荷物にプリンを持っていた場合は返却する	*/
								if( l_Game.player.iContent == CONTENT_DRIP || l_Game.player.iContent == CONTENT_PUDDING ){
									AddReturnThing( l_Game.player.iContent, l_Game.player.iContentVal, l_Game.player.iX, l_Game.player.iY );
									l_Game.player.iContent = CONTENT_NO;
									l_Game.player.iContentVal = 0;
								}

								/*	キャッチした物をカウントする	*/
								if( l_Game.material[i].iKind < 5 ){
									l_Game.player.iMaterialCnt[l_Game.material[i].iKind]++;
									l_Game.material[i].iStatus = MATERIAL_STATUS_NOUSE;
									DrawMaterialValue();
								} else {
									/*	ごみを受けてしまった！！	*/
									PreparationMiss();
									l_Game.material[i].iStatus = MATERIAL_STATUS_NOUSE;
								}

								l_Game.iScore += SCORE_RECEIVE;
								DrawScore();
							}
					} else {
						l_Game.material[i].iY += (l_Game.material[i].iYY)/4;
						l_Game.material[i].iYY++;
						if( l_Game.material[i].iYY > 8 ){
							l_Game.material[i].iYY = 8;
						}
						if( l_Game.material[i].iY >= 128 ){
							/*	ミスの処理へ*/
							PreparationMiss();
							l_Game.material[i].iStatus = MATERIAL_STATUS_NOUSE;
						}
					}
					break;

				case	MATERIAL_STATUS_GARBAGE:			/*	ごみ箱へ投げた時							*/
					l_Game.material[i].iY += (l_Game.material[i].iYY)/4;
					l_Game.material[i].iYY ++;
					l_Game.material[i].iX += l_Game.material[i].iXX;
					if( l_Game.material[i].iX <= 0 ){
						l_Game.material[i].iStatus = MATERIAL_STATUS_NOUSE;
						TrashBoxPutIn();
					}
					break;

				case	MATERIAL_STATUS_REUSE:				/*	返品している時								*/
					l_Game.material[i].iY += (l_Game.material[i].iYY)/4 - 5;
					l_Game.material[i].iYY ++;
					if( l_Game.material[i].iYY > 16 ){
						l_Game.material[i].iStatus = MATERIAL_STATUS_NOUSE;
					}
					break;
			}
		}

		/*	描画	*/
		if( l_Game.material[i].iStatus != MATERIAL_STATUS_NOUSE && l_Game.material[i].iStatus != MATERIAL_STATUS_CONVEYER ){
			sprite_Set( 32+l_Game.material[i].iKind, l_Game.material[i].iX, l_Game.material[i].iY, SP_PAL6 | CFM_SPR_UPPER );
		} else if( l_Game.material[i].iStatus == MATERIAL_STATUS_CONVEYER ){
			sprite_Set( 32+l_Game.material[i].iKind, l_Game.material[i].iX, l_Game.material[i].iY/8, SP_PAL6 | CFM_SPR_UPPER );
		}
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			コンベアに材料を載せてもいいか調べる
 *			落下タイミングが重ならないようにチェックする
 *		[IN]
 *			コンベア番号
 *		[OUT]
 *			int	iIsReady	TRUE = 乗せても良い
	-------------------------------------------------------------------------------------------------	*/
int IsTimingCheck( int iConveyerNo )
{
	int iTime = (8 / l_Game.belt[iConveyerNo].iYAdd) - 1;
	if( iTime < 0 ){ return FALSE;	}
	if( l_Game.timeTbl.ucTimeTable[iTime] || l_Game.timeTbl.iCounter ){
		return FALSE;
	}
	return TRUE;
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			コンベアに材料を載せてもいいか調べる
 *			落下タイミングが重ならないようにチェックする
 *		[IN]
 *			コンベア番号
 *		[OUT]
 *			int	iIsReady	TRUE = 乗せても良い
	-------------------------------------------------------------------------------------------------	*/
void CheckMarkTiming( int iConveyerNo )
{
	int iTime = (8 / l_Game.belt[iConveyerNo].iYAdd) - 1;
	if( iTime < 0 ){ return;	}
	l_Game.timeTbl.ucTimeTable[iTime] = 1;
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			材料をコンベアに載せます
	-------------------------------------------------------------------------------------------------	*/
void AddMaterial( int iConveyerNo, int iMaterialKind )
{
	int	i;
	/*	使用できる変数を探す	*/
	for( i = 0; i < MATERIAL_NUMBER; i++ ){
		if( l_Game.material[i].iStatus == MATERIAL_STATUS_NOUSE ){
			break;
		}
	}
	if( i == MATERIAL_NUMBER ){							/*	空きがなかった・・・						*/
		return;
	}

	/*	タイムテーブルにチェックする	*/
	CheckMarkTiming( iConveyerNo );

	/*	材料をコンベアに載せる	*/
	l_Game.material[i].iStatus = MATERIAL_STATUS_CONVEYER;
	l_Game.material[i].iX = BELT_X*8 + iConveyerNo*8*3;
	l_Game.material[i].iY = BELT_Y*8*8;					/*	8 = コンベアに乗っている時だけ8倍			*/
	l_Game.material[i].iYY = l_Game.belt[iConveyerNo].iYAdd;
	l_Game.material[i].iKind = iMaterialKind;
}


/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			ゲーム全体の管理を行う
	-------------------------------------------------------------------------------------------------	*/
void Manager()
{
	if( l_Game.iEventStop == FALSE ){
		/*	レベル管理		*/
		l_Game.level.iTimer++;
		if( l_Game.level.iTimer >= LEVELUP_SPEED ){
			l_Game.level.iTimer = 0;
			l_Game.level.iLevel++;
			if( l_Game.level.iLevel > LEVELUP_MAX ){
				l_Game.level.iLevel = LEVELUP_MAX;
				l_Game.iScore += 100;						/*	ボーナスポイント							*/
				SetConveyerSpeed();
			}

			l_Game.iScore += SCORE_LEVELUP;
			DrawScore();
		}
	}

	/*	半透明の反転	*/
	l_Game.iTransparencyFlag = 1-l_Game.iTransparencyFlag;
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			
	-------------------------------------------------------------------------------------------------	*/
void SetConveyerSpeed()
{
	int i;
	for( i = 0; i < BELT_NUMBER; i++ ){
		l_Game.belt[i].iYAdd = (rand() % 4) + 1;
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			机の左側のお皿を描画する
 *
 *		[IN]
 *			テーブル番号0, 1
 *			プリンの数	0 - 
	-------------------------------------------------------------------------------------------------	*/
void DrawPlate( int iTableNo, int iPuddingVal )
{
	int iChrTop, iChrNo;

	iChrTop = DESK_TOP1_CHRTOP + 16 * iTableNo;
	iChrNo = iPuddingVal;
	if( iChrNo > 4 ){
		iChrNo = 4 + iPuddingVal % 2;
	}

	sprite_SetCharacter( iChrTop, 4, ucChrTableLeft[iChrNo*8] );
	sprite_SetCharacter( iChrTop+8, 4, ucChrTableLeft[iChrNo*8 + 4] );
}


/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			こし機を描画する
	-------------------------------------------------------------------------------------------------	*/
void DrawFilter( int iHoseNo, int iMaterialVal )
{
	int iChrNo;
	iChrNo = iHoseNo * 4;
	sprite_SetCharacter( 308, 2, ucChrFilterLeft[iChrNo] );
	sprite_SetCharacter( 316, 2, ucChrFilterLeft[iChrNo + 2] );

	iChrNo = iMaterialVal * 4;
	sprite_SetCharacter( 310, 2, ucChrFilterRight[iChrNo] );
	sprite_SetCharacter( 318, 2, ucChrFilterRight[iChrNo + 2] );
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			
	-------------------------------------------------------------------------------------------------	*/
void DrawOven( int iAniNo )
{
	int	iChrNo = iAniNo * 8;
	sprite_SetCharacter( 292, 4, ucChrOven[iChrNo] );
	sprite_SetCharacter( 300, 4, ucChrOven[iChrNo + 4] );
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			
	-------------------------------------------------------------------------------------------------	*/
void DrawRefrigerator( int iAniNo )
{
	int iChrNo = iAniNo * 16;
	sprite_SetCharacter( REFRIGERATOR_CHRTOP, 16, ucChrRefrigerator[iChrNo] );
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			
	-------------------------------------------------------------------------------------------------	*/
void Pudding()
{
	int i;
	for( i = 0; i < PUDDING_NUMBER; i++ ){
		if( l_Game.iEventStop == FALSE ){
			switch( l_Game.pudding[i].iStatus ){
				case	PUDDING_STATUS_MOVE:
					l_Game.pudding[i].iX += l_Game.pudding[i].iXX;
					l_Game.pudding[i].iY += l_Game.pudding[i].iYY / 3;
					l_Game.pudding[i].iYY++;
					if( l_Game.pudding[i].iX <= 168 ){
						PuddingMoveComp( l_Game.pudding[i].iTableNo );
						l_Game.pudding[i].iStatus = PUDDING_STATUS_NOUSE;
					}
					break;

				case	PUDDING_STATUS_SPLASHES:
					l_Game.pudding[i].iX += l_Game.pudding[i].iXX;
					l_Game.pudding[i].iY += l_Game.pudding[i].iYY / 3;
					l_Game.pudding[i].iYY++;
					if( l_Game.pudding[i].iX <= 168 ){
						l_Game.pudding[i].iStatus = PUDDING_STATUS_POPUP;
						l_Game.pudding[i].iXX = -3;
						l_Game.pudding[i].iYY = -16;
					}
					break;

				case	PUDDING_STATUS_POPUP:
					l_Game.pudding[i].iX += l_Game.pudding[i].iXX;
					l_Game.pudding[i].iY += l_Game.pudding[i].iYY/2;
					l_Game.pudding[i].iYY++;
					if(	l_Game.pudding[i].iYY == 0 ){		
						PuddingMoveComp( l_Game.pudding[i].iTableNo );
						l_Game.pudding[i].iStatus = PUDDING_STATUS_NOUSE;
					}
					break;

				default:
					continue;
			}
		}

		/*	アニメーション＆表示	*/
		if( l_Game.pudding[i].iStatus != PUDDING_STATUS_NOUSE ){
			l_Game.pudding[i].iAniTimer++;
			if( l_Game.pudding[i].iAniTimer >= 4 ){
				l_Game.pudding[i].iAniTimer = 0;
				l_Game.pudding[i].iAniNo++;
				if( l_Game.pudding[i].iAniNo >= 4 ){
					l_Game.pudding[i].iAniNo = 0;
				}
			}
			sprite_Set( 28 + l_Game.pudding[i].iAniNo, l_Game.pudding[i].iX, l_Game.pudding[i].iY, SP_PAL7 | CFM_SPR_UPPER );
		}
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			
	-------------------------------------------------------------------------------------------------	*/
void PuddingMoveComp( int iTableNo )
{
	switch( iTableNo ){
		case	0:								/*	冷やしあがった			*/
			l_Game.iScore = l_Game.iScore + SCORE_PUDDING * ( l_Game.refrigerator.iPuddingVal * 2);
			l_Game.refrigerator.iStatus = REFRIGERATOR_STATUS_CLOSE;
			l_Game.refrigerator.iPuddingVal = 0;
			DrawScore();
			break;
		case	1:								/*	焼きあがった			*/
			l_Game.oven.iStatus = OVEN_STATUS_CLOSE;
			l_Game.oven.iGrilledUpVal += l_Game.oven.iPuddingVal;
			l_Game.oven.iPuddingVal = 0;
			DrawPlate( 0, l_Game.oven.iGrilledUpVal );
			break;
		case	2:								/*	１つ分のプリンがこせた	*/
			l_Game.filtration.iDripVal++;
			DrawPlate( 1, l_Game.filtration.iDripVal );
			break;
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			プリンを移動させる
 *		<IN>
 *			テーブル番号 0 - 2
	-------------------------------------------------------------------------------------------------	*/
void AddPudding( int iTableNo )
{
	int i;
	/*	空いている領域を探す	*/
	for( i = 0; i < PUDDING_NUMBER; i++ ){
		if( l_Game.pudding[i].iStatus == PUDDING_STATUS_NOUSE ){
			break;
		}
	}
	
	/*	見つからない場合	*/
	if( i == PUDDING_NUMBER ){
		PuddingMoveComp( iTableNo );
		return;
	}

	/*	プリンを飛ばす		*/
	switch( iTableNo ){
		case	0:
			l_Game.pudding[i].iStatus = PUDDING_STATUS_SPLASHES;
			break;

		case	1:
		case	2:
			l_Game.pudding[i].iStatus = PUDDING_STATUS_MOVE;
			break;
	}
	l_Game.pudding[i].iTableNo = iTableNo;
	l_Game.pudding[i].iX = 208;
	l_Game.pudding[i].iXX = -2;
	l_Game.pudding[i].iYY = -10;
	l_Game.pudding[i].iY = iTableNo * 40 + 16;
	l_Game.pudding[i].iAniNo = 0;
	l_Game.pudding[i].iAniTimer = 0;
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void DrawScore()
{
	sprintf( g_Buf, "SCORE:%d", l_Game.iScore );
	bg_Text( SCREEN2, 5, 1, g_Buf, BG_PALd );

	if( l_Game.iHiScore < l_Game.iScore ){
		l_Game.iHiScore = l_Game.iScore;
		l_Game.iNameEntryFlag = TRUE;
	}
	sprintf( g_Buf, "Hi-SCORE:%d", l_Game.iScore );
	bg_Text( SCREEN2, 2, 0, g_Buf, BG_PALd );

	sprintf( g_Buf, "PLAYER:%d", l_Game.iPlayer );
	bg_Text( SCREEN2, 16, 0, g_Buf, BG_PALd );

	sprintf( g_Buf, "L-%d", l_Game.level.iLevel );
	bg_Text( SCREEN2, 25, 0, g_Buf, BG_PALd );
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			ストップゲージの表示
	-------------------------------------------------------------------------------------------------	*/
void DrawStopGage()
{
	int i, iFullNum, iHalfwayNum;

	/*	ゲージの描画	*/
/*	if( l_Game.iTransparencyFlag ){*/
		iFullNum = l_Game.player.iStopTimer / STOP_ONESIZE;
		iHalfwayNum = l_Game.player.iStopTimer % STOP_ONESIZE;

		for( i = 0; i < iFullNum; i++ ){
			bg_Set( SCREEN2, i+STOP_GAGE_X, STOP_GAGE_Y, (GAGE_CHRTOP+8)| BG_PAL8 );
		}
		if( iHalfwayNum ){
			bg_Set( SCREEN2, i+STOP_GAGE_X, STOP_GAGE_Y, (GAGE_CHRTOP+iHalfwayNum)| BG_PAL8 );
			i++;
		}
		for( ; i < STOP_GAGESIZE; i++ ){
			bg_Set( SCREEN2, i+STOP_GAGE_X, STOP_GAGE_Y, GAGE_CHRTOP | BG_PAL8 );
		}
/*	} else {
		for( i = 0; i < STOP_GAGESIZE; i++ ){
			bg_Set( SCREEN2, i+STOP_GAGE_X, STOP_GAGE_Y, 0| BG_PALe );
		}
	}*/

}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			材料を返す
	-------------------------------------------------------------------------------------------------	*/
void AddReturnThing( int iKind, int iValue, int iStartX, int iStartY )
{
	int iTargetY;

	if( l_Game.returnThing.iKind != CONTENT_NO ){			/*	現在返却中の時は、中断する			*/
		ReturnThingTerm( l_Game.returnThing.iKind );
	}
	l_Game.returnThing.iKind = iKind;
	l_Game.returnThing.iValue = iValue;
	l_Game.returnThing.iX = iStartX * 4;
	l_Game.returnThing.iY = iStartY * 4;
	l_Game.returnThing.iTimer = RETURNTHING_DIVIDE;			/*	RETURNTHING_DIVIDE 回で目標につくようにしている	*/
	l_Game.returnThing.iOffsetY = 0;
	l_Game.returnThing.iOffsetYY = -(RETURNTHING_DIVIDE/2);

	switch( iKind ){
		case CONTENT_DRIP:
			iTargetY = 96;
			break;
		case CONTENT_PUDDING:
			iTargetY = 56;
			break;
	}
	
	l_Game.returnThing.iXX = (168 - iStartX) * 4 / RETURNTHING_DIVIDE;
	l_Game.returnThing.iYY = (iTargetY - iStartY) * 4 / RETURNTHING_DIVIDE;
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			返却物の処理
	-------------------------------------------------------------------------------------------------	*/
void ReturnThing()
{
	int iChrNo;

	if( l_Game.returnThing.iKind != CONTENT_NO ){
		if( l_Game.iEventStop == FALSE ){
			iChrNo = l_Game.returnThing.iValue;
			if( iChrNo > 4 ){
				iChrNo = (iChrNo-4) % 2 + 4;
			}
			iChrNo += 40;

			l_Game.returnThing.iX += l_Game.returnThing.iXX;
			l_Game.returnThing.iY += l_Game.returnThing.iYY;
			l_Game.returnThing.iTimer--;
			if( l_Game.returnThing.iTimer <= 0 ){
				ReturnThingTerm( l_Game.returnThing.iKind );
			}

			l_Game.returnThing.iOffsetY += (l_Game.returnThing.iOffsetYY/2);
			l_Game.returnThing.iOffsetYY++;
		}

		sprite_Set( iChrNo, l_Game.returnThing.iX/4, l_Game.returnThing.iY/4 + l_Game.returnThing.iOffsetY, SP_PAL7 );
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			返却物の処理
	-------------------------------------------------------------------------------------------------	*/
void ReturnThingTerm( int iKind )
{
	switch( iKind ){
		case CONTENT_DRIP:
			l_Game.filtration.iDripVal += l_Game.returnThing.iValue;
			DrawPlate( 1, l_Game.filtration.iDripVal );
			break;
		case CONTENT_PUDDING:
			l_Game.oven.iGrilledUpVal += l_Game.returnThing.iValue;
			DrawPlate( 0, l_Game.oven.iGrilledUpVal );
			break;
	}

	l_Game.returnThing.iKind = CONTENT_NO;
	l_Game.returnThing.iValue = 0;
}


/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			ごみ箱を処理します
	-------------------------------------------------------------------------------------------------	*/
void TrashBox()
{
	if( l_Game.iEventStop == FALSE ){
		if( l_Game.trashBox.iAniNo ){
			l_Game.trashBox.iAniTimer++;
			if( l_Game.trashBox.iAniTimer >= 10 ){
				l_Game.trashBox.iAniTimer = 0;
				l_Game.trashBox.iAniNo++;
				if( l_Game.trashBox.iAniNo >= 4 ){
					l_Game.trashBox.iAniNo = 0;
				}
			}
		}
	}

	sprite_Set( 20+l_Game.trashBox.iAniNo, 0, 120, SP_PAL7 );
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			新しいごみを入れる
	-------------------------------------------------------------------------------------------------	*/
void TrashBoxPutIn()
{
	l_Game.trashBox.iAniNo = 1;
	l_Game.trashBox.iAniTimer = 0;
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *				開始予告を表示する
	-------------------------------------------------------------------------------------------------	*/
void DrawMessage()
{
	switch( l_Game.info.iMessageStatus ){
		case MESSAGE_READY_MOVE:
			l_Game.info.iMessageTimer++;
			if( l_Game.info.iMessageTimer > 3 ){
				l_Game.info.iMessageTimer = 0;

				l_Game.info.iMessageXBack = l_Game.info.iMessageX;
				l_Game.info.iMessageYBack = l_Game.info.iMessageY;
				l_Game.info.iMessageX += l_Game.info.iMessageXX;
				l_Game.info.iMessageY += l_Game.info.iMessageYY;
				l_Game.info.iMessageYY++;
				if( l_Game.info.iMessageYY > 7 ){
					l_Game.info.iMessageStatus = MESSAGE_READY_WAIT;
					l_Game.info.iMessageTimer = 0;
				}
			}
			
			/*	表示	*/
			if( l_Game.iTransparencyFlag ){
				sprite_Set( 52, l_Game.info.iMessageX, l_Game.info.iMessageY, SP_PAL7 | CFM_SPR_UPPER );
			} else {
				sprite_Set( 52, l_Game.info.iMessageXBack, l_Game.info.iMessageYBack, SP_PAL7 | CFM_SPR_UPPER );
			}
			break;

		case MESSAGE_READY_WAIT:
			l_Game.info.iMessageTimer++;
			if( l_Game.info.iMessageTimer >= 140 ){
				l_Game.info.iMessageStatus = MESSAGE_GO_WAIT;
				l_Game.info.iMessageTimer = 0;
				sprite_SetCharacter( SYMBOL_CHRTOP, 48, ucChrGO );
			}
			/*	表示	*/
			sprite_Set( 52, 72, 40, SP_PAL7 | CFM_SPR_UPPER );
			break;

		case MESSAGE_GO_WAIT:
			l_Game.info.iMessageTimer++;
			if( l_Game.info.iMessageTimer >= 140 ){
				l_Game.info.iMessageStatus = MESSAGE_FREE;
				g_GameProc = Game_Main;						/*	メインループ指定							*/
			}

			/*	表示	*/
			sprite_Set( 53, 72, 40, SP_PAL7 | CFM_SPR_UPPER );
			break;

		case MESSAGE_MISS_WAIT:
			l_Game.info.iMessageTimer++;
			if( l_Game.info.iMessageTimer >= 35*6 ){
				l_Game.iPlayer--;
				if( l_Game.iPlayer >= 0 ){
					l_Game.info.iMessageStatus = MESSAGE_FREE;
					ReTry();
				} else {
					l_Game.info.iMessageStatus = MESSSGE_GAMEOVER;
					l_Game.info.iMarkerTimer = 0;
					sprite_SetCharacter( SYMBOL_CHRTOP, 48, ucChrGameOver );
				}
			}

			/*	表示	*/
			if( l_Game.info.iMessageTimer % 35 < 17 ){
				sprite_Set( 52, 72, 40, SP_PAL7 | CFM_SPR_UPPER );
			}
			break;

		case MESSSGE_GAMEOVER:
			l_Game.info.iMarkerTimer++;
			if( l_Game.info.iMarkerTimer >= 140 ){
				if( l_Game.iNameEntryFlag ){
					NameEntry_Start( l_Game.iScore );
				} else {
					Title_Start();
				}
			}
			
			/*	表示	*/
			sprite_Set( 54, 56, 48, SP_PAL7 | CFM_SPR_UPPER );
			break;
	}
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void PreparationReady()
{
	sprite_SetCharacter( SYMBOL_CHRTOP, 45, ucChrReady );
	l_Game.info.iMessageStatus = MESSAGE_READY_MOVE;
	l_Game.info.iMessageTimer = 0;
	l_Game.info.iMessageX = -3;
	l_Game.info.iMessageY = 155;
	l_Game.info.iMessageXX = 3;
	l_Game.info.iMessageYY = -17;
	l_Game.info.iMessageXBack = l_Game.info.iMessageX;
	l_Game.info.iMessageYBack = l_Game.info.iMessageY;
}


/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void PreparationMiss()
{
	l_Game.iEventStop = TRUE;

	sprite_SetCharacter( SYMBOL_CHRTOP, 45, ucChrMiss );
	l_Game.info.iMessageStatus = MESSAGE_MISS_WAIT;
	l_Game.info.iMessageTimer = 0;
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *			ゲーム用変数の初期化
	-------------------------------------------------------------------------------------------------	*/
void InitGameReg()
{
	int i;

	l_Game.player.iX = 9*8;								/*	主人公変数の設定					*/
	l_Game.player.iY = 15*8;
	l_Game.player.iVector = VECTOR_RIGHT;
	l_Game.player.iCatchMode = CATCH_RECV;
	l_Game.player.iAnime = 0;
	l_Game.player.iAnimeTime = 0;
	l_Game.player.iCatchVector = VECTOR_RIGHT;
	l_Game.player.iStopFlag = STOP_STATUS_NONSTOP;
	l_Game.player.iStopTimer = 	STOP_GAGESIZE * STOP_ONESIZE;
	l_Game.player.iContent = CONTENT_NO;
	l_Game.player.iContentVal = 0;
	for( i = 0; i < MATERIAL_EFFECTIVE_NUMBER; i++ ){
#ifndef _DEBUG_
		l_Game.player.iMaterialCnt[i] = 0;
#else
		l_Game.player.iMaterialCnt[i] = 5;
#endif
	}

	l_Game.filtration.iMaterialVal = 0;					 /*	こし作業台	*/
	l_Game.filtration.iDripVal = 0;
	l_Game.filtration.iTimer = 0;
	l_Game.filtration.iHoseAniTime = 0;
	l_Game.filtration.iHoseAniNo = 0;

	for( i = 0; i < MATERIAL_NUMBER; i++ ){
		l_Game.material[i].iStatus = MATERIAL_STATUS_NOUSE;
	}

	for( i = 0; i < MATERIAL_KIND_NUMBER; i++ ){
		l_Game.icon[i].iMoveFlag = 0;
		l_Game.icon[i].iY = 0;
	}

	l_Game.timeTbl.iCounter = 0;
	for( i = 0; i < TIME_TABLE_SIZE; i++ ){
		l_Game.timeTbl.ucTimeTable[i] = 0;
	}

	l_Game.oven.iStatus = OVEN_STATUS_CLOSE;			 /*	オーブン	*/
	l_Game.oven.iAniNo = 0;
	l_Game.oven.iGrilledUpVal = 0;
	l_Game.oven.iPuddingVal = 0;

	for( i = 0; i < EMPLOYEE_NUMBER; i++ ){				/*	従業員変数の設定					*/
		l_Game.employee.iStatus[i] = EMPLOYEE_FREE;
	}
	l_Game.employee.iSpanTimer = 0;

	for( i = 0; i < PUDDING_NUMBER; i++ ){				/*	プリン								*/
		l_Game.pudding[i].iStatus = PUDDING_STATUS_NOUSE;
	}

	l_Game.info.iMarkerY = 0;							/*	Display Info	*/
	l_Game.info.iMarkerTimer = 0;

	l_Game.returnThing.iKind = CONTENT_NO;				/*	返却物	*/
	l_Game.returnThing.iValue = 0;

	l_Game.refrigerator.iAniNo = 0;						/*	冷蔵庫	*/
	l_Game.refrigerator.iAniTime = 0;
	l_Game.refrigerator.iStatus = REFRIGERATOR_STATUS_CLOSE;
	l_Game.refrigerator.iPuddingVal = 0;

	l_Game.trashBox.iAniNo = 0;							/*	ごみ箱	*/
}

/*	-------------------------------------------------------------------------------------------------
 *		[概要]
 *
	-------------------------------------------------------------------------------------------------	*/
void ReTry()
{
	InitGameReg();

	/*	描画		*/
	DrawMaterialValue();
	DrawPlate( 0, 0 );
	DrawPlate( 1, 0 );
	DrawFilter( 0, 0 );
	DrawOven( 0 );
	DrawRefrigerator( 0 );
	DrawScore();

	/*	再開		*/
	l_Game.iEventStop = FALSE;
}

