/*
 ******************************************************************************
 *
 *	セーブ画面制御
 *	$Id: save_menu.c,v 1.1 2004/02/26 19:08:47 tong Exp $
 *
 ******************************************************************************
 */
/* このファイルはオーバーレイです */

#include "player_select.h"
#include "save_menu.h"

#include "m_cpak.h"
#include "s_flashrom.h"
#include "m_flashrom.h"
#include "m_private.h"

#include "m_font.h"

#include "m_trademark.h"
#include "m_land.h"

#if	DEBUG
#include "assert64.h"
#endif

#ifdef BBPLAYER
#include "m_common_data.h"
extern u32 bbRTC_delta_minutes;
extern int bbRTC_delta_sign;
#endif

/*
 * プレーヤーセレクト処理フラグ
 *	1 にするとセーブ画面が出ます
 */
#define	SAVE_MENU_ON		1

/** セーブエラーテーブル */
enum	save_error_table {
    SAVE_ERR_TABLE_e,

    DO_SAVE_e = SAVE_ERR_TABLE_e,	/** セーブ許可 */
    ERR_SAVE_FROM_e,			/** Flashromでのセーブエラー */
    ERR_SAVE_PAK_e,			/** Pakでのセーブエラー */
    FIN_SAVE_e,				/** セーブ終了 */

    SAVE_ERR_TABLE_END_e
};

/** サブ処理型 */
typedef void	(* Save_Menu_Sub_Proc)( GAME_SAVE_MENU * );
/** 初期化基本関数型 */
typedef void	(* Save_Menu_Proc)( GAME_SAVE_MENU * );



/*
 ---------------------------
 *	カーソルカラーの決定
 ---------------------------
 */
#define	SAVE_MENU_COLOR_0	{255, 180, 180}
#define	SAVE_MENU_COLOR_1	{240, 150, 150}
#define	SAVE_MENU_COLOR_2	{224, 130, 130}
#define	SAVE_MENU_COLOR_3	{192, 120, 120}
#define	SAVE_MENU_COLOR_4	{128, 80, 80}
#define	SAVE_MENU_COLOR_5	{64, 64, 64}

#define SAVE_FRAME_COUNT_INTERVAL	(4)
#define	SAVE_FRAME_COUNT_COLOR_NUM	(10)
#define SAVE_FRAME_COUNT_LOOP		(SAVE_FRAME_COUNT_INTERVAL * SAVE_FRAME_COUNT_COLOR_NUM)
/*
 *	カーソルの点滅
 */
static void save_menu_set_cursor_col( GAME_SAVE_MENU *save_menu_p ){

    int		cursor_color[SAVE_FRAME_COUNT_COLOR_NUM][RGB] = {
	SAVE_MENU_COLOR_3, SAVE_MENU_COLOR_2, SAVE_MENU_COLOR_1,
	SAVE_MENU_COLOR_0, SAVE_MENU_COLOR_1, SAVE_MENU_COLOR_2,
	SAVE_MENU_COLOR_3, SAVE_MENU_COLOR_4, SAVE_MENU_COLOR_5,
	SAVE_MENU_COLOR_4,
    };
    int		save_data_mode = save_menu_p->save_data_mode;
    int		color_count =
	(int)((save_menu_p->frame_count) /SAVE_FRAME_COUNT_INTERVAL);
    int		*now_color;
    int		i;

    now_color = &(save_menu_p->cursor_col[save_data_mode][0]);
    for( i = 0; i < RGB; i++ ){
	now_color[i] = cursor_color[color_count][i];
    }
    
}

/*
 *	カーソルカラーの色リセット
 */
static void save_menu_reset_cursor_col( int *cursor_col_p ){

    int		def_cursor_color[3] = { 40, 40, 40 };
    int		i;

    for( i = 0; i < 3; i++ ){
	cursor_col_p[i] = def_cursor_color[i];
    }
    
}

/*
 *****************************************************
 *	ゲームスタート時に 1度だけ処理される初期化関数
 *****************************************************
 */
/*
 -------------------------------
 *	「Flashromにセーブ」処理
 -------------------------------
 */
static void save_menu_data_save_from( GAME_SAVE_MENU *save_menu_p ){

    int		rec_from;
    int		player_no = (int)ZCommonGet(player_no);

#if	defined(U_gen_U)
    PRINTF(ESC_YELLOW"save frash rom\n"ESC_NORMAL);
#endif

    /** 国内プレーヤーであれば Flashromへのセーブ許可 */
    if( player_no != mPr_FOREIGNER_PLAYER_NO  ){
	nowPrivateSet(exist, 1);
	/** Flashromへ書き込み */
#ifdef BBPLAYER
        SaveSet(delta.minutes, bbRTC_delta_minutes);
        SaveSet(delta.sign, bbRTC_delta_sign);
#endif
	rec_from = mFRm_FlashSaveAllData( );
	if( rec_from != -1 ){	/** 書き込み成功であればセーブ処理をぬける */
	    save_menu_p->save_err = FIN_SAVE_e;
	} else {	/** 書き込み失敗の場合 エラー処理 */
#if	DEBUG
	    PRINTF(ESC_RED"\nFlashrom 書き込み失敗です\n"ESC_NORMAL);
#endif
	    save_menu_p->save_err = ERR_SAVE_FROM_e;
	}
    } else {	/** 外国プレーヤーであればエラー */
#if	DEBUG
	PRINTF(ESC_RED"\nあなたは 外国のプレーヤーです\n"ESC_NORMAL);
	PRINTF(ESC_RED"Flashrom 書き込み出来ません.\n"ESC_NORMAL);
	PRINTF(ESC_RED"パックへセーブしてください\n"ESC_NORMAL);
#endif
	save_menu_p->save_err = ERR_SAVE_FROM_e;
    }
    
}

/*
 -----------------------------
 *	「パックにセーブ」処理
 -----------------------------
 */
static void save_menu_data_save_pak( GAME_SAVE_MENU *save_menu_p ){

    Private_c	*private_p = ZCommonGet(now_private);	/** 現在のプレーヤー */
    int		player_no = (int)ZCommonGet(player_no);	/** プレーヤー番号 */
    int		rec;

#if	defined(U_gen_U)
    PRINTF(ESC_YELLOW"\nsave pak\n"ESC_NORMAL);
#endif

    /** もしプレーヤーが外国人なら NPC個人情報を書き込み */
    if( player_no == mPr_FOREIGNER_PLAYER_NO ){
	AnmPersonalID_c	*foreign_id_p;

	/** 住んでいる NPC情報から任意に選出 */
	foreign_id_p = mNpc_GetOtherAnimalPersonalID( NULL, 0 );
	if( foreign_id_p != NULL ){	/** プレーヤー情報に書き込み */
#if	defined(U_gen_U)
	    PRINTF(ESC_YELLOW"秘密で NPC情報の書き込み\n"ESC_NORMAL);
	    PRINTF(ESC_YELLOW"npc name : %#010x\n"ESC_NORMAL,
		   foreign_id_p->name);
#endif
	    mNpc_CopyAnimalPersonalID( &(private_p->foreign_npc_id),
				       foreign_id_p );
	}
    }

    /** 実験用です */
    mCPk_PakOpen(mCPk_get_pkinfo( ), 0 );
    rec = mCPk_SavePak( SaveGetP(privateInfo[0]),
			SaveGetP(animal[0]),
			mCPk_get_pkinfo( ));
    if( rec == 1 ){
	int	rec_from;
	/** 現在のプレーヤーデータを「外出中( 不在 )」にセット */
	if( mLd_PlayerManKindCheck( ) == NATIVE_e ){
	    nowPrivateSet(exist, 0);
	}
	/** セーブデータを Flashromに書き込む */
#ifdef BBPLAYER
        SaveSet(delta.minutes, bbRTC_delta_minutes);
        SaveSet(delta.sign, bbRTC_delta_sign);
#endif
	rec_from = mFRm_FlashSaveAllData( );
	if( rec_from != -1 ){	/** 書き込み成功であれば セーブ処理終了 */
	    save_menu_p->save_err = FIN_SAVE_e;
	} else {	/** Flashrom書き込み失敗 */
#if	DEBUG
	    PRINTF(ESC_RED"\nFlashromへの書き込みに失敗しました\n"ESC_NORMAL);
#endif
	    save_menu_p->save_err = ERR_SAVE_FROM_e;
	}

    } else {	/** エラー処理 */
#if	DEBUG
	PRINTF(ESC_RED"\nパックを正しくさし直してください\n"ESC_NORMAL);
#endif
	save_menu_p->save_err = ERR_SAVE_PAK_e;
    }

}

/*
 *****************
 *	セーブ処理
 *****************
 */
static void save_menu_move_do_save( GAME_SAVE_MENU *save_menu_p ){

    int		save_data_mode = save_menu_p->save_data_mode;
    static Save_Menu_Proc	save_proc[SAVE_DATA_MODE_TABLE_END_e] = {
	save_menu_data_save_from,
	save_menu_data_save_pak,
    };
    
    if( chkTrigger(A_BTN) ){
	/** セーブ処理 */
	save_proc[save_data_mode]( save_menu_p );
    }
    /** セーブモード切り替え */
    if( chkTrigger(R_BTN) || chkTrigger(UP_TRG) || chkTrigger(DOWN_TRG)){
	/** 点滅のリセット */
	save_menu_p->frame_count = 0;
	save_menu_reset_cursor_col(
	    &(save_menu_p->cursor_col[save_data_mode][0]));
	
	/** モードの切り替え */
	(save_menu_p->save_data_mode)++;
	if( save_menu_p->save_data_mode >= SAVE_DATA_MODE_TABLE_END_e ){
	    save_menu_p->save_data_mode = SAVE_FROM_e;
	}
    }
    if( chkTrigger(B_BTN) ){
	save_menu_p->save_err = FIN_SAVE_e;
    }
}

/*
 ***********************************
 *	セーブメニューからぬける処理
 ***********************************
 */
static void save_menu_move_finish( GAME_SAVE_MENU *save_menu_p ){
    
    GAME	*game_p = &(save_menu_p->g);

    /** セーブ処理を終了  任天堂トレードマーク画面に移行 */
    game_goto_next_game_name(game_p, trademark, TRADEMARK);
}

/*
 *****************************
 *	エラーを標準出力に表示
 *****************************
 */
static void save_menu_move_err( GAME_SAVE_MENU *save_menu_p ){

#if	DEBUG
    PRINTF(ESC_RED"セーブ処理 エラーです err:%x\n"ESC_NORMAL,
	   save_menu_p->save_err );
#endif
    save_menu_p->save_err = DO_SAVE_e;
}

/*
 ******************************************************************************
 *	描画以外のメイン処理
 ******************************************************************************
 */
static void save_menu_move_main( GAME_SAVE_MENU *save_menu_p ){

    int		save_err = save_menu_p->save_err;
    static Save_Menu_Sub_Proc	sub_proc[SAVE_ERR_TABLE_END_e] = {
	save_menu_move_do_save,
	save_menu_move_err,
	save_menu_move_err,
	save_menu_move_finish
    };

    /** サブ処理 */
    if(( 0 <= save_err ) && ( save_err < SAVE_ERR_TABLE_END_e )){
	sub_proc[save_err]( save_menu_p );
    } else {
#if	DEBUG
	PRINTF(ESC_ERROR"サブ処理 モードエラー\n"ESC_NORMAL);
	assert(0);
#endif
    }
    /** 指定したカーソルの点滅 */
    save_menu_set_cursor_col( save_menu_p );
    (save_menu_p->frame_count)++;
    if( save_menu_p->frame_count == SAVE_FRAME_COUNT_LOOP ){
	save_menu_p->frame_count = 0;
    }

}
    
/*
******************************************************************************
 *				描画処理
 ******************************************************************************
 */
/*
 *-----------------------------------------------------------------------------
 *	描画用データ
 *-----------------------------------------------------------------------------
 */
#if 0
#define SAVE_MENU_TEXSIZE_DOT_W	32
#define SAVE_MENU_TEXSIZE_DOT_H	16

#define SAVE_MENU_TEX_MUL_W		8
#define SAVE_MENU_TEX_MUL_H		8

#define SAVE_MENU_TEXSIZE_DOT_W_M	\
		( SAVE_MENU_TEXSIZE_DOT_W * SAVE_MENU_TEX_MUL_W )
#define SAVE_MENU_TEXSIZE_DOT_H_M	\
    		( SAVE_MENU_TEXSIZE_DOT_H * SAVE_MENU_TEX_MUL_H)

/* アライメントの為 */
static u64 SaveMenu_dummy = 0;
static char SaveMenu_dummy_tex[] = {
    0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
    0x22,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,
    0x22,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x22,
    0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
};

static unshort SaveMenu_dummy_pallet[] = {
    0x0001,0xffff,0xfffe,0x0000,0x0000,0x0000,0x0000,0x0000,
    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
};


static Gfx SaveMenu_init_disp[] = {
    gsDPPipeSync(),
    gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON),     
    gsSPClearGeometryMode(G_ZBUFFER | G_SHADE |\
			  G_SHADING_SMOOTH | G_CULL_BOTH |\
			  G_FOG | G_LIGHTING |\
			  G_TEXTURE_GEN |\
			  G_TEXTURE_GEN_LINEAR | G_LOD),
    gsDPSetTextureLOD(G_TL_TILE),
    gsDPSetTextureConvert(G_TC_FILT),
    gsDPSetTextureLUT(G_TT_RGBA16),
    gsDPSetTextureFilter(G_TF_POINT),

    gsDPSetCycleType(G_CYC_1CYCLE),
    gsDPSetTexturePersp(G_TP_NONE),
    
    gsDPSetAlphaDither(G_AD_DISABLE),
    gsDPSetColorDither(G_CD_DISABLE),
    gsDPSetCombineKey(G_CK_NONE),
    
    gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
    gsDPSetRenderMode(G_RM_TEX_EDGE, G_RM_TEX_EDGE2),
    gsDPLoadTextureTile_4b(SaveMenu_dummy_tex,
			   G_IM_FMT_CI,
			   SAVE_MENU_TEXSIZE_DOT_W, SAVE_MENU_TEXSIZE_DOT_H,
			   0, 0,
			   SAVE_MENU_TEXSIZE_DOT_W, SAVE_MENU_TEXSIZE_DOT_H,
			   0,
			   G_TX_WRAP | G_TX_NOMIRROR,
			   G_TX_WRAP | G_TX_NOMIRROR,
			   G_TX_NOMASK, G_TX_NOMASK,
			   G_TX_NOLOD, G_TX_NOLOD),
    gsDPLoadTLUT_pal16(0, SaveMenu_dummy_pallet),
    gsSPTextureRectangle(30 << 2, 50 << 2,
			 (30 + SAVE_MENU_TEXSIZE_DOT_W_M) << 2,
			 (50 + SAVE_MENU_TEXSIZE_DOT_H_M) << 2,
			 0,
			 0 << 5, 0 << 5,
			 1 << 7, 1 << 7),
    gsSPEndDisplayList(),
};


/*
 ***************
 *	絵の描画
 ***************
 */
static void save_menu_draw_rectangle(GAME *game_p){
    
    GRAPH *graph = game_p->graph;
    
    OPEN_DISP(graph);
    gSPDisplayList(NEXT_DISP, SaveMenu_init_disp);
    
    CLOSE_DISP(graph);
}

#endif

#define PS_STR_WRITE( game_p, str, len, d_x, d_y, m_x, m_y )	\
    mFont_SetLineStrings_AndSpace(	\
	game_p,	str, len, d_x, d_y, 200, 200, 200, 255, 0, 1, 0, m_x, m_y, \
	M_FONT_ENTRY_FONT_DISP )
#define PS_STR_WRITE_RED( game_p, str, len, d_x, d_y, m_x, m_y )	\
    mFont_SetLineStrings_AndSpace(	\
	game_p,	str, len, d_x, d_y, 200, 50, 50, 255, 0, 1, 0, m_x, m_y, \
	M_FONT_ENTRY_FONT_DISP )
/*
 -------------------------------
 *	「セーブメニュー」の表示
 -------------------------------
 */
#define	_DEBUG_SAVE_MENU_STR_LEN		8
static void save_menu_draw_title( GAME_SAVE_MENU *save_menu_p ){

    GAME	*game_p = &(save_menu_p->g);
    unchar	_debug_save_menu[_DEBUG_SAVE_MENU_STR_LEN] = {
	
	MOJI_SE, MOJI_HYPHEN, MOJI_BU, MOJI_SPACE1, MOJI_ME, MOJI_NI,
	MOJI_LITTLEYU, MOJI_HYPHEN,
    };

    mFont_SetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    PS_STR_WRITE_RED(
	game_p,
	_debug_save_menu,		/* 表示文字列ポインター */
	_DEBUG_SAVE_MENU_STR_LEN,	/* 表示文字数 */
	110.0F,		/* ディスプレー座標	X */
	30.0F,		/* ディスプレー座標	Y */
	1.1F,/* 表示倍率（基本は１２×１６ドット） */
	1.1F/* 表示倍率（基本は１２×１６ドット） */
	);
    mFont_UnSetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    
}

/*
 ------------------------------
 *	「Push A Button」の表示
 ------------------------------
 */
#define	_DEBUG_PUSH_A_STR_LEN		13
static void save_menu_draw_push_a( GAME_SAVE_MENU *save_menu_p ){

    GAME	*game_p = &(save_menu_p->g);
    unchar	_debug_push_a[_DEBUG_PUSH_A_STR_LEN] = {
	
	MOJI_P, MOJI_u, MOJI_s, MOJI_h, MOJI_SPACE1,
	MOJI_A, MOJI_SPACE1, MOJI_B, MOJI_u, MOJI_t, MOJI_t, MOJI_o, MOJI_n,
    };

    mFont_SetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    PS_STR_WRITE(
	game_p,
	_debug_push_a,		/* 表示文字列ポインター */
	_DEBUG_PUSH_A_STR_LEN,	/* 表示文字数 */
	95.0F,		/* ディスプレー座標	X */
	175.0F,		/* ディスプレー座標	Y */
	0.8F,/* 表示倍率（基本は１２×１６ドット） */
	0.8F/* 表示倍率（基本は１２×１６ドット） */
	);
    mFont_UnSetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    
}


/*
 --------------------------------
 *	「Select R Button」の表示
 --------------------------------
 */
#define	_DEBUG_SELECT_R_STR_LEN		15
static void save_menu_draw_select_r( GAME_SAVE_MENU *save_menu_p ){

    GAME	*game_p = &(save_menu_p->g);
    unchar	_debug_select_r[_DEBUG_SELECT_R_STR_LEN] = {
	
	MOJI_S, MOJI_e, MOJI_l, MOJI_e, MOJI_c,	MOJI_t, MOJI_SPACE1,
	MOJI_R, MOJI_SPACE1, MOJI_B, MOJI_u, MOJI_t, MOJI_t, MOJI_o, MOJI_n,
    };
    
    mFont_SetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    PS_STR_WRITE(
	game_p,
	_debug_select_r,		/* 表示文字列ポインター */
	_DEBUG_SELECT_R_STR_LEN,	/* 表示文字数 */
	76.0F,		/* ディスプレー座標	X */
	185.0F,		/* ディスプレー座標	Y */
	0.8F,/* 表示倍率（基本は１２×１６ドット） */
	0.8F/* 表示倍率（基本は１２×１６ドット） */
	);
    mFont_UnSetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    
}

/*
 --------------------------------------
 *	「Push B Button to EXIT」の表示
 --------------------------------------
 */
#define	_DEBUG_PUSH_B_STR_LEN		21
static void save_menu_draw_push_b( GAME_SAVE_MENU *save_menu_p ){

    GAME	*game_p = &(save_menu_p->g);
    unchar	_debug_push_b[_DEBUG_PUSH_B_STR_LEN] = {
	
	MOJI_P, MOJI_u, MOJI_s, MOJI_h, MOJI_SPACE1, MOJI_B, MOJI_SPACE1,
	MOJI_B, MOJI_u, MOJI_t, MOJI_t, MOJI_o, MOJI_n, MOJI_SPACE1,
	MOJI_t, MOJI_o, MOJI_SPACE1, MOJI_E, MOJI_X, MOJI_I, MOJI_T
    };
    
    mFont_SetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    PS_STR_WRITE(
	game_p,
	_debug_push_b,		/* 表示文字列ポインター */
	_DEBUG_PUSH_B_STR_LEN,	/* 表示文字数 */
	50.0F,		/* ディスプレー座標	X */
	210.0F,		/* ディスプレー座標	Y */
	0.8F,/* 表示倍率（基本は１２×１６ドット） */
	0.8F/* 表示倍率（基本は１２×１６ドット） */
	);
    mFont_UnSetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    
}

/*
 ---------------------------------------
 *	「はじめから」「続きから」の描画
 ---------------------------------------
 */
#define	SAVE_SELECT_MODE_STR_LEN	13
static void save_menu_draw_select_mode( GAME_SAVE_MENU *save_menu_p ){
    
    GAME	*game_p = &(save_menu_p->g);
    unchar	select_mode_str[SAVE_DATA_MODE_TABLE_END_e][SAVE_SELECT_MODE_STR_LEN] = {
	{
	    MOJI_F, MOJI_l, MOJI_a, MOJI_s, MOJI_h, MOJI_R, MOJI_o, MOJI_m,
	    MOJI_SPACE1, MOJI_ni, MOJI_SE, MOJI_HYPHEN, MOJI_BU,
	},
	{
	    MOJI_PA, MOJI_LITTLETU, MOJI_KU, MOJI_SPACE1, MOJI_ni,
	    MOJI_SE, MOJI_HYPHEN, MOJI_BU, MOJI_SPACE1,  MOJI_SPACE1,
	    MOJI_SPACE1,  MOJI_SPACE1,  MOJI_SPACE1, 
	},
    };

    
    /** 「FlashRomにセーブ」の表示 */
    mFont_SetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    mFont_SetLineStrings_AndSpace(
	game_p,
	select_mode_str[SAVE_FROM_e],
	SAVE_SELECT_MODE_STR_LEN,
	60.0F,
	85.0F,
	save_menu_p->cursor_col[SAVE_FROM_e][0],
	save_menu_p->cursor_col[SAVE_FROM_e][1],
	save_menu_p->cursor_col[SAVE_FROM_e][2],
	255,
	0,
	1,
	0,
	1.2F,
	1.2F,
	M_FONT_ENTRY_FONT_DISP );
    mFont_UnSetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    /** 「パックにセーブ」の表示 */
    mFont_SetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );
    mFont_SetLineStrings_AndSpace(
	game_p,
	select_mode_str[SAVE_PAK_e],
	SAVE_SELECT_MODE_STR_LEN,
	100.0F,
	125.0F,
	save_menu_p->cursor_col[SAVE_PAK_e][0],
	save_menu_p->cursor_col[SAVE_PAK_e][1],
	save_menu_p->cursor_col[SAVE_PAK_e][2],
	255,
	0,
	1,
	0,
	1.2F,
	1.2F,
	M_FONT_ENTRY_FONT_DISP );
    mFont_UnSetMatrix( game_p->graph, M_FONT_ENTRY_FONT_DISP );

}

/*
 ******************************************************************************
 *	描画メイン処理
 ******************************************************************************
 */
static void save_menu_draw_main( GAME_SAVE_MENU *save_menu_p ){
    
    GAME *game_p = &(save_menu_p->g);
    View *view_p = &(save_menu_p->view);
    GRAPH *graph = game_p->graph;

    OPEN_DISP(graph);
    
    /*
     * セグメントアドレス設定
     */
    gSPSegment(NEXT_DISP, 0, 0x0);	/* Physical address segment */

    /*
     * ディスプレイリスト初期設定
     */
    DisplayList_initialize(graph, 0, 0, 0, NULL);

    /*
     * ビュワー設定
     */ 
    gDPPipeSync(NEXT_DISP);
//    view_set_ScissorBox(view_p, 0, 0, SCREEN_WD, SCREEN_HT);
    view_setup_view(view_p);

    /*
     *	絵の描画
     */
#if 0
    save_menu_draw_rectangle(game_p);
#endif
    /** タイトル「セーブメニュー」の表示 */
    save_menu_draw_title( save_menu_p );
    /** 「Push A Button」の表示 */
    save_menu_draw_push_a( save_menu_p );
    /** 「Select R Button」の表示 */
    save_menu_draw_select_r( save_menu_p );
    /** 「Push B Button to EXIT」の表示 */
    save_menu_draw_push_b( save_menu_p );
    /** 「Fashromにセーブする」「パックにセーブする」の表示 */
    save_menu_draw_select_mode( save_menu_p );
    
    CLOSE_DISP(graph);
}

/*
 ******************************************************************************
 *	ループする部分
 ******************************************************************************
 */
static void save_menu_main( GAME *game_p ){

    GAME_SAVE_MENU	*save_menu_p = (GAME_SAVE_MENU *)game_p;
    
    save_menu_move_main( save_menu_p );
    save_menu_draw_main( save_menu_p );
    {
	GRAPH	*graph = game_p->graph;

	game_debug_draw_last(game_p, graph);
	game_draw_last(graph);
    }
}

/*
 ******************************************************************************
 *	後始末を行う
 ******************************************************************************
 */
extern void save_menu_cleanup(GAME *this){
    
    (void)this;
}

/*
 ******************************************************************************
 *	first_game の初期化を行う
 ******************************************************************************
 */
extern void save_menu_init(GAME *game_p){
    
    GAME_SAVE_MENU	*save_menu_p = (GAME_SAVE_MENU *)game_p;
    View		*view_p = &(save_menu_p->view);
    GRAPH		*graph = game_p->graph;
    int			i;
    
#if	defined(U_gen_U)
    PRINTF(ESC_CYAN"\n .................... save_menu_init\n\n"ESC_NORMAL);
#endif

    game_p->exec = save_menu_main;
    game_p->cleanup = save_menu_cleanup;

    view_init(view_p, graph);
    view_p->setflag = VIEW_DO_ORTHO;

    /*
     * 行列計算クラス宣言
     */
    new_Matrix(game_p);
    SetGameFrame(1);
    
    save_menu_p->frame_count = 0;
    save_menu_p->save_data_mode = SAVE_FROM_e;
    save_menu_p->save_err = DO_SAVE_e;
    
    for( i = 0; i < SAVE_DATA_MODE_TABLE_END_e; i++ ){
	save_menu_reset_cursor_col( &(save_menu_p->cursor_col[i][0]) );
    }
    
}

#undef	SAVE_MENU_ON

#undef	SAVE_MENU_COLOR_0
#undef	SAVE_MENU_COLOR_1
#undef	SAVE_MENU_COLOR_2
#undef	SAVE_MENU_COLOR_3
#undef	SAVE_MENU_COLOR_4
#undef	SAVE_MENU_COLOR_5
#undef	SAVE_MENU_COLOR_6
#undef	SAVE_MENU_COLOR_7
#undef	SAVE_MENU_COLOR_8
#undef	SAVE_MENU_COLOR_9

#undef	SAVE_FRAME_COUNT_INTERVAL
#undef	SAVE_FRAME_COUNT_LOOP

#undef	SAVE_MENU_TEXSIZE_DOT_W
#undef	SAVE_MENU_TEXSIZE_DOT_H
#undef	SAVE_MENU_TEX_MUL_W
#undef	SAVE_MENU_TEX_MUL_H
#undef	SAVE_MENU_TEXSIZE_DOT_W_M
#undef	SAVE_MENU_TEXSIZE_DOT_H_M

#undef	PS_STR_WRITE
#undef	PS_STR_WRITE_RED

#undef	_DEBUG_SAVE_MENU_STR_LEN
#undef	_DEBUG_PUSH_A_STR_LEN
#undef	_DEBUG_SELECT_R_STR_LEN
#undef	_DEBUG_PUSH_B_STR_LEN
#undef	SAVE_SELECT_MODE_STR_LEN
