/*
  ======================================================================

						オプション画面

  ======================================================================
*/

#include	"ot_header.h"
#include	"audio/sound.h"
#include	"ko_language.h"
#include	"ot_course.h"
#include	"ot_machine.h"
#include	"ko_block.h"
#include	"ko_gsub.h"
#include	"ko_abc.h"
#include	"ko_select.h"
#include	"ko_ramman.h"
#include "ko_define.h"
#include	"l_static.h"
#include	"dai_engine.h"
#include	"kn_wipe.h"
#include 	"kn_backup.h"
#include 	"kn_common.h"
#include 	"kn_option.h"
#include	"kn_backup.h"
#include	"kn_backedit.h"
#include	"kn_dlsub.h"
#include	"kn_disk.h"

#include	"kn_font.h"
#include	"kn_window.h"
#include	"dai_ssletter2.h"

/* すいだし君 */
#include	"kn_suidashi.h"

/* ====================================================================== */
/*
	定数
*/
/* --- コンパイルスイッチ --- */

/* オプションメニューのフラグ */
#define OPTIONMENU_FLAG_NOMEMBER 	0x0001		/* 項目なし */
#define OPTIONMENU_FLAG_EXIST 		0x0002		/* 存在するかどうか */

/* タイトル２の消える時間 */
#define OPTION_TITLE2_DISAPPR_COUNT		120

/* タイルの数 */
#define OPTION_TILE_X_NUM	10
#define OPTION_TILE_Y_NUM	15
/* ポイントの数 */
#define OPTION_POINT_X_NUM	(OPTION_TILE_X_NUM+1)
#define OPTION_POINT_Y_NUM	(OPTION_TILE_Y_NUM+1)

/* WINDOW ID */
enum {
	MENUWIN_ID_CLR=0,
	MENUWIN_ID_SUI,
	MENUWIN_ID_MES,
	MENUWIN_ID_OWN
};

/* --- シーケンス --- */
enum OptionSeq {
	OPTION_SEQ_MAIN=0,
	OPTION_SEQ_BACKUP,
	OPTION_SEQ_SUIDASHI,
	OPTION_SEQ_SUIDASHI_MES,
	OPTION_SEQ_SUIDASHI_OWN
};
typedef enum OptionSeq OptionSeq;

/* --- 選択項目数 --- */
enum {
  	OPTION_MENU_VSCPU=0,
  	OPTION_MENU_VSSLOT,
  	OPTION_MENU_VSHANDE,
  	OPTION_MENU_SOUND,
  	OPTION_MENU_BACKUP,
  	OPTION_MENU_GHOSTCOPY,
  	OPTION_MENU_EXIT,
  	OPTION_MENU_MAX
};

/* --- 項目別選択可能数 --- */
/* VS CPU */
enum {
	OPTION_VSCPU_ON=0,
	OPTION_VSCPU_OFF,
	OPTION_VSCPU_MAX
};
/* VS SLOT */
enum {
	OPTION_VSSLOT_ON=0,
	OPTION_VSSLOT_OFF,
	OPTION_VSSLOT_MAX
};
/* VS HANDE */
enum {
	OPTION_VSHANDE_NASI=0,
	OPTION_VSHANDE_NORMAL,
	OPTION_VSHANDE_HARD,
	OPTION_VSHANDE_MAX
};
/* SOUND MODE */
enum {
	OPTION_SOUND_STEREO=0,
	OPTION_SOUND_MONO,
	OPTION_SOUND_MAX
};
/* BACKUP */
enum {
	OPTION_BACKUP_NO=0,
	OPTION_BACKUP_YES,
	OPTION_BACKUP_MAX
};

/* --- 表示関係 --- */
/* BG */
#define OPTION_BG2_WD		64
#define OPTION_BG2_HT		64
#define SX_OPTION_BG		8
#define SY_OPTION_BG		0
#define SX_OPTION_BG3		0
#define SY_OPTION_BG3		0
#define SX_OPTION_BG2		50
#define SX2_OPTION_BG2		(SCREEN_WD-SX_OPTION_BG2-OPTION_BG2_WD)
#define SY_OPTION_BG2		4

/* タイトル */
#define SX_OPTION_TITLE		( (SCREEN_WD-DAI_M_OPTION_W)/2 )
#define SY_OPTION_TITLE		22

/* メニュータイトル */
#define SX_OPTION_MENU		30
#define SY_OPTION_MENU		60
#define DY_OPTION_MENU		27
#define DY_OPTION_MENU_G	23

/* かこみ */
#define SX_OPTION_KAKOMI	190
#define DX_OPTION_KAKOMI	75		/* かこみの間隔 */

/* メンバー */
#define SX_OPTION_MEMBER	(SX_OPTION_KAKOMI+18)
#define DISP_WD_OPTION_MEMBER	60

/* BACKUP WINDOW */
#define OPTION_CLRWIN_WD				148
#define OPTION_CLRWIN_HT				80
#define SX_OPTION_CLRWIN				((SCREEN_WD-OPTION_CLRWIN_WD)/2+4)
#define SY_OPTION_CLRWIN				140
#define OPTION_CLRWIN_COLOR				RGBA16(31,0,0,1)
#define DX_OPTION_CLRWIN_ALLCLROK		12
#define DY_OPTION_CLRWIN_ALLCLROK		10
#define DX_OPTION_CLRWIN_KAKOMI		((OPTION_CLRWIN_WD-(DX_OPTION_KAKOMI+DAI_M_MARKL_W+DAI_M_MARKR_W))/2+4)
#define DY_OPTION_CLRWIN_KAKOMI		50
#define DX_OPTION_CLRWIN_MEMBER		(DX_OPTION_CLRWIN_KAKOMI+18)
#define DY_OPTION_CLRWIN_MEMBER		(DY_OPTION_CLRWIN_KAKOMI)
/* BG */
#define OPTION_BG_WD		304
#define OPTION_BG_HT		240
#define OPTION_BG3_WD		320
#define OPTION_BG3_HT		240

/* SUIDASHI WIN */
#define OPTION_SUIWIN_WD				280
#define OPTION_SUIWIN_HT				140
#define SX_OPTION_SUIWIN				((SCREEN_WD-OPTION_SUIWIN_WD)/2+4)
#define SY_OPTION_SUIWIN				((SCREEN_HT-OPTION_SUIWIN_HT)/2+4)
#define OPTION_SUIWIN_COLOR				RGBA16(0,0,31,1)
/* SUIDASHI MESSAGE WIN */
#define OPTION_MESWIN_WD				280
#define OPTION_MESWIN_HT				46
#define SX_OPTION_MESWIN				((SCREEN_WD-OPTION_MESWIN_WD)/2+4)
#define SY_OPTION_MESWIN				((SCREEN_HT-OPTION_MESWIN_HT)/2+4)
#define OPTION_MESWIN_COLOR				RGBA16(31,0,0,1)
/* SUIDASHI MESSAGE WIN */
#define OPTION_OWNWIN_WD				280
#define OPTION_OWNWIN_HT				170
#define SX_OPTION_OWNWIN				((SCREEN_WD-OPTION_OWNWIN_WD)/2+4)
#define SY_OPTION_OWNWIN				((SCREEN_HT-OPTION_OWNWIN_HT)/2+4)
#define OPTION_OWNWIN_COLOR				RGBA16(0,31,0,1)



/* ====================================================================== */
/*
	構造体
*/
/* オプションメニュー */
struct OptionMenu {
  	int			mode;
	ushort		flag;
  	int			maxMember;
  	int			dxTitle;
	int			dxMember;
	TexData		*pTexMember;
	TexData		texTitle;
};
typedef struct OptionMenu OptionMenu;

struct SuiOwn {
  	ushort		owner;
	char		*pStrName;
};
typedef struct SuiOwn SuiOwn;

struct OptionDynamic {
	Vtx		vtxBG[OPTION_TILE_X_NUM*OPTION_TILE_Y_NUM*4];
};
typedef struct OptionDynamic OptionDynamic;


//#define TEXDATA_CI(tex)		tex, ##tex##tlut

/* ====================================================================== */
/*
	グラフィック
*/

/* --- 外部変数 --- */
extern ushort 	title_TX[], title_TX2[], title_TX3[], tex_csel_bg2[];
extern Gfx 	dlInitWipeTileMoveZ[];

/* --- 内部 --- */

/* テクスチャデータテーブル */

/* メニュー内容 */
static TexData tblVsCpuTex[OPTION_VSCPU_MAX] = {
  { dai_m_ON , DAI_M_ON_W , DAI_M_ON_H },
  { dai_m_OFF, DAI_M_OFF_W, DAI_M_OFF_H },
};
static TexData tblVsSlotTex[OPTION_VSSLOT_MAX] = {
  { dai_m_ON , DAI_M_ON_W , DAI_M_ON_H },
  { dai_m_OFF, DAI_M_OFF_W, DAI_M_OFF_H },
};
static TexData tblVsHandeTex[OPTION_VSHANDE_MAX] = {
  { dai_m_OFF, DAI_M_OFF_W, DAI_M_OFF_H },
  { dai_m_handi1, DAI_M_HANDI1_W, DAI_M_HANDI1_H },
  { dai_m_handi2, DAI_M_HANDI2_W, DAI_M_HANDI2_H },
};
static TexData tblSoundTex[OPTION_SOUND_MAX] = {
  { dai_m_stereo, DAI_M_STEREO_W, DAI_M_STEREO_H },
  { dai_m_monoral, DAI_M_MONORAL_W, DAI_M_MONORAL_H },
};
static TexData tblBackupTex[OPTION_BACKUP_MAX] = {
  { dai_m_no , DAI_M_NO_W , DAI_M_NO_H  },
  { dai_m_yes, DAI_M_YES_W, DAI_M_YES_H },
};

/* ====================================================================== */
/*
	変数
*/
/* Backup Data buffer */
static BakData	*pBakOpt;

/* Dynamic */
static OptionDynamic dynamicBuf[2];
static OptionDynamic *pDynamic;
/* アルファ */
static short	alpha[OPTION_POINT_X_NUM*OPTION_POINT_Y_NUM];

/* シーケンス */
static OptionSeq optionSeq;

/* フラグ */
static short	fExit;

/* カーソル位置 */
static int 	idSelectMenu = 0;
static int 	idSelectMember[OPTION_MENU_MAX];

/* ウィンドウポインタ */
MenuWindow *pClrWin;

/* ＢＧ */
static short		fDispTitle2;
static short		cDispTitle2;
static ushort		*pTexTitle2;	
/* ゴーストコピーフラグ */
static short		fGhostCopy;

/* メニューテーブル */
static OptionMenu	optionMenu[OPTION_MENU_MAX] = {
	/* VS CPU */
	{
		OPTION_MENU_VSCPU, OPTIONMENU_FLAG_EXIST, OPTION_VSCPU_MAX, 0, 0, tblVsCpuTex,
		{ dai_m_VScpu, DAI_M_VSCPU_W, DAI_M_VSCPU_H }
	}, 
	/* VS SLOT */
	{
	  	OPTION_MENU_VSSLOT, OPTIONMENU_FLAG_EXIST, OPTION_VSSLOT_MAX , 0, 0, tblVsSlotTex,
	  	{ dai_m_VSslot, DAI_M_VSSLOT_W, DAI_M_VSSLOT_H },
	},
	/* VS HANDE */
	{
	  	OPTION_MENU_VSHANDE, OPTIONMENU_FLAG_EXIST, OPTION_VSHANDE_MAX, 0, 0, tblVsHandeTex, 
  		{ dai_m_VShandicap, DAI_M_VSHANDICAP_W, DAI_M_VSHANDICAP_H },
	},
	/* SOUND */
#if (LANGUAGE_SW == LG_JPN)		/* JAPAN */
	{
	  	OPTION_MENU_SOUND, OPTIONMENU_FLAG_EXIST, OPTION_SOUND_MAX, 0, 4, tblSoundTex,
  		{ dai_m_soundmode, DAI_M_SOUNDMODE_W, DAI_M_SOUNDMODE_H },
	},
#else
	{
	  	OPTION_MENU_SOUND, OPTIONMENU_FLAG_EXIST, OPTION_SOUND_MAX, 0, 0, tblSoundTex,
  		{ dai_m_soundmode, DAI_M_SOUNDMODE_W, DAI_M_SOUNDMODE_H },
	},
#endif
	/* BACK UP */
	{
	  	OPTION_MENU_BACKUP, OPTIONMENU_FLAG_NOMEMBER|OPTIONMENU_FLAG_EXIST, 0, 0, 0, NULL,
		{ dai_m_alldataclear, DAI_M_ALLDATACLEAR_W, DAI_M_ALLDATACLEAR_H },
	}, 
	/* GHOST COPY */
	{
	  	OPTION_MENU_GHOSTCOPY, OPTIONMENU_FLAG_NOMEMBER, 0, 0, 0, NULL,
		{ dai_m_ghostcopy, DAI_M_GHOSTCOPY_W, DAI_M_GHOSTCOPY_H },
	}, 
	/* EXIT */
	{
	  	OPTION_MENU_EXIT, OPTIONMENU_FLAG_NOMEMBER|OPTIONMENU_FLAG_EXIST, 0, 0, 0, NULL,
		{ dai_m_exitOP, DAI_M_EXITOP_W, DAI_M_EXITOP_H },
	}, 
};

/* --- デバッグ用変数 --- */

/* --- 吸出し君 --- */
#if SW_SUIDASHI
/* ウィンドウポインタ */
static MenuWindow 	*pSuiWin, *pSuiMesWin, *pSuiOwnWin;
/* メニュー選択 */
static int			idSuiMenu;
/* エラー */
static short		errSui;
static short		cErrSui;
/* 警告シーケンス */
static short		seqSuiMes;
static short		cSuiMes;

/* パック */
static OSPfs		pfs;
static s32			pfsFileNo;
static u8 pfsGameName[PFS_FILE_NAME_LEN] = {
	0x1f,0x3b,0x33,0x1e,0x2b,0x28,0x31,0x2c,0x2e,0x29,0x2b,0x1a,0x00,0x00,0x00,0x00
};
static u8 pfsExtName[PFS_FILE_EXT_LEN] = {
  	0x20,0x00,0x00,0x00
};

/* 所有者テーブル */
#define OWN_TBL_MAX		14
static SuiOwn tblOwner[OWN_TBL_MAX] = {
	{ BAK_OWNER_ID_NONE , "NO NAME" },
	{ BAK_OWNER_ID_SUGI , "SUGIYAMA" },
	{ BAK_OWNER_ID_IMA  , "IMAMURA" },
	{ BAK_OWNER_ID_OYA  , "OHYAGI" },
	{ BAK_OWNER_ID_KON  , "KONNO" },

	{ BAK_OWNER_ID_ARI  , "ARIMOTO" },
	{ BAK_OWNER_ID_BANDO, "BANDO" },
	{ BAK_OWNER_ID_OTA  , "OHTA" },
	{ BAK_OWNER_ID_KAWA , "KAWANO" },
	{ BAK_OWNER_ID_DAI  , "DAICHAN" },
	
	{ BAK_OWNER_ID_MOURI, "MOURI" },
	{ BAK_OWNER_ID_SOTO , "SOTOIKE" },
	{ BAK_OWNER_ID_WAKA , "WAKAI" },
	{ BAK_OWNER_ID_KANE , "KANESHIGE" },
};

extern int idSuiOwner;
#endif

static char knEnd[] = {
	0x46, 0x65, 0x65, 0x6c, 0x20, 0x4d, 0x69, 0x65 
};

/* --- 外部変数 --- */

/* ====================================================================== */
/*
	関数プロトタイプ
*/
void 		init_option( void );
static void setSelectMember( void );

int 		move_option( void );
static int	moveOptionMain( void );
static void	moveOptionBackup( void );
static void moveTitle2( void );

Gfx 		*make_option_glist( Gfx *gp );
static Gfx 	*makeClrWinGlist( Gfx *pGfx, int x, int y );
static Gfx 	*makeTitle2Glist( Gfx *pGfx );

#if SW_SUIDASHI
static void initSuidashi( void );
static void	moveOptionSuidashi( void );
static void moveSuidashiMakeC( int idCourse );
static Gfx 	*makeSuiWinGlist( Gfx *pGfx, int x, int y );
static void	moveOptionSuidashiMes( void );
static Gfx 	*makeSuiMesWinGlist( Gfx *pGfx, int x, int y );
static void	moveOptionSuidashiOwn( void );
static Gfx 	*makeSuiOwnWinGlist( Gfx *pGfx, int x, int y );
#endif

/* ====================================================================== */
/*
	初期化
*/
void init_option( void )
{
	int			i;
	TexData		*p;
	OptionMenu	*op;
  
	next_fbuffer_mode = 3;

	SetOBJBlock(KO_GDL_INIT,0,0,1);/* 安全のため */
	
	/* テクスチャの転送 */
	TexBuffLoad2( dai_m_color, FZERO_FONT_COLOR_NUM*2 );		/* フォント用パレット */
	
	TexBuffLoad2p( tex_csel_bg2, OPTION_BG2_WD*OPTION_BG2_HT*2 );
	TexBuffLoad2p( dai_m_OPTION, DAI_M_OPTION_W*DAI_M_OPTION_H );

	TexBuffLoad2p( dai_m_alldataclearOK, DAI_M_ALLDATACLEAROK_W*DAI_M_ALLDATACLEAROK_H );
	TexBuffLoad2p( dai_m_OFF, DAI_M_OFF_W*DAI_M_OFF_H );
	TexBuffLoad2p( dai_m_ON, DAI_M_ON_W*DAI_M_ON_H );
	TexBuffLoad2p( dai_m_handi1, DAI_M_HANDI1_W*DAI_M_HANDI1_H);
	TexBuffLoad2p( dai_m_handi2, DAI_M_HANDI2_W*DAI_M_HANDI2_H );
	TexBuffLoad2p( dai_m_stereo, DAI_M_STEREO_W*DAI_M_STEREO_H );
	TexBuffLoad2p( dai_m_monoral, DAI_M_MONORAL_W*DAI_M_MONORAL_H );
	TexBuffLoad2p( dai_m_markL,  DAI_M_MARKL_W*DAI_M_MARKL_H);
	TexBuffLoad2p( dai_m_markR,  DAI_M_MARKR_W*DAI_M_MARKR_H);
	TexBuffLoad2p( dai_m_no, DAI_M_NO_W*DAI_M_NO_H );
	TexBuffLoad2p( dai_m_yes, DAI_M_YES_W*DAI_M_YES_H);

	for( i = 0, op = optionMenu ; i < OPTION_MENU_MAX ; i ++, op ++ ) {
	  	p = &(op->texTitle);
	  	TexBuffLoad2p( p->pTex, p->width*p->height );
	}

	/* 圧縮テクスチャの転送 */
 	TexBuffLoad2p( title_TX , OPTION_BG_WD*OPTION_BG_HT*2 );
	GrayScale_tex_buff_RGB( GetTexBuffPointer( title_TX ), OPTION_BG_WD*OPTION_BG_HT*2, 195, 95, 95 );
	if( title_status == 1 ) {
		pTexTitle2 = (ushort *)TexBuffLoad2p( title_TX2, OPTION_BG3_WD*OPTION_BG3_HT*2 );
		GrayScale_tex_buff_RGB( pTexTitle2, OPTION_BG3_WD*OPTION_BG3_HT*2, 195, 95, 95 );
	}
	else if( title_status == 2 ) {
		pTexTitle2 = (ushort *)TexBuffLoad2p( title_TX3, OPTION_BG3_WD*OPTION_BG3_HT*2 );
		GrayScale_tex_buff_RGB( pTexTitle2, OPTION_BG3_WD*OPTION_BG3_HT*2, 195, 95, 95 );
	}
	
	if( title_status ) {
	  	fDispTitle2 = 1;
		for( i = 0 ; i < OPTION_POINT_X_NUM*OPTION_POINT_Y_NUM ; i ++ ) alpha[i] = 255;
	}
	else fDispTitle2 = 0;

	/* 変数の初期化 */
	optionSeq = OPTION_SEQ_MAIN;
	fExit = 0;

	/* ゴーストコピー */
#if SW_KN_DISKPROG
	fGhostCopy = 1;
	for( i = 0, op = optionMenu ; i < OPTION_MENU_MAX ; i ++, op ++ ) {
	  	if( op->mode == OPTION_MENU_GHOSTCOPY ) {
		  	op->flag |= OPTIONMENU_FLAG_EXIST;
			break;
		}
	}
#else
	fGhostCopy = 0;
#endif /* SW_KN_DISKPROG */
	
	/* 各フラグの現在の状態を取得 */
	idSelectMenu = 0;
	setSelectMember();

	/* メニューウィンドウの初期化 */
	getMenuWindow( &pClrWin );
	initMenuWindow();

	#if SW_SUIDASHI
	initSuidashi();
	#endif	/* SW_SUIDASHI */

	/* バックアップデータバッファの確保 */
	pBakOpt = &bakDataOpt;
}

static void setSelectMember( void )
{
	int			i, j;
	OptionMenu	*op;
	
	for( i = 0, op = optionMenu ; i < OPTION_MENU_MAX ; i ++, op ++ ) {
	  	switch( op->mode ) {
			case OPTION_MENU_VSCPU:
		  		if( !vs_computer_flag ) j = OPTION_VSCPU_OFF;
				else j = OPTION_VSCPU_ON;
		  		break;
			case OPTION_MENU_VSSLOT:
		  		if( !vs_slot ) j = OPTION_VSSLOT_OFF;
				else j = OPTION_VSSLOT_ON;
		  		break;
			case OPTION_MENU_VSHANDE:
		  		if( handicap_flag == 0 ) j = OPTION_VSHANDE_NASI;
		  		else if( handicap_flag == 1 ) j = OPTION_VSHANDE_NORMAL;
				else j = OPTION_VSHANDE_HARD;
		  		break;
			case OPTION_MENU_SOUND:
		  		if( fSoundMode == 0 ) j = OPTION_SOUND_STEREO;
				else j = OPTION_SOUND_MONO;
		  		break;
			default:
				j = 0;
				break;
		}
		idSelectMember[i] = j;
	}
}

/* ====================================================================== */
/*
	メイン
*/
int move_option( void )
{
	Controller	*cp;

	cp = &all_cont;
	ko_SetContData( cp );
#if SW_BAKEDIT
	if( fBakEdit ) {
	  	new_button = new_button_trg = 0;
	}
#endif /* SW_BAKEDIT */
	

	moveMenuWindow();

	/* BG MAIN */
	moveTitle2();
	
	if( !fExit ) {
		switch( optionSeq ) {
			case OPTION_SEQ_MAIN:
		  		if( wipeStatus != WIPE_STATUS_END ) break;
		  		if( moveOptionMain() ) {
				  	fExit = 1;
				  	SEQUENCE_CHANGE( SEQUENCE_CHANGE_OPTION2GSEL );
				}
		  		break;
			case OPTION_SEQ_BACKUP:
		  		moveOptionBackup();
		  		break;
	
			/* すいだし君メイン */
			#if SW_SUIDASHI
			case OPTION_SEQ_SUIDASHI:
				moveOptionSuidashi();
				break;
			case OPTION_SEQ_SUIDASHI_MES:
				moveOptionSuidashiMes();
				break;
			case OPTION_SEQ_SUIDASHI_OWN:
				moveOptionSuidashiOwn();
				break;
			#endif	/* SW_SUIDASHI */
		
		}
	}
	
	return ( LOOP_KIND_OPTION ) ;
}

/*
   	通常
*/
static int moveOptionMain( void )
{
  	int			old_select_menu, old_select_member, member_change_flag;
	OptionMenu	*op;
	
	/* ウィンドウ死ぬまで何もしない */
	if( checkMenuWindow( pClrWin, MENUWIN_CHKMODE_EXIST ) ) return( 0 );
#if SW_SUIDASHI
	if( checkMenuWindow( pSuiWin, MENUWIN_CHKMODE_EXIST ) ) return( 0 );
#endif /* SW_SUIDASHI */
	
	old_select_menu = idSelectMenu;
	if( new_button & U_JPAD ) {
	  	idSelectMenu --;
		if( idSelectMenu < 0 ) idSelectMenu = OPTION_MENU_MAX - 1;
		while( !(optionMenu[idSelectMenu].flag & OPTIONMENU_FLAG_EXIST) ) {
		  	idSelectMenu --;
			if( idSelectMenu < 0 ) idSelectMenu = OPTION_MENU_MAX - 1;
		}
	}
	if( new_button & D_JPAD ) {
	  	idSelectMenu ++;
		if( idSelectMenu >= OPTION_MENU_MAX ) idSelectMenu = 0;
		while( !(optionMenu[idSelectMenu].flag & OPTIONMENU_FLAG_EXIST) ) {
		  	idSelectMenu ++;
			if( idSelectMenu >= OPTION_MENU_MAX ) idSelectMenu = 0;
		}
	}
	
	if( idSelectMenu != old_select_menu ) {
		#if SOUND_SW
	  	Na_SystemSE_Start( SE_CURSOL );
		#endif
		return( 0 );
	}

	op = &optionMenu[idSelectMenu];
	member_change_flag = 0;
	if( !(op->flag & OPTIONMENU_FLAG_NOMEMBER) ) {
		old_select_member = idSelectMember[idSelectMenu];
		if( new_button_trg & L_JPAD ) {
	  		idSelectMember[idSelectMenu] --;
			if( idSelectMember[idSelectMenu] < 0 ) idSelectMember[idSelectMenu] = op->maxMember - 1;
		}
		if( new_button_trg & R_JPAD ) {
		  	idSelectMember[idSelectMenu] ++;
			if( idSelectMember[idSelectMenu] >= op->maxMember ) idSelectMember[idSelectMenu] = 0;
		}

		/* 設定変更 */
		if( idSelectMember[idSelectMenu] != old_select_member ) {
		  	member_change_flag = 1;
			#if SOUND_SW
		  	Na_SystemSE_Start( SE_DECIDE );
			#endif
		}
	}

	if ( new_button_trg & CONT_CANCEL ) {
		#if SOUND_SW
		Na_SystemSE_Start( SE_CANCEL );
		#endif
		return ( 1 ) ;
	}
	
	switch( op->mode ) {
		case OPTION_MENU_VSCPU:
			if( member_change_flag ) {
			  	if( idSelectMember[idSelectMenu] == OPTION_VSCPU_OFF ) vs_computer_flag = 0;
				else vs_computer_flag = 1;
			}
	  		break;
		case OPTION_MENU_VSSLOT:
			if( member_change_flag ) {
			  	if( idSelectMember[idSelectMenu] == OPTION_VSSLOT_OFF ) vs_slot = 0;
				else vs_slot = 1;
			}
		  	break;
		case OPTION_MENU_VSHANDE:
			if( member_change_flag ) {
			  	if( idSelectMember[idSelectMenu] == OPTION_VSHANDE_NASI ) handicap_flag = 0;
			  	else if( idSelectMember[idSelectMenu] == OPTION_VSHANDE_NORMAL ) handicap_flag = 1;
				else handicap_flag = 2;
			}
	  		break;
		case OPTION_MENU_SOUND:
			if( member_change_flag ) {
			  	if( idSelectMember[idSelectMenu] == OPTION_SOUND_STEREO ) {
				  	fSoundMode = 0;
					#if SOUND_SW
				  	Na_SetOutMode( STEREO_MODE );
					#endif
				}
				else {
				  	fSoundMode = 1;
				  	#if SOUND_SW
				  	Na_SetOutMode( MONO_MODE );
					#endif
				}
			}
	  		break;
		case OPTION_MENU_BACKUP:
			if ( new_button_trg & CONT_DECIDE ) {
				if( (pClrWin = openMenuWindow( MENUWIN_ID_CLR, SX_OPTION_CLRWIN, SY_OPTION_CLRWIN,
										   OPTION_CLRWIN_WD, OPTION_CLRWIN_HT,
										   OPTION_CLRWIN_COLOR, makeClrWinGlist )) != NULL ) {
					optionSeq = OPTION_SEQ_BACKUP;
				  	idSelectMember[idSelectMenu] = OPTION_BACKUP_NO;
					#if SOUND_SW
			  		Na_SystemSE_Start( SE_DECIDE );
					#endif
				}
			}
	  		break;
		case OPTION_MENU_EXIT:
			if ( new_button_trg & CONT_DECIDE ) {
				#if SOUND_SW
				Na_SystemSE_Start( SE_CANCEL );
				#endif
				return ( 1 ) ;
			}
			/* 吸出し君の起動 */
			#if SW_SUIDASHI
			else if( cont[cont_no[0]].hold & CONT_KEY_SUIDASHI_HOLD ) {
				if( cont[cont_no[0]].trig & CONT_KEY_SUIDASHI_TRIG ) {
					if( (pSuiWin = openMenuWindow( MENUWIN_ID_SUI, SX_OPTION_SUIWIN, SY_OPTION_SUIWIN,
										   OPTION_SUIWIN_WD, OPTION_SUIWIN_HT,
										   OPTION_SUIWIN_COLOR, makeSuiWinGlist )) != NULL ) {
						optionSeq = OPTION_SEQ_SUIDASHI;
						#if SOUND_SW
			  			Na_SystemSE_Start( SE_BAKUHATU );
						#endif
					}
				}
			}
			#endif
	  		break;
		default:
			break;
	}

	/* 設定変更時にセーブ */
	if( member_change_flag ) {
		bakWriteDataGameData();
	}
	
	return( 0 );
}

/*
   バックアップ
*/
static void	moveOptionBackup( void )
{
	int		i, old_select_member, member_change_flag, close_flag;

	/* ウィンドウ開ききるまで何もしない */
	if( !checkMenuWindow( pClrWin, MENUWIN_CHKMODE_OPEN ) ) return;
	
	old_select_member = idSelectMember[idSelectMenu];
	member_change_flag = 0;
	if( new_button_trg & L_JPAD ) {
  		idSelectMember[idSelectMenu] --;
		if( idSelectMember[idSelectMenu] < 0 ) idSelectMember[idSelectMenu] = OPTION_BACKUP_MAX - 1;
	}
	if( new_button_trg & R_JPAD ) {
	  	idSelectMember[idSelectMenu] ++;
		if( idSelectMember[idSelectMenu] >= OPTION_BACKUP_MAX ) idSelectMember[idSelectMenu] = 0;
	}
	if( idSelectMember[idSelectMenu] != old_select_member ) {
	  	member_change_flag = 1;
		#if SOUND_SW
	  	Na_SystemSE_Start( SE_CURSOL );
		#endif
	}

	close_flag = 0;
  	if ( new_button_trg & CONT_DECIDE ) {
		close_flag = 1;
	  	if( idSelectMember[idSelectMenu] == OPTION_BACKUP_YES ) {
		  	/* バックアップを消す */
		  	bakClear( pBakOpt, BAK_CLRFLAG_NORM );
			setSelectMember();
			/* VSのポイント */
			for( i = 0 ; i < 4 ; i++ ) {
				players_victory[i] = players_score[i] = 0 ;
			}
			/* マシンセレクトカーソル位置リセット */
			ClearCursorPosition();
			#if SOUND_SW
	  		Na_SystemSE_Start( SE_BAKUHATU );
			#endif
			/* 毛利君用 */
			#ifndef RMASTER_FLAG
			{
				extern void mo_all_data_clear(void);
				mo_all_data_clear();
			}
			#endif
		}
		else {
			#if SOUND_SW
	  		Na_SystemSE_Start( SE_CANCEL );
			#endif
		}
	}
  	else if ( new_button_trg & CONT_CANCEL ) {
		close_flag = 1;
		#if SOUND_SW
	  	Na_SystemSE_Start( SE_CANCEL );
		#endif
	}

	/* Window Close */
	if( close_flag ) {
		optionSeq = OPTION_SEQ_MAIN;
		closeMenuWindow( pClrWin );
	}
}

/* ====================================================================== */
/*
	ディスプレイリストの作成
*/
Gfx *make_option_glist( Gfx *gp )
{
	int			i, y, dy;
	int			dx;
	TexData		*tp;
	OptionMenu	*op;
  
	gp = doOBJBlock( gp );

	/* BG */
	if( fDispTitle2 != 1 ) {
	  	gp = MakeDL_TexRect4( gp, GetTexBuffPointer( title_TX ),
								 SX_OPTION_BG, SY_OPTION_BG, OPTION_BG_WD, OPTION_BG_HT );
	}
	/* special BG */
	if( fDispTitle2 ) {
	  	gp = makeTitle2Glist( gp );
	}
	/* ヘルメット */
  	gp = MakeDL_TexRect4_flip( gp, GetTexBuffPointer( tex_csel_bg2 ),
						 SX_OPTION_BG2, SY_OPTION_BG2, OPTION_BG2_WD, OPTION_BG2_HT,
						 1, 0 );
  	gp = MakeDL_TexRect4( gp, GetTexBuffPointer( tex_csel_bg2 ),
						 SX2_OPTION_BG2, SY_OPTION_BG2, OPTION_BG2_WD, OPTION_BG2_HT );
	
	/* タイトル */
	gDPPipeSync( gp++ );
  	gDPSetPrimColor( gp++, 0, 0, 250, 250, 0, 255 );
	gp = kDLTexRect_CI8_Prim( gp, GetTexBuffPointer( dai_m_OPTION ), GetTexBuffPointer( dai_m_color ),
					    SX_OPTION_TITLE, SY_OPTION_TITLE, DAI_M_OPTION_W, DAI_M_OPTION_H, KDL_TEXRECT_FLAG_INIT );

	/* メニュー */
	y = SY_OPTION_MENU;
	if( fGhostCopy ) dy = DY_OPTION_MENU_G;
	else dy = DY_OPTION_MENU;
	for( i = 0, op = optionMenu ; i < OPTION_MENU_MAX ; i ++, op ++ ) {
	  	if( !(op->flag & OPTIONMENU_FLAG_EXIST) ) continue;
	  	/* カラー決定 */
	  	gDPPipeSync( gp++ );
		if( i != idSelectMenu ) {
		  	gDPSetPrimColor( gp++, 0, 0, 255, 255, 255, 255 );
		}
		else {
		  	gp = SetOKPrimColor0( gp );
		}
		/* メニュータイトル */
	  	tp = &(op->texTitle);
		gp = kDLTexRect_CI8( gp, GetTexBuffPointer( tp->pTex ), NULL,
						SX_OPTION_MENU + op->dxTitle, y,
						tp->width, tp->height, 0 );
		if( !(op->flag & OPTIONMENU_FLAG_NOMEMBER) ) {
			/* かこみ */
			gp = kDLTexRect_CI8( gp, GetTexBuffPointer( dai_m_markL ), NULL,
				   	SX_OPTION_KAKOMI, y,
					DAI_M_MARKL_W, DAI_M_MARKL_H, 0 );
			gp = kDLTexRect_CI8( gp, GetTexBuffPointer( dai_m_markR ), NULL,
				   	SX_OPTION_KAKOMI + DX_OPTION_KAKOMI, y,
					DAI_M_MARKR_W, DAI_M_MARKR_H, 0 );
			/* メンバー */
	  		tp = op->pTexMember + idSelectMember[i];
			dx = (DISP_WD_OPTION_MEMBER - tp->width) / 2 + op->dxMember;
			gp = kDLTexRect_CI8( gp, GetTexBuffPointer( tp->pTex ), NULL,
				 	SX_OPTION_MEMBER + dx, y,
					tp->width, tp->height, 0 );
		}
		y += dy;
	}
	
	/* バックアップウインドウ */
  	gp = makeMenuWindowGlist( gp );
	
  	return( gp );
}

/*
	バックアップウインドウ
*/
static Gfx 	*makeClrWinGlist( Gfx *pGfx, int x, int y )
{
	int			dx;
	TexData		*tp;
	
	gDPPipeSync( pGfx++ );
	gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 0, 255 );
	pGfx = kDLTexRect_CI8_Prim( pGfx, GetTexBuffPointer( dai_m_alldataclearOK ), GetTexBuffPointer( dai_m_color ),
				   	x+DX_OPTION_CLRWIN_ALLCLROK, y+DY_OPTION_CLRWIN_ALLCLROK,
					DAI_M_ALLDATACLEAROK_W, DAI_M_ALLDATACLEAROK_H, KDL_TEXRECT_FLAG_INIT );
	/* かこみ */
	gDPPipeSync( pGfx++ );
  	pGfx = SetOKPrimColor0( pGfx );
	pGfx = kDLTexRect_CI8( pGfx, GetTexBuffPointer( dai_m_markL ), NULL,
				   	x + DX_OPTION_CLRWIN_KAKOMI, y + DY_OPTION_CLRWIN_KAKOMI,
					DAI_M_MARKL_W, DAI_M_MARKL_H, 0 );
	pGfx = kDLTexRect_CI8( pGfx, GetTexBuffPointer( dai_m_markR ), NULL,
			   	x + DX_OPTION_CLRWIN_KAKOMI + DX_OPTION_KAKOMI, y + DY_OPTION_CLRWIN_KAKOMI,
					DAI_M_MARKR_W, DAI_M_MARKR_H, 0 );
	/* YES, NO */
	tp = &tblBackupTex[idSelectMember[idSelectMenu]];
	dx = (DISP_WD_OPTION_MEMBER - tp->width) / 2;
	pGfx = kDLTexRect_CI8( pGfx, GetTexBuffPointer( tp->pTex ), NULL,
	 	x + DX_OPTION_CLRWIN_MEMBER + dx, y + DY_OPTION_CLRWIN_MEMBER,
					tp->width, tp->height, 0 );
	
  	return( pGfx );
}
/* ====================================================================== */
/*
	タイトル２
*/
static void moveTitle2( void )
{
	int		i, j, k, x, y;
	int		ix, iy, is, it, tile_wd, tile_ht;
	Vtx		*vp;
	short	*ap;
	float	px[4], py[4], s[4], t[4];

	switch( fDispTitle2 ) {
		case 0:		/* 非表示 */
	  		break;
			
		case 1:		/* 表示 */
#ifndef ROM_FLAG
	  		if( (new_button & U_CBUTTONS) || (title_status == 0) ) {
#else
			if( title_status == 0 ) {
#endif /* ROM_FLAG */
				fDispTitle2 = 2;
				cDispTitle2 = 0;
			}
	  		break;
				
		case 2:		/* 変化 */
			x = OPTION_POINT_X_NUM - OPTION_POINT_X_NUM * cDispTitle2 / OPTION_TITLE2_DISAPPR_COUNT;
			y = OPTION_POINT_Y_NUM - OPTION_POINT_Y_NUM * cDispTitle2 / OPTION_TITLE2_DISAPPR_COUNT;

			for( i = 0 ; i < OPTION_POINT_Y_NUM ; i ++ ) {
			  	if( i < y ) continue;
			  	for( j = 0 ; j < OPTION_POINT_X_NUM ; j ++ ) {
				  	if( j < x ) continue;

					ap = &alpha[ i * OPTION_POINT_X_NUM + j ];
					*ap -= 5;
					
					if( *ap < 0 ) *ap = 0;
				}
			}
			
			cDispTitle2 ++;
			
			if( cDispTitle2 >= OPTION_TITLE2_DISAPPR_COUNT ) {
//				fDispTitle2 = 0;
//			  	cDispTitle2 = 0;
			}
	  		break;
				
	}	/* switch */

	/* set Vertex */
	if( fDispTitle2 ) {
		pDynamic = &dynamicBuf[double_index];
		make_ORTHOmatrix( &(dynamic_p->mtxWipeProj), NULL, 1.0f,
			0.0f, (float)(SCREEN_WD-1),
			(float)(SCREEN_HT-1), 0.0f,
			-100.0f, 100.0f  );
		vp = &(pDynamic->vtxBG[0]);
		tile_wd = 32;
		tile_ht = 16;
		for( i = 0 ; i < OPTION_TILE_Y_NUM ; i ++ ) {
		  	for( j = 0 ; j < OPTION_TILE_X_NUM ; j ++ ) {
			  	s[0] = s[2] = (float)( j * tile_wd ) - 0.5f;
				s[1] = s[3] = s[0] + (float)tile_wd;
			  	t[0] = t[1] = (float)( i * tile_ht ) - 0.5f;
				t[2] = t[3] = t[0] + (float)tile_ht;
			  	px[0] = px[2] = (float)SX_OPTION_BG3 + (float)( j * tile_wd ) - 2.0f;
				px[1] = px[3] = px[0] + (float)tile_wd;
			  	py[0] = py[1] = (float)SY_OPTION_BG3 + (float)( i * tile_ht ) - 2.0f;
				py[2] = py[3] = py[0] + (float)tile_ht;
			  	for( k = 0 ; k < 4 ; k ++ ) {
					ix = (int)px[k];
					iy = (int)py[k];
					is = (int)( s[k] * 32.0f );
					it = (int)( t[k] * 32.0f );
					SET_V( vp, ix, iy, 0, 0, is, it, 255, 255, 255,
						  alpha[i*OPTION_POINT_X_NUM+j+(k&1)+(k>>1)*OPTION_POINT_X_NUM] );
					vp++;
				}
			}
		}
	}
}

static Gfx 	*makeTitle2Glist( Gfx *pGfx )
{
	int		i, j, a, id, tile_wd, tile_ht;
	int		sld0, sld1, tld0, tld1;
  
  	switch( fDispTitle2 ) {
		case 1:
		case 2:
//#define KN_CC_TEST	0,0,0,SHADE,0,0,0,SHADE
			pGfx = set_view_port( pGfx, VIEWPORT_ALL );
			gSPDisplayList( pGfx++, dlInitWipeTileMoveZ );
			gDPSetTextureFilter( pGfx++, G_TF_POINT );
			gDPSetRenderMode( pGfx++, G_RM_XLU_SURF, G_RM_XLU_SURF );
			gDPSetCombineMode( pGfx++, KN_CC_DECALRGB_SHADEA, KN_CC_DECALRGB_SHADEA );
//			gDPSetCombineMode( pGfx++, KN_CC_TEST, KN_CC_TEST );
			gSPMatrix( pGfx++, &(dynamic.mtxWipeProj)  , G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
			gSPMatrix( pGfx++, &(automatic.e_MT), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
			tile_wd = 32;
			tile_ht = 16;
			for( i = 0 ; i < OPTION_TILE_Y_NUM ; i ++ ) {
			  	for( j = 0 ; j < OPTION_TILE_X_NUM ; j ++ ) {
					id = OPTION_TILE_X_NUM *  i + j;
					sld0 = MAX(j * tile_wd - 1, 0);
					sld1 = MIN(j * tile_wd + tile_wd, OPTION_BG3_WD-1);
					tld0 = MAX(i * tile_ht - 1, 0);
					tld1 = MIN(i * tile_ht + tile_ht, OPTION_BG3_HT-1);
					gSPVertex( pGfx++, &(pDynamic->vtxBG[id * 4]), 4, 0 );
					gDPPipeSync( pGfx++ );
					gDPLoadTextureTile( pGfx++, pTexTitle2,
						G_IM_FMT_RGBA, G_IM_SIZ_16b, OPTION_BG3_WD, OPTION_BG3_HT,
						sld0, tld0, sld1, tld1, 0,
						G_TX_CLAMP, G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD );
					gSP2Triangles( pGfx++, 0, 3, 1, 0,  0, 2, 3, 0 );
				}
			}
			break;
	}
	
	return( pGfx );
}

/* ====================================================================== */
/*
   
								吸出し君
	
*/
/* ====================================================================== */
#if SW_SUIDASHI

#define SU_OWNNAME_REVERSE_NUM		7

#define SW_KNDAI	1

#if SW_KNDAI
#include "IMAGES/kn_dai.tex"
#endif

/* 初期化 */
static void initSuidashi( void )
{
	getMenuWindow( &pSuiWin );
	getMenuWindow( &pSuiMesWin );
	getMenuWindow( &pSuiOwnWin );
  	idSuiMenu = 0;
}

/* メイン */
static void	moveOptionSuidashi( void )
{
	int		close_flag, old_id;
  
	/* ウィンドウ開ききるまで何もしない */
	if( !checkMenuWindow( pSuiWin, MENUWIN_CHKMODE_OPEN ) ) return;
	/* ウィンドウ死ぬまで何もしない */
	if( checkMenuWindow( pSuiMesWin, MENUWIN_CHKMODE_EXIST ) ) return;
	if( checkMenuWindow( pSuiOwnWin, MENUWIN_CHKMODE_EXIST ) ) return;

	close_flag = 0;

	old_id = idSuiMenu;
	
  	if( new_button_trg & CONT_DECIDE ) {

		switch( idSuiMenu ) {
			case SUI_MODE_SRAM2PACK:
				if( (pSuiOwnWin = openMenuWindow( MENUWIN_ID_OWN, SX_OPTION_OWNWIN, SY_OPTION_OWNWIN,
												  OPTION_OWNWIN_WD, OPTION_OWNWIN_HT,
												  OPTION_OWNWIN_COLOR, makeSuiOwnWinGlist )) != NULL ) {
					optionSeq = OPTION_SEQ_SUIDASHI_OWN;
				}
				break;
			case SUI_MODE_PACK2SRAM:
				if( (pSuiMesWin = openMenuWindow( MENUWIN_ID_MES, SX_OPTION_MESWIN, SY_OPTION_MESWIN,
												  OPTION_MESWIN_WD, OPTION_MESWIN_HT,
												  OPTION_MESWIN_COLOR, makeSuiMesWinGlist )) != NULL ) {
					optionSeq = OPTION_SEQ_SUIDASHI_MES;
					errSui = 0;
					cErrSui = 0;
					seqSuiMes = 0;
					cSuiMes = 0;
				}
				break;
			case SUI_MODE_MAKEC:
				moveSuidashiMakeC( COURSE_ID2NUMBER( pBakOpt->d.ghostInfo.courseID ) );
				break;
		}
		#if SOUND_SW
  		Na_SystemSE_Start( SE_DECIDE );
		#endif
	}
	else if( new_button_trg & CONT_CANCEL ) {
		close_flag = 1;
		#if SOUND_SW
	  	Na_SystemSE_Start( SE_CANCEL );
		#endif
	}
	else if( new_button & U_JPAD ) {
	  	idSuiMenu --;
		if( idSuiMenu < 0 ) idSuiMenu = SUI_MEMBER_MAX - 1;
		#if !SW_SUIDASHI_MAKEC
		if( idSuiMenu == SUI_MODE_MAKEC ) {
		  	idSuiMenu --;
			if( idSuiMenu < 0 ) idSuiMenu = SUI_MEMBER_MAX - 1;
		}
		#endif
	}
	else if( new_button & D_JPAD ) {
	  	idSuiMenu ++;
		if( idSuiMenu >= SUI_MEMBER_MAX ) idSuiMenu = 0;
		#if !SW_SUIDASHI_MAKEC
		if( idSuiMenu == SUI_MODE_MAKEC ) {
		  	idSuiMenu ++;
			if( idSuiMenu >= SUI_MEMBER_MAX ) idSuiMenu = 0;
		}
		#endif
	}

	/* move cursor */
	if( old_id != idSuiMenu ) {
		#if SOUND_SW
	  	Na_SystemSE_Start( SE_CURSOL );
		#endif
	}
	
	/* Window Close */
	if( close_flag ) {
		optionSeq = OPTION_SEQ_MAIN;
		closeMenuWindow( pSuiWin );
	}
}

/* Ｃのソースをつくる */
#define SUI_C_KEYWORD	"SUIDASHI"
#define SUI_C_LABEL		"DEMOLABEL"
static void moveSuidashiMakeC( int idCourse )
{
  	int				i, j;
	int				data_size, loop_num, rest;
	BakGhostInfo	*ip;
	BakGhostData	*dp;

	ip = &pBakOpt->d.ghostInfo;
	dp = &pBakOpt->d.ghostData;
	
#ifndef ROM_FLAG
	osSyncPrintf( "%s/* ======================================== */\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s/*\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s\n", SUI_C_KEYWORD );
	osSyncPrintf( "%sGHOSTDATAforCourse%d\n", SUI_C_KEYWORD, idCourse );
	osSyncPrintf( "%s\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s*/\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s/* ======================================== */\n\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s#include \"ot_header.h\"\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s#include \"kn_backup.h\"\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s/* Ghost Info */\n\n", SUI_C_KEYWORD );
	osSyncPrintf( "%sBakGhostInfo romGhostInfo_%d = {\n", SUI_C_KEYWORD, idCourse );
	osSyncPrintf( "%s\t0x%X,\t/* sumInfo */\n", SUI_C_KEYWORD, ip->sumInfo );
	osSyncPrintf( "%s\t0x%X,\t/* type */\n", SUI_C_KEYWORD, ip->type );
	osSyncPrintf( "%s\t0x%X,\t/* dataSum */\n", SUI_C_KEYWORD, ip->dataSum );
	osSyncPrintf( "%s\t0x%X,\t/* courseID */\n", SUI_C_KEYWORD, ip->courseID );
	osSyncPrintf( "%s\t0x%X,\t/* goalTime */\n", SUI_C_KEYWORD, ip->goalTime );
	osSyncPrintf( "%s\t0x%X,\t/* owner */\n", SUI_C_KEYWORD, ip->owner );
	/* dummy */
	osSyncPrintf( "%s\t{\t/* dummy */\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s\t\t", SUI_C_KEYWORD );
	for( i = 0 ; i < BAK_GHOSTINFO_DUMMY_SIZE ; i ++ ){
	  	if( i != (BAK_GHOSTINFO_DUMMY_SIZE-1) ) osSyncPrintf( "0x%X,", (uchar)ip->dummy[i] );
		else osSyncPrintf( "0x%X", ip->dummy[i] );
	}
	osSyncPrintf( "\n" );
	osSyncPrintf( "%s\t},\n", SUI_C_KEYWORD );
	/* courseName */
	osSyncPrintf( "%s\t{\t/* course name */\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s\t\t", SUI_C_KEYWORD );
	for( i = 0 ; i < BAK_GHOSTINFO_COURSENAMEBUF_SIZE ; i ++ ){
		if( i != (BAK_GHOSTINFO_COURSENAMEBUF_SIZE-1) ) osSyncPrintf( "0x%X,", ip->courseName[i] );
		else osSyncPrintf( "0x%X", ip->dummy[i] );
	}
	osSyncPrintf( "\n" );
	osSyncPrintf( "%s\t},\n", SUI_C_KEYWORD );
	/* edit machine */
	osSyncPrintf( "%s\t{\t/* edit machine */\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s\t\t0x%X,\t/* designNo */\n", SUI_C_KEYWORD, ip->edit.designNo );
	osSyncPrintf( "%s\t\t0x%X,\t/* fEdit */\n", SUI_C_KEYWORD, ip->edit.fEdit );
	osSyncPrintf( "%s\t\t0x%X,\t/* bodyShape */\n", SUI_C_KEYWORD, ip->edit.bodyShape );
	osSyncPrintf( "%s\t\t0x%X,\t/* engineShape */\n", SUI_C_KEYWORD, ip->edit.engineShape );
	osSyncPrintf( "%s\t\t0x%X,\t/* wingShape */\n", SUI_C_KEYWORD, ip->edit.wingShape );
	osSyncPrintf( "%s\t\t0x%X,\t/* markType */\n", SUI_C_KEYWORD, ip->edit.markType );
	osSyncPrintf( "%s\t\t0x%X,\t/* numberType */\n", SUI_C_KEYWORD, ip->edit.numberType );
	osSyncPrintf( "%s\t\t0x%X,\t/* lineType */\n", SUI_C_KEYWORD, ip->edit.lineType );
	osSyncPrintf( "%s\t\t0x%X,\t/* bodyColorR */\n", SUI_C_KEYWORD, ip->edit.bodyColorR );
	osSyncPrintf( "%s\t\t0x%X,\t/* bodyColorG */\n", SUI_C_KEYWORD, ip->edit.bodyColorG );
	osSyncPrintf( "%s\t\t0x%X,\t/* bodyColorB */\n", SUI_C_KEYWORD, ip->edit.bodyColorB );
	osSyncPrintf( "%s\t\t0x%X,\t/* numberColorR */\n", SUI_C_KEYWORD, ip->edit.numberColorR );
	osSyncPrintf( "%s\t\t0x%X,\t/* numberColorG */\n", SUI_C_KEYWORD, ip->edit.numberColorG );
	osSyncPrintf( "%s\t\t0x%X,\t/* numberColorB */\n", SUI_C_KEYWORD, ip->edit.numberColorB );
	osSyncPrintf( "%s\t\t0x%X,\t/* lineColorR */\n", SUI_C_KEYWORD, ip->edit.lineColorR );
	osSyncPrintf( "%s\t\t0x%X,\t/* lineColorG */\n", SUI_C_KEYWORD, ip->edit.lineColorG );
	osSyncPrintf( "%s\t\t0x%X,\t/* lineColorB */\n", SUI_C_KEYWORD, ip->edit.lineColorB );
	osSyncPrintf( "%s\t\t0x%X,\t/* glassColorR */\n", SUI_C_KEYWORD, ip->edit.glassColorR );
	osSyncPrintf( "%s\t\t0x%X,\t/* glassColorG */\n", SUI_C_KEYWORD, ip->edit.glassColorG );
	osSyncPrintf( "%s\t\t0x%X,\t/* glassColorB */\n", SUI_C_KEYWORD, ip->edit.glassColorB );
	for( i = 0 ; i < BAK_EDITMACHINE_DUMMY_SIZE ; i ++ ) {
		if( i != (BAK_EDITMACHINE_DUMMY_SIZE-1) ) {
		  	osSyncPrintf( "%s\t\t0x%X,\t/* dummy[%d] */\n", SUI_C_KEYWORD, ip->edit.dummy[i], i );
		}
		else {
		  	osSyncPrintf( "%s\t\t0x%X\t/* dummy[%d] */\n", SUI_C_KEYWORD, ip->edit.dummy[i], i );
		}
	}
	osSyncPrintf( "%s\t},\n", SUI_C_KEYWORD );
	/* end */
	osSyncPrintf( "%s};\n", SUI_C_KEYWORD );

	/* ghost data */
	osSyncPrintf( "%s\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s/* Ghost Data */\n\n", SUI_C_KEYWORD );
	osSyncPrintf( "%sBakGhostHeader romGhostHeader_%d = {\n", SUI_C_KEYWORD, idCourse );
	osSyncPrintf( "%s\t0x%X,\t/* sumGhost */\n", SUI_C_KEYWORD, dp->header.sumGhost );
	osSyncPrintf( "%s\t0x%X,\t/* dummy */\n", SUI_C_KEYWORD, dp->header.dummy );
	/* lap time */
	osSyncPrintf( "%s\t{\t/* laptime */\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s\t\t", SUI_C_KEYWORD );
	for( i = 0 ; i < BAK_LAPTIME_NUM ; i ++ ){
		if( i != (BAK_LAPTIME_NUM-1) ) {
		  	osSyncPrintf( "0x%X,", dp->header.lapTime[i] );
		}
		else {
		  	osSyncPrintf( "0x%X", dp->header.lapTime[i] );
		}
	}
	osSyncPrintf( "\n" );
	osSyncPrintf( "%s\t},\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s\t0x%X,\t/* goalDataSize */\n", SUI_C_KEYWORD, dp->header.goalDataSize );
	osSyncPrintf( "%s\t0x%X,\t/* totalDataSize */\n", SUI_C_KEYWORD, dp->header.totalDataSize );
	osSyncPrintf( "%s\t0x%X,\t/* dummyUI_0 */\n", SUI_C_KEYWORD, dp->header.dummyUI_0 );
	osSyncPrintf( "%s\t0x%X\t/* dummyUI_1 */\n", SUI_C_KEYWORD, dp->header.dummyUI_1 );
	/* end */
	osSyncPrintf( "%s};\n", SUI_C_KEYWORD );
	
	/* data */
	data_size = dp->header.totalDataSize;
	loop_num = data_size / 10;
	rest = data_size % 10;
	osSyncPrintf( "%s\n", SUI_C_KEYWORD );
	osSyncPrintf( "%s/* data */\n\n", SUI_C_KEYWORD );
	osSyncPrintf( "%suchar romGhostData_%d[%d] = {\n",
				 SUI_C_KEYWORD, idCourse, data_size );
	for( i = 0 ; i < loop_num ; i ++ ) {
		osSyncPrintf( "%s\t\t", SUI_C_KEYWORD );
	  	for( j = 0 ; j < 10 ; j ++ ) {
		  	osSyncPrintf( "0x%X,", dp->data[i*10+j] );
		}
		osSyncPrintf( "\t/* %d */\n", (i+1) * 10 );
	}
	osSyncPrintf( "%s\t\t", SUI_C_KEYWORD );
	for( j = 0 ; j < rest ; j ++ ) {
	  	if( j != (rest-1) ) {
		  	osSyncPrintf( "0x%X,", dp->data[i*10+j] );
		}
		else {
		  	osSyncPrintf( "0x%X", dp->data[i*10+j] );
		}
	}
	if( rest > 0 ) osSyncPrintf( "\t/* %d */\n", rest );
	/* end */
	osSyncPrintf( "\n%s};\n", SUI_C_KEYWORD );
	
#endif	/* !ROM_FLAG */
}

/* ディスプレイリスト */
static Gfx 	*makeSuiWinGlist( Gfx *pGfx, int x, int y )
{
	int	i, ox, oy;
	
	/* タイトル文字列 */
	static char	strTitle[] = "SUIDASHI DAICHAN V3.20";
	static char	*tblStrMember[] = {
		"FROM SRAM TO PACK",
		"FROM PACK TO SRAM",
		"FROM SRAM TO C"
	};

	ox = OPTION_SUIWIN_WD/2;

  	gSPDisplayList( pGfx++, init_texture_rectangle_no_LUT );
#if SW_KNDAI
  	gDPPipeSync( pGfx );
  	gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 255, 128 );
	pGfx = MakeDL_TexRect4p_slow( pGfx, texDai, x+0, y+0, 280, 140 );
#endif
	
	/* タイトル */
  	gDPPipeSync( pGfx );
  	gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 255, 255 );
  	pGfx = SetWord3_C( pGfx, x + ox, y + 26, strTitle, 1 );
	

	/* 項目 */
	oy = y + 26 + 30 + 16;
	for( i = 0 ; i < SUI_MEMBER_MAX ; i ++ ) {
	  	gDPPipeSync( pGfx++ );
		if( i != idSuiMenu ) {
	  		gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 255, 255 );
			#if !SW_SUIDASHI_MAKEC
	  		if( i == SUI_MODE_MAKEC ) gDPSetPrimColor( pGfx++, 0, 0, 128, 128, 128, 255 );
			#endif
		}
		else {
		  	pGfx = SetOKPrimColor0( pGfx );
		}
  		pGfx = SetWord3_C( pGfx, x + ox, oy + 26 * i, tblStrMember[i], 1 );
	}


  
  

	return( pGfx );
}

/* パックのリードライト */
static int pfsReadWritePack( int fWrite )
{
  	u8	flag;
	int	ret, length, offset, nbyte;

 	if ( read_controller_fg != 0 ) {
		get_controller_data() ;
	  	read_controller_fg = 0 ;
  	}

  	ret = osPfsInitPak( &MesgQ_SI, &pfs, 0 );
	if( !ret ) {
		ret = osPfsFindFile( &pfs, SUI_PFS_COMPANY_CODE, SUI_PFS_GAME_CODE,
							 pfsGameName, pfsExtName, &pfsFileNo );
	  	if( fWrite && (ret == PFS_ERR_INVALID ) ) {
		  	length = ( sizeof( BakGhostInfo ) + sizeof( BakGhostData ) + 63 ) / 64;
			length *= 64;
			ret = osPfsAllocateFile( &pfs, SUI_PFS_COMPANY_CODE, SUI_PFS_GAME_CODE,
									pfsGameName, pfsExtName, length, &pfsFileNo );
		}
	}
	if( !ret ) {
	  	if( fWrite ) flag = PFS_WRITE;
	  	else flag = PFS_READ;
		offset = 0;
		ret = osPfsReadWriteFile( &pfs, pfsFileNo, flag,
						   offset, sizeof(BakGhostInfo), (u8 *)&pBakOpt->d.ghostInfo);
		offset = sizeof(BakGhostInfo);
		nbyte = (sizeof(BakGhostData) + 31) / 32;
		nbyte *= 32;
		ret = osPfsReadWriteFile( &pfs, pfsFileNo, flag,
						   offset, nbyte, (u8 *)&pBakOpt->d.ghostData);
	}

#ifndef ROM_FLAG
	osSyncPrintf( "PFS ERROR = %d, fileNo.%d\n", ret, pfsFileNo );
#endif

	
	return( ret );
}

/* --- 警告ルーチン --- */
static void moveOptionSuidashiMes( void )
{
  	int			close_flag, err, max_count;
	ushort		sum;
	GhostInfo	info;
	BakGhostInfo	*ip;
	BakGhostData	*dp;
  
	/* ウィンドウ開ききるまで何もしない */
	if( !checkMenuWindow( pSuiMesWin, MENUWIN_CHKMODE_OPEN ) ) return;

	close_flag = 0;

	if( seqSuiMes == 0 ) {
	  	cSuiMes ++;
		if( cSuiMes >= 5 ) {
		  	seqSuiMes = 1;
			cSuiMes = 0;
		}
	}
	else {

	if( !errSui ) {
		switch( idSuiMenu ) {
	  
			case SUI_MODE_SRAM2PACK:
		  		err = bakGetDataGhostInfo( &info );
				if( !err ) {
					dp = &pBakOpt->d.ghostData;
 					readSramGhostData( dp );
					sum = calcSumGhostData( dp );
					if( sum != dp->header.sumGhost ) {
				  		err = BAK_ERROR_BRKDATA;
					}
				}
				/* SRAM ERROR */
				switch( err ) {
					case BAK_ERROR_BRKDATA:
				  		errSui = SUI_ERROR_SRAM_BRKDATA;
				  		break;
					case BAK_ERROR_NODATA:
				  		errSui = SUI_ERROR_SRAM_NODATA;
						break;
				}
				if( !err ) {
				  	/* write type & owner */
				  	ip = &pBakOpt->d.ghostInfo;
 					readSramGhostInfo( ip );
				  	ip->type  = GHOST_TYPE_STAFF;
				  	ip->owner = tblOwner[idSuiOwner].owner;
					sum = calcSumGhostInfo( ip );
					ip->sumInfo = sum;
				  	/* write pfs */
				  	err = pfsReadWritePack( 1 );
					/* PACK ERROR */
					switch( err ) {
						case 0:
					  		errSui = SUI_ERROR_OK;
							break;
						case PFS_ERR_NOPACK:
						case PFS_ERR_DEVICE:
							errSui = SUI_ERROR_PFS_NOPACK;
							break;
						case PFS_ERR_CONTRFAIL:
						case PFS_ERR_ID_FATAL:
						case PFS_ERR_INCONSISTENT:
							errSui = SUI_ERROR_PFS_BRKPACK;
							break;
					}
				}
	  			break;
			case SUI_MODE_PACK2SRAM:
				/* read pfs */
				err = pfsReadWritePack( 0 );
				/* PACK ERROR */
				switch( err ) {
					case PFS_ERR_NOPACK:
					case PFS_ERR_DEVICE:
						errSui = SUI_ERROR_PFS_NOPACK;
						break;
					case PFS_ERR_CONTRFAIL:
					case PFS_ERR_INCONSISTENT:
						errSui = SUI_ERROR_PFS_BRKPACK;
						break;
					case PFS_ERR_ID_FATAL:
						errSui = SUI_ERROR_PFS_NODATA;
						break;
				}
				/* check sum */
				if( !err ) {
				  	ip = &pBakOpt->d.ghostInfo;
					sum = calcSumGhostInfo( ip );
#ifndef ROM_FLAG
					osSyncPrintf( "READ INFO : CALC SUM = %x, DATA SUM = %x\n", sum, ip->sumInfo );
#endif
					if( sum != ip->sumInfo ) err = BAK_ERROR_BRKDATA;
				}
				if( !err ) {
				  	dp = &pBakOpt->d.ghostData;
					sum = calcSumGhostData( dp );
					if( sum != dp->header.sumGhost ) err = BAK_ERROR_BRKDATA;
				}
				/* SRAM ERROR */
				switch( err ) {
					case BAK_ERROR_BRKDATA:
				  		errSui = SUI_ERROR_SRAM_BRKDATA;
				  		break;
					case BAK_ERROR_NODATA:
				  		errSui = SUI_ERROR_SRAM_NODATA;
						break;
				}
				if( !err ) {
					writeSramGhostInfo( &bakDataOpt.d.ghostInfo );
					writeSramGhostData( &bakDataOpt.d.ghostData );
					errSui = SUI_ERROR_OK;
				}
	  			break;
			case SUI_MODE_MAKEC:
	  			break;
	  
		}
  	}

	if( errSui ) {
	  	cErrSui ++;
		if( errSui == SUI_ERROR_OK ) max_count = 60;
		else max_count = 60*3;
		if( cErrSui >= max_count ) {
		  	errSui = SUI_ERROR_NORMAL;
		  	cErrSui = 0;
			close_flag = 1;
		}
		if( close_flag ) {
			optionSeq = OPTION_SEQ_SUIDASHI;
			closeMenuWindow( pSuiMesWin );
			if( idSuiMenu == SUI_MODE_SRAM2PACK ) {
				closeMenuWindow( pSuiOwnWin );
			}
		}
	}

  	}	/* seqSuiMes */
}

static Gfx 	*makeSuiMesWinGlist( Gfx *pGfx, int x, int y )
{
	char	*str_p;
	int		disp_flag, color_pat;

	disp_flag = 0;
	color_pat = 0;
	if( seqSuiMes == 0 ) {
		str_p = "PLEASE WAIT MOMENT";
		disp_flag = 1;
		color_pat = 0;
	}
	else {
	  
		color_pat = 1;
	
		switch( errSui ) {
			case SUI_ERROR_OK:
	  			str_p = "OK";
				color_pat = 2;
	  			break;
			case SUI_ERROR_SRAM_BRKDATA:
	  			str_p = "SRAM : BREAK DATA";
	  			break;
			case SUI_ERROR_SRAM_NODATA:
	  			str_p = "SRAM : NO GHOST";
	  			break;
			case SUI_ERROR_PFS_NOPACK:
	  			str_p = "PFS : NO PACK";
	  			break;
			case SUI_ERROR_PFS_BRKPACK:
	  			str_p = "PFS : BREAK PACK";
	  			break;
			case SUI_ERROR_PFS_NODATA:
	  			str_p = "PFS : NO GHOST";
	  			break;
		}
	}
	if( errSui ) disp_flag = 1;

	if( disp_flag ) {
	  	gSPDisplayList( pGfx++, init_texture_rectangle_no_LUT );
		if( color_pat == 0 ) {
			gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 255, 255 );
		}
		if( color_pat == 1 ) {
		  	gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 0, 255 );
		}
		else {
		  	gDPSetPrimColor( pGfx++, 0, 0,   0, 255, 0, 255 );
		}
	  	pGfx = SetWord3_C( pGfx, x + (OPTION_MESWIN_WD/2), y + 26, str_p, 1 );
	}
  
	return( pGfx );
}

/* --- 所有者 --- */
static void	moveOptionSuidashiOwn( void )
{
	int		old_id;
  
	/* ウィンドウ開ききるまで何もしない */
	if( !checkMenuWindow( pSuiOwnWin, MENUWIN_CHKMODE_OPEN ) ) return;

	old_id = idSuiOwner;

  	if( new_button_trg & CONT_DECIDE ) {
			if( (pSuiMesWin = openMenuWindow( MENUWIN_ID_MES, SX_OPTION_MESWIN, SY_OPTION_MESWIN,
											  OPTION_MESWIN_WD, OPTION_MESWIN_HT,
											  OPTION_MESWIN_COLOR, makeSuiMesWinGlist )) != NULL ) {
			optionSeq = OPTION_SEQ_SUIDASHI_MES;
			errSui = 0;
			cErrSui = 0;
			seqSuiMes = 0;
			cSuiMes = 0;
		}
		#if SOUND_SW
  		Na_SystemSE_Start( SE_DECIDE );
		#endif
	}
  	else if( new_button_trg & CONT_CANCEL ) {
		optionSeq = OPTION_SEQ_SUIDASHI;
		closeMenuWindow( pSuiOwnWin );
		#if SOUND_SW
  		Na_SystemSE_Start( SE_CANCEL );
		#endif
	}
	else if( new_button & U_JPAD ) {
	  	idSuiOwner --;
		if( idSuiOwner < 0 ) idSuiOwner = OWN_TBL_MAX - 1;
	}
	else if( new_button & D_JPAD ) {
	  	idSuiOwner ++;
		if( idSuiOwner >= OWN_TBL_MAX ) idSuiOwner = 0;
	}
	else if( new_button & L_JPAD ) {
	  	idSuiOwner -= SU_OWNNAME_REVERSE_NUM;
		if( idSuiOwner < 0 ) idSuiOwner += (SU_OWNNAME_REVERSE_NUM*2);
	}
	else if( new_button & R_JPAD ) {
	  	idSuiOwner += SU_OWNNAME_REVERSE_NUM;
		if( idSuiOwner >= OWN_TBL_MAX ) idSuiOwner -= (SU_OWNNAME_REVERSE_NUM*2);
	}

	if( old_id != idSuiOwner ) {
		#if SOUND_SW
	  	Na_SystemSE_Start( SE_CURSOL );
		#endif
	}
}

static Gfx 	*makeSuiOwnWinGlist( Gfx *pGfx, int x, int y )
{
	int		i, ox, oy;
	SuiOwn	*p;
	/* タイトル文字列 */
	static char	strTitle[] = "WHO ARE YOU";

	/* タイトル */
	ox = OPTION_OWNWIN_WD/2;
  	gDPPipeSync( pGfx++ );
  	gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 255, 255 );
  	pGfx = SetWord3_C( pGfx, x + ox, y + 26, strTitle, 1 );
	for( i = 0, p = tblOwner ; i < OWN_TBL_MAX ; i ++, p ++ ) {
	  	gDPPipeSync( pGfx++ );
	  	if( i != idSuiOwner ) {
		  	gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 255, 255 );
		}
		else {
		  	pGfx = SetOKPrimColor0( pGfx );
		}
	  	ox = (i / SU_OWNNAME_REVERSE_NUM) * 120 + 30;
		oy = (i % SU_OWNNAME_REVERSE_NUM) * 20  + 46;
	  	pGfx = SetWord6( pGfx, x + ox, y + oy, p->pStrName, 1 );
	}
  
	return( pGfx );
}

#endif	/* SW_SUIDASHI */
