/*
	ゲーム内メッセージ
*/
#include "ot_header.h"
#include "ot_newton.h"
#include "ot_sub.h"
#include "ot_hover.h"
#include "endefine.h"
#include "enchkcrs.h"
#include "sot_world.h"

#include "kn_def.h"
#include "kn_main.h"
#include "kn_dynamic.h"
#include "kn_gword.h"
#include "kn_font.h"
#include "kn_title.h"

/* ================================================= */
/* プロトタイプ宣言 */
void 	moveGWord( void );
Gfx 	*makeGWordGlist( Gfx *gp );
void	initGWord( ushort kind, ushort flag );
int	checkGWordBuf( void );

void	moveGWordFinish( sGWord *gwp );
void	moveGWordGoal( sGWord *gwp );
void	moveGWordCube( sGWord *gwp );
void	moveGWordRetire( sGWord *gwp );

/* ================================================= */
/* 変数 */
extern Gfx	dlInitShade[], dlInitFont[], dlDrawCube[], dlDrawCube2[];
extern Gfx	dlInitResultBG[];
extern uint texFinish[], texGoal[], texNewRecord[];
extern uint texRetire[], texTimeUp[];
extern int	syTitleMenu;

/* メッセージ用バッファ */
sGWord	mGWord[MAX_NUM_GWORD];

/* バッファクリア */
sGWord mGWordClear = {
	GWORD_KIND_NOUSE,		/* ushort kind */
	GWORD_NOUSE_STAT_INIT,	/* ushort stat */
	0,						/* ushort number */
	0,						/* ushort disp */
	0, 0,					/* int x y */
	0.0, 0.0,				/* float vx vy */
	0, 0, 0, 0,				/* uint count0 count1 count2 count3 */
	0						/* int flag */
};

/* ================================================= */
/*
	ポーズ中のキューブのｘ座標
*/
#if (SW_KN_LANGUAGE == KN_EU)
/* 文字とキューブの間隔 */
#define DX_PAUSE_CUBE	14
/* for English */
#define SX_CONTINUE		128
#define WD_CONTINUE		64
#define SX_RETIRE		136
#define WD_RETIRE		48
#define SX_RESTART_C	104
#define WD_RESTART_C	112
#define SX_EXIT			124
#define WD_EXIT			72
#define SX_START_R		104
#define WD_START_R		112
#define SX_RESTART		128
#define WD_RESTART		64
#define SX_MACHINE_SEL	88
#define WD_MACHINE_SEL	144
#define SX_COURSE_SEL	108
#define WD_COURSE_SEL	104
/* for German */
#define SX_CONTINUE_GE		140
#define WD_CONTINUE_GE		40
#define SX_RETIRE_GE		132
#define WD_RETIRE_GE		56
#define SX_RESTART_C_GE		76
#define WD_RESTART_C_GE		168
#define SX_EXIT_GE			132
#define WD_EXIT_GE			56
#define SX_START_R_GE		112
#define WD_START_R_GE		96
#define SX_RESTART_GE		132
#define WD_RESTART_GE		56
#define SX_MACHINE_SEL_GE	104
#define WD_MACHINE_SEL_GE	112
#define SX_COURSE_SEL_GE	124
#define WD_COURSE_SEL_GE	72

sCubeXPos mCubeXPosDefault[] = {
	{ SX_CONTINUE-DX_PAUSE_CUBE, SX_CONTINUE+WD_CONTINUE+DX_PAUSE_CUBE,
	  SX_CONTINUE_GE-DX_PAUSE_CUBE, SX_CONTINUE_GE+WD_CONTINUE_GE+DX_PAUSE_CUBE }, /* CONTINUE */
	{ SX_RETIRE-DX_PAUSE_CUBE, SX_RETIRE+WD_RETIRE+DX_PAUSE_CUBE,
	  SX_RETIRE_GE-DX_PAUSE_CUBE, SX_RETIRE_GE+WD_RETIRE_GE+DX_PAUSE_CUBE-2 },	/* RETIRE */
};
sCubeXPos mCubeXPosTour[] = {
	{ SX_CONTINUE-DX_PAUSE_CUBE, SX_CONTINUE+WD_CONTINUE+DX_PAUSE_CUBE,
	  SX_CONTINUE_GE-DX_PAUSE_CUBE, SX_CONTINUE_GE+WD_CONTINUE_GE+DX_PAUSE_CUBE },	/* CONTINUE */
	{ SX_RETIRE-DX_PAUSE_CUBE, SX_RETIRE+WD_RETIRE+DX_PAUSE_CUBE,
	  SX_RETIRE_GE-DX_PAUSE_CUBE, SX_RETIRE_GE+WD_RETIRE_GE+DX_PAUSE_CUBE-4 },	/* RETIRE */
	{ SX_RESTART_C-DX_PAUSE_CUBE, SX_RESTART_C+WD_RESTART_C+DX_PAUSE_CUBE,
	  SX_RESTART_C_GE-DX_PAUSE_CUBE, SX_RESTART_C_GE+WD_RESTART_C_GE+DX_PAUSE_CUBE },	/* RESTART CIRCUIT */
	{ SX_EXIT-DX_PAUSE_CUBE, SX_EXIT+WD_EXIT+DX_PAUSE_CUBE,
	  SX_EXIT_GE-DX_PAUSE_CUBE, SX_EXIT_GE+WD_EXIT_GE+DX_PAUSE_CUBE-2 },	/* EXIT */
};
sCubeXPos mCubeXPosPark[] = {
	{ SX_CONTINUE-DX_PAUSE_CUBE, SX_CONTINUE+WD_CONTINUE+DX_PAUSE_CUBE,
	  SX_CONTINUE_GE-DX_PAUSE_CUBE, SX_CONTINUE_GE+WD_CONTINUE_GE+DX_PAUSE_CUBE },	/* CONTINUE */
	{ SX_START_R-DX_PAUSE_CUBE, SX_START_R+WD_START_R+DX_PAUSE_CUBE,
	  SX_START_R_GE-DX_PAUSE_CUBE, SX_START_R_GE+WD_START_R_GE+DX_PAUSE_CUBE },	/* START RACE */
	{ SX_EXIT-DX_PAUSE_CUBE, SX_EXIT+WD_EXIT+DX_PAUSE_CUBE,
	  SX_EXIT_GE-DX_PAUSE_CUBE, SX_EXIT_GE+WD_EXIT_GE+DX_PAUSE_CUBE },	/* EXIT */
};
sCubeXPos mCubeXPosAttack[] = {
	{ SX_CONTINUE-DX_PAUSE_CUBE, SX_CONTINUE+WD_CONTINUE+DX_PAUSE_CUBE,
	  SX_CONTINUE_GE-DX_PAUSE_CUBE, SX_CONTINUE_GE+WD_CONTINUE_GE+DX_PAUSE_CUBE },	/* CONTINUE */
	{ SX_RESTART-DX_PAUSE_CUBE, SX_RESTART+WD_RESTART+DX_PAUSE_CUBE,
	  SX_RESTART_GE-DX_PAUSE_CUBE, SX_RESTART_GE+WD_RESTART_GE+DX_PAUSE_CUBE },	/* RESTART */
	{ SX_MACHINE_SEL-DX_PAUSE_CUBE, SX_MACHINE_SEL+WD_MACHINE_SEL+DX_PAUSE_CUBE,
	  SX_MACHINE_SEL_GE-DX_PAUSE_CUBE, SX_MACHINE_SEL_GE+WD_MACHINE_SEL_GE+DX_PAUSE_CUBE },	/* MACHINE SELECT */
	{ SX_COURSE_SEL-DX_PAUSE_CUBE, SX_COURSE_SEL+WD_COURSE_SEL+DX_PAUSE_CUBE,
	  SX_COURSE_SEL_GE-DX_PAUSE_CUBE,SX_COURSE_SEL_GE+WD_COURSE_SEL_GE+DX_PAUSE_CUBE  },	/* COURSE SELECT */
	{ SX_EXIT-DX_PAUSE_CUBE, SX_EXIT+WD_EXIT+DX_PAUSE_CUBE,
	  SX_EXIT_GE-DX_PAUSE_CUBE, SX_EXIT_GE+WD_EXIT_GE+DX_PAUSE_CUBE-2 },	/* EXIT */
};
#endif

/* ================================================= */
/*
	メイン
*/
void moveGWord( void )
{
	register int	i;
	register sGWord	*gwp;

	for( i = 0 ; i < MAX_NUM_GWORD ; i ++ ) {
		gwp = &mGWord[i];

		switch( gwp->kind ) {
			case GWORD_KIND_FINISH:
				gwp->disp = 1;
				moveGWordFinish( gwp );
				break;
			case GWORD_KIND_GOAL:
				gwp->disp = 1;
				moveGWordGoal( gwp );
				break;
			case GWORD_KIND_CUBE:
				gwp->disp = 1;
				moveGWordCube( gwp );
				break;
			case GWORD_KIND_RETIRE:
				gwp->disp = 1;
				moveGWordRetire( gwp );
				break;
		}
	}
}

/* ================================================= */
/*
	ディスプレイリストの作成
*/
Gfx *makeGWordGlist( Gfx *gp )
{
	register int	i, j, f, dx;
	register uint	ht, wd;
	register uint	*tex_p;
	register sGWord	*gwp;

	for( i = 0 ; i < MAX_NUM_GWORD ; i ++ ) {
		gwp = &mGWord[i];

		if( gwp->disp == 0 ) continue;
		switch( gwp->kind ) {
			case GWORD_KIND_FINISH:
				if( gwp->stat == GWORD_FINISH_STAT_STOP ) {
					gSPDisplayList( gp++, dlInitFont );
				}
				else {
					gSPDisplayList( gp++, dlInitShade );
					gDPSetCombineMode( gp++, G_CC_DECALRGBA, G_CC_DECALRGBA );
					gSPMatrix( gp++, &(rspKnDynamic.mtxFontProj),
							   G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
					gSPMatrix( gp++, &(rspKnDynamic.mtxGWordModel[gwp->number]),
							   G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
				}
				for( j = 0 ; j < 8 ; j ++ ) {
					gDPLoadTextureTile( gp++, (uint)(texFinish + 160 * 5 * j),
						G_IM_FMT_RGBA, G_IM_SIZ_32b,
						160, 5,
						0, 0,
						159, 4,
						0,
						G_TX_CLAMP, G_TX_CLAMP,
						G_TX_NOMASK, G_TX_NOMASK,
						G_TX_NOLOD, G_TX_NOLOD );
					if( gwp->stat == GWORD_FINISH_STAT_STOP ) {
						gSPTextureRectangle( gp++,
							(gwp->x) << 2      , (gwp->y + 5 * j) << 2,
							(gwp->x + 160) << 2, (gwp->y + 5 * j + 5) << 2,
							G_TX_RENDERTILE,
							0, 0,
							1 << 10, 1 << 10 );
					}
					else {
						gp = makeFontVtxGlist( gp, 160, 6, (uint)0, (uint)(5 * j),
											   255, 255, 255,
											   255, 255, 255,
											   255, 255, 255,
											   255, 255, 255, 1.0f );
					}
				}
				break;
			case GWORD_KIND_GOAL:
				if( gwp->stat == GWORD_GOAL_STAT_STOP ) {
					gSPDisplayList( gp++, dlInitFont );
				}
				else {
					gSPDisplayList( gp++, dlInitShade );
					gDPSetCombineMode( gp++, G_CC_DECALRGBA, G_CC_DECALRGBA );
					gSPMatrix( gp++, &(rspKnDynamic.mtxFontProj),
							   G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
					gSPMatrix( gp++, &(rspKnDynamic.mtxGWordModel[gwp->number]),
							   G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
				}
				if( gwp->flag ) {
					for( j = 0 ; j < 6 ; j ++ ) {
						gDPLoadTextureTile( gp++, (uint)(texNewRecord + 204 * 5 * j ),
							G_IM_FMT_RGBA, G_IM_SIZ_32b,
							204, 5,
							0, 0,
							203, 4,
							0,
							G_TX_CLAMP, G_TX_CLAMP,
							G_TX_NOMASK, G_TX_NOMASK,
							G_TX_NOLOD, G_TX_NOLOD );
						if( gwp->stat == GWORD_GOAL_STAT_STOP ) {
							gSPTextureRectangle( gp++,
								(gwp->x) << 2      , (gwp->y + 5 * j) << 2,
								(gwp->x + 204) << 2, (gwp->y + 5 * j + 5) << 2,
								G_TX_RENDERTILE,
								0, 0,
								1 << 10, 1 << 10 );
						}
						else {
							if( j == 5 ) ht = 4;
							else ht = 6;
							gp = makeFontVtxGlist( gp, 204, ht, (uint)0, (uint)(5 * j),
											   255, 255, 255,
											   255, 255, 255,
											   255, 255, 255,
											   255, 255, 255, 1.0f );
						}
					}
				}
				else {
					for( j = 0 ; j < 20 ; j ++ ) {
						gDPLoadTextureTile( gp++, (uint)(texGoal
							+ 80 * 40 * chkcrs[my_hover].rank + 80 * 2 * j ),
							G_IM_FMT_RGBA, G_IM_SIZ_32b,
							80, 40,
							0, 0,
							79, 2,
							0,
							G_TX_CLAMP, G_TX_CLAMP,
							G_TX_NOMASK, G_TX_NOMASK,
							G_TX_NOLOD, G_TX_NOLOD );
						if( j == 19 ) ht = 1;
						else ht = 3;
						if( gwp->stat == GWORD_GOAL_STAT_STOP ) {
							gSPTextureRectangle( gp++,
								(gwp->x) << 2      , (gwp->y + 2 * j) << 2,
								(gwp->x + 80) << 2, (gwp->y + 2 * j + 2) << 2,
								G_TX_RENDERTILE,
								0, 0,
								1 << 10, 1 << 10 );
						}
						else {
							gp = makeFontVtxGlist( gp, 80, ht, (uint)0, (uint)(2 * j),
											   255, 255, 255,
											   255, 255, 255,
											   255, 255, 255,
											   255, 255, 255, 1.0f );
						}
					}
				}
				break;
			case GWORD_KIND_CUBE:
				gSPMatrix( gp++, &(rspKnDynamic.mtxFontProj),
						   G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
				gSPMatrix( gp++, &(rspKnDynamic.mtxGWordModel[gwp->number]),
						   G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
				gSPDisplayList( gp++, dlDrawCube );
				gSPDisplayList( gp++, dlDrawCube2 );
				break;
			case GWORD_KIND_RETIRE:
				if( gwp->flag ) {
					f = 1;
					dx = -8;
					wd = 176;
					tex_p = texTimeUp;
				}
				else {
					f = 0;
					dx = 0;
					wd = 160;
					tex_p = texRetire;
				}
				gSPDisplayList( gp++, dlInitFont );
				for( j = 0 ; j < 8 ; j ++ ) {
					gDPLoadTextureTile( gp++, (uint)(tex_p + wd * 5 * j),
						G_IM_FMT_RGBA, G_IM_SIZ_32b,
						wd, 5,
						0, 0,
						wd-1, 4,
						0,
						G_TX_CLAMP, G_TX_CLAMP,
						G_TX_NOMASK, G_TX_NOMASK,
						G_TX_NOLOD, G_TX_NOLOD );
					gSPScisTextureRectangle( gp++,
						(gwp->x+dx) << 2, (gwp->y + 5 * j) << 2,
						(gwp->x+dx+wd) << 2, (gwp->y + 5 * j + 5) << 2,
						G_TX_RENDERTILE,
						0, 0,
						1 << 10, 1 << 10 );
				}
				break;
		}
	}

	return( gp );
}

/* ================================================= */
/*
	種類ごとの処理
*/
/* ================================================= */
/*
	FINISH
*/
void moveGWordFinish( sGWord *gwp )
{
	Mtxf	mtxf_dummy;
	float	sc;
	
	switch( gwp->stat ) {
		case GWORD_FINISH_STAT_ZOOM:
			sc = (float)gwp->count0 / (float)GWORD_FINISH_ZOOM_COUNT * 1.5f;
			gwp->x = (int)( (float)GWORD_FINISH_INIT_X + 74.0F * ( 1.00F - sc ) );
			gwp->y = (int)( (float)GWORD_FINISH_INIT_Y + 20.0F * ( 1.00F - sc ) );
			make_ROTSmatrix( &(pKnDynamic->mtxGWordModel[gwp->number]),
					 0.0f, 0.0f, 1.0f,
					 0.0f, 1.0f, 0.0f,
					 (float)gwp->x,(float)gwp->y, 0.0f, sc );
			gwp->count0 ++;
			if( gwp->count0 > GWORD_FINISH_ZOOM_COUNT ) {
				gwp->stat = GWORD_FINISH_STAT_STOP;
				gwp->x = GWORD_FINISH_INIT_X;
				gwp->y = GWORD_FINISH_INIT_Y;
				gwp->count0 = 0;
			}
			break;
		case GWORD_FINISH_STAT_STOP:
			make_ROTmatrix( &(pKnDynamic->mtxGWordModel[gwp->number]), &mtxf_dummy,
					 0.0f, 0.0f, 1.0f,
					 0.0f, 1.0f, 0.0f,
					 (float)gwp->x,(float)gwp->y, 0.0f );
			gwp->count0 ++;
			if( mSelGameInfo.gameKind == GAME_KIND_TOUR ) {
				if( gwp->count0 > 10 ) {
					gwp->kind = GWORD_KIND_NOUSE;
					initGWord( GWORD_KIND_GOAL, 0 );
				}
			}
			else if( mSelGameInfo.gameKind == GAME_KIND_ATTACK ) {
				if( gwp->count0 > 10 ) {
					gwp->kind = GWORD_KIND_NOUSE;
					if( frank_total == 1 ) initGWord( GWORD_KIND_GOAL, 1 );
				}
			}
			break;
	}
}

/* ================================================= */
/*
	GOAL
*/
void moveGWordGoal( sGWord *gwp )
{
	Mtxf	mtxf_dummy;
	float	sc;

	switch( gwp->stat ) {
		case GWORD_GOAL_STAT_ZOOM:
			sc = (float)gwp->count0 / (float)GWORD_GOAL_ZOOM_COUNT * 1.5f;
			if( gwp->flag ) {
				gwp->x = (uint)( (float)GWORD_GOAL_INIT_X_REC + 102.0f * ( 1.00F - sc ) );
				gwp->y = (uint)( (float)GWORD_GOAL_INIT_Y + 15.0f * ( 1.00F - sc ) );
			}
			else {
				gwp->x = (uint)( (float)GWORD_GOAL_INIT_X + 38.0f * ( 1.00F - sc ) );
				gwp->y = (uint)( (float)GWORD_GOAL_INIT_Y + 20.0f * ( 1.00F - sc ) );
			}
			make_ROTSmatrix( &(pKnDynamic->mtxGWordModel[gwp->number]),
					 0.0f, 0.0f, 1.0f,
					 0.0f, 1.0f, 0.0f,
					 (float)gwp->x,(float)gwp->y, 0.0f, sc );
			gwp->count0 ++;
			if( gwp->count0 > GWORD_GOAL_ZOOM_COUNT ) {
				gwp->stat = GWORD_GOAL_STAT_STOP;
				if( gwp->flag ) gwp->x = GWORD_GOAL_INIT_X_REC;
				else gwp->x = GWORD_GOAL_INIT_X;
				gwp->y = GWORD_GOAL_INIT_Y;
				gwp->count0 = 0;
			}
			break;
		case GWORD_GOAL_STAT_STOP:
			make_ROTmatrix( &(pKnDynamic->mtxGWordModel[gwp->number]), &mtxf_dummy,
					 0.0f, 0.0f, 1.0f,
					 0.0f, 1.0f, 0.0f,
					 (float)gwp->x,(float)gwp->y, 0.0f );
			gwp->count0 ++;
			if( gwp->count0 > 30 ) {
				gwp->kind = GWORD_KIND_NOUSE;
			}
			break;
	}
}
/* ================================================= */
/*
	タイトル用キューブ
*/
void moveGWordCube( sGWord *gwp )
{
	Mtxf			mtxf_dummy;
	Mtx				mtx_trans, mtx_rot;
	register float	rad;

	switch( gwp->stat ) {
		case GWORD_CUBE_STAT_ROT:
#if (SW_KN_LANGUAGE == KN_EU)
			if( seqTitle == TITLE_SEQ_LANGUAGE ) {
				gwp->y = SY_LANGUAGE_MENU + 6 + LL_LANGUAGE_MENU * euLanguageMenuNum;
			}
			else {
				gwp->y = syTitleMenu + 6 + 20 * titleMenuNum;
			}
#else
			gwp->y = syTitleMenu + 6 + 20 * titleMenuNum;
#endif
			rad = ( (float)gwp->count0 / 40.0f ) * 2.0f * PAI;
			make_ZXYTmatrix( &(pKnDynamic->mtxGWordModel[gwp->number]), &mtxf_dummy,
							 rad, rad, 0.0,
					 		(float)gwp->x,(float)gwp->y, 0.0f );
			gwp->count0 ++;
			if( gwp->count0 >= 40 ) gwp->count0 -= 40;
			gwp->count2 += 4;
			break;
		case GWORD_CUBE_STAT_ROT_P:			/* ポーズ中のキューブ */
			if( pause_mode == PAUSE_MODE_OFF ) {
				gwp->kind = GWORD_KIND_NOUSE;
			}
			else {
				#if (SW_KN_LANGUAGE == KN_EU)
				if( mSelGameInfo.gameKind == GAME_KIND_ATTACK || mSelGameInfo.gameKind == GAME_KIND_SCORE ) {
					if( !gwp->count2 ) {
						if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosAttack[pause_mode].lx;
						else gwp->x = mCubeXPosAttack[pause_mode].lx2;
					}
					else {
						if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosAttack[pause_mode].rx;
						else gwp->x = mCubeXPosAttack[pause_mode].rx2;
					}
				}
				else if( mSelGameInfo.gameKind == GAME_KIND_TOUR ) {
					if( ncourse == NCOURSE_PARK ) {
						if( !gwp->count2 ) {
							if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosPark[pause_mode].lx;
							else gwp->x = mCubeXPosPark[pause_mode].lx2;
						}
						else {
							if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosPark[pause_mode].rx;
							else gwp->x = mCubeXPosPark[pause_mode].rx2;
						}
					}
					else {
						if( !gwp->count2 ) {
							if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosTour[pause_mode].lx;
							else gwp->x = mCubeXPosTour[pause_mode].lx2;
						}
						else {
							if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosTour[pause_mode].rx;
							else gwp->x = mCubeXPosTour[pause_mode].rx2;
						}
					}
				}
				else {
					if( !gwp->count2 ) {
						if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosDefault[pause_mode].lx;
						else gwp->x = mCubeXPosDefault[pause_mode].lx2;
					}
					else {
						if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosDefault[pause_mode].rx;
						else gwp->x = mCubeXPosDefault[pause_mode].rx2;
					}
				}
				#endif
				gwp->y = gwp->count3 + 15 * (int)pause_mode;
				rad = ( (float)gwp->count0 / 40.0f ) * 2.0f * PAI;
				make_ZXYTmatrix( &(pKnDynamic->mtxGWordModel[gwp->number]), &mtxf_dummy,
							 rad, rad, 0.0,
							(float)gwp->x, (float)gwp->y, 0.0f ) ;
				gwp->count0 += 1;
				if( gwp->count0 >= 40 ) gwp->count0 -= 40;
			}
			break;
	}
}
/* ================================================= */
/*
	リタイア
*/
void moveGWordRetire( sGWord *gwp )
{
	Mtxf			mtxf_dummy;
	Mtx				mtx_trans, mtx_rot;
	register float	rad;

	switch( gwp->stat ) {
		case GWORD_RETIRE_STAT_FALL:
			gwp->y = GWORD_RETIRE_INIT_Y + (int)( GWORD_RETIRE_G * (float)gwp->count0 * (float)gwp->count0 );
			gwp->count0 ++;
			if( gwp->y >= GWORD_RETIRE_BOUND_Y ) {
				gwp->stat = GWORD_RETIRE_STAT_BOUND;
				gwp->y = GWORD_RETIRE_BOUND_Y;
				gwp->vy = ( GWORD_RETIRE_BOUND_VY );
				gwp->count0 = 1;
				gwp->count1 = 1;
				#if SOUND_SW
				Na_SyncRetireDown();
				#endif
			}
			break;
		case GWORD_RETIRE_STAT_BOUND:
			gwp->y = GWORD_RETIRE_BOUND_Y
				- (int)( gwp->vy * (float)gwp->count0 )
				+ (int)( GWORD_RETIRE_G_BOUND * (float)gwp->count0 * (float)gwp->count0 );
			gwp->count0 ++;
			if( gwp->y > GWORD_RETIRE_BOUND_Y ) {
				gwp->y = GWORD_RETIRE_BOUND_Y;
				gwp->vy = ( (float)gwp->vy * GWORD_RETIRE_BOUND_K );
				gwp->count0 = 1;
				gwp->count1 ++;
				if( gwp->vy < GWORD_RETIRE_G_BOUND ) {
					gwp->stat = GWORD_RETIRE_STAT_STOP;
					gwp->count0 = gwp->count1 = 0;
				}
			}
			break;
		case GWORD_RETIRE_STAT_STOP:
			break;
	}
}
/* ================================================= */
/* ================================================= */
/*
	サブルーチン
*/
/* 初期化 */
void initGWord( ushort kind, ushort flag )
{
	register int 	i;
	register sGWord	*gwp;
	
	switch( kind ) {
		case GWORD_KIND_NOUSE:
			if( flag == GWORD_FLAG_ALLCLR ) {
				/* バッファオールクリア */
				for( i = 0 ; i < MAX_NUM_GWORD ; i ++ ) mGWord[i] = mGWordClear;
			}
			break;
		case GWORD_KIND_FINISH:
			i = checkGWordBuf();
			if( i == -1 ) break;
			mGWord[i] = mGWordClear;
			gwp = &mGWord[i];
			gwp->number = (ushort)i;
			gwp->kind = GWORD_KIND_FINISH;
			gwp->stat = GWORD_FINISH_STAT_ZOOM;
			gwp->x = GWORD_FINISH_INIT_X;
			gwp->y = GWORD_FINISH_INIT_Y;
			gwp->count0 = 0;
			break;
		case GWORD_KIND_GOAL:
			i = checkGWordBuf();
			if( i == -1 ) break;
			mGWord[i] = mGWordClear;
			gwp = &mGWord[i];
			gwp->number = (ushort)i;
			gwp->kind = GWORD_KIND_GOAL;
			gwp->stat = GWORD_GOAL_STAT_ZOOM;
			if( flag ) gwp->x = GWORD_GOAL_INIT_X_REC;
			else gwp->x = GWORD_GOAL_INIT_X;
			gwp->y = GWORD_GOAL_INIT_Y;
			gwp->flag = (int)flag;
			break;
		case GWORD_KIND_CUBE:
			i = checkGWordBuf();
			if( i == -1 ) break;
			mGWord[i] = mGWordClear;
			gwp = &mGWord[i];
			gwp->number = (ushort)i;
			gwp->kind = GWORD_KIND_CUBE;
			switch( flag ) {
				case GWORD_CUBE_FLAG_TITLE_L:
					gwp->stat = GWORD_CUBE_STAT_ROT;
					gwp->x = GWORD_CUBE_INIT_X_L;
					gwp->y = SY_TITLE_MENU_MAIN + 6;
					break;
				case GWORD_CUBE_FLAG_TITLE_R:
					gwp->stat = GWORD_CUBE_STAT_ROT;
					gwp->x = GWORD_CUBE_INIT_X_R;
					gwp->y = SY_TITLE_MENU_MAIN + 6;
					break;
				case GWORD_CUBE_FLAG_PAUSE1_L:
				case GWORD_CUBE_FLAG_PAUSE2_1L:
				case GWORD_CUBE_FLAG_PAUSE2_2L:
					gwp->stat = GWORD_CUBE_STAT_ROT_P;
					if( flag == GWORD_CUBE_FLAG_PAUSE1_L ) gwp->y = GWORD_CUBE_INIT_Y_P1;
					else if( flag == GWORD_CUBE_FLAG_PAUSE2_1L ) gwp->y = DISPLAY_Y1_1P + 64;
					else gwp->y = DISPLAY_Y1_2P + 64;
					gwp->count2 = 0;		/* 左右判断用ＩＤ */
					gwp->count3 = gwp->y;	/* 初期ｙ座標 */
					#if (SW_KN_LANGUAGE == KN_EU)
					if( mSelGameInfo.gameKind == GAME_KIND_ATTACK || mSelGameInfo.gameKind == GAME_KIND_SCORE ) {
						if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosAttack[0].lx;
						else gwp->x = mCubeXPosAttack[0].lx2;
					}
					else if( mSelGameInfo.gameKind == GAME_KIND_TOUR ) {
						if( ncourse == NCOURSE_PARK ) {
							if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosPark[0].lx;
							else gwp->x = mCubeXPosPark[0].lx2;
						}
						else {
							if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosTour[0].lx;
							else gwp->x = mCubeXPosTour[0].lx2;
						}
					}
					else {
						if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosDefault[0].lx;
						else gwp->x = mCubeXPosDefault[0].lx2;
					}
					#else
					gwp->x = GWORD_CUBE_INIT_X_L_P1;
					#endif
					break;
				case GWORD_CUBE_FLAG_PAUSE1_R:
				case GWORD_CUBE_FLAG_PAUSE2_1R:
				case GWORD_CUBE_FLAG_PAUSE2_2R:
					gwp->stat = GWORD_CUBE_STAT_ROT_P;
					if( flag == GWORD_CUBE_FLAG_PAUSE1_R ) gwp->y = GWORD_CUBE_INIT_Y_P1;
					else if( flag == GWORD_CUBE_FLAG_PAUSE2_1R ) gwp->y = DISPLAY_Y1_1P + 64;
					else gwp->y = DISPLAY_Y1_2P + 64;
					gwp->count2 = 1;		/* 左右判断用ＩＤ */
					gwp->count3 = gwp->y;	/* 初期ｙ座標 */
					#if (SW_KN_LANGUAGE == KN_EU)
					if( mSelGameInfo.gameKind == GAME_KIND_ATTACK || mSelGameInfo.gameKind == GAME_KIND_SCORE ) {
						if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosAttack[0].rx;
						else gwp->x = mCubeXPosAttack[0].rx2;
					}
					else if( mSelGameInfo.gameKind == GAME_KIND_TOUR ) {
						if( ncourse == NCOURSE_PARK ) {
							if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosPark[0].rx;
							else gwp->x = mCubeXPosPark[0].rx2;
						}
						else {
							if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosTour[0].rx;
							else gwp->x = mCubeXPosTour[0].rx2;
						}
					}
					else {
						if( euLanguage == EL_ENGLISH ) gwp->x = mCubeXPosDefault[0].rx;
						else gwp->x = mCubeXPosDefault[0].rx2;
					}
					#else
					gwp->x = GWORD_CUBE_INIT_X_R_P1;
					#endif
					break;
			}
			break;
		case GWORD_KIND_RETIRE:
			i = checkGWordBuf();
			if( i == -1 ) break;
			mGWord[i] = mGWordClear;
			gwp = &mGWord[i];
			gwp->number = (ushort)i;
			gwp->kind = GWORD_KIND_RETIRE;
			gwp->stat = GWORD_RETIRE_STAT_FALL;
			gwp->x = GWORD_RETIRE_INIT_X;
			gwp->y = GWORD_RETIRE_INIT_Y;
			gwp->flag = (int)flag;
			break;
	}
}

/* 空き領域を調べる */
int checkGWordBuf( void )
{
	register int	i;
	register int	gword_num;
	register sGWord	*gwp;
	
	for( i = 0, gwp = mGWord ; i < MAX_NUM_GWORD ; i ++, gwp ++ ) {
		if( gwp->kind == GWORD_KIND_NOUSE ) break;
	}

	if( i == MAX_NUM_GWORD ) gword_num = -1;
	else gword_num = i;

	return( gword_num );
}
