
/********************
	csel.c
 ********************/

#include	"ot_header.h"
#include	"ot_letter.h"
#include	"ot_menu.h"
#include	"ot_course.h"
#include	"ko_select.h"
#include	"ko_block.h"
#include	"kn_camera.h"
#include	"sot_mapselect.h"
#include	"ko_abc.h"
#include	"ko_define.h"
#include	"ko_csel.h"
#include	"ko_gsub.h"
#include	"sot_diskproc.h"
#include	"audio/sound.h"
#include	"kn_backup.h"
#include	"kn_wipe.h"
#include	"ko_title.h"
#include	"ko_language.h"


/*******************************************************
	DEFINE
*******************************************************/
#define CSEL_CURSOR_MAX 4
#define CSEL_CUP_SIZE_W 64
#define CSEL_CUP_SIZE_H 96
#define CSEL_CUP_SIZE_H2 64
#define CSEL_CUP_POS_Y1 45
#define CSEL_CUP_POS_Y1_GP 49
#define CSEL_CUP_POS_Y2 85
#define CSEL_ECUP_POS_Y2 170
#define CSEL_CUP_INTERVAL_X3 10
#define CSEL_CUP_INTERVAL_X4 6
#define CSEL_CUP_INTERVAL_X5 (-8)

#define CSEL_LOGO_W 	160
#define CSEL_LOGO2_W 	96
#define CSEL_LOGO_H 	24
#define CSEL_LOGO_POS_X ((SCREEN_WD - CSEL_LOGO_W)/2)
#define CSEL_LOGO2_POS_X ((SCREEN_WD - CSEL_LOGO2_W)/2)
#define CSEL_LOGO_POS_Y 17
#define CSEL_LOGO2_POS_Y 21
#define CSEL_OK_POS_X 267
#define CSEL_OK_POS_Y 208
#define CSEL_ARROW_SIZE_W 32
#define CSEL_ARROW_SIZE_H 32
#define CSEL_ARROW_LR_INTERVAL 170
#define CSEL_ARROW_POS_Y 112

#define CSEL_STAR_SIZE_W 16
#define CSEL_STAR_SIZE_H 16
#define CSEL_STAR_INTERVAL_X (-4)

#define CSEL_BG_OFFSET_X 19
#define CSEL_BG_OFFSET_Y 7
#define CSEL_BG_OFFSET_X2 53
#define CSEL_BG_OFFSET_Y2 4
#define CSEL_HELM_W 64
#define CSEL_HELM_H 64

#define CSEL_TATYPE_START_X 195
#define CSEL_TATYPE_START_Y 45
#define CSEL_TATYPE_OFFSET_Y 20

#define XCUP_START_NUMBER	48

#if (PAL_SW == 1)
#define STAFFGHOST_SELECTABLE_RATIO	138
#else
#define STAFFGHOST_SELECTABLE_RATIO	115
#endif

/*******************************************************
	GRAPHIC
*******************************************************/
extern unsigned short tex_csel_jack[],tex_csel_queen[],tex_csel_king[],
	tex_csel_joker[],tex_csel_edit[],tex_csel_logo[],tex_sel_ok[],
	tex_csel_ya[],tex_csel_estar[],tex_csel_nstar[],
	tex_csel_hstar[],tex_csel_mstar[],tex_csel_staff[],tex_csel_hatena[],
	tex_csel_bg2[],tex_csel_logo2[],tex_csel_mugen[],tex_gsel_back[],
	tex_csel_ghost[],
	tex_csel_ta_type0[],tex_csel_ta_type1[],tex_csel_ta_type2[],
	tex_csel_ta_type3[],tex_csel_ta_type4[];

/*******************************************************
	VARIABLE
*******************************************************/
CselMode csel_mode = CS_CUP_SELECT;
static int		class_cursor = 0 ;
char csel_cursor = 0,csel_cursor2 = 0;
char course_turn_flg = 0;/* ０じゃないときコースマップ回転 */
char ta_type_in_disp = 0;/* 画面上のタイムアタックmodeのカーソル位置 */
char ta_type_max = 1;
char beat_staff_ghost_status = 1;
int old_cc;/* edit course のとき4になるcsel_cursor */
int now_crs_number/* = -1*/;


//static int aaaa = CSEL_BG_OFFSET_X2;
static int aaaa = 64;
//static float f_x = 1.5f,f_y = 1.5f,fff = 1.0f;
//static int b_x = CSEL_LOGO2_POS_X,b_y = CSEL_LOGO2_POS_Y;
//static int d_ = 180;
static int d_ = 0;
static int c1 = 60,c2 = 40,c3 = 70;

#define CSELCUP_TEXLIST(name,size) \
TexBlock TexList_csel_cup_##name[] = {\
	{KBP_COPY ,(unsigned short *)tex_csel_##name,CSEL_CUP_SIZE_W,CSEL_CUP_SIZE_H,  size},\
	{0,(unsigned short *)0,0,0}\
}

#define CSELCUP_TEXLIST2(name,size) \
TexBlock TexList_csel_cup_##name[] = {\
	{KBP_COPY ,(unsigned short *)tex_csel_##name,CSEL_CUP_SIZE_W,CSEL_CUP_SIZE_H2,  size},\
	{0,(unsigned short *)0,0,0}\
}

#if ( LANGUAGE_SW == LG_ZH )
#include "CSEL_CUP_SIZES.inc"
#else
CSELCUP_TEXLIST(jack,1759);
CSELCUP_TEXLIST(queen,1837);
CSELCUP_TEXLIST(king,1848);
CSELCUP_TEXLIST(joker,1748);
CSELCUP_TEXLIST(mugen,1733);
#endif
CSELCUP_TEXLIST2(edit,1155);
CSELCUP_TEXLIST(hatena,1998);


TexBlock *TexLists_cselcups[] = {
	TexList_csel_cup_jack,
	TexList_csel_cup_queen,
	TexList_csel_cup_king,
	TexList_csel_cup_joker,
	TexList_csel_cup_mugen,
	TexList_csel_cup_edit,
	TexList_csel_cup_hatena
};

#if 0
TexBlock TexList_csel_logo[] = {
	{KBP_COPY_S ,(unsigned short *)tex_csel_logo,CSEL_LOGO_W,CSEL_LOGO_H,2848},
	{0,(unsigned short *)0,0,0}
};
#else
TexBlock TexList_csel_logo[] = {
	{KB_I4 ,(unsigned short *)tex_csel_logo,CSEL_LOGO_W,CSEL_LOGO_H,},
	{0,(unsigned short *)0,0,0}
};
#endif
TexBlock TexList_csel_logo2[] = {
	{KB_I4 ,(unsigned short *)tex_csel_logo2,CSEL_LOGO2_W,CSEL_LOGO_H,},
	{0,(unsigned short *)0,0,0}
};

#if ( LANGUAGE_SW == LG_ZH )
TexBlock TexList_csel_ok[] = {
	{KBP_COPY ,(unsigned short *)tex_sel_ok,32,16,
#include "OK_SIZE.inc"
},
	{0,(unsigned short *)0,0,0}
};
#else
TexBlock TexList_csel_ok[] = {
	{KBP_COPY ,(unsigned short *)tex_sel_ok,32,16,274},
	{0,(unsigned short *)0,0,0}
};
#endif


TexBlock TexList_csel_arrow[] = {
	{KBP_COPY ,(unsigned short *)tex_csel_ya,32,32,288},
	{0,(unsigned short *)0,0,0}
};

#if 1
/* ヘルメット */
TexBlock TexList_csel_back2[] = {
	//{KB_COPY ,(unsigned short *)tex_csel_bg,320,240,},
	{KBP_COPY ,(unsigned short *)tex_csel_bg2,64,64,2536},
	{0,(unsigned short *)0,0,0}
};
TexBlock TexList_csel_back3[] = {
	{KBP_COPY,(unsigned short *)title_TX,304,240, TITLE1_PRESS_SIZE},
	//{KBP_COPY,(unsigned short *)tex_gsel_back,304,240, 60216},
	{0,(unsigned short *)0,0,0}
};

TexBlock TexList_csel_back3_2[] = {
	{KBP_COPY,(unsigned short *)title_TX2,320,240, TITLE2_PRESS_SIZE},
	{0,(unsigned short *)0,0,0}
};

TexBlock TexList_csel_back3_3[] = {
	{KBP_COPY ,(unsigned short *)title_TX3,  320,  240,  TITLE3_PRESS_SIZE},
	{0,(unsigned short *)0,0,0}//endcode
};

TexBlock *TexList_cselback3s[] = {
	TexList_csel_back3,
	TexList_csel_back3_2,
	TexList_csel_back3_3
};

#endif

#define CSELSTAR_TEXLIST(name,size) \
TexBlock TexList_csel_##name[] = {\
	{KBP_COPY ,(unsigned short *)tex_csel_##name,CSEL_STAR_SIZE_W,CSEL_STAR_SIZE_H,  size},\
	{0,(unsigned short *)0,0,0}\
}

CSELSTAR_TEXLIST(estar,117);
CSELSTAR_TEXLIST(nstar,117);
CSELSTAR_TEXLIST(hstar,118);
CSELSTAR_TEXLIST(mstar,117);

TexBlock *TexLists_cselstars[] = {
	TexList_csel_estar,
	TexList_csel_nstar,
	TexList_csel_hstar,
	TexList_csel_mstar
};

TexBlock TexList_csel_ghost[] = {
	{KB_I4 ,(unsigned short *)tex_csel_ghost,32,16,},
	{0,(unsigned short *)0,0,0}
};

TexBlock TexList_csel_staff[] = {
	{KBP_COPY ,(unsigned short *)tex_csel_staff,16,16,117},
	{0,(unsigned short *)0,0,0}
};

#define CSELTATYPE_TEXLIST(name)\
TexBlock TexList_csel_ta_type##name[] = {\
	{KB_I4 ,(unsigned short *)tex_csel_ta_type##name,64,16,},\
	{0,(unsigned short *)0,0,0}\
}

CSELTATYPE_TEXLIST(0);
CSELTATYPE_TEXLIST(1);
CSELTATYPE_TEXLIST(2);
CSELTATYPE_TEXLIST(3);
CSELTATYPE_TEXLIST(4);

TexBlock *TexLists_cseltatypes[] = {
	TexList_csel_ta_type0,
	TexList_csel_ta_type1,
	TexList_csel_ta_type2,
	TexList_csel_ta_type3,
	TexList_csel_ta_type4
};

int course_map_colors[18] = {
	MAP_COLOR_JACK_R,MAP_COLOR_JACK_G,MAP_COLOR_JACK_B,
	MAP_COLOR_QUEEN_R,MAP_COLOR_QUEEN_G,MAP_COLOR_QUEEN_B,
	MAP_COLOR_KING_R,MAP_COLOR_KING_G,MAP_COLOR_KING_B,
	MAP_COLOR_JOKER_R,MAP_COLOR_JOKER_G,MAP_COLOR_JOKER_B,
	MAP_COLOR_EDIT_R,MAP_COLOR_EDIT_G,MAP_COLOR_EDIT_B,
	MAP_COLOR_EDIT_R,MAP_COLOR_EDIT_G,MAP_COLOR_EDIT_B
};

char *course_comments[] = {
#if (LANGUAGE_SW == LG_JPN)
	"エイトロード","ハイスピード","パイプ",
	"スクリュー","シリンダー","ハイジャンプ",
	"ロールオーバー","ジャンプジャンプ","アップダウン",
	"テクニカル","クイックターン","ステップアップロード",
	"ジグザグジャンプ","ウェーブロード","ムーンサルト",
	"スリムライン","ハーフパイプ","クランククランク",
	"レインボーロード","ミラーロード","シリンダー&ハイジャンプ",
	"ウェーブパニック","スネークロード","ビッグハンド",
#endif
#if (LANGUAGE_SW == LG_ENG  )
	"FIGURE EIGHT","HIGH SPEED","PIPE",
	"CORKSCREW","CYLINDER","HIGH JUMP",
	"INVERTED LOOP","MULTI JUMP","UP AND DOWN",
	"TECHNIQUE","QUICK TURN","DANGEROUS STEPS",
	"ZIG-ZAG JUMP","WAVY ROAD","DOUBLE SOMERSAULT",
	"SLIM LINE","HALF PIPE","JUMPS OF DOOM",
	"PSYCHEDELIC EXPERIENCE","MIRROR ROAD","CYLINDER & HIGH JUMP",
	"WAVE PANIC","SNAKE ROAD","DEADLY CURVES",
#endif
#if (LANGUAGE_SW == LG_ZH ) // XXX
	"FIGURE EIGHTZH","HIGH SPEEDZH","PIPEZH",
	"CORKSCREW","CYLINDER","HIGH JUMP",
	"INVERTED LOOP","MULTI JUMP","UP AND DOWN",
	"TECHNIQUE","QUICK TURN","DANGEROUS STEPS",
	"ZIG-ZAG JUMP","WAVY ROAD","DOUBLE SOMERSAULT",
	"SLIM LINE","HALF PIPE","JUMPS OF DOOM",
	"PSYCHEDELIC EXPERIENCE","MIRROR ROAD","CYLINDER & HIGH JUMP",
	"WAVE PANIC","SNAKE ROAD","DEADLY CURVES",
#endif
	"","","","","","",""
};

/* どちら向きの変換にもこのテーブルが使える */
char tat_chart[5] = {
	TA_GHOST_ON,
	TA_GHOST_OFF,
	TA_STAFF_GHOST,
	TA_PRO_GHOST,
	TA_CHAMP_GHOST
};



void SetTimeAttackTypeMax(void)
{
	GhostInfo pInfo;
	int staff_time,player_time;

	/* 毎フレーム、ＳＲＡＭにアクセスしないための処理 */
	if (now_crs_number == crs_number)
		return;

	beat_staff_ghost_status = 0;
	if (romGetDataGhostInfo(&pInfo,crs_number))
		ta_type_max = 1;
	else{/* スタッフゴーストの115%より早いとき(PALは115*1.2=138%) */
		staff_time = pInfo.goalTime;
		player_time = course_BF[crs_number].best_time[0];
		if (staff_time*STAFFGHOST_SELECTABLE_RATIO/100 > player_time)
			ta_type_max = 2;
		else
			ta_type_max = 1;
		if (staff_time > player_time)
			beat_staff_ghost_status = 1;
	}
	// HACK!
	beat_staff_ghost_status = 1;
	ta_type_max = 2;

	now_crs_number = crs_number;
}

void SetCourseNamesPtr(void)
{
	//if (crs_number >= XCUP_START_NUMBER)
	//	course_names_ptr = course_names[30];
	//else
		course_names_ptr = course_names[crs_number];
}

/******************************************************************************
	INITIATE MAIN PROCESS
******************************************************************************/
void init_csel( void )
{
	int i,j,k;
	/***********************************************************************
		INITIATE ETC
	***********************************************************************/
	next_fbuffer_mode = 3 ;

#ifdef DISK_FLAG
	csel_mode = CS_CUP_SELECT;/* コード転送時に代入されてるので省略 */
#endif
	ta_type_in_disp = tat_chart[time_attack_type];
	now_crs_number = -1;

	if (loop_kind == LOOP_KIND_CSEL)
		k = crs_number_buf;
	else/* (loop_kind == LOOP_KIND_CSEL_RECORD) */
		k = crs_number_buf_record;

	if (k >= XCUP_START_NUMBER){
		csel_cursor = 4;
		csel_cursor2 = 0;
		crs_number = XCUP_START_NUMBER;
	}
	else{
		csel_cursor2 = k%6;
		if (k >= 24)
			csel_cursor = 10;
		else
			csel_cursor = k/6;
		crs_number = k;
	}

	SetTimeAttackTypeMax();

	/* csel_cursorの値が不正のとき補正 */
#ifndef RMASTER_FLAG
	if (csel_cursor < 10)
#endif
	{
		int jo_st_cushion;/* joker_statusを0,1,2にする緩衝剤 */

		jo_st_cushion = joker_status;
		if ((jo_st_cushion >=3)||command_status)
			jo_st_cushion = 2;
		if (jo_st_cushion + 2 < csel_cursor)
			csel_cursor = jo_st_cushion + 2;
	}
	if ((csel_cursor == 4)&&((loop_kind == LOOP_KIND_CSEL_RECORD)||(game_mode == GM_TA)))
		csel_cursor = 3;

	if (csel_cursor >= 10)
		old_cc = 4;
	else{
		if (csel_cursor == 4)
			old_cc = 5;
		else
			old_cc = csel_cursor;
	}

	init_camera() ;
	SetOBJBlock(KO_GDL_INIT,0,0,1);/* 安全のため */
	SetOBJBlock(KO_CSEL_BACK,0,0,2);
	if (loop_kind != LOOP_KIND_CSEL_RECORD){
		i = CSEL_LOGO_POS_X;
		j = CSEL_LOGO_POS_Y;
	}
	else{
		i = CSEL_LOGO2_POS_X;
		j = CSEL_LOGO2_POS_Y;
	}
	SetOBJBlock(KO_CSEL_LOGO,i,j,4);
	SetOBJBlock(KO_CSEL_OK,0,0,10);
	SetOBJBlock(KO_CSEL_COURSE,0,0,8);
#ifndef RMASTER_FLAG
	//if ((loop_kind != LOOP_KIND_CSEL_RECORD)&&Check_DDFZ_Seq())
		SetOBJBlock(KO_CSEL_EDIT,0,(SCREEN_WD - CSEL_CUP_SIZE_W)/2,300);
#endif
	if ((command_status||(joker_status >= 2))&&(loop_kind != LOOP_KIND_CSEL_RECORD)&&(game_mode != GM_TA))
		SetOBJBlock(KO_CSEL_MUGEN,0,-100,6);
	if ((joker_status >= 1)||command_status)
		SetOBJBlock(KO_CSEL_JOKER,0,-100,6);
	SetOBJBlock(KO_CSEL_KING,0,-100,6);
	SetOBJBlock(KO_CSEL_QUEEN,0,-100,6);
	SetOBJBlock(KO_CSEL_JACK,0,-100,6);
#ifdef MASTER_FLAG
	if (game_mode != GM_GP)
#endif
		SetOBJBlock(KO_CSEL_ARROW,0,0,8);
	SetOBJBlock(KO_CSEL_COURSE_NAME,0,0,8);

	switch(game_mode){
	case GM_TA:
		if (loop_kind != LOOP_KIND_CSEL_RECORD)
			SetOBJBlock(KO_CSEL_TA_TYPE,0,0,10);
	case GM_RECORD:
		SetOBJBlock(KO_CSEL_GHOST,190,160,10);
		break;
	}

	/***********************************************************************
		ENTRY MENU
	***********************************************************************/
#if KO_FLAG
#if MENU_SW
	entry_menu( 0, 30,3, "A", 37,3, MENU_TYPE_INT  , 4,0, &aaaa, &int_min    , &int_max   ) ;
	entry_menu( 0, 30,4, "A", 37,4, MENU_TYPE_INT  , 4,0, &d_, &int_min    , &int_max   ) ;
	entry_menu( 0, 30,5, "R", 37,5, MENU_TYPE_INT  , 4,0, &c1, &int_min    , &int_max   ) ;
	entry_menu( 0, 30,6, "G", 37,6, MENU_TYPE_INT  , 4,0, &c2, &int_min    , &int_max   ) ;
	entry_menu( 0, 30,7, "B", 37,7, MENU_TYPE_INT  , 4,0, &c3, &int_min    , &int_max   ) ;
#if 0
	entry_menu( 0, 30,8, "BX", 37,8, MENU_TYPE_INT  , 4,0, &b_x, &int_min    , &int_max   ) ;
	entry_menu( 0, 30,9, "BY", 37,9, MENU_TYPE_INT  , 4,0, &b_y, &int_min    , &int_max   ) ;
	entry_menu( 0, 30,6, "F", 34,6, MENU_TYPE_FLOAT  , 2,2, &fff, &float_min    , &float_max   ) ;
	entry_menu( 0, 30,4, "FX", 34,4, MENU_TYPE_FLOAT  , 2,2, &f_x, &float_min    , &float_max   ) ;
	entry_menu( 0, 30,5, "FY", 34,5, MENU_TYPE_FLOAT  , 2,2, &f_y, &float_min    , &float_max   ) ;
#endif
/*	entry_menu( 0, 12,0, "RND", 19,0, MENU_TYPE_INT  , 4,0, &part_rand, &int_0    , &int_max   ) ;*/
/*	entry_menu( 0, 12,1, "ACC", 19,1, MENU_TYPE_FLOAT, 2,2, &part_acc , &float_min, &float_max ) ;*/
#endif
#endif
}


void init_csel_gp( void )
{
	/***********************************************************************
		INITIATE ETC
	***********************************************************************/
	next_fbuffer_mode = 3 ;

	csel_mode = CS_GP;
	if (crs_number >= XCUP_START_NUMBER){
		csel_cursor = 4;
		csel_cursor2 = crs_number % 6;
	}
	else{
		csel_cursor2 = crs_number%6;
		if (crs_number >= 24)
			csel_cursor = 10;
		else
			csel_cursor = crs_number/6;
	}

	SetCourseNamesPtr();

	if (csel_cursor >= 10)
		old_cc = 4;
	else{
		if (csel_cursor == 4)
			old_cc = 5;
		else
			old_cc = csel_cursor;
	}

	init_camera() ;
	SetOBJBlock(KO_GDL_INIT,0,0,1);/* 安全のため */
	SetOBJBlock(KO_CSEL_BACK,0,0,2);
	//SetOBJBlock(KO_CSEL_LOGO,CSEL_LOGO_POS_X,CSEL_LOGO_POS_Y,4);
	SetOBJBlock(KO_CSEL_COURSE,0,0,8);
	if (csel_cursor >= 10)
		SetOBJBlock(KO_CSEL_EDIT,0,-100,6);
	else
		SetOBJBlock(KO_CSEL_JACK+csel_cursor,0,-100,6);
	SetOBJBlock(KO_CSEL_COURSE_NAME,0,0,8);


	/***********************************************************************
		ENTRY MENU
	***********************************************************************/
	#if MENU_SW
#if 0
	entry_menu( 0, 30,3, "A", 37,3, MENU_TYPE_INT  , 4,0, &a, &int_min    , &int_max   ) ;
#endif
	#endif
}


/******************************************************************************
	MOVE MAIN PROCESS
******************************************************************************/
int move_csel( void )
{
	int csel_cursor_old;
	int ec_flg;/* エディターコース選択可能フラグ */

#ifndef RMASTER_FLAG
	if (/*(loop_kind != LOOP_KIND_CSEL_RECORD)&&*/(Get_OBJBlock_ptr(KO_CSEL_EDIT)))
	//if ((loop_kind != LOOP_KIND_CSEL_RECORD)&&Check_DDFZ_Seq())
		ec_flg = 1;
	else
#endif
		ec_flg = 0;

	/***********************************************************************
		CAMERA MATRIX
	***********************************************************************/
	move_camera() ;
	if (wipeStatus != WIPE_STATUS_END)/* Wipe中はキー入力受け付けない */
		return ( loop_kind );
	if ((game_mode == GM_TA)&&(loop_kind != LOOP_KIND_CSEL_RECORD))
		SetTimeAttackTypeMax();


	ko_SetContData(&all_cont);

#ifndef MASTER_FLAG
	if (new_button & CONT_L){
		if ((game_mode == GM_GP)&&(csel_cursor < 4)){
			cup_status[csel_cursor]++;
			cup_status[csel_cursor] %= 5;
		}
	}
#endif

	switch(csel_mode){
	case CS_CUP_SELECT:
		course_turn_flg = 1;
		csel_cursor_old = csel_cursor;
		if (ec_flg){/* ディスク有るときだけカーソル上下移動可能 */
			if (new_button & CONT_DOWN){
				if (csel_cursor < 10)
					csel_cursor += 10;
			}
			else{
				if (new_button & CONT_UP){
					if (csel_cursor >= 10)
						csel_cursor -= 10;
				}
			}
		}
		if (csel_cursor < 10){
			if (new_button & CONT_LEFT){
				if (csel_cursor > 0)
					csel_cursor--;
			}
			if (new_button & CONT_RIGHT){
				if (csel_cursor < CSEL_CURSOR_MAX){
					csel_cursor++;
				}
			}
			{
				int jo_st_cushion;/* joker_statusを0,1,2にする緩衝剤 */

				jo_st_cushion = joker_status;
				if ((jo_st_cushion >=3)||command_status)
					jo_st_cushion = 2;
				if (jo_st_cushion + 2 < csel_cursor)
					csel_cursor = jo_st_cushion + 2;
			}
			if ((csel_cursor == 4)&&((loop_kind == LOOP_KIND_CSEL_RECORD)||(game_mode == GM_TA)))
				csel_cursor = 3;
		}

		if (csel_cursor >= 10)
			old_cc = 4;
		else{
			if (csel_cursor == 4)
				old_cc = 5;
			else
				old_cc = csel_cursor;
		}

		if (csel_cursor_old != csel_cursor){
			csel_cursor2 = 0;
			//(Get_OBJBlock_ptr(KO_CSEL_COURSE))->disp_x = 0;
			if (old_cc < 5)
				setup_mapdatas_with_wait(old_cc);
#if SOUND_SW
			Na_SystemSE_Start(SE_CURSOL);
			//Na_PlyTrgSE_Start(i,SE_CURSOL);
#endif
		}
		if (csel_cursor < 10)
			gp_cup = csel_cursor;
		else
			gp_cup = GP_CUP_EDIT;

		/* crs_numberの設定 */
		if (csel_cursor >= 10)
			crs_number = 4*6 + csel_cursor2;
		else{
			if (csel_cursor == 4)
				crs_number = XCUP_START_NUMBER;
			else
				crs_number = csel_cursor*6 + csel_cursor2;
		}

		if ( new_button_trg & CONT_CANCEL ){
#if SOUND_SW
			Na_SystemSE_Start(SE_CANCEL);
			//Na_PlyTrgSE_Start(i,SE_CANCEL);
#endif
			if (loop_kind == LOOP_KIND_CSEL){
				crs_number_buf = crs_number;
				csel_mode = CS_GSEL_OUT;
				//return(LOOP_KIND_GSEL);
			}
			else{/* (loop_kind == LOOP_KIND_CSEL_RECORD) */
				crs_number_buf_record = crs_number;
				csel_mode = CS_CUP_SELECT2;
				SEQUENCE_CHANGE(SEQUENCE_CHANGE_RECORD2GSEL);
			}
		}
		else{
			if (new_button_trg & CONT_DECIDE){
#if SOUND_SW
				Na_SystemSE_Start(SE_DECIDE);
				//Na_PlyTrgSE_Start(i,SE_DECIDE);
#endif
				if (csel_cursor == 4){
					//crs_number = XCUP_START_NUMBER;
					csel_cursor2 = 0;
					csel_mode = CS_OK;
				}
				else{
					if (game_mode == GM_GP){
						if (csel_cursor >= 10)
							crs_number = 4*6;
						else
							crs_number = csel_cursor*6;
						csel_cursor2 = 0;
						csel_mode = CS_OK;
					}
					else
						csel_mode = CS_COURSE_SELECT;
#ifndef MASTER_FLAG
					if (all_cont.hold & CONT_R)
						csel_mode = CS_COURSE_SELECT;
#endif
				}
				(Get_OBJBlock_ptr(KO_CSEL_COURSE))->disp_x = 400 - csel_cursor2*SC_WD;
			}
		}
		break;
	case CS_COURSE_SELECT:
		course_turn_flg = 1;

		if ((game_mode == GM_TA)&&(loop_kind != LOOP_KIND_CSEL_RECORD)){
			char old_ta_type;
			int tat_max_buff;

#ifndef MASTER_FLAG
			if (all_cont.hold & (CONT_L))
				tat_max_buff = 2;
			else
#endif
				tat_max_buff = ta_type_max;

			old_ta_type = ta_type_in_disp;
			if (new_button & CONT_UP){
				if (ta_type_in_disp > 0)
					ta_type_in_disp--;
			}
			if (new_button & CONT_DOWN){
				if (ta_type_in_disp < tat_max_buff)
					ta_type_in_disp++;
			}
#if SOUND_SW
			if (old_ta_type != ta_type_in_disp){
				Na_SystemSE_Start(SE_CURSOL);
				//Na_PlyTrgSE_Start(i,SE_CURSOL);
			}
#endif
			if (ta_type_in_disp > tat_max_buff)
				ta_type_in_disp = 0;
			  
			time_attack_type = tat_chart[ta_type_in_disp];
		}

		if (new_button & CONT_LEFT){
			if (csel_cursor2 > 0){
				csel_cursor2--;
				camera[0].demo_id = 1;
				(Get_OBJBlock_ptr(KO_CSEL_ARROW))->pattern += 512;
#if SOUND_SW
				Na_SystemSE_Start(SE_CURSOL);
				//Na_PlyTrgSE_Start(i,SE_CURSOL);
#endif
			}
		}
		if (new_button & CONT_RIGHT){
			if (csel_cursor2 < 5){
				csel_cursor2++;
				camera[0].demo_id = 1;
				(Get_OBJBlock_ptr(KO_CSEL_ARROW))->pattern2 += 512;
#if SOUND_SW
				Na_SystemSE_Start(SE_CURSOL);
				//Na_PlyTrgSE_Start(i,SE_CURSOL);
#endif
			}
		}

		/* 毎フレームcrs_numberに値を入れる */
		if (csel_cursor >= 10)
			crs_number = 4*6 + csel_cursor2;
		else
			crs_number = csel_cursor*6 + csel_cursor2;

		if ( new_button_trg & CONT_CANCEL ){
			csel_mode = CS_CUP_SELECT;
#if SOUND_SW
			Na_SystemSE_Start(SE_CANCEL);
			//Na_PlyTrgSE_Start(i,SE_CANCEL);
#endif
		}
		else{
			if (new_button_trg & CONT_DECIDE){
#if SOUND_SW
				Na_SystemSE_Start(SE_DECIDE);
				//Na_PlyTrgSE_Start(i,SE_DECIDE);
#endif
				csel_mode = CS_OK;
				course_turn_flg = 0;
			}
		}
		break;
	case CS_OK:
		if (new_button_trg & CONT_CANCEL){
			if ((game_mode == GM_GP)||(csel_cursor == 4))
				csel_mode = CS_CUP_SELECT;
			else
				csel_mode = CS_COURSE_SELECT;
#if SOUND_SW
			Na_SystemSE_Start(SE_CANCEL);
			//Na_PlyTrgSE_Start(i,SE_CANCEL);
#endif
			break;
		}
		else{
			if (new_button_trg & CONT_DECIDE){
#if SOUND_SW
				Na_SystemSE_Start(SE_KETTEI);
				//Na_PlyTrgSE_Start(i,SE_DECIDE);
#endif
				csel_mode = CS_OK2;
				if (loop_kind == LOOP_KIND_CSEL){
					crs_number_buf = crs_number;
					return ( LOOP_KIND_MSEL1 );
				}
				else{/* (loop_kind == LOOP_KIND_CSEL_RECORD) */
					crs_number_buf_record = crs_number;
					return ( LOOP_KIND_RECORD );
				}
			}
		}
		break;
	case CS_CUP_SELECT2:/* CS_CUP_SELECTでBボタンを押したときは何もできない */
	case CS_OK2:/* OK選択後は何もできない */
		break;
	case CS_GSEL_OUT:
		if (new_button_trg & CONT_DECIDE){
#if SOUND_SW
			Na_SystemSE_Start(SE_DECIDE);
#endif
			csel_mode = CS_CUP_SELECT;
		}
		break;
	case CS_GSEL_OUT2:
		if (!loop_kind_changing_flg)
			SEQUENCE_CHANGE(SEQUENCE_CHANGE_CSEL2GSEL);
		break;
	default:
		break;
	}

	SetCourseNamesPtr();

	return(loop_kind);

}


int move_csel_gp( void )
{
	/***********************************************************************
		CAMERA MATRIX
	***********************************************************************/
	move_camera() ;


	ko_SetContData(&all_cont);

	course_turn_flg = 1;
	switch(csel_mode){
	case CS_GP:
		if (new_button_trg & CONT_DECIDE){
			csel_mode = CS_GP2;
#if SOUND_SW
			Na_SystemSE_Start(SE_KETTEI);
			//Na_PlyTrgSE_Start(i,SE_DECIDE);
#endif
			return(LOOP_KIND_MSEL2_GP);
		}
		break;
	case CS_GP2:/* OK選択後は何もできない */
		break;
	}
	return(loop_kind);

}


/******************************************************************************
	MAKE MAIN PROCESS GRAPHIC LIST
******************************************************************************/
Gfx *make_csel_glist( Gfx *gp )
{
	gp = doOBJBlock(gp);
#if 0
	gDPSetPrimColor(gp++,0,0,255,255,255,255);
	gp = SetWord3(gp,50,100,"a'b'c'd'e'f'g'h'i'j'k'l'm'n'a",d_);
	gp = SetWord3(gp,50,120,"opqrstuvwzo",d_);
	gp = SetWord3(gp,50,140,"0'1.2,34567890",d_);
	gp = SetWord6_R(gp,250,60,"abcdefghijklmna",d_);
	gp = SetWord6_R(gp,250,75,"opqrstuvwxyzＡＢo",d_);
	gp = SetWord6_R(gp,250,90,"0'1.2,3\"4567890に&-",d_);
	gp = SetWord6_R(gp,250,105,"zyxwvutsrqpoＢＡ",d_);
	gp = SetWord2(gp,50,170,"a,b.c-defghijklmna",d_);
	gp = SetWord2(gp,50,180,"opqrstuvwzo",d_);
	gp = SetWord2(gp,50,190,"0'1.2,34567890",d_);
	gDPSetPrimColor(gp++,0,0,255,255,255,255);
	gp = SetWord5(gp,50,20,"Ｐ1",d_);
	gp = SetWord5(gp,50,40,"Ｐ2",d_);
	gp = SetWord5(gp,50,60,"Ａ3",d_);
	gp = SetWord5(gp,50,80,"Ａ4",d_);
	gp = SetWord5(gp,50,120,"Ｐ2012345v67890",d_);
	gp = SetWord5(gp,50,140,"(012)(9)",d_);
	gp = SetWord5(gp,50,160,"1Ｓ2Ｎ3Ｒ4Ｔ+5$ＵＤ0",d_);
	gp = SetWord4(gp,50,170,"012'23\"0&1＆23-45+67$89",d_);
	gp = SetWord5(gp,50,100,"ＥＭＰ1Ｃ",d_);

	gDPSetPrimColor(gp++,0,0,255,255,255,255);
	gp = SetWord3z(gp,100,120,"ab.cd*e0123fghijk",d_,1.0,1.0);
	gp = SetWord3z(gp,100,140,"hijkl45:67mnopq",d_,1.0,1.0);
	gp = SetWord3z(gp,100,160,"opqrs89'tuvw",d_,1.0,1.0);
	gp = SetWord3(gp,100,200,"vwxyzＡＢＣabc",d_);
	gp = SetWord3z(gp,100,180,"mute city",d_,1.0,1.0);
	gp = SetWord4(gp,50,110,"01'23\"0&1＆23-45+67$89",0);
	gp = SetWord4(gp,50,120,"アイィウエェオカキクケコサシスセソ",0);
	gp = SetWord4(gp,50,130,"タチッツテトナニヌネノハヒフヘホ",0);
	gp = SetWord4(gp,50,140,"マミムメモヤユヨャュョラリルレロ",0);
	gp = SetWord4(gp,50,150,"ワヲンガギグゲゴザジズゼゾダヂヅデド",0);
	gp = SetWord4(gp,50,160,"バビブベボパーピプペーポ",0);
	{/* 文字コードを調べるルーチン */
		char poipoi[] = "＆";
		osSyncPrintf("%x,%x,%x\n",poipoi[0],poipoi[1],poipoi[2]);
	}

	gp = SetWord4(gp,100,200,"ead ead mm",1);
	gp = SetWord4z(gp,100,200,"ead ead mm",1,2.0,2.0);
	gp = SetWord4(gp,100,140,"01'23\"0123456789",0);
	gp = SetWord4(gp,100,150,"ead ead mm ダイナンチャラー",1);
	gp = SetWord4(gp,100,160,"1Ｓ2ｎ3Ｒ4Ｔ",0);
#endif

	return ( gp ) ;
}

void SOB_csel_back(OBJBlock *ptr)
{
	int size;
	TexBlock *tb_ptr;

#if 0
	if (joker_status >= 3)
		ptr->pattern = 1;
	else/* (ptr->pattern == 0) */
		ptr->disp_x = 8;
#endif

	ptr->pattern = title_status;
	tb_ptr = TexList_cselback3s[ptr->pattern];
	TexBuffLoad(tb_ptr);
	if (ptr->pattern == 0)
		ptr->disp_x = 8;

	if (loop_kind == LOOP_KIND_CSEL_RECORD){
		TexBuffLoad(TexList_csel_back2);
		if (!ptr->pattern)
			size = 304*240*2;
		else
			size = 320*240*2;
		GrayScale_tex_buff_RGB(GetTexBuffPointer(tb_ptr->tex_data_ptr),
							   size,135,135,255);
	}
}

void SOB_csel_course(void)
{
	int i;
	init_mapselect();
	if (old_cc < 5){
	  	extern int nextCupNum;
	  	extern int setup_mapdata_flag;
		extern void setup_mapdatas(int);

		setup_mapdatas_with_wait(old_cc);
		setup_mapdata_flag-=2;
		for (i = 0;i < 6;i++){
			setup_mapdatas(nextCupNum);
			setup_mapdata_flag--;
		}
	}
}

void SOB_csel_cup(OBJBlock *ptr)
{
	int i,num;

	num = ptr->kind - KO_CSEL_JACK;
	switch(num){
	case 3:
	case 4:/* ?を表示させるためのおまじない(今は要らないかも) */
		{
			int jo_st_cushion;/* joker_statusを0,1,2にする緩衝剤 */

			jo_st_cushion = joker_status;
			if ((jo_st_cushion >=3)||command_status)
				jo_st_cushion = 2;

			if (num - 2 > jo_st_cushion)
				num = 6;
		}
		break;
	}
	TexBuffLoad(TexLists_cselcups[num]);
	for (i = 0;i < 4;i++)
		TexBuffLoad(TexLists_cselstars[i]);

	if (loop_kind_changing_flg == 33){
		ptr->work1 = 12;
	}
	ptr->disp_x = (SCREEN_WD - CSEL_CUP_SIZE_W)/2;
	ptr->disp_y = CSEL_CUP_POS_Y2;
}

void SOB_csel_logo(OBJBlock *ptr)
{
	if (loop_kind != LOOP_KIND_CSEL_RECORD){
		TexBuffLoad(TexList_csel_logo);
		//if (loop_kind_changing_flg == 23)
			ptr->work1 = 12;
	}
	else{
		TexBuffLoad(TexList_csel_logo2);
	}
}

void SOB_csel_ok(OBJBlock *ptr)
{
	TexBuffLoad(TexList_csel_ok);
	ptr->disp_x = 50;
}

void SOB_csel_arrow(OBJBlock *ptr)
{
	TexBuffLoad(TexList_csel_arrow);
	ptr->pattern = 128;/* くるくる回す角速度の設定 */
	ptr->pattern2 = 128;
}

void SOB_csel_ghost(OBJBlock *ptr)
{
	GhostInfo pInfo;
	int check;

	check = 0;

	if (bakGetDataGhostInfo( &pInfo ))
		ptr->kind = 0;
	if (!pInfo.courseID)
		ptr->kind = 0;
	ptr->disp_x += ((pInfo.courseNumber%6)*SCREEN_WD);
	ptr->pattern = pInfo.courseNumber;
	TexBuffLoad(TexList_csel_ghost);
}

void SOB_csel_ta_type(OBJBlock *ptr)
{
	int i;

	TexBuffLoad(TexList_csel_staff);
	for (i = 0;i < 5;i++)
		TexBuffLoad(TexLists_cseltatypes[i]);
	ptr->disp_x = 150;
}

Gfx *DispOB_Sub_csel_back(Gfx *gdl,OBJBlock *ptr)
{
	int x,y;
	TexBlock *tb_ptr;

	if (loop_kind != LOOP_KIND_CSEL_RECORD){
		//gdl = FillFullScreen(gdl,0,0,0);
		gDPSetPrimColor(gdl++,0,0,75,75,75,180);
		gdl = doTexList_p(gdl,TexList_cselback3s[ptr->pattern],
						  ptr->disp_x,ptr->disp_y);
		
		//gdl = FillRect1Color_f(gdl,0+8,0,304+8,240, 0,0,0,180);
	}
	else{
		tb_ptr = TexList_csel_back2;
		x = CSEL_BG_OFFSET_X2;
		y = CSEL_BG_OFFSET_Y2;
#if 0
		gDPSetPrimColor(gdl++,0,0,
						255-(255-c1)*d_/255,
						255-(255-c2)*d_/255,
						255-(255-c3)*d_/255,
						180);
		gdl = doTexList_p(gdl,TexList_cselback3s[ptr->pattern],
						  ptr->disp_x,ptr->disp_y);
#else
		gdl = doTexList(gdl,TexList_cselback3s[ptr->pattern],
						ptr->disp_x,ptr->disp_y);
#endif
		//gdl = FillRect1Color_f(gdl,0+8,0,304+8,240, 0,0,50,180);
		gdl = doTexList_f(gdl,tb_ptr,x,y,1,0);
		gdl = doTexList(gdl,tb_ptr,SCREEN_WD-CSEL_HELM_W-x,y);
	}
	return(gdl);
	
}

Gfx *DispOB_Sub_csel_course(Gfx *gdl,OBJBlock *ptr)
{
	switch(csel_mode){
	case CS_CUP_SELECT:
	case CS_CUP_SELECT2:
		break;
	case CS_COURSE_SELECT:
	case CS_OK:
	case CS_OK2:
	case CS_GP:
	case CS_GP2:
		if (old_cc < 5)
			gdl = make_mapselect_glist(gdl);
		break;
	}
	return(gdl);
}

Gfx *DispOB_Sub_csel_cup(Gfx *gdl,OBJBlock *ptr)
{
	int num,i,star,cup_num,prim,y;
#ifdef DISK_FLAG
	int uy,dy;
#endif

	num = ptr->kind - KO_CSEL_JACK;
	if (csel_cursor >= 10)
		cup_num = 5;
	else
		cup_num = csel_cursor;
	if (cup_num == num){
		if ((csel_mode == CS_CUP_SELECT)||(csel_mode == CS_CUP_SELECT2)){
			i = main_count%30;
			if (i >= 15)
				i = 30-i;
			/* 選択、決定前 */
#if 0
			gDPSetPrimColor(gdl++,0,0,255,255,255,255-i*5);/* 半透明 */
#else
			gDPSetPrimColor(gdl++,0,0,255-i*5,255-i*5,255-i*5,255);/* 不透明 */
#endif
		}
		else{/* 選択,決定後 */
			gDPSetPrimColor(gdl++,0,0, 255,255,255,255);
		}
	}
	else{/* 非選択時 */
#ifdef DISK_FLAG
		if (cup_num == 5){
			if (game_mode == GM_GP)
				uy = CSEL_CUP_POS_Y1_GP;
			else
				uy = CSEL_CUP_POS_Y1;
			dy = CSEL_CUP_POS_Y2;
			prim = 300*(ptr->disp_y-uy)/(dy-uy);
			if (prim > 255)
				prim = 255;
		}
		else
			prim = 255;
		gDPSetPrimColor(gdl++,0,0, 100,100,100,prim);
#else
#if 0
		gDPSetPrimColor(gdl++,0,0, 255,255,255,100);
#else
		gDPSetPrimColor(gdl++,0,0, 100,100,100,255);
#endif
#endif
	}

	switch(csel_mode){
	case CS_GSEL_OUT:
	case CS_GSEL_OUT2:
		ptr->work1++;
		if (ptr->work1 > 12){
			csel_mode = CS_GSEL_OUT2;
			ptr->work1 = 12;
		}
		break;
	default:
		if (ptr->work1 > 0)
			ptr->work1--;
		break;
	}
	if (ptr->work1 < 0)
		ptr->work1 = 0;

	y = ptr->work1*ptr->work1*3/2;

	star = cup_status[num];
	switch(num){
	case 3:
	case 4:/* ?を表示させるためのおまじない(今は要らないかも) */
		{
			int jo_st_cushion;/* joker_statusを0,1,2にする緩衝剤 */

			jo_st_cushion = joker_status;
			if ((jo_st_cushion >=3)||command_status)
				jo_st_cushion = 2;

			if (num - 2 > jo_st_cushion)
				num = 6;
		}
		break;
	}
	gdl = doTexList_p(gdl,TexLists_cselcups[num],ptr->disp_x,ptr->disp_y+y);

	/* Xマーク(カップ取得状況)の表示 */
	if ((game_mode == GM_GP)&&(num < 4)){
		prim = 255*(ptr->disp_y - CSEL_CUP_POS_Y1_GP)
		  /(CSEL_CUP_POS_Y2 - CSEL_CUP_POS_Y1_GP);
		if (cup_num == num){
			gDPSetPrimColor(gdl++,0,0, 255,255,255,255);	
		}
		else{
			gDPSetPrimColor(gdl++,0,0, 255,255,255,prim);	
		}
		for (i = 0;i < star;i++){
			gdl = doTexList_p(gdl,TexLists_cselstars[i],
							ptr->disp_x + (i-2)*CSEL_STAR_SIZE_W
							+ (2*i-3)*CSEL_STAR_INTERVAL_X/*d_*//2
							+ CSEL_CUP_SIZE_W/2,
							ptr->disp_y - CSEL_STAR_SIZE_H + 4+y);
		}
	}
	return(gdl);
}

Gfx *DispOB_Sub_csel_logo(Gfx *gdl,OBJBlock *ptr)
{
	int y;

	gDPSetPrimColor(gdl++,0,0, 250,250,0,255);
	if (loop_kind != LOOP_KIND_CSEL_RECORD){
		switch(csel_mode){
		case CS_GSEL_OUT:
		case CS_GSEL_OUT2:
			ptr->work1++;
			if (ptr->work1 > 12){
				csel_mode = CS_GSEL_OUT2;
				ptr->work1 = 12;
			}
			break;
		default:
			if (ptr->work1 > 0)
				ptr->work1--;
			break;
		}
		if (ptr->work1 < 0)
			ptr->work1 = 0;

		y = ptr->work1*ptr->work1*3/2;
		//gdl = doTexList(gdl,TexList_csel_logo,b_x,b_y);
		gdl = doTexList(gdl,TexList_csel_logo,ptr->disp_x,ptr->disp_y+y);
	}
	else{
		//gdl = doTexList(gdl,TexList_csel_logo2,b_x,b_y);
		gdl = doTexList(gdl,TexList_csel_logo2,ptr->disp_x,ptr->disp_y);
	}
	return(gdl);
}

Gfx *DispOB_Sub_csel_ok(Gfx *gdl,OBJBlock *ptr)
{
#if 0
	switch(csel_mode){
	case CS_CUP_SELECT:
	case CS_CUP_SELECT2:
	case CS_COURSE_SELECT:
		break;
	case CS_OK:
	case CS_OK2:
		//gdl = doTexList(gdl,TexList_csel_ok,b_x,b_y);
		gdl = SetOKPrimColor0(gdl);
		gdl = doTexList_p(gdl,TexList_csel_ok,
						  CSEL_OK_POS_X+ptr->disp_x,
						  CSEL_OK_POS_Y+ptr->disp_y);
		break;
	}
#endif
	gdl = SetOKPrimColor0(gdl);
	gdl = doTexList_p(gdl,TexList_csel_ok,
					  CSEL_OK_POS_X+ptr->disp_x,CSEL_OK_POS_Y+ptr->disp_y);
	return(gdl);
}

Gfx *DispOB_Sub_csel_arrow(Gfx *gdl,OBJBlock *ptr)
{
	float f1,f2;

	//f = (SINF(main_count*128)+1.0)/2;
	f1 = (SINF(ptr->work1)+1.0)/2;
	f2 = (SINF(ptr->work2)+1.0)/2;
#if 0
	gdl = doTexList(gdl,TexList_csel_arrow,
					SCREEN_WD/2-b_x/2-CSEL_ARROW_SIZE_W,b_y);
	gdl = doTexList_f(gdl,TexList_csel_arrow,
					  SCREEN_WD/2+b_x/2,b_y,1,0);
#else
#if 0
	/* 左側の矢印 */
	gdl = doTexList(gdl,TexList_csel_arrow,
					SCREEN_WD/2-CSEL_ARROW_LR_INTERVAL/2-CSEL_ARROW_SIZE_W
					+ptr->disp_x,
					CSEL_ARROW_POS_Y);
	/* 右側の矢印 */
	gdl = doTexList_f(gdl,TexList_csel_arrow,
					  SCREEN_WD/2+CSEL_ARROW_LR_INTERVAL/2+ptr->disp_y,
					  CSEL_ARROW_POS_Y,1,0);
#endif
	/* 左側の矢印 */
	gdl = doTexList2(gdl,TexList_csel_arrow,
					 SCREEN_WD/2-CSEL_ARROW_LR_INTERVAL/2-CSEL_ARROW_SIZE_W
					 +ptr->disp_x,
					 CSEL_ARROW_POS_Y+CSEL_ARROW_SIZE_H/2*(1.0-f1),
					 1.0,f1);
	/* 右側の矢印 */
	gdl = doTexList2_f(gdl,TexList_csel_arrow,
					   SCREEN_WD/2+CSEL_ARROW_LR_INTERVAL/2+ptr->disp_y,
					   CSEL_ARROW_POS_Y+CSEL_ARROW_SIZE_H/2*(1.0-f2),
					   1.0,f2);
#endif
	return(gdl);
}

Gfx *DispOB_Sub_csel_course_name(Gfx *gdl)
{
	char let[4];
	int l1,l2;
	int *cp;

	switch(csel_mode){
	case CS_CUP_SELECT:
	case CS_CUP_SELECT2:
		break;
	case CS_COURSE_SELECT:
	case CS_OK:
	case CS_OK2:
	case CS_GP:
	case CS_GP2:
#if LANGUAGE_SW == LG_ZH 
#define LOCATION 192
#else
#define LOCATION 200
#endif

		kawano_itoa(csel_cursor2+1,let);
		let[1] = ':';
		let[2] = ' ';
		let[3] = '\0';
		l1 = GetWordLength3(let,0);
		if (old_cc == 5){
			l2 = GetWordLength3(course_names_ptr,0);
			gDPSetPrimColor(gdl++,0,0,255,255,255,255);
			gdl = SetWord3_C(gdl,SCREEN_WD/2-l2/2,LOCATION,let,0);
			gdl = SetWord3_C(gdl,SCREEN_WD/2+l1/2,LOCATION,course_names_ptr,0);
			break;
		}
		l2 = GetWordLength3(course_names_ptr,0);
		cp = &course_map_colors[old_cc*3];
		gDPSetPrimColor(gdl++,0,0,*cp,*(cp+1),*(cp+2),255);
		gdl = SetWord3_C(gdl,SCREEN_WD/2-l2/2,LOCATION,
						 let,0);
		gDPSetPrimColor(gdl++,0,0,255,255,255,255);
		gdl = SetWord3_C(gdl,SCREEN_WD/2+l1/2,LOCATION,course_names_ptr,0);
#if LANGUAGE_SW == LG_ZH 
		gdl = SetWord3_C(gdl,SCREEN_WD/2,210,
						 course_comments[old_cc*6 + csel_cursor2],0);
#else
		gdl = SetWord4_C(gdl,SCREEN_WD/2,210,
						 course_comments[old_cc*6 + csel_cursor2],0);
#endif
		break;
	}
	return(gdl);
}

Gfx *DispOB_Sub_csel_ghost(Gfx *gdl,OBJBlock *ptr)
{
	if (ptr->pattern/6 != crs_number/6)
		return(gdl);
	switch(csel_mode){
	case CS_CUP_SELECT:
	case CS_CUP_SELECT2:
	case CS_GSEL_OUT:
	case CS_GSEL_OUT2:
		break;
	case CS_COURSE_SELECT:
	case CS_OK:
	case CS_OK2:
		gDPSetPrimColor(gdl++,0,0,255,255,255,255);
		gdl = doTexList(gdl,TexList_csel_ghost,
						ptr->disp_x + ptr->work1,
						ptr->disp_y);
		break;
	}
	return(gdl);
}

Gfx *DispOB_Sub_csel_ta_type(Gfx *gdl,OBJBlock *ptr)
{
	int i,j;

#ifndef MASTER_FLAG
	if (all_cont.hold & (CONT_L))
		j = 5;
	else
#endif
		j = ta_type_max+1;

	for (i = 0;i < j;i++){
		if (ta_type_in_disp == i){
			switch(csel_mode){
			case CS_OK:
			case CS_OK2:
				gDPSetPrimColor(gdl++,0,0, 0,255,0,255);
				break;
			default:
				gdl = SetOKPrimColor0(gdl);
				break;
			}
		}
		else{
			gDPSetPrimColor(gdl++,0,0,255,255,255,255);
		}
		gdl = doTexList(gdl,TexLists_cseltatypes[i],
						CSEL_TATYPE_START_X+ptr->disp_x,
						CSEL_TATYPE_START_Y+i*CSEL_TATYPE_OFFSET_Y);
		if ((i == 2)&&(beat_staff_ghost_status)){
			gdl = doTexList(gdl,TexList_csel_staff/*TexLists_cselstars[3]*/,
							CSEL_TATYPE_START_X+/*aaaa*/70+ptr->disp_x,
							CSEL_TATYPE_START_Y+/*d_*/0+i*CSEL_TATYPE_OFFSET_Y);
		}
	}
	return(gdl);
}

void DOB_csel_course(OBJBlock *ptr)
{
	int target_x;

	switch(csel_mode){
	case CS_CUP_SELECT:
	case CS_CUP_SELECT2:
		if (csel_cursor >= 4)
			break;
	default:
		move_mapselect();
		break;
	}
	//if ((csel_cursor < 4)||(csel_mode != CS_CUP_SELECT))
	//	move_mapselect();

	//target_x = 0-csel_cursor2*SC_WD/2;
	target_x = 0-csel_cursor2*SC_WD;
	if (loop_kind == LOOP_KIND_CSEL_GP)
		ptr->disp_x = target_x;
	else
		DOB_moving2_x(ptr,target_x);
	//DOB_moving1_x_base(ptr,target_x,16);
	move_view_port(ptr->disp_x);
}

void DOB_csel_cup(OBJBlock *ptr)
{
	int num,target_x,target_y,jo_buf;

	if (loop_kind == LOOP_KIND_CSEL_GP){
		ptr->disp_x = (SCREEN_WD - CSEL_CUP_SIZE_W)/2;
		ptr->disp_y = CSEL_CUP_POS_Y1_GP;
		return;
	}
	num = ptr->kind - KO_CSEL_JACK;
	switch(ptr->pattern){
	case 0:
		if (num != 5){/* 最初に左上から入ってくる */
			if (ptr->disp_y < CSEL_CUP_POS_Y2)
				DOB_moving1_y(ptr,CSEL_CUP_POS_Y2);
			else
				ptr->pattern = 1;
		}
		else{/* 最初に下から入ってくる */
			if (ptr->disp_y > CSEL_ECUP_POS_Y2)
				DOB_moving1_y(ptr,CSEL_ECUP_POS_Y2);
			else
				ptr->pattern = 1;
		}
		switch(csel_mode){
		case CS_CUP_SELECT:
		case CS_CUP_SELECT2:
			break;
		default:
			ptr->pattern = 1;
			break;
		}
		break;
	case 1:
	case 2:
	case 3:
		if ((csel_cursor == num)||((csel_cursor >= 10)&&(num == 5)))
			ptr->pri = 7;
		else
			ptr->pri = 6;
		switch(csel_mode){
		case CS_CUP_SELECT:
		case CS_CUP_SELECT2:
		case CS_GSEL_OUT:
		case CS_GSEL_OUT2:
			if (num != 5)
				target_y = CSEL_CUP_POS_Y2;
			else
				target_y = CSEL_ECUP_POS_Y2;
			DOB_moving1_y(ptr,target_y);
			if (ptr->pattern == 2)
				ptr->pattern = 3;
			break;
		case CS_COURSE_SELECT:
		case CS_OK:
		case CS_OK2:
		default:
			if (game_mode == GM_GP)
				DOB_moving1_y(ptr,CSEL_CUP_POS_Y1_GP);
			else
				DOB_moving1_y(ptr,CSEL_CUP_POS_Y1);
			ptr->pattern = 2;
			break;
		}

		if ((ptr->pattern == 2)||(num == 5))
			target_x = (SCREEN_WD - CSEL_CUP_SIZE_W)/2;
		else{
			jo_buf = joker_status;
			if (command_status)
				jo_buf = 2;
			switch(jo_buf){
			case 0:
				if (num >2)
					num = 2;
				target_x = (SCREEN_WD + (num*2 - 3)*CSEL_CUP_SIZE_W)/2
					+ (num-1)*CSEL_CUP_INTERVAL_X3/*aaaa*/;
				break;
			case 2:
			case 3:
			default:
				if((loop_kind != LOOP_KIND_CSEL_RECORD)&&(game_mode != GM_TA)){
					target_x = (SCREEN_WD + (num*2 - 5)*CSEL_CUP_SIZE_W)/2
						+ (num-2)*CSEL_CUP_INTERVAL_X5/*aaaa*/;
					break;
				}
			case 1:
			//case 2:
				if (num >3)
					num = 3;
				target_x = (SCREEN_WD + (num*2 - 3)*CSEL_CUP_INTERVAL_X4)/2
				  + (num-2)*CSEL_CUP_SIZE_W;
				break;
			}
		}
		if (ptr->work1 == 11)
			ptr->disp_x = target_x;
		else{
			if (ptr->pattern >= 2){
				DOB_moving2_x_base(ptr,target_x,128);
			}
			else{
				DOB_moving1_x_base(ptr,target_x,16/ptr->pattern);
			}
		}
		break;
	}

}

void DOB_csel_ok(OBJBlock *ptr)
{
	switch(csel_mode){
	case CS_OK:
	case CS_OK2:
		DOB_moving2_x(ptr,0);
		break;
	default:
		DOB_moving2_x(ptr,50);
		break;
	}
}

void DOB_csel_arrow(OBJBlock *ptr)
{
	switch(csel_mode){
	case CS_CUP_SELECT:
	case CS_CUP_SELECT2:
	case CS_GSEL_OUT:
	case CS_GSEL_OUT2:
		ptr->disp_on = 0;
		ptr->disp_x = -100;
		ptr->disp_y = 100;
		ptr->pattern = 128;
		ptr->pattern2 = 128;
		break;
	case CS_COURSE_SELECT:
	case CS_OK:
	case CS_OK2:
	default:
		if (ptr->pattern > 640)
			ptr->pattern = 640;
		if (ptr->pattern > 128)
			ptr->pattern -= 16;
		else
			ptr->pattern = 128;
		ptr->work1 += ptr->pattern;
		if (ptr->pattern2 > 640)
			ptr->pattern2 = 640;
		if (ptr->pattern2 > 128)
			ptr->pattern2 -= 16;
		else
			ptr->pattern2 = 128;
		ptr->work2 += ptr->pattern2;

		ptr->disp_on = 1;
		if ((csel_cursor2 == 0)||(csel_mode == CS_OK)||(csel_mode == CS_OK2))
			DOB_moving2_x(ptr,-100);
		else
			DOB_moving2_x(ptr,0);
		if ((csel_cursor2 == 5)||(csel_mode == CS_OK)||(csel_mode == CS_OK2))
			DOB_moving2_y(ptr,100);
		else
			DOB_moving2_y(ptr,0);
		break;
	}
}
	
void DOB_csel_ghost(OBJBlock *ptr)
{
	int x;

	ptr->work1 = ((Get_OBJBlock_ptr(KO_CSEL_COURSE))->disp_x)>>2;
	x = ptr->disp_x + ptr->work1;
	if ((x < -30)||(x > 320))
	 	ptr->disp_on = 0;
	else
		ptr->disp_on = 1;
}

void DOB_csel_ta_type(OBJBlock *ptr)
{
	switch(csel_mode){
	case CS_CUP_SELECT:
	case CS_CUP_SELECT2:
	case CS_GSEL_OUT:
	case CS_GSEL_OUT2:
		DOB_moving2_x(ptr,150);
		break;
	case CS_COURSE_SELECT:
	case CS_OK:
	case CS_OK2:
	default:
		DOB_moving2_x(ptr,0);
		break;
	}
}


