/*
  ======================================================================

						レコード画面

  ======================================================================
*/

#include	"ot_header.h"
#include	"audio/sound.h"
#include	"ko_language.h"
#include	"ot_letter.h"
#include	"ot_course.h"
#include	"ot_machine.h"
#include	"kn_camera.h"
#include	"kn_world.h"
#include 	"ko_block.h"
#include	"ko_select.h"
#include	"ko_gsub.h"
#include	"l_static.h"
#include	"sot_crsobj.h"
#include	"sot_pack.h"
#include	"sot_disk.h"
#include	"kn_record.h"
#include 	"kn_option.h"
#include	"dai_ssletter2.h"
#include	"dai_traveling.h"
#include	"kn_wipe.h"
#include 	"ko_define.h"

#include	"kn_backup.h"
#include	"kn_window.h"
#include	"kn_dlsub.h"
#include	"kn_font.h"
#include	"kn_disk.h"

#include	"sot_ghost.h"
/* ====================================================================== */
/*
	定数
*/

/* コース数 */
#define RECORD_COURSE_NUM		18
#define RECORD_COURSE_NUM_JOKER	24

/* エディットコース番号 */
#define RECORD_EDITCRS_BEGIN	24
#define RECORD_EDITCRS_END		29

/* 消去ウィンドウのメニュー数 */
#define RECORD_DELMENU_YESNO_MAX	2

/* コースチェンジキー */
#define CONT_KEY_REC_CRSUP		(R_JPAD)
#define CONT_KEY_REC_CRSDOWN	(L_JPAD)

/* ---------------- */

/* レコードシーケンス */
enum RecordSeq {
	RECORD_SEQ_DISPREC=0,
	RECORD_SEQ_MENU,
	RECORD_SEQ_DELETE
};
typedef enum RecordSeq RecordSeq;

/* メニューモード */
enum RecMenuMode {
  	RECMENU_MODE_CLRREC = 0,
  	RECMENU_MODE_CLRGHOST,
  	RECMENU_MODE_GSEL,
  	RECMENU_MODE_CRSCHANGE,
  	RECMENU_MODE_MAX
};
typedef enum RecMenuMode RecMenuMode;

/* ウインドウＩＤ */
enum {
  	MENUWIN_ID_MAIN=0,
	MENUWIN_ID_DEL
};

/* 消去データの種類 */
enum {			/* 注  ここの番号を変えたときはテクスチャのテーブルも変えること  */
 	DELDATA_KIND_RECORD=0,
	DELDATA_KIND_GHOST,
	DELDATA_KIND_MAX
};

/* --- 表示系 --- */
/* MAIN MENU */
#define SX_RECORD_MAINMENU		108
#define SY_RECORD_MAINMENU		50
#define RECORD_MAINMENU_WD		104
#define RECORD_MAINMENU_HT		100
#define RECORD_MAINMENU_COLOR	RGBA16(0,31,0,1)
#define OX_RECORD_MAINMENU		20
#define OY_RECORD_MAINMENU		10
#define DY_RECORD_MAINMENU		20
/* DELETE MENU */
#define SX_RECORD_DELMENU		120
#define SY_RECORD_DELMENU0		120
#define SY_RECORD_DELMENU1		142
#define RECORD_DELWIN_WD		148
#define RECORD_DELWIN_HT		80
#define RECORD_DELWIN_COLOR	RGBA16(31,0,0,1)
#define OX_RECORD_DELMENU_CLROK	12
#define OY_RECORD_DELMENU_CLROK	10
#define DISP_WD_RECORD_MEMBER	(DX_RECORD_KAKOMI-DAI_M_MARKL_W)
#define DX_RECORD_DELWIN_KAKOMI		((RECORD_DELWIN_WD-(DX_RECORD_KAKOMI+DAI_M_MARKL_W+DAI_M_MARKR_W))/2+4)
#define DY_RECORD_DELWIN_KAKOMI		50
#define DX_RECORD_DELWIN_MEMBER		(DX_RECORD_DELWIN_KAKOMI+18)
#define DY_RECORD_DELWIN_MEMBER		(DY_RECORD_DELWIN_KAKOMI)

/* ゴーストマーク */
#define SX_RECORD_GHOST		236
#define SY_RECORD_GHOST		60

/* --- テクスチャデータ --- */

/* ゴーストマーク */
#define RECORD_GHOST_WD		32
#define RECORD_GHOST_HT		16

/* ====================================================================== */
/*
	構造体
*/
/* dynamic */
struct RecDynamic {
	Mtx		mtxGhost;
	Vtx		vtxGhost[4];
};
typedef struct RecDynamic RecDynamic;

/* メニュー */
struct RecMenu {
  	RecMenuMode		mode;
	TexData			tex;
};
typedef struct RecMenu RecMenu;

/* ====================================================================== */
/*
	変数
*/
/* --- 外部 --- */
extern int 	clear_screen_count;
extern Gfx	init_zbuffer_GL[] ;

extern uchar	tex_csel_ghost[];

/* --- 内部 --- */
/* シーケンス */
static RecordSeq 	recordSeq;

/* レコード表示するコース番号 */
static int	dispCourseNum = 0 ;
/* 選択可能コース数 */
static int	maxCourseNum;
/* 選択可能項目 */
static short	fRecMenuExist[RECMENU_MODE_MAX];

/* ウィンドウポインタ */
static MenuWindow	*pMainWin, *pDelWin;

/* メニュー選択 */
static short	idMainMenu, idMainMenuCrsChange;
static short	idDelMenu;

/* 消去データの種類 */
static short	delDataKind;

/* ゴーストマーク表示 */
static short	fGhostMark;
static short	aGhostMarkU, aGhostMarkD;

/* exit flag */
static short	fExit;

/* dynamic */
static RecDynamic	*pRecDynamic;
static RecDynamic	recDynamic[2];

/* --- デバッグ用変数 --- */

/* ====================================================================== */
/*
	データテーブル
*/
/* メニュー */
static const RecMenu	tblRecMenu[RECMENU_MODE_MAX] = {
 	/* コースチェンジ */
  	{ RECMENU_MODE_CRSCHANGE, { dai_m_coursechange, DAI_M_COURSECHANGE_W, DAI_M_COURSECHANGE_H } },

	/* メニューへ */
  	{ RECMENU_MODE_GSEL     , { dai_m_yameru, DAI_M_YAMERU_W, DAI_M_YAMERU_H } },

	/* レコードクリア */
  	{ RECMENU_MODE_CLRREC   , { dai_m_recordclear, DAI_M_RECORDCLEAR_W, DAI_M_RECORDCLEAR_H } },

	/* ゴーストクリア */
  	{ RECMENU_MODE_CLRGHOST , { dai_m_ghostclear, DAI_M_GHOSTCLEAR_W, DAI_M_GHOSTCLEAR_H } },
 };	

/* テクスチャ */
static TexData tblClearOk[DELDATA_KIND_MAX] = {
  { dai_m_recordclearOK, DAI_M_RECORDCLEAROK_W, DAI_M_RECORDCLEAROK_H },
  { dai_m_ghostclearOK , DAI_M_GHOSTCLEAROK_W , DAI_M_GHOSTCLEAROK_H  },
};

static TexData tblYesNoClear[RECORD_DELMENU_YESNO_MAX] = {
  { dai_m_no , DAI_M_NO_W , DAI_M_NO_H  },
  { dai_m_yes, DAI_M_YES_W, DAI_M_YES_H },
};

/* ====================================================================== */
/*
	関数プロトタイプ
*/
void 		init_record( void );
static void initRecord( void );
static int	checkFirstDataRecord( int idCourse );
static int	checkGhostDataExist( int idCourse );

int 		move_record( void );
static int	moveRecordDispRec( void );
static int	moveRecordMenu( void );
static void	moveRecordDelete( void );
static void	moveGhostMark( void );

Gfx 		*make_record_glist( Gfx *gp );
static Gfx 	*makeGhostMarkGlist( Gfx *pGfx );
static Gfx 	*makeMainMenuGlist( Gfx *pGfx, int xWin, int yWin );
static Gfx 	*makeDelMenuGlist( Gfx *pGfx, int xWin, int yWin );


/* ====================================================================== */
/*
	初期化
*/
void init_record( void )
{
  	/* --- レース画面用初期化 --- */
	next_fbuffer_mode = clear_screen_count = 3 ;

	pause_sw = 0 ;

	gp_class = GP_CLASS_MASTER;
	machine[0].name = 0;
	
	init_course() ;
	dai_init_machine();
	init_machine() ;
	init_camera() ;
	setWorldKind( diskSaveFormat.haikei, diskSaveFormat.sky );
	init_world() ;

	init_mine();
	init_jbox();
	init_gate();
	init_gadget(GADGET_DEVIDE_MODE_RACE);

	/* レコード画面用初期化 */
	initRecord();
}

static void initRecord( void )
{
	int					i;
	const RecMenu		*p;
  
  	/* コース番号の初期化 */
	dispCourseNum = crs_number;
	/* 選択可能コース数 */
	if( joker_status == 0 && command_status == 0 ) maxCourseNum = RECORD_COURSE_NUM;
	else maxCourseNum = RECORD_COURSE_NUM_JOKER;
	/* 選択可能項目 */
	for( i = 0 ; i < RECMENU_MODE_MAX ; i ++ ) {
	  	switch( tblRecMenu[i]. mode ) {
			case RECMENU_MODE_CLRREC:
				/* レコードが初期値のままかどうか */
		  		if( checkFirstDataRecord( dispCourseNum ) ) fRecMenuExist[i] = 0;
				else fRecMenuExist[i] = 1;
		  		break;
			case RECMENU_MODE_CLRGHOST:
				/* ゴーストがあるかどうか */
		  		if( checkGhostDataExist( dispCourseNum ) ) {
				  	fRecMenuExist[i] = 1;
					fGhostMark = 1;
					aGhostMarkU = aGhostMarkD = 255;
				}
				else {
				  	fRecMenuExist[i] = 0;
					fGhostMark = 0;
				}
				break;
			case RECMENU_MODE_CRSCHANGE:
				idMainMenuCrsChange = i;
			default:
				fRecMenuExist[i] = 1;
				break;
		}
	}
	
	/* シーケンス */
	recordSeq = RECORD_SEQ_DISPREC;
	/* exit */
	fExit = 0;

	/* テクスチャの転送 */
	TexBuffLoad2( dai_m_color, FZERO_FONT_COLOR_NUM*2 );		/* フォント用パレット */
	for( i = 0, p = tblRecMenu ; i < RECMENU_MODE_MAX ; i ++, p ++ ) {
	  	TexBuffLoad2p( p->tex.pTex, (p->tex.width)*(p->tex.height) );
	}
	TexBuffLoad2p( dai_m_recordclearOK, DAI_M_RECORDCLEAROK_W*DAI_M_RECORDCLEAROK_H );
	TexBuffLoad2p( dai_m_ghostclearOK , DAI_M_GHOSTCLEAROK_W*DAI_M_GHOSTCLEAROK_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);
	TexBuffLoad2( tex_csel_ghost, RECORD_GHOST_WD*RECORD_GHOST_HT/2);

	/* レコード画面の初期化 */
	initRecordScreen();

	/* メニューウィンドウの初期化 */
	getMenuWindow( &pMainWin );
	getMenuWindow( &pDelWin );
	initMenuWindow();
}

/*
	初期データ（レコード）のチェック
	戻り値  ０ : 初期データではない   ０以外 : 初期データ
*/
static int	checkFirstDataRecord( int idCourse )
{
	int		i, ret;
	Course		*cp;


	ret = 1;
	
  	cp = &course_BF[idCourse];
	for( i = 0 ; i < CRS_TIMES ; i ++ ) {
	  	if( cp->best_time[i] != BAK_DEFAULT_RECORD_TIME ) {
		  	ret = 0;
			break;
		}
	}

	return( ret );
}

/*
	初期データ（ゴースト）のチェック
	戻り値  ０ : ない   ０以外 : ある
*/
static int	checkGhostDataExist( int idCourse )
{
	int		i, ret;
	GhostData	*gp;
	Course		*cp;
	GhostInfo	work_info;
	#if SW_KN_DISKPROG
	BakGhostInfo 	info[3];
	#endif	/* SW_KN_DISKPROG */

	cp = &course_BF[idCourse];

	ret = 0;
	/* ＲＡＭチェック */
#if 0		/* ＲＡＭチェックは無し */
	for( i = 0, gp = &ghost_BF[0] ; i < GHOST_MAX ; i++, gp++ ) {
	  	if( gp->course_id == cp->id ) {
			ret = 1;
			break;
		}
	}
#endif

	/* ＳＲＡＭチェック */
	if( !ret ) {
	  	bakGetDataGhostInfo( &work_info );
		if( work_info.courseID == cp->id ) ret = 1;
	}

	/* ディスクチェック */
	#if SW_KN_DISKPROG
	if( !ret ) {
		diskLoadGhostInfo( idCourse, &info[0] );
		for( i = 0 ; i < 3 ; i ++ ) {
			if( info[i].courseID == cp->id ) {
				ret = 1;
				break;
			}
		}
	}
	#endif	/* SW_KN_DISKPROG */
	
	return( ret );  
}

/* ====================================================================== */
/*
	メイン
*/
int move_record( void )
{
	int			ret, new_loop_kind, seq_change_flag;
	Controller	*cp;

	cp = &all_cont;

	ko_SetContData( cp );

	pRecDynamic = &recDynamic[double_index];
	
	move_machine() ;
	move_camera() ;
	move_world() ;
	move_course() ;
	move_crsobj();

	/* ゴーストマーク */
	if( fGhostMark ) moveGhostMark();
	
	moveRecordScreen();

	moveMenuWindow();
	
	new_loop_kind = LOOP_KIND_RECORD;

	seq_change_flag = 0;
	if( !fExit ) {
		switch( recordSeq ) {
			case RECORD_SEQ_DISPREC:
				ret = moveRecordDispRec();
		  		if( ret == 1 ) seq_change_flag = 1;
		  		else if( ret == 2 ) new_loop_kind = LOOP_KIND_CSEL_RECORD;
				if( ret ) fExit = 1;
		  		break;
			case RECORD_SEQ_MENU:
				ret = moveRecordMenu();
				if( ret == 1 ) new_loop_kind = LOOP_KIND_CSEL_RECORD;
				else if( ret == 2 ) new_loop_kind = LOOP_KIND_GSEL;
				if( ret ) fExit = 1;
		  		break;
			case RECORD_SEQ_DELETE:
				moveRecordDelete();
		  		break;
		}
	}


	if( seq_change_flag ) {
	  	/* コース変更 */
		crs_number_buf_record = crs_number;
		SEQUENCE_CHANGE(SEQUENCE_CHANGE_RECORD);
	}
	else if( new_loop_kind == LOOP_KIND_RECORD && !fExit ) {
	  	/* 敵が落ちたらリトライ */
		if( (machine[0].state & MC_STATE_FALL) != 0 ) {
			SEQUENCE_CHANGE(SEQUENCE_CHANGE_RACE_RETRY);
		}
	}

	return ( new_loop_kind ) ;
}

static int moveRecordDispRec( void )
{
	int		ret, old_crs;

	/* Wipe中はキー入力受け付けない */
	if( wipeStatus != WIPE_STATUS_END ) return( 0 );
	/* メインウィンドウ死ぬまで何もしない */
	if( checkMenuWindow( pMainWin, MENUWIN_CHKMODE_EXIST ) ) return( 0 );

	dispRecordScreenArrow( 1 );

	
	old_crs = crs_number;
	if( new_button & CONT_KEY_REC_CRSUP ) {
	  	/* コース番号増加 */
	  	crs_number ++;
		#if SW_KN_DISKPROG
		/* for DD */
	  	if( crs_number > RECORD_EDITCRS_END ) crs_number = 0;
	  	else if( (crs_number >= maxCourseNum) && (crs_number < RECORD_EDITCRS_BEGIN) ) {
		  	crs_number = RECORD_EDITCRS_BEGIN;
		}
		#else
		/* for ROM */
	  	if( crs_number >= maxCourseNum ) crs_number = 0;
		#endif /* SW_KN_DISKPROG */
		requestWipeSubMode( WPM_MOVE2D, 0 );
	}
	else if( new_button & CONT_KEY_REC_CRSDOWN ) {
	  	/* コース番号減少 */
	  	crs_number --;
		#if SW_KN_DISKPROG
		/* for DD */
	  	if( crs_number < 0 ) crs_number = RECORD_EDITCRS_END;
	  	else if( (crs_number >= maxCourseNum) && (crs_number < RECORD_EDITCRS_BEGIN) ) {
		  	crs_number = maxCourseNum - 1;
		}
		#else
		/* for ROM */
		if( crs_number < 0 ) crs_number = maxCourseNum - 1;
		#endif /* SW_KN_DISKPROG */
		requestWipeSubMode( WPM_MOVE2D, 1 );
	}
	if( old_crs != crs_number ) {
	  	ret = 1;
		#if SOUND_SW
		Na_SystemSE_Start( SE_CURSOL );
		#endif
	}
	else ret = 0;
	if( !ret ) {
		if( new_button_trg & CONT_DECIDE ) {
			/* Init Main Menu */
			if( (pMainWin = openMenuWindow( MENUWIN_ID_MAIN, SX_RECORD_MAINMENU, SY_RECORD_MAINMENU,
									   RECORD_MAINMENU_WD, RECORD_MAINMENU_HT,
									   RECORD_MAINMENU_COLOR, makeMainMenuGlist )) != NULL ) {
		
			  	recordSeq = RECORD_SEQ_MENU;
				idMainMenu = 0;
				#if SOUND_SW
  				Na_SystemSE_Start( SE_DECIDE );
				#endif
				dispRecordScreenArrow( 0 );
			}
		}
		else if( new_button_trg & CONT_CANCEL ) {
		  	ret = 2;
			#if SOUND_SW
  			Na_SystemSE_Start( SE_CANCEL );
			#endif
		}
	}
	

	return( ret );
}

static int moveRecordMenu( void )
{
	int		old_id, flag, ret, sy;

	/* ウィンドウ開ききるまで何もしない */
	if( !checkMenuWindow( pMainWin, MENUWIN_CHKMODE_OPEN ) ) return( 0 );
	
	old_id = idMainMenu;
	ret = 0;

	if( new_button & U_JPAD ) {
	  	idMainMenu --;
		if( idMainMenu < 0 ) idMainMenu = RECMENU_MODE_MAX - 1;
		while ( !fRecMenuExist[idMainMenu] ) {
		  	idMainMenu --;
			if( idMainMenu < 0 ) idMainMenu = RECMENU_MODE_MAX - 1;
		}
	}
	else if( new_button & D_JPAD ) {
	  	idMainMenu ++;
		if( idMainMenu >= RECMENU_MODE_MAX ) idMainMenu = 0;
		while ( !fRecMenuExist[idMainMenu] ) {
		  	idMainMenu ++;
			if( idMainMenu >= RECMENU_MODE_MAX ) idMainMenu = 0;
		}
	}
	/* 項目がないところにはカーソルがいかない様にする*/
	
	#if SOUND_SW
	if( old_id != idMainMenu ) {
	  	Na_SystemSE_Start( SE_CURSOL );
	}
	#endif
	
	if ( new_button_trg & CONT_DECIDE ) {
	  	flag = 0;
		switch( tblRecMenu[idMainMenu].mode ) {
			case RECMENU_MODE_CRSCHANGE:
	  			flag = 1;
  				ret = 1;
				break;
			case RECMENU_MODE_GSEL:
	  			flag = 1;
  				ret = 2;
				break;
			case RECMENU_MODE_CLRREC:
			case RECMENU_MODE_CLRGHOST:
				if( tblRecMenu[idMainMenu].mode == RECMENU_MODE_CLRREC ) {
				  	delDataKind = DELDATA_KIND_RECORD;
					sy = SY_RECORD_DELMENU0;
				}
				else {
				  	delDataKind = DELDATA_KIND_GHOST;
					sy = SY_RECORD_DELMENU1;
				}
				if( (pDelWin = openMenuWindow( MENUWIN_ID_DEL, SX_RECORD_DELMENU, sy,
								   RECORD_DELWIN_WD, RECORD_DELWIN_HT,
								   RECORD_DELWIN_COLOR, makeDelMenuGlist )) != NULL ) {
	  				flag = 1;
					idDelMenu = 0;
	  				recordSeq = RECORD_SEQ_DELETE;
				}
				break;
		}
		#if SOUND_SW
		if( flag ) Na_SystemSE_Start( SE_DECIDE );
		#endif
	}
	else if ( new_button_trg & CONT_CANCEL ) {
	  	recordSeq = RECORD_SEQ_DISPREC;
		closeMenuWindow( pMainWin );
		#if SOUND_SW
		Na_SystemSE_Start( SE_CANCEL );
		#endif
	}

  	return( ret );
}

static void moveRecordDelete( void )
{
	int		old_id, close_flag;

	/* ウィンドウ開ききるまで何もしない */
	if( !checkMenuWindow( pDelWin, MENUWIN_CHKMODE_OPEN ) ) return;
	
	old_id = idDelMenu;
  
	if ( new_button & L_JPAD ) {
	  	idDelMenu --;
		if( idDelMenu < 0 ) idDelMenu = RECORD_DELMENU_YESNO_MAX - 1;
	}
	else if ( new_button & R_JPAD ) {
	  	idDelMenu ++;
		if( idDelMenu >= RECORD_DELMENU_YESNO_MAX ) idDelMenu = 0;
	}
	#if SOUND_SW
	if( old_id != idDelMenu ) {
	  	Na_SystemSE_Start( SE_CURSOL );
	}
	#endif

	close_flag = 0;
	if ( new_button_trg & CONT_DECIDE ) {
		close_flag = 1;
	  	if( idDelMenu == 0 ) {
		  	/* NO */
			#if SOUND_SW
			Na_SystemSE_Start( SE_CANCEL );
			#endif
		}
		else {
		  	/* YES */
		  	if( delDataKind == DELDATA_KIND_RECORD ) {
			  	if( (crs_number >= 0) && (crs_number <= 23) ) bakClearDataRecord( crs_number );	/* 公式コース */
				#if SW_KN_DISKPROG
				else {
				  	/* エディットコース */
					diskEraseBakRecord( crs_number );
				}
				#endif /* SW_KN_DISKPROG */
			}
			else if( delDataKind == DELDATA_KIND_GHOST ) {
			  	/* ＳＲＡＭゴーストの消去 */
			  	bakClearDataGhost( crs_number );
				/* ＤＤ版ゴーストを消す（何回も呼ぶとぶっとぶらしい） */
				#if SW_KN_DISKPROG
				diskEraseDataGhost( crs_number );
				#endif
				/* ゴーストマークを消すフラグ */
				fGhostMark = 2;
			}
			fRecMenuExist[idMainMenu] = 0;
			idMainMenu = idMainMenuCrsChange;
			#if SOUND_SW
			Na_SystemSE_Start( SE_BAKUHATU );
			#endif
		}
	}
	else if ( new_button_trg & CONT_CANCEL ) {
		close_flag = 1;
		#if SOUND_SW
		Na_SystemSE_Start( SE_CANCEL );
		#endif
	}
	if( close_flag ) {
	  	recordSeq = RECORD_SEQ_MENU;
		closeMenuWindow( pDelWin );
	}
}

/* ====================================================================== */
/*
	ディスプレイリストの作成
*/
Gfx *make_record_glist( Gfx *gp )
{
	/***********************************************************************
		CLEAR SCREEN
	***********************************************************************/
	if ( clear_screen_count != 0 ) {
		-- clear_screen_count ;
		gDPPipeSync( gp++ ) ;
		gDPSetCycleType( gp++, G_CYC_FILL ) ;
		gDPPipelineMode( gp++, G_PM_NPRIMITIVE ) ;
		gDPSetRenderMode( gp++, G_RM_NOOP, G_RM_NOOP2 ) ;
		gDPSetCombineMode( gp++, G_CC_SHADE, G_CC_SHADE ) ;
		gDPSetAlphaCompare( gp++, G_AC_NONE ) ;
		gDPSetScissor( gp++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WD, SCREEN_HT ) ;
		gDPSetFillColor( gp++, RGBA16(0,0,0,1) << 16 | RGBA16(0,0,0,1) ) ;
		gDPSetColorImage( gp++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WD, OS_K0_TO_PHYSICAL( fbuffer_t[triple_index] ) ) ;
		gDPFillRectangle( gp++, 0, 0, SCREEN_WD-1, SCREEN_HT-1 ) ;
	}

	/***********************************************************************
		CLEAR Z BUFFER
	***********************************************************************/
	gSPDisplayList( gp++, init_zbuffer_GL ) ;
	gDPPipeSync( gp++ ) ;
	gDPSetColorImage( gp++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WD, OS_K0_TO_PHYSICAL( fbuffer_t[triple_index] ) ) ;

	/***********************************************************************
		COURSE
	***********************************************************************/
	crs_vertex_pt = dynamic_p->road_VT ;
	effect_vtx_pt = dynamic_p->effect_VT ;
	effect_vtx_pt_end = &dynamic_p->effect_VT[ EFFECT_VTXS - 1 ] ;

	gp = make_world_glist(  gp, 0, VIEWPORT_ALL ) ;
	gp = make_course_glist( gp, 0 ) ;
	gp = make_crsobj_glist( gp, 0 );
	
	/* RECORD */
	gp = makeRecordScreenGlist( gp, dispCourseNum );

	/* GHOST MARK */
	if( fGhostMark ) {
	  	gp = makeGhostMarkGlist( gp );
	}
	
	/* MENU */
  	gp = makeMenuWindowGlist( gp );
	
  	return( gp );
}

/* ==============================================================================================*/
/*
 	ゴーストマーク
*/
/* move */
static void	moveGhostMark( void )
{
  	int		is, it;
	Vtx	*vp;

	switch( fGhostMark ) {
		case 1:
#ifndef ROM_FLAG
	  		if( new_button & U_CBUTTONS ) fGhostMark = 2;
#endif
	  		break;

		case 2:
			if( aGhostMarkD > 0 ) {
			  	aGhostMarkD -= 10;
				if( aGhostMarkD < 0 ) aGhostMarkD = 0;
			}
			if( aGhostMarkD == 0 ) {
			  	aGhostMarkU -= 10;
				if( aGhostMarkU < 0 ) aGhostMarkU = 0;
			}
			if( (aGhostMarkD == 0) && (aGhostMarkU == 0) ) {
			  	fGhostMark = 0;
				return;
			}
			break;
	}
	
	make_ORTHOmatrix( &(pRecDynamic->mtxGhost), NULL, 1.0f,
			0.0f, (float)(SCREEN_WD-1),
			(float)(SCREEN_HT-1), 0.0f,
			-100.0f, 100.0f  );

	vp = &pRecDynamic->vtxGhost[0];

	is = (int)( -0.5f * 32.0f );
	it = (int)( -0.5f * 32.0f );
	SET_V( vp, SX_RECORD_GHOST, SY_RECORD_GHOST, 0, 0, is, it, 255, 255, 255, aGhostMarkU );
	vp ++;
	is = (int)( ((float)(RECORD_GHOST_WD) - 0.0f) * 32.0f );
	it = (int)( 0.0f * 32.0f );
	SET_V( vp, SX_RECORD_GHOST+RECORD_GHOST_WD-1, SY_RECORD_GHOST, 0, 0, is, it, 255, 255, 255, aGhostMarkU );
	vp ++;
	is = (int)( 0.0f * 32.0f );
	it = (int)( ((float)(RECORD_GHOST_HT) + 0.0f) * 32.0f );
	SET_V( vp, SX_RECORD_GHOST, SY_RECORD_GHOST+RECORD_GHOST_HT-1, 0, 0, is, it, 255, 255, 255, aGhostMarkD );
	vp ++;
	is = (int)( ((float)(RECORD_GHOST_WD) + 0.0f) * 32.0f );
	it = (int)( ((float)(RECORD_GHOST_HT) + 0.0f) * 32.0f );
	SET_V( vp, SX_RECORD_GHOST+RECORD_GHOST_WD-1, SY_RECORD_GHOST+RECORD_GHOST_HT-1,
		  0, 0, is, it, 255, 255, 255, aGhostMarkD );
	vp ++;
}

extern Gfx dlInitWipeTileMoveZ[];

/* make GL */
static Gfx 	*makeGhostMarkGlist( Gfx *pGfx )
{
	pGfx = set_view_port( pGfx, VIEWPORT_ALL );
	gSPDisplayList( pGfx++, dlInitWipeTileMoveZ );
	gDPSetCombineMode( pGfx++, KN_CC_DECALRGB_MODULATESHADEA, KN_CC_DECALRGB_MODULATESHADEA );
	gDPSetRenderMode( pGfx++, G_RM_XLU_SURF, G_RM_XLU_SURF2 );
	gSPMatrix( pGfx++, &(pRecDynamic->mtxGhost)  , G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
	gSPMatrix( pGfx++, &(automatic.e_MT), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
	gSPVertex( pGfx++, &(pRecDynamic->vtxGhost[0]), 4, 0 );
	gDPLoadTextureBlock_4b( pGfx++, GetTexBuffPointer( tex_csel_ghost ),
				G_IM_FMT_I, RECORD_GHOST_WD, RECORD_GHOST_HT, 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 );
#if 0
  
  	gDPPipeSync( pGfx++ );
  	gDPSetPrimColor( pGfx++, 0, 0, 255,255, 255, 0 );
	pGfx = MakeDL_TexRect4_i4( pGfx, GetTexBuffPointer( tex_csel_ghost ),
							 SX_RECORD_GHOST, SY_RECORD_GHOST, RECORD_GHOST_WD, RECORD_GHOST_HT );
#endif
	
  	return( pGfx );
}

/* ==============================================================================================*/
/*
 	メインメニュー
*/
static Gfx 	*makeMainMenuGlist( Gfx *pGfx, int xWin, int yWin )
{
	int				i, dx;
	const RecMenu	*p;
	const TexData	*tp;
	void			*pal_p;

  	gSPDisplayList( pGfx++, init_texture_rectangle_no_LUT );
	for( i = 0, p = tblRecMenu ; i < RECMENU_MODE_MAX ; i ++, p++ ) {
	  	gDPPipeSync( pGfx++ );
		if( i != idMainMenu ) {
		  	if( fRecMenuExist[i] ) {
			  	/* 項目あり */
			  	gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 255, 255 );
			}
			else {
			  	/* 項目なし */
			  	gDPSetPrimColor( pGfx++, 0, 0, 128, 128, 128, 255 );
			}
		}
		else {
			pGfx = SetOKPrimColor0( pGfx );
		}
		tp = &(p->tex);
		if( i == 0 ) pal_p = GetTexBuffPointer( dai_m_color );
		else pal_p = NULL;
		dx = ( RECORD_MAINMENU_WD - tp->width ) / 2 - OX_RECORD_MAINMENU;
		pGfx = kDLTexRect_CI8( pGfx, GetTexBuffPointer( tp->pTex ), pal_p,
				 				xWin + OX_RECORD_MAINMENU + dx, yWin + OY_RECORD_MAINMENU + DY_RECORD_MAINMENU * i,
							 	tp->width, tp->height, (KDL_TEXRECT_FLAG_INIT|KDL_TEXRECT_FLAG_MODULATEPRIM) );
	}
	
  	return( pGfx );
}

/* ==============================================================================================*/
/*
 	データ消去ウィンドウ
*/
static Gfx 	*makeDelMenuGlist( Gfx *pGfx, int xWin, int yWin )
{
	int			i, dx;
	TexData		*tp;
  
	gDPPipeSync( pGfx++ );
	gDPSetPrimColor( pGfx++, 0, 0, 255, 255, 0, 255 );
	tp = &tblClearOk[delDataKind];
#if (LANGUAGE_SW==LG_ENG)
	/* アメリカ版 */
	dx = (RECORD_DELWIN_WD - OX_RECORD_DELMENU_CLROK*2 - tp->width) / 2;
	pGfx = kDLTexRect_CI8_Prim( pGfx, GetTexBuffPointer( tp->pTex ), GetTexBuffPointer( dai_m_color ),
				    xWin + OX_RECORD_DELMENU_CLROK + dx, yWin + OY_RECORD_DELMENU_CLROK,
					tp->width, tp->height, KDL_TEXRECT_FLAG_INIT );
#else
	pGfx = kDLTexRect_CI8_Prim( pGfx, GetTexBuffPointer( tp->pTex ), GetTexBuffPointer( dai_m_color ),
				    xWin + OX_RECORD_DELMENU_CLROK, yWin + OY_RECORD_DELMENU_CLROK,
					tp->width, tp->height, KDL_TEXRECT_FLAG_INIT );
#endif /*LANGUAGE_SW=??*/

	/* かこみ */
	gDPPipeSync( pGfx++ );
  	pGfx = SetOKPrimColor0( pGfx );
	pGfx = kDLTexRect_CI8( pGfx, GetTexBuffPointer( dai_m_markL ), NULL,
				   	xWin + DX_RECORD_DELWIN_KAKOMI, yWin + DY_RECORD_DELWIN_KAKOMI,
					DAI_M_MARKL_W, DAI_M_MARKL_H, 0 );
	pGfx = kDLTexRect_CI8( pGfx, GetTexBuffPointer( dai_m_markR ), NULL,
			   	xWin + DX_RECORD_DELWIN_KAKOMI + DX_RECORD_KAKOMI, yWin + DY_RECORD_DELWIN_KAKOMI,
					DAI_M_MARKR_W, DAI_M_MARKR_H, 0 );
	
	/* YES, NO */
	tp = &tblYesNoClear[idDelMenu];
	dx = (DISP_WD_RECORD_MEMBER - tp->width) / 2;
	pGfx = kDLTexRect_CI8( pGfx, GetTexBuffPointer( tp->pTex ), NULL,
	 	xWin + DX_RECORD_DELWIN_MEMBER + dx, yWin + DY_RECORD_DELWIN_MEMBER,
					tp->width, tp->height, 0 );
	
  	return( pGfx );
}
