/* ====================================================================== */
/*
	ポーズ状態
*/
/* ====================================================================== */

#include "ot_header.h"
#include "ot_newton.h"
#include "hjm_camera.h"
#include "sot_world.h"
#include "kn_def.h"
#include "kn_main.h"
#include "kn_mask.h"
#include "kn_def.h"
#include "kn_font.h"
#include "kn_gword.h"
#include "kn_pause.h"
#include "kn_message.h"
#include "kn_stage.h"
#include "kn_pfswarning.h"
#include "endefine.h"
#include "enchkcrs.h"
#include "enrecord.h"

/*******************************************************
	DEFINE
*******************************************************/
#define PAUSE_SEQ_PAUSE		0
#define PAUSE_SEQ_PFSMES	1


#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGAGE == ZH)

#define SX_PAUSE	111

#define DX_RETIRE12			19
#define DX_GOAGAIN12		-3
#define DX_EXIT12			0
#define DX_START_RACE12		3
#define DX_RESTART12		11
#define DX_MACHINE_SEL12	0
#define DX_CRS_SEL12		0

#elif (SW_KN_LANGUAGE == KN_US)

#define SX_PAUSE	120

#define DX_RETIRE12			7
#define DX_GOAGAIN12		-25
#define DX_EXIT12			-3
#define DX_START_RACE12		-24
#define DX_RESTART12		2
#define DX_MACHINE_SEL12	-39
#define DX_CRS_SEL12		-22

#elif (SW_KN_LANGUAGE == KN_EU)

/* English */
#define SX_PAUSE	120
#define DX_RETIRE12			7
#define DX_GOAGAIN12		-25
#define DX_EXIT12			-3
#define DX_START_RACE12		-24
#define DX_RESTART12		2
#define DX_MACHINE_SEL12	-39
#define DX_CRS_SEL12		-22
/* German */
#define SX_PAUSE_GE			132
#define DX_RETIRE12_GE		-9
#define DX_GOAGAIN12_GE		-65
#define DX_EXIT12_GE		-7
#define DX_START_RACE12_GE	-28
#define DX_RESTART12_GE		-6
#define DX_MACHINE_SEL12_GE	-35
#define DX_CRS_SEL12_GE		-18


#endif

/*******************************************************
	VARIABLE
*******************************************************/

/* ホバーモードのバックアップ */
int 	hoverModeBak;

/* ポーズシーケンス */
static int seqPause;

/* パックエラー */
static int knPfsErrorOld, knPfsError, knPfsErrorBak;

/* ポーズのメニュー */
sPauseMenu mPauseMenuDefault[] = {
	{ PAUSE_MODE_CONTINUE, 0          , GMESG_CONTINUE12 },
	{ PAUSE_MODE_RETIRE  , DX_RETIRE12, GMESG_RETIRE12 },
};

#if LOCALE==CHINA

sPauseMenu mPauseMenuTour[] = {
	{ PAUSE_MODE_CONTINUE, 0           , GMESG_CONTINUE12 },
	{ PAUSE_MODE_RETIRE  , DX_RETIRE12 , GMESG_RETIRE12 },
	{ PAUSE_MODE_CTITLE  , DX_EXIT12, GMESG_END_GOAGAIN12 },
	{ PAUSE_MODE_EXIT    , DX_EXIT12   , GMESG_EXIT12 },
};

#else

sPauseMenu mPauseMenuTour[] = {
	{ PAUSE_MODE_CONTINUE, 0           , GMESG_CONTINUE12 },
	{ PAUSE_MODE_RETIRE  , DX_RETIRE12 , GMESG_RETIRE12 },
	{ PAUSE_MODE_CTITLE  , DX_GOAGAIN12, GMESG_END_GOAGAIN12 },
	{ PAUSE_MODE_EXIT    , DX_EXIT12   , GMESG_EXIT12 },
};

#endif

sPauseMenu mPauseMenuPark[] = {
	{ PAUSE_MODE_CONTINUE, 0              , GMESG_CONTINUE12 },
	{ PAUSE_MODE_TOUR    , DX_START_RACE12, GMESG_START_RACE12 },
	{ PAUSE_MODE_EXIT    , DX_EXIT12      , GMESG_EXIT12 },
};
sPauseMenu mPauseMenuAttack[] = {
	{ PAUSE_MODE_CONTINUE, 0               , GMESG_CONTINUE12 },
	{ PAUSE_MODE_RESTART , DX_RESTART12    , GMESG_RESTART12 },
	{ PAUSE_MODE_MACHINE , DX_MACHINE_SEL12, GMESG_MACHINE_SEL12 },
	{ PAUSE_MODE_COURSE  , DX_CRS_SEL12    , GMESG_CRS_SEL12 },
	{ PAUSE_MODE_EXIT    , DX_EXIT12       , GMESG_EXIT12 },
};
#if (SW_KN_LANGUAGE == KN_EU)
/* ポーズのメニュー */
sPauseMenu mPauseMenuDefault_Ge[] = {
	{ PAUSE_MODE_CONTINUE, 0             , GMESG_CONTINUE12 },
	{ PAUSE_MODE_RETIRE  , DX_RETIRE12_GE, GMESG_RETIRE12 },
};
sPauseMenu mPauseMenuTour_Ge[] = {
	{ PAUSE_MODE_CONTINUE, 0              , GMESG_CONTINUE12 },
	{ PAUSE_MODE_RETIRE  , DX_RETIRE12_GE , GMESG_RETIRE12 },
	{ PAUSE_MODE_CTITLE  , DX_GOAGAIN12_GE, GMESG_END_GOAGAIN12 },
	{ PAUSE_MODE_EXIT    , DX_EXIT12_GE   , GMESG_EXIT12 },
};
sPauseMenu mPauseMenuPark_Ge[] = {
	{ PAUSE_MODE_CONTINUE, 0                 , GMESG_CONTINUE12 },
	{ PAUSE_MODE_TOUR    , DX_START_RACE12_GE, GMESG_START_RACE12 },
	{ PAUSE_MODE_EXIT    , DX_EXIT12_GE      , GMESG_EXIT12 },
};
sPauseMenu mPauseMenuAttack_Ge[] = {
	{ PAUSE_MODE_CONTINUE, 0           		  , GMESG_CONTINUE12 },
	{ PAUSE_MODE_RESTART , DX_RESTART12_GE    , GMESG_RESTART12 },
	{ PAUSE_MODE_MACHINE , DX_MACHINE_SEL12_GE, GMESG_MACHINE_SEL12 },
	{ PAUSE_MODE_COURSE  , DX_CRS_SEL12_GE    , GMESG_CRS_SEL12 },
	{ PAUSE_MODE_EXIT    , DX_EXIT12_GE       , GMESG_EXIT12 },
};
#endif

extern sKnPad	mKnPad[];
extern short	pause_mode, pause_mode_max;
extern short	pausePermission;
extern short	pauseOwner;
extern short	reset_flag;

extern void initMainGlistRace2Next( int next_game_mode );
int knPfsCheck( int *pfsErr, int *pfsErrOld );
static void	movePauseOn( void );
static void	movePauseOff( void );
static void	movePausePfsMes( void );
static Gfx	*makePauseGlistPause( Gfx *gp );
static Gfx	*makePauseGlistPfsMes( Gfx *gp );

/* ================================================= */
/*
	ポーズ用ディスプレイリストの作成 
*/
Gfx *makePauseGlist( Gfx *gp )
{
	/* --- パッド判定 --- */
	if( pause_mode == PAUSE_MODE_OFF ) {
		/* ポーズオフ時の判定 */
		if( pause_flag != PAUSE_FLAG_OFF ) pause_flag = PAUSE_FLAG_OFF;
		if( pausePermission ) movePauseOff();
	}
	else {
		/* ポーズオン時の判定 */
		switch( seqPause ) {
			case PAUSE_SEQ_PAUSE:
				movePauseOn();
				break;
			default:
				movePausePfsMes();
				break;
		}
	}

	/* --- 表示 --- */
	if( pause_mode != PAUSE_MODE_OFF ) {		/* ポーズ中 */
		/* 黒半透明マスク */
		if( players == 1 ) {
			gp = drawRectangleGlist( gp, DISPLAY_X1, DISPLAY_Y1, DISPLAY_X2, DISPLAY_Y2,
									0, 0, 0, 160 );
		}
		else {
			gp = drawRectangleGlist( gp, DISPLAY_X1_1P, DISPLAY_Y1_1P, DISPLAY_X2_2P, DISPLAY_Y2_2P,
									0, 0, 0, 160 );
		}
		/* ポーズ用表示 */
		switch( seqPause ) {
			case PAUSE_SEQ_PAUSE:
				gp = makePauseGlistPause( gp );
				break;
			default:
				gp = makePauseGlistPfsMes( gp );
				break;
		}
	}

	return ( gp ) ;
}


/* ポーズオフ */
static void	movePauseOff( void )
{
	register int pause_on;
	
	pause_on = 0;
	if( players == 1 ) {
		if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_PAUSE ) {
			/* １Ｐゲーム ポーズオン */
			pause_on = 1;
			pauseOwner = 1;
			seqPause = PAUSE_SEQ_PAUSE;
			/* キューブ */
			initGWord( GWORD_KIND_CUBE, GWORD_CUBE_FLAG_PAUSE1_L );	/* カーソルキューブ（左）*/
			initGWord( GWORD_KIND_CUBE, GWORD_CUBE_FLAG_PAUSE1_R );	/* カーソルキューブ（右）*/
		}
	}
	else {
		if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_PAUSE ) {
			/* ２Ｐゲーム ポーズオン（１Ｐ） */
			pause_on = 1;
			pauseOwner = 1;
			seqPause = PAUSE_SEQ_PAUSE;
			/* キューブ */
			initGWord( GWORD_KIND_CUBE, GWORD_CUBE_FLAG_PAUSE2_1L );/* カーソルキューブ（左）*/
			initGWord( GWORD_KIND_CUBE, GWORD_CUBE_FLAG_PAUSE2_1R );/* カーソルキューブ（右）*/
		}
		else if( mKnPad[KN_PAD_2P].pad.trig & BUTTON_ARG_PAUSE ) {
			/* ２Ｐゲーム ポーズオン（２Ｐ） */
			pause_on = 1;
			pauseOwner = 2;
			seqPause = PAUSE_SEQ_PAUSE;
			/* キューブ */
			initGWord( GWORD_KIND_CUBE, GWORD_CUBE_FLAG_PAUSE2_2L );/* カーソルキューブ（左）*/
			initGWord( GWORD_KIND_CUBE, GWORD_CUBE_FLAG_PAUSE2_2R );/* カーソルキューブ（右）*/
		}
	}

	/* ポーズオン */
	if( pause_on ) {
		pause_mode = 0;
		if( mSelGameInfo.gameKind == GAME_KIND_TOUR && ncourse == NCOURSE_PARK ) pause_mode = 1;
		/* ホバーモード*/
		hoverModeBak = hover_mode;
		hover_mode = HOVER_MODE_TIME_STOP;
		/* pause_mode_max */
		if( mSelGameInfo.gameKind == GAME_KIND_ATTACK || mSelGameInfo.gameKind == GAME_KIND_SCORE ) {
			pause_mode_max = PAUSE_MODE_MAX_ATTACK;
		}
		else if( mSelGameInfo.gameKind == GAME_KIND_TOUR ) {
			if( ncourse == COURSE_NUM_DOLPHIN ) pause_mode_max = PAUSE_MODE_MAX_PARK;
			else pause_mode_max = PAUSE_MODE_MAX_TOUR;
		}
		else pause_mode_max = PAUSE_MODE_MAX_DEFAULT;
		/* SE */
		#if SOUND_SW
		Na_PauseStart();
		Na_SystemSound( NA_SYS_PAUSE, 0 );
		#endif
	}
}

/* ポーズオン */
static void	movePauseOn( void )
{
	register int pause_off, se_flag, pause_exit;
	register sPauseMenu	*menu_p;
	
	pause_off = 0;
	se_flag = 0;
	
	if( pause_flag == PAUSE_FLAG_OFF ) {
		if( players == 1 ) {
			if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) pause_off = 1;
			else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_UP ) pause_off = 2;
			else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_DOWN ) pause_off = 3;
		}
		else {
			if( pauseOwner == 1 ) {
				if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) pause_off = 1;
				else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_UP ) pause_off = 2;
				else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_DOWN ) pause_off = 3;
			}
			else {
				if( mKnPad[KN_PAD_2P].pad.trig & BUTTON_ARG_ANY ) pause_off = 1;
				else if( mKnPad[KN_PAD_2P].pad.trig & BUTTON_ARG_UP ) pause_off = 2;
				else if( mKnPad[KN_PAD_2P].pad.trig & BUTTON_ARG_DOWN ) pause_off = 3;
			}
		}
	}
	switch( pause_off ) {
		case 1:		/* 決定 */
			if( mSelGameInfo.gameKind == GAME_KIND_ATTACK || mSelGameInfo.gameKind == GAME_KIND_SCORE ) {
				#if (SW_KN_LANGUAGE == KN_EU)
				if( euLanguage == EL_ENGLISH ) menu_p = &mPauseMenuAttack[pause_mode];
				else menu_p = &mPauseMenuAttack_Ge[pause_mode];
				#else
				menu_p = &mPauseMenuAttack[pause_mode];
				#endif
			}
			else if( mSelGameInfo.gameKind == GAME_KIND_TOUR ) {
				if( ncourse == NCOURSE_PARK ) {
					#if (SW_KN_LANGUAGE == KN_EU)
					if( euLanguage == EL_ENGLISH ) menu_p = &mPauseMenuPark[pause_mode];
					else menu_p = &mPauseMenuPark_Ge[pause_mode];
					#else
					menu_p = &mPauseMenuPark[pause_mode];
					#endif
				}
				else {
					#if (SW_KN_LANGUAGE == KN_EU)
					if( euLanguage == EL_ENGLISH ) menu_p = &mPauseMenuTour[pause_mode];
					else menu_p = &mPauseMenuTour_Ge[pause_mode];
					#else
					menu_p = &mPauseMenuTour[pause_mode];
					#endif
				}
			}
			else {
				#if (SW_KN_LANGUAGE == KN_EU)
				if( euLanguage == EL_ENGLISH ) menu_p = &mPauseMenuDefault[pause_mode];
				else menu_p = &mPauseMenuDefault_Ge[pause_mode];
				#else
				menu_p = &mPauseMenuDefault[pause_mode];
				#endif
			}
			pause_exit = 1;
			switch( menu_p->mode ) {
				case PAUSE_MODE_CONTINUE:
					pause_mode = PAUSE_MODE_OFF;
					hover_mode = hoverModeBak;
					pause_flag = PAUSE_FLAG_OFF;
					break;
				case PAUSE_MODE_EXIT:
					se_flag = 1;
					pause_flag = PAUSE_FLAG_EXIT;
					ftime_stop = 1;
					initMainGlistRace2Next( GM_OPEN );
					break;
				case PAUSE_MODE_RETIRE:
					pause_mode = PAUSE_MODE_OFF;
					hover_mode = hoverModeBak;
					if( pauseOwner == 1 ) pause_flag = PAUSE_FLAG_RETIRE1;
					else pause_flag = PAUSE_FLAG_RETIRE2;
					break;
				case PAUSE_MODE_RESTART:
					pause_flag = PAUSE_FLAG_RESTART;
					ftime_stop = 1;
					initMainGlistRace2Next( GM_RACE );
					break;
				case PAUSE_MODE_MACHINE:
					if( mSelGameInfo.gameKind == GAME_KIND_ATTACK ) {
						if( knPfsCheck( &knPfsError, &knPfsErrorOld ) == 1 ) pause_exit = 0;
					}
					if( pause_exit ) {
						pause_flag = PAUSE_FLAG_MACHINE;
						ftime_stop = 1;
						initMainGlistRace2Next( GM_MACHINE );
					}
					break;
				case PAUSE_MODE_COURSE:
					if( mSelGameInfo.gameKind == GAME_KIND_ATTACK ) {
						if( knPfsCheck( &knPfsError, &knPfsErrorOld ) == 1 ) pause_exit = 0;
					}
					if( pause_exit ) {
						pause_flag = PAUSE_FLAG_COURSE;
						ftime_stop = 1;
						initMainGlistRace2Next( GM_COURSE );
					}
					break;
				case PAUSE_MODE_TOUR:
					pause_flag = PAUSE_FLAG_TOUR;
					ftime_stop = 1;
					initMainGlistRace2Next( GM_CTITLE );
					break;
				case PAUSE_MODE_CTITLE:
					pause_flag = PAUSE_FLAG_CTITLE;
					ftime_stop = 1;
					initMainGlistRace2Next( GM_CTITLE );
					break;
			}
			/* SE */
			if( pause_exit ) {
				#if SOUND_SW
				Na_PauseEnd();
				if( se_flag ) Na_SystemSound( NA_SYS_DECIDE, 0 );
				#endif
			}
			else {
				seqPause = PAUSE_SEQ_PFSMES;
				knPfsErrorBak = -1;
			}
			break;
		case 2:		/* 上ボタン */
			pause_mode --;
			if( pause_mode < 0 ) pause_mode = pause_mode_max - 1;
			/* SE */
			#if SOUND_SW
			Na_SystemSound( NA_SYS_CURMOVE, 0 );
			#endif
			break;
		case 3:		/* 下ボタン */
			pause_mode ++;
			if( pause_mode == pause_mode_max ) pause_mode = 0;
			/* SE */
			#if SOUND_SW
			Na_SystemSound( NA_SYS_CURMOVE, 0 );
			#endif
			break;
	}
}

/* パックメッセージ */
static void	movePausePfsMes( void )
{
	register int	f;
	register sPauseMenu	*menu_p;

	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		/* パックチェック */
		knPfsErrorOld = knPfsError;
		knPfsError = PfsFindGhostFile();
		f = 0;
		if( knPfsErrorOld == knPfsError ) knPfsError = 0;
		else if( knPfsErrorOld == PFS_ERROR_MEMORY && knPfsError == PFS_ERROR_NODATA ) knPfsError = 0;
		else if( knPfsErrorOld == PFS_ERROR_NOTE && knPfsError == PFS_ERROR_NODATA ) knPfsError = 0;
		else if( knPfsErrorOld == PFS_ERROR_NOPACK && knPfsError == PFS_ERROR_MOTOR ) knPfsError = 0;
		else if( knPfsErrorOld == PFS_ERROR_MOTOR && knPfsError == PFS_ERROR_NOPACK ) knPfsError = 0;
		switch( knPfsError ) {
			case 0:
				knPfsErrorBak = knPfsErrorOld;
				menu_p = &mPauseMenuAttack[pause_mode];
				switch( menu_p->mode ) {
					case PAUSE_MODE_MACHINE:
						pause_flag = PAUSE_FLAG_MACHINE;
						ftime_stop = 1;
						initMainGlistRace2Next( GM_MACHINE );
						f = 1;
						break;
					case PAUSE_MODE_COURSE:
						pause_flag = PAUSE_FLAG_COURSE;
						ftime_stop = 1;
						initMainGlistRace2Next( GM_COURSE );
						f = 1;
						break;
					#ifndef ROM_FLAG
					default:
						osSyncPrintf( "UnKnouwn menu_p->mode = %d\n", menu_p->mode );
						break;
					#endif
				}
				break;
			case PFS_ERROR_NODATA:
				knPfsError = PfsChkFreeGhost();
				if( knPfsError == 0 ) {
					knPfsErrorBak = knPfsErrorOld;
					menu_p = &mPauseMenuAttack[pause_mode];
					switch( menu_p->mode ) {
						case PAUSE_MODE_MACHINE:
							pause_flag = PAUSE_FLAG_MACHINE;
							ftime_stop = 1;
							initMainGlistRace2Next( GM_MACHINE );
							f = 1;
							break;
						case PAUSE_MODE_COURSE:
							pause_flag = PAUSE_FLAG_COURSE;
							ftime_stop = 1;
							initMainGlistRace2Next( GM_COURSE );
							f = 1;
							break;
						#ifndef ROM_FLAG
						default:
							osSyncPrintf( "UnKnouwn menu_p->mode = %d\n", menu_p->mode );
							break;
						#endif
					}
				}
				break;
			#ifndef ROM_FLAG
			default:
				break;
			#endif
		}
		/* SE */
		#if SOUND_SW
		if( f ) Na_PauseEnd();
		Na_SystemSound( NA_SYS_DECIDE, 0 );
		#endif
	}
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		seqPause = PAUSE_SEQ_PAUSE;
		/* SE */
		#if SOUND_SW
		Na_SystemSound( NA_SYS_CANCEL, 0 );
		#endif
	}
}

/* ======================================================================= */
/*
	ポーズ用表示
*/
static Gfx *makePauseGlistPause( Gfx *gp )
{
	register int		i;
	register uint 		font_flag, sx, sy;
	register sPauseMenu	*menu_p;

	if( players == 1 ) {
		#if (SW_KN_LANGUAGE == KN_EU)
		if( euLanguage == EL_ENGLISH ) sx = DISPLAY_X1 + SX_PAUSE;
		else sx = DISPLAY_X1 + SX_PAUSE_GE;
		#else
		sx = DISPLAY_X1 + SX_PAUSE;
		#endif
		sy = 65;			 
	}
	else {
		#if (SW_KN_LANGUAGE == KN_EU)
		if( euLanguage == EL_ENGLISH ) sx = DISPLAY_X1 + SX_PAUSE;
		else sx = DISPLAY_X1 + SX_PAUSE_GE;
		#else
		sx = DISPLAY_X1 + SX_PAUSE;
		#endif
		if( pauseOwner == 1 ) sy = DISPLAY_Y1_1P + 28;
		else sy = DISPLAY_Y1_2P + 28;
	}

	/* 文字 */
	for( i = 0 ; i < (int)pause_mode_max ; i ++ ) {
		if( mSelGameInfo.gameKind == GAME_KIND_ATTACK || mSelGameInfo.gameKind == GAME_KIND_SCORE ) {
			#if (SW_KN_LANGUAGE == KN_EU)
			if( euLanguage == EL_ENGLISH ) menu_p = &mPauseMenuAttack[i];
			else menu_p = &mPauseMenuAttack_Ge[i];
			#else
			menu_p = &mPauseMenuAttack[i];
			#endif
		}
		else if( mSelGameInfo.gameKind == GAME_KIND_TOUR ) {
			if( ncourse == NCOURSE_PARK ) {
			#if (SW_KN_LANGUAGE == KN_EU)
				if( euLanguage == EL_ENGLISH ) menu_p = &mPauseMenuPark[i];
				else menu_p = &mPauseMenuPark_Ge[i];
				#else
				menu_p = &mPauseMenuPark[i];
				#endif
			}
			else {
				#if (SW_KN_LANGUAGE == KN_EU)
				if( euLanguage == EL_ENGLISH ) menu_p = &mPauseMenuTour[i];
				else menu_p = &mPauseMenuTour_Ge[i];
				#else
				menu_p = &mPauseMenuTour[i];
				#endif
			}
		}
		else {
			#if (SW_KN_LANGUAGE == KN_EU)
			if( euLanguage == EL_ENGLISH ) menu_p = &mPauseMenuDefault[i];
			else menu_p = &mPauseMenuDefault_Ge[i];
			#else
			menu_p = &mPauseMenuDefault[i];
			#endif
		}
		if( i == pause_mode ) font_flag = FONT_FLAG_FLASH_3;
		else font_flag = FONT_FLAG_NORMAL;
		gp = makeInitStrGlist( gp, font_flag,
					   255,255,255, 255,255,255, 255,255,255, 255,255,255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, menu_p->gmesgNum,
						  sx + (int)menu_p->dx, sy + 30 + 15 * i, 0, 0 );
	}
	/* キューブ */
	gp = makeGWordGlist( gp );

	return( gp );
}

/* ======================================================================= */
/*
	ポーズ用表示
*/
static Gfx *makePauseGlistPfsMes( Gfx *gp )
{
	register int 	i, err;
	register uint 	offset;
	
	/* --- 枠 --- */
	gSPDisplayList( gp++, dlInitWaku );
	gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 +  20, DISPLAY_Y1 +  66, 264, 40 );
	gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 +  58, DISPLAY_Y1 + 110, 90, 16 );
	gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + 156, DISPLAY_Y1 + 110, 90, 16 );

	/* --- 文字 --- */
	gp = makeInitStrGlist( gp, FONT_FLAG_NORMAL, 255,255,255, 255,255,255, 255,255,255, 255,255,255 );
	gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_SINA12, DISPLAY_X1 +  83, DISPLAY_Y1 + 113, 0, BANK_OFFSET_GAME_PFSMES_GHOST );
	gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_SINB12, DISPLAY_X1 + 173, DISPLAY_Y1 + 113, 0, BANK_OFFSET_GAME_PFSMES_GHOST );

	/* --- パック関係警告 --- */
	i = PFSWARN_NULL;
	if( knPfsErrorBak == -1 ) err = knPfsError;
	else err = knPfsErrorBak;
	offset = BANK_OFFSET_GAME_PFSMES_GHOST;
	switch( err ) {
		case PFS_ERROR_NOPACK:
		case PFS_ERROR_MOTOR:
			i = PFSWARN_INS_CPACK;
			break;
		case PFS_ERROR_MEMORY:
			i = PFSWARN_NOMEM4GHOST;
			break;
		case PFS_ERROR_DEAD:
		case PFS_ERROR_BRKDATA:
			i = PFSWARN_CANT_READ;
			break;
		case PFS_ERROR_NOTE:
			i = PFSWARN_DONTMAKE_NOTE;
			offset = BANK_OFFSET_GAME_PFSMES;
			break;
	}
		
	if( i != PFSWARN_NULL ) {
		gp = makePfsWarningGlist( gp, i, DISPLAY_X1 + 20, DISPLAY_Y1 + 66, offset );
	}
	return( gp );
}

/* ======================================================================= */
/*
	パックチェック
*/
int knPfsCheck( int *pfsErr, int *pfsErrOld )
{
	register int	i;

	i = 1;
	
	*pfsErrOld = *pfsErr = 0;
	*pfsErr = PfsCheck();
	switch( *pfsErr ) {
		case PFS_ERROR_NOPACK:
		case PFS_ERROR_MOTOR:
			break;
		default:
			*pfsErrOld = *pfsErr;
			*pfsErr = PfsFindGhostFile();
			if( *pfsErr == PFS_ERROR_NODATA ) {
				*pfsErrOld = *pfsErr;
				*pfsErr = PfsChkFreeGhost();
			}
			if( *pfsErr == 0 ) i = 0;
			break;
	}
	#ifndef ROM_FLAG
	osSyncPrintf( "Pfs Error (knPfsCheck) = %d\n", *pfsErr );
	#endif

	return( i );
}

/* ======================================================================= */
/*
	ゲームストップ
*/
void freezeGame( void )
{
	pauseOwner = 1;
	pause_mode = PAUSE_MODE_CONTINUE;
	hoverModeBak = hover_mode;
	hover_mode = HOVER_MODE_TIME_STOP;
}

void reopenGame( void )
{
	pause_mode = PAUSE_MODE_OFF;
	hover_mode = hoverModeBak;
	pause_flag = PAUSE_FLAG_OFF;
}
