/*
	ネームチェンジ
*/
#include "ot_header.h"
#include "ot_sub.h"
#include "ot_newton.h"
#include "ot_hover.h"
#include "ot_sea.h"

#include "endefine.h"
#include "enrecord.h"

#include "dai_anim_data.h"

#include "kn_def.h"
#include "kn_main.h"
#include "kn_dynamic.h"
#include "kn_font.h"
#include "kn_message.h"
#include "kn_mask.h"
#include "kn_gword.h"
#include "kn_machine.h"
#include "kn_config.h"
#include "kn_cfgname.h"

/*******************************************************
	FUNCTION
*******************************************************/
void	moveMainCfgName( void );
Gfx 	*makeMainGlistCfgName( Gfx *gp );
static Gfx 	*makeCfgNameGlist( Gfx *gp );
static void		changeGameModeCfgName( void );
static void		cfgNameInputName( void );
static void		copyOrgManName( char *src_name );
static void		cfgNameCLR( void );
static void		cfgNameBS( void );
static void		cfgNameEnd( void );
static int		checkNameDotWidth( void );
static int 		calcStrDotWidth( char *str, uint font_type );
static void		initMainGlistCfgName2Next( void );
static void		copyStr( char *src, char *dst, int nbyte );

extern void 	initMainGlistOpen( void );
extern Gfx 		*makeKnJetGlist(Gfx *glistp,int man_num,int anim_num,int flag, Mtx *mtx_p );
/*******************************************************
	DEFINE
*******************************************************/
/* カーソル点滅時間 */
#define CFGNAME_MCUR_FLASH_COUNT		4

#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)

#define SX_RENAME18		96
#define SX_WAKU_BS		33
#define WD_WAKU_BS		33
#define SX_WAKU_SP		85
#define SX_TURN8		37
#define SX_SPACE8		94
#define SX_ORIGINAL8	38
#define SX_END8			115

#elif (SW_KN_LANGUAGE == KN_US)

#define SX_RENAME18		59
#define SX_WAKU_BS		25
#define WD_WAKU_BS		67
#define SX_WAKU_SP		93
#define SX_TURN8		33
#define SX_SPACE8		100
#define SX_ORIGINAL8	34
#define SX_END8			116

#elif (SW_KN_LANGUAGE == KN_EU)

#define SX_RENAME18		59
#define SX_WAKU_BS		25
#define WD_WAKU_BS		67
#define SX_WAKU_SP		93
#define SX_TURN8		33
#define SX_SPACE8		100
#define SX_ORIGINAL8	34
#define SX_END8			116

#define SX_RENAME18_GE		78
#define SX_TURN8_GE		41
#define SX_SPACE8_GE	108
#define SX_ORIGINAL8_GE	36
#define SX_END8_GE		115

#endif
/*******************************************************
	VARIABLE
*******************************************************/
/* --- 外部参照 --- */
/* Display List */
extern Gfx 		dlInitMachineModel[];
extern Gfx		dlCfgNameSetMachineView0[], dlCfgNameSetMachineView1[]; 
extern Gfx		dlCfgNameSetMachineView2[], dlCfgNameSetMachineView3[]; 
extern Gfx 		dlConfigBG[];
extern Gfx 		dlCfgNameLoadWaku[];
extern Gfx 		dlCfgNameBG[];
extern Gfx 		dlCfgNameLoadMCur[];
extern Gfx 		dlCfgNameClearCvg[];
/* テクスチャ */
extern uchar texSelect1p_CfgName[];
/* コントローラー */
extern sKnPad	mKnPad[];

/* --- 内部 --- */
/* パースぺクティブ ノーマライズ */
static ushort	perspNorm;
/* 選択マシン番号 */
static int		cfgNameSelMachineNum = 0;
/* カーソル点滅 */
static int		cfgNameMCurPat = 0;
static int		cfgNameMCurCount = 0;
static uint		cfgNameMCurColor;
/* 選択文字番号 */
static int		selLetterX, selLetterY, selLetterYBak;
static int		selLetterXBak = -1;
/* 名前修正バッファ */
static char		strNameChange[MAN_NAME_MAX_SIZE+1];
static char		strNameChangeBak[MAN_NAME_MAX_SIZE+1];
/* 名前入力カーソル位置 */
static int		inputNamePosition;
static int		inputNamePosX;
/* マシン回転用カウンタ */
static int		cfgNameMachineRotCount = 0;
/* エンドフラグ */
static int		cfgNameEndFlag;

/*******************************************************
	CONST
*******************************************************/
/* カーソル表示位置 */
static const short	sxCfgNameMCur[MAX_NUM_MACHINE_SEL] = {
	19, 86, 153, 220
};

/* マシンの並び順 */
static const int	machineNumConvTable[MAX_NUM_MACHINE_SEL] = {
	MACHINE_NUM_0, MACHINE_NUM_1, MACHINE_NUM_2, MACHINE_NUM_3
};

/* キーボード */
sDispKeyBoard mDispKeyBoardTable[MAX_NUM_CFGNAME_KEYBOARD] = {
/*    flag ATTRIB type x y x2 y2 str str2 */
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 1, 1, 0, 0, "A", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 3, 1, 0, 0, "B", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 3, 1, 0, 0, "C", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "D", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 3, 1, 0, 0, "E", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 3, 1, 0, 0, "F", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "G", 0 },
	
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "H", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 4, 1, 0, 0, "I", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 4, 1, 0, 0, "J", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "K", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 4, 1, 0, 0, "L", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 0, 1, 0, 0, "M", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "N", 0 },

	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "O", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 4, 1, 0, 0, "P", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 1, 1, 0, 0, "Q", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 3, 1, 0, 0, "R", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 4, 1, 0, 0, "S", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "T", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "U", 0 },
	
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 1, 1, 0, 0, "V", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 0, 1, 0, 0, "W", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "X", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "Y", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 2, 1, 0, 0, "Z", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 3, 2, 0, 0, "-", 0 },
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP), CFGNAME_KB_ATTRIB_LETTER,
	  FONT_TYPE_SELECT, 5, 1, 0, 0, ".", 0 },

#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP|CFGNAME_KB_FLAG_MESG|CFGNAME_KB_FLAG_DCOORD),
	  CFGNAME_KB_ATTRIB_BS, FONT_TYPE_SMALL, DISPLAY_X1 + SX_TURN8, DISPLAY_Y1 + 159,
	  DISPLAY_X1 + 67, DISPLAY_Y1 + 161, "", GMESG_TURN8 },
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* CLEAR DUMMY */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* CLEAR DUMMY */
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP|CFGNAME_KB_FLAG_MESG|CFGNAME_KB_FLAG_DCOORD),
	  CFGNAME_KB_ATTRIB_SP, FONT_TYPE_SMALL, DISPLAY_X1 + SX_SPACE8, DISPLAY_Y1 + 159,
	  DISPLAY_X1 + 84, DISPLAY_Y1 + 161, "", GMESG_SPACE8 },
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
#elif (SW_KN_LANGUAGE == KN_US)
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP|CFGNAME_KB_FLAG_MESG|CFGNAME_KB_FLAG_DCOORD),
	  CFGNAME_KB_ATTRIB_BS, FONT_TYPE_SMALL, DISPLAY_X1 + SX_TURN8, DISPLAY_Y1 + 159,
	  DISPLAY_X1 + 67, DISPLAY_Y1 + 161, "", GMESG_TURN8 },
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* CLEAR DUMMY */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* CLEAR DUMMY */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP|CFGNAME_KB_FLAG_MESG|CFGNAME_KB_FLAG_DCOORD),
	  CFGNAME_KB_ATTRIB_SP, FONT_TYPE_SMALL, DISPLAY_X1 + SX_SPACE8, DISPLAY_Y1 + 159,
	  DISPLAY_X1 + 84, DISPLAY_Y1 + 161, "", GMESG_SPACE8 },
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
#elif (SW_KN_LANGUAGE == KN_EU)
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP|CFGNAME_KB_FLAG_MESG|CFGNAME_KB_FLAG_DCOORD),
	  CFGNAME_KB_ATTRIB_BS, FONT_TYPE_SMALL, DISPLAY_X1 + SX_TURN8, DISPLAY_Y1 + 159,
	  DISPLAY_X1 + 67, DISPLAY_Y1 + 161, "", GMESG_TURN8 },
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* CLEAR DUMMY */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* CLEAR DUMMY */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP|CFGNAME_KB_FLAG_MESG|CFGNAME_KB_FLAG_DCOORD),
	  CFGNAME_KB_ATTRIB_SP, FONT_TYPE_SMALL, DISPLAY_X1 + SX_SPACE8, DISPLAY_Y1 + 159,
	  DISPLAY_X1 + 84, DISPLAY_Y1 + 161, "", GMESG_SPACE8 },
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
#endif

	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP|CFGNAME_KB_FLAG_MESG|CFGNAME_KB_FLAG_DCOORD),
	  CFGNAME_KB_ATTRIB_ORG, FONT_TYPE_SMALL, DISPLAY_X1 + SX_ORIGINAL8, DISPLAY_Y1 + 176,
	  0, 0, "", GMESG_ORIGINAL8 },
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
	{ (CFGNAME_KB_FLAG_EXIST|CFGNAME_KB_FLAG_DISP|CFGNAME_KB_FLAG_MESG|CFGNAME_KB_FLAG_DCOORD),
	  CFGNAME_KB_ATTRIB_END, FONT_TYPE_SMALL, DISPLAY_X1 + SX_END8, DISPLAY_Y1 + 176,
	  0, 0, "", GMESG_END8 },
	{ 0, 0, FONT_TYPE_SMALL, 0, 0, 0, 0, "", 0 },	/* NO EXIST */
};

/*******************************************************
	MACRO
*******************************************************/

/* ====================================================================== */
/*
	ネームチェンジ ムーブ
*/
void moveMainCfgName( void )
{
	register int	i;
	register uint font_code, letter_width;
	register float		eye_x, eye_z;
	Mtxf		mtxf_scale, mtxf_trans, mtxf_model;
	Mtx		mtx_scale, mtx_trans;

	/* はじめの一回 */
	if( gameModeChangeFlag ) {
		if( game_mode == GM_CFGNAME ) {
			gameModeSeq = GM_SEQ_CFGNAME_SEL_MACHINE;

#if (SW_KN_LANGUAGE == KN_EU)
			/* キーボードテーブルの書換え */
			if( euLanguage == EL_GERMAN ) {
				mDispKeyBoardTable[28].dx = DISPLAY_X1 + SX_TURN8_GE;		/* BACK SPACE */
				mDispKeyBoardTable[32].dx = DISPLAY_X1 + SX_SPACE8_GE;		/* SPACE */
				mDispKeyBoardTable[35].dx = DISPLAY_X1 + SX_ORIGINAL8_GE;	/* ORIGINAL */
				mDispKeyBoardTable[40].dx = DISPLAY_X1 + SX_END8_GE;		/* END */
			}
#endif
		}
	}

	if( gameModeSeq == GM_SEQ_CFGNAME_SEL_MACHINE ) {
		/* ネームのコピー */
		copyStr( mMachine[0][machineNumConvTable[cfgNameSelMachineNum]].manName,
				 strNameChange, MAN_NAME_MAX_SIZE+1 );
		hover[my_hover].boat_number = machineNumConvTable[cfgNameSelMachineNum];
		hover[my_hover].performance_handling = (int)mMachineOrg[hover[my_hover].boat_number].perf[0];
		hover[my_hover].performance_gear     = (int)mMachineOrg[hover[my_hover].boat_number].perf[1];
		hover[my_hover].performance_grip     = (int)mMachineOrg[hover[my_hover].boat_number].perf[2];
	}
	/* マシンカーソルの色決定 */
	if( cfgNameMCurPat == 0 ) {
		cfgNameMCurColor = (uint)( 255.0f * (float)cfgNameMCurCount
								   / (float)CFGNAME_MCUR_FLASH_COUNT );
	}
	else {
		cfgNameMCurColor = (uint)( 255.0f
								* ((float)CFGNAME_MCUR_FLASH_COUNT - (float)cfgNameMCurCount)
								/ (float)CFGNAME_MCUR_FLASH_COUNT );
	}
	cfgNameMCurCount ++;
	if( cfgNameMCurCount >= CFGNAME_MCUR_FLASH_COUNT ) {
		cfgNameMCurCount  = 0;
		cfgNameMCurPat ^= 1;
	}		

	/* カーソル座標の計算 */
	for( i = 0, inputNamePosX = 0 ; i < inputNamePosition ; i ++ ) {
		font_code = codeConvAsc2Font( FONT_TYPE_SELECT, strNameChange[i] );
		if( font_code == FONT_CODE_SPACE ) letter_width = FONT_SPACE_WD_SELECT;
		else letter_width = (int)fontWidthSelect[font_code];
		inputNamePosX += letter_width;		
	}

	/* マシンの行列 計算 */
	make_SCRmatrix( &(pKnDynamic->mtxMachineProj), &perspNorm,
					33.0f, 1.0f, 16.0f, 4096.0f, 0.0f, 0.0f ) ;
	make_ROTSmatrix( &(mtx_scale),
				0.0f, 0.0f, 1.0f,
				0.0f, 1.0f, 0.0f,
				0.0f, 0.0f, 0.0f, 0.07f ) ;

	for( i = 0 ; i < MAX_NUM_MACHINE_SEL ; i ++ ) {
		if( i == cfgNameSelMachineNum ) {
			eye_x = 500.0f * COSF( (cfgNameMachineRotCount % SIN_RANGE) );
			eye_z = 500.0f * SINF( (cfgNameMachineRotCount % SIN_RANGE) );
		}
		else {
			eye_x = 500.0f * COSF( MACHINE_CAMERA_INIT_ANGLE );
			eye_z = 500.0f * SINF( MACHINE_CAMERA_INIT_ANGLE );
		}
		make_LOOKmatrix( &mtx_trans, &mtxf_trans,
						eye_x, 500.0f, eye_z,						 
						0.0f, 0.0f, 0.0f,
				 		0.0f, 1.0f, 0.0f );
		mtx2mtxf( &(mtx_scale), &(mtxf_scale) );
		mult_mtxf( &(mtxf_trans), &(mtxf_scale), &mtxf_model );
		mtxf2mtx( &(mtxf_model), &(pKnDynamic->mtxMachineModel[i]) );
	}
	cfgNameMachineRotCount += 48;
	if( cfgNameMachineRotCount >= SIN_RANGE ) cfgNameMachineRotCount -= SIN_RANGE;
} 

/* ====================================================================== */
/*
	ネームチェンジ メイン
*/
Gfx *makeMainGlistCfgName( Gfx *gp )
{
	if( gameModeChangeFlag ) {
		gameModeChangeFlag = 0;
		if( game_mode == GM_CFGNAME ) {
			gp = clearAllFBuffer( gp );
			return( gp );
		}
	}

	/* ディスプレイリストの作成 */
	player_index = 0;
	gDPPipeSync( gp++ );
	gDPSetScissor( gp++, G_SC_NON_INTERLACE, DISPLAY_X1, DISPLAY_Y1, DISPLAY_X2, DISPLAY_Y2 );
	gSPMatrix( gp++, &(rspKnDynamic.mtxFontProj),
			   G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
	gSPMatrix( gp++, &automatic.e_MT,
			   G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
	gSPDisplayList( gp++, dlConfigBG );
	gp = makeMainGlistRaceSub( gp );
	gDPPipeSync( gp++ );
	gDPSetScissor( gp++, G_SC_NON_INTERLACE, DISPLAY_X1, DISPLAY_Y1, DISPLAY_X2, DISPLAY_Y2 );
	gp = makeCfgNameGlist( gp );

	gSPDisplayList( gp++, dlCfgNameClearCvg );

	/* ゲームモードの変更 */
	if( game_mode == GM_CFGNAME ) changeGameModeCfgName();
	else {
		if ( mMask.flag == MASK_FLAG_END ) {
			EepWriteDataMachine();
			initMainGlistConfig();
		}		
	}

	return( gp );
}

/* ====================================================================== */
/*
	ゲームモードの変更
*/
static void changeGameModeCfgName( void )
{
	register int	i, letter_num, se_flag;
	register char	*name_p;

	se_flag = 0;
	/* 決定ボタン */
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		switch( gameModeSeq ) {
			case GM_SEQ_CFGNAME_SEL_MACHINE:
				se_flag = 1;
				gameModeSeq = GM_SEQ_CFGNAME_INPUT_NAME;
				selLetterX = selLetterY = 0;
				cfgNameCLR();
				break;
			case GM_SEQ_CFGNAME_INPUT_NAME:
				se_flag = 1;
				cfgNameEndFlag = 0;
				if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_NAME ) cfgNameInputName();
				else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_NAME_END ) cfgNameEnd();
				if( cfgNameEndFlag ) initMainGlistCfgName2Next();
				break;
		}
		#if SOUND_SW
		if( se_flag ) Na_SystemSound( NA_SYS_DECIDE, 0 );
		#endif
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		switch( gameModeSeq ) {
			case GM_SEQ_CFGNAME_SEL_MACHINE:
				se_flag = 1;
				initMainGlistCfgName2Next();
				break;
			case GM_SEQ_CFGNAME_INPUT_NAME:
				se_flag = 1;
				cfgNameBS();
				break;
		}
		#if SOUND_SW
		if( se_flag ) Na_SystemSound( NA_SYS_CANCEL, 0 );
		#endif
	}
	/* 上ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_UP ) {
		switch( gameModeSeq ) {
			case GM_SEQ_CFGNAME_INPUT_NAME:
				se_flag = 1;
				selLetterYBak = selLetterY;
				selLetterY --;
				if( selLetterY < 0 ) selLetterY = MAX_NUM_CFGNAME_KEYBOARD_Y - 1;
				while( 1 ) {
					letter_num = selLetterY * MAX_NUM_CFGNAME_KEYBOARD_X + selLetterX;
					if( mDispKeyBoardTable[letter_num].flag & CFGNAME_KB_FLAG_EXIST ) break;
					else selLetterX --;
				}
				if( selLetterYBak == 4 && selLetterY == 3 && selLetterXBak != -1 ) {
					selLetterX = selLetterXBak;
					selLetterXBak = -1;
				}
				break;
		}
		/* SE */
		#if SOUND_SW
		if( se_flag ) Na_SystemSound( NA_SYS_CURMOVE, 0 );
		#endif
	}
	/* 下ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_DOWN ) {
		switch( gameModeSeq ) {
			case GM_SEQ_CFGNAME_INPUT_NAME:
				se_flag = 1;
				selLetterYBak = selLetterY;
				selLetterY ++;
				if( selLetterY >= MAX_NUM_CFGNAME_KEYBOARD_Y ) selLetterY = 0;
				if( selLetterYBak == 3 && selLetterY == 4 ) selLetterXBak = selLetterX;
				while( 1 ) {
					letter_num = selLetterY * MAX_NUM_CFGNAME_KEYBOARD_X + selLetterX;
					if( mDispKeyBoardTable[letter_num].flag & CFGNAME_KB_FLAG_EXIST ) break;
					else {
						if( selLetterY == 5 ) selLetterX ++;
						else selLetterX --;
					}
				}
				break;
		}
		/* SE */
		#if SOUND_SW
		if( se_flag ) Na_SystemSound( NA_SYS_CURMOVE, 0 );
		#endif
	}
	/* 左ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		switch( gameModeSeq ) {
			case GM_SEQ_CFGNAME_SEL_MACHINE:
				se_flag = 1;
				cfgNameSelMachineNum --;
				if( cfgNameSelMachineNum < 0 ) cfgNameSelMachineNum = MAX_NUM_MACHINE_SEL - 1;
				cfgNameMachineRotCount = MACHINE_CAMERA_INIT_ANGLE;
				break;
			case GM_SEQ_CFGNAME_INPUT_NAME:
				se_flag = 1;
				selLetterXBak = -1;
				while( 1 ) {
					selLetterX --;
					if( selLetterX < 0 ) selLetterX = MAX_NUM_CFGNAME_KEYBOARD_X - 1;
					letter_num = selLetterY * MAX_NUM_CFGNAME_KEYBOARD_X + selLetterX;
					if( mDispKeyBoardTable[letter_num].flag & CFGNAME_KB_FLAG_EXIST ) break;
				}
				break;
		}
		/* SE */
		#if SOUND_SW
		if( se_flag ) Na_SystemSound( NA_SYS_CURMOVE, 0 );
		#endif
	}
	/* 右ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		switch( gameModeSeq ) {
			case GM_SEQ_CFGNAME_SEL_MACHINE:
				se_flag = 1;
				cfgNameSelMachineNum ++;
				if( cfgNameSelMachineNum >= MAX_NUM_MACHINE_SEL ) cfgNameSelMachineNum = 0;
				cfgNameMachineRotCount = MACHINE_CAMERA_INIT_ANGLE;
				break;
			case GM_SEQ_CFGNAME_INPUT_NAME:
				se_flag = 1;
				selLetterXBak = -1;
				while( 1 ) {
					selLetterX ++;
					if( selLetterX >= MAX_NUM_CFGNAME_KEYBOARD_X ) selLetterX = 0;
					letter_num = selLetterY * MAX_NUM_CFGNAME_KEYBOARD_X + selLetterX;
					if( mDispKeyBoardTable[letter_num].flag & CFGNAME_KB_FLAG_EXIST ) break;
				}
				break;
		}
		/* SE */
		#if SOUND_SW
		if( se_flag ) Na_SystemSound( NA_SYS_CURMOVE, 0 );
		#endif
	}

	/* デバッグ用バッファ 表示 */
	#if 0
	osSyncPrintf( "Cursor = %d\n", inputNamePosition );
	osSyncPrintf( "------------------\n" );
	for( i = 0 ; i < MAN_NAME_MAX_SIZE+1; i ++ ) {
		if( strNameChange[i] ) osSyncPrintf( "buf[%d] = %c\n", i, strNameChange[i] );
		else osSyncPrintf( "buf[%d] = END_CODE\n", i );
	}
	#endif
}

/* ====================================================================== */
/*
	ネームチェンジ 表示
*/
static Gfx	*makeCfgNameGlist( Gfx *gp )
{
	register uint			font_flag;
	register int			i, x, y, posx, posy, letter_num, dx_rename;
	register sDispKeyBoard	*kb_p;
	
	gSPDisplayList( gp++, dlCfgNameBG );
	/* --- 枠 --- */
	gSPDisplayList( gp++, dlInitWaku );
	gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + 19, DISPLAY_Y1 +  2, 265, 23 );
	gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + 19, DISPLAY_Y1 + 76, 130, 16 );
	gp = makeWakuGlist( gp, WAKU_KIND_64x32,
			    DISPLAY_X1 + SX_WAKU_BS, DISPLAY_Y1 + 156, WD_WAKU_BS, 14 );
	gp = makeWakuGlist( gp, WAKU_KIND_256x32,
						DISPLAY_X1 + SX_WAKU_SP, DISPLAY_Y1 + 156, 50, 14 );
	gp = makeWakuGlist( gp, WAKU_KIND_64x32,
			    DISPLAY_X1 + 25, DISPLAY_Y1 + 97 + 15 * 5, 17*3+16, 14 );
	gp = makeWakuGlist( gp, WAKU_KIND_64x32,
			    DISPLAY_X1 + 25+17*5, DISPLAY_Y1 + 97 + 15 * 5, 17+16, 14 );
	gSPDisplayList( gp++, dlCfgNameLoadWaku );

	/* ジェット表示 */
    gSPPerspNormalize( gp++, perspNorm );
    gSPMatrix( gp++, &rspKnDynamic.mtxMachineProj,
    		G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
	gSPDisplayList( gp++, dlInitMachineModel );

	gSPDisplayList( gp++, dlCfgNameSetMachineView0 );
    gSPMatrix( gp++, &rspKnDynamic.mtxMachineModel[0],
			G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
	gp = makeKnJetGlist( gp, MACHINE_NUM_0,BASEPOSE_AN,0, &pKnDynamic->mtxMachine[0][0] );

	gSPDisplayList( gp++, dlCfgNameSetMachineView1 );
    gSPMatrix( gp++, &rspKnDynamic.mtxMachineModel[1],
			G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
	gp = makeKnJetGlist( gp, MACHINE_NUM_1,BASEPOSE_AN,0, &pKnDynamic->mtxMachine[1][0] );

	gSPDisplayList( gp++, dlCfgNameSetMachineView2 );
    gSPMatrix( gp++, &rspKnDynamic.mtxMachineModel[2],
			G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
	gp = makeKnJetGlist( gp, MACHINE_NUM_2,BASEPOSE_AN,0, &pKnDynamic->mtxMachine[2][0] );

	gSPDisplayList( gp++, dlCfgNameSetMachineView3 );
    gSPMatrix( gp++, &rspKnDynamic.mtxMachineModel[3],
			G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
	gp = makeKnJetGlist( gp, MACHINE_NUM_3,BASEPOSE_AN,0, &pKnDynamic->mtxMachine[3][0] );

	
	/* マシンカーソル */
	gSPDisplayList( gp++, dlCfgNameLoadMCur );
	gDPSetPrimColor( gp++, 0, 0, cfgNameMCurColor, 255, cfgNameMCurColor, 255 );
	gSPTextureRectangle( gp++,
		(DISPLAY_X1 + (uint)sxCfgNameMCur[cfgNameSelMachineNum]) << 2,
		(DISPLAY_Y1 + 28) << 2,
		(DISPLAY_X1 + (uint)sxCfgNameMCur[cfgNameSelMachineNum] + 63) << 2,
		(DISPLAY_Y1 + 28 + 40) << 2,
		G_TX_RENDERTILE,
		0, 0,
		1 << 10, 1 << 10 );
	
	/* --- 文字表示 --- */
	gp = makeInitStrGlist( gp, FONT_FLAG_NORMAL,
						   255,255,255, 255,255,255, 255,255,255, 255,255,255 );
#if (SW_KN_LANGUAGE == KN_EU)
	if( euLanguage == EL_ENGLISH ) dx_rename = SX_RENAME18;
	else dx_rename = SX_RENAME18_GE;
#else
	dx_rename = SX_RENAME18;
#endif
	gp = makeGameMessageGlist( gp, GMESG_KIND_18, GMESG_RENAME18,
			   DISPLAY_X1 + dx_rename, DISPLAY_Y1 + 4, 0, 0 );
	/* 名前表示 */
	gp = makeStrGlistSub( gp, FONT_TYPE_SMALL, mMachine[0][machineNumConvTable[cfgNameSelMachineNum]].manName,
					   DISPLAY_X1 + 172, DISPLAY_Y1 + 183 );
	/* 名前	*/
	gp = makeStrGlistSub( gp, FONT_TYPE_SELECT, strNameChange, DISPLAY_X1 + 23, DISPLAY_Y1 + 78 );

	/* キーボード表示 */
	for( i = 0, kb_p = mDispKeyBoardTable ; i < MAX_NUM_CFGNAME_KEYBOARD ; i++, kb_p++ ) {
		if( !(kb_p->flag & CFGNAME_KB_FLAG_DISP) ) continue;

		if( gameModeSeq == GM_SEQ_CFGNAME_INPUT_NAME ) {
			letter_num = selLetterY * MAX_NUM_CFGNAME_KEYBOARD_X + selLetterX;
			if( i == letter_num ) continue;
		}
		
		if( kb_p->flag & CFGNAME_KB_FLAG_DCOORD ) {
			posx = (int)kb_p->dx;
			posy = (int)kb_p->dy;
		}
		else {
			x = DISPLAY_X1 + 25 + 17 * (i % MAX_NUM_CFGNAME_KEYBOARD_X);
			y = DISPLAY_Y1 + 96 + 15 * (i / MAX_NUM_CFGNAME_KEYBOARD_X);
			posx = x + (int)kb_p->dx;
			posy = y + (int)kb_p->dy;
		}

		if( kb_p->flag & CFGNAME_KB_FLAG_MESG ) {
			gp = makeGameMessageGlist( gp, GMESG_KIND_8, kb_p->gmesgNum, posx, posy, 0, 0 );
		}
		else {
			gp = makeStrGlistSub( gp, kb_p->fontType, kb_p->strLetter, posx, posy );
		}
	}

	gp = makeInitStrGlist( gp, FONT_FLAG_FLASH_3, 255,255,255, 255,255,255, 255,255,255, 255,255,255 );
	if( gameModeSeq == GM_SEQ_CFGNAME_INPUT_NAME ) {
		letter_num = selLetterY * MAX_NUM_CFGNAME_KEYBOARD_X + selLetterX;
		kb_p = &mDispKeyBoardTable[letter_num];
		if( kb_p->flag & CFGNAME_KB_FLAG_DCOORD ) {
			posx = (int)kb_p->dx;
			posy = (int)kb_p->dy;
		}
		else {
			x = DISPLAY_X1 + 25 + 17 * (letter_num % MAX_NUM_CFGNAME_KEYBOARD_X);
			y = DISPLAY_Y1 + 96 + 15 * (letter_num / MAX_NUM_CFGNAME_KEYBOARD_X);
			posx = x + (int)kb_p->dx;
			posy = y + (int)kb_p->dy;
		}

		if( kb_p->flag & CFGNAME_KB_FLAG_MESG ) {
			gp = makeGameMessageGlist( gp, GMESG_KIND_8, kb_p->gmesgNum, posx, posy, 0, 0 );
		}
		else {
			gp = makeStrGlistSub( gp, kb_p->fontType, kb_p->strLetter, posx, posy );
		}
	}
	/* 文字入力カーソル */
	if( gameModeSeq == GM_SEQ_CFGNAME_INPUT_NAME ) {
		gp = makeStrGlistSub( gp, FONT_TYPE_SELECT, "|",
						  DISPLAY_X1 + 23 + inputNamePosX, DISPLAY_Y1 + 78 );
	}
	
	return( gp );
}

/* ====================================================================== */
/*
	名前入力
*/
static void cfgNameInputName( void )
{
	register int			i, f;
	register int			letter_num, name_dot_length;
	register char			*dst;
	register sDispKeyBoard	*kb_p;

	letter_num = selLetterY * MAX_NUM_CFGNAME_KEYBOARD_X + selLetterX;
	kb_p = &mDispKeyBoardTable[letter_num];

	switch( kb_p->attrib ) {
		case CFGNAME_KB_ATTRIB_LETTER:
		case CFGNAME_KB_ATTRIB_SP:
			f = 1;
			if( getStrLength( strNameChange ) >= MAN_NAME_MAX_SIZE ) f = 0;
			else if( calcStrDotWidth( strNameChange, FONT_TYPE_SELECT )
					 > MAX_DOT_WIDTH_INPUT_NAME - FONT_MIN_WD_SELECT ) f = 0;
			if( f ) {
				copyStr( strNameChange, strNameChangeBak, MAN_NAME_MAX_SIZE+1 );
				for( i = inputNamePosition+1 ; i < MAN_NAME_MAX_SIZE+1 ; i ++ ) {
					strNameChange[i] = strNameChangeBak[i-1];
				}
				dst = &strNameChange[inputNamePosition];
				if( kb_p->attrib == CFGNAME_KB_ATTRIB_SP ) *dst = ' ';
				else *dst = kb_p->strLetter[0];
				/* ドット幅チェック */
				name_dot_length = calcStrDotWidth( strNameChange, FONT_TYPE_SELECT );
				if( name_dot_length > MAX_DOT_WIDTH_INPUT_NAME ) {
					/* 文字オーバー */
					copyStr( strNameChangeBak, strNameChange, MAN_NAME_MAX_SIZE+1 );
				}
				else {
					if( strNameChangeBak[inputNamePosition] == '\0' ) {
						inputNamePosition ++;
					}
				}
			}
			break;
		case CFGNAME_KB_ATTRIB_CLEAR:
			cfgNameCLR();
			break;
		case CFGNAME_KB_ATTRIB_BS:
			cfgNameBS();
			break;
		case CFGNAME_KB_ATTRIB_RIGHT:
			if( strNameChange[inputNamePosition] ) {
				if( inputNamePosition < MAN_NAME_MAX_SIZE ) {
					inputNamePosition ++;
				}
			}
			break;
		case CFGNAME_KB_ATTRIB_LEFT:
			if( inputNamePosition > 0 ) inputNamePosition --;
			break;
		case CFGNAME_KB_ATTRIB_ORG:
			copyOrgManName( mMachineOrg[machineNumConvTable[cfgNameSelMachineNum]].manName );
			break;
		case CFGNAME_KB_ATTRIB_END:
			cfgNameEnd();
			break;
	}
}

/* CLR */
void cfgNameCLR( void )
{
	register int	i;
	register char	*dst;
	
	inputNamePosition = 0;
	for( i = 0, dst = strNameChange ; i < MAN_NAME_MAX_SIZE+1 ; i ++, dst ++ ) *dst = '\0';
}

/* BS */
void cfgNameBS( void )
{
	register char			*src, *dst;

	if( inputNamePosition > 0 ) {
		src = &strNameChange[inputNamePosition];
		inputNamePosition --;
		dst = &strNameChange[inputNamePosition];
		while( *src ) {
			*dst ++ = *src ++;
		}
		*dst = '\0';
	}
}

/* End */
void cfgNameEnd( void )
{
	if( strNameChange[0] != '\0' ) {
		copyStr( strNameChange, mMachine[0][machineNumConvTable[cfgNameSelMachineNum]].manName,
				 MAN_NAME_MAX_SIZE+1 );
	}
	cfgNameEndFlag = 1;
	
}

/* ====================================================================== */
/*
	オリジナルネームのコピー
*/
static void copyOrgManName( char *src_name )
{
	copyStr( src_name, strNameChange, MAN_NAME_MAX_SIZE+1 );
	inputNamePosition = getStrLength( strNameChange );
	if( inputNamePosition >= MAN_NAME_MAX_SIZE - 1 ) {
		inputNamePosition = MAN_NAME_MAX_SIZE - 1;
	}
}
/* ====================================================================== */
static int calcStrDotWidth( char *str, uint font_type )
{
	register int	letter_width, str_width;
	register uint	font_code;
	register char	*str_p;

	str_width = 0;
	str_p = str;
	while( *str_p ) {
		font_code = codeConvAsc2Font( font_type, *str_p );
		if( font_code == FONT_CODE_SPACE ) letter_width = FONT_SPACE_WD_SELECT;
		else letter_width = (int)fontWidthSelect[font_code];
		str_width += letter_width;
		str_p ++;
	}
	
	return( str_width );
}

/* ====================================================================== */
/*
	ネームチェンジ 初期化
*/
static void initMainGlistCfgName2Next( void )
{
	/* ゲームモード */
	gameModeOld = game_mode;
	gameModeNext = 0;
	game_mode = GM_CFGNAME2NEXT;
	game_stat = GAME_STAT_CFGNAME;
	gameModeChangeFlag = 1;
	gameModeSeq = 0;
	gameModeCount = 0;
	vram_mode = VM_NORMAL;
	Graph_timing_req = GRAPH_TIMING_CFGNAME;

	/* プレイヤー制御変数 */

	/* ホバー制御フラグ */
	/* 海制御フラグ */
	/* シグナル制御 */

	/* 初期化関数 */
	initMoveMask( MASK_MODE_FADE_OUT, MASK_FADE_OUT_COUNT, 0 );

	/* 記録画面用カメラ */

	/* ＢＧＭ */
}
/* ====================================================================== */
/*
	文字列コピー
*/
static void copyStr( char *src, char *dst, int nbyte )
{
	register int	i;
	
	for( i = 0 ; i < nbyte ; i ++ ) *dst++ = *src++;
}

