/*
	コンフィグ内サウンド
*/
#include "ot_header.h"
#include "ot_newton.h"
#include "ot_sea.h"

#include "endefine.h"
#include "enrecord.h"
//#include "enchkcrs.h"

//#include "sot_world.h"

#include "kn_def.h"
#include "kn_main.h"
#include "kn_dynamic.h"
#include "kn_font.h"
#include "kn_mask.h"
#include "kn_gword.h"
#include "kn_message.h"
#include "kn_config.h"
#include "kn_cfgsound.h"
#include "kn_backup.h"

/*******************************************************
	FUNCTION
*******************************************************/
Gfx 		*makeMainGlistCfgSound( Gfx *gp );
static Gfx 	*makeCfgSoundGlist( Gfx *gp );
static void changeGameModeCfgSound( void );
static void changeAudioMode( void );
static void initMainGlistCfgSound2Next( int next_game_mode );

/*******************************************************
	DEFINE
*******************************************************/

#if (SW_KN_LANGUAGE == KN_JP )

#define SX_SOUND18			112
#define DX_LISTEN_BGM12		(-4)
#define DY_SOUND_MENU		82

#elif (SW_KN_LANGUAGE == KN_ZH )

#define SX_SOUND18			112
#define DX_LISTEN_BGM12		0
#define DY_SOUND_MENU		82

#elif (SW_KN_LANGUAGE == KN_US)

#define SX_SOUND18			114
#define DX_LISTEN_BGM12		(0)
#define DY_SOUND_MENU		83

#elif (SW_KN_LANGUAGE == KN_EU)

#define SX_SOUND18			114
#define DX_LISTEN_BGM12		(0)
#define DY_SOUND_MENU		83

#define SX_SOUND18_GE			123
#endif

/*******************************************************
	VARIABLE
*******************************************************/
/* --- 外部参照 --- */
/* ディスプレイリスト */
extern Gfx		dlConfigBG[], dlConfigTitleBG[];
/* コントローラー */
extern sKnPad	mKnPad[];
/* サウンド設定データ */
extern int		cfgSoundMyData[CFGSOUND_MAX_NUM_MEMBER];
extern int		bgmVolume;
/* --- 内部 --- */
static dummy;
/* 選択したモード番号 */
static int		selectMemberNum = 0;

static int		cfgSoundMyDataOrg[CFGSOUND_MAX_NUM_MEMBER] = {
	CFGSOUND_STEREO,			/* サウンド切り替え */
	CFGSOUND_BGM_ON,			/* ＢＧＭのオン,オフ */
	CFGSOUND_INIT_NUM_BGM,		/* ＢＧＭ番号 */
};

/* メニュー用文字列 */
static sDispGMesg mCfgSoundMenu[] = {
	 0, GMESG_SOUND_SEL12,
	 0, GMESG_BGM12,
	 DX_LISTEN_BGM12, GMESG_LISTEN_BGM12
};
/* サウンド切り替え */
static int	gmesgNumCfgSoundSelSound[] = {
	GMESG_STEREO12,
	GMESG_MONO12,
	GMESG_SSEL_HP12
};
/* オン,オフ */
static int	gmesgNumCfgSoundBgmSw[] = {
	GMESG_OFF12,
	GMESG_ON12,
};
#if (SW_KN_LANGUAGE == KN_EU)
static int	gmesgNumCfgSoundBgmSw_Ge[] = {
	GMESG_OFFA12,
	GMESG_ONA12,
};
#endif

sKnMinMax cfgSoundDataMinMax[CFGSOUND_MAX_NUM_MEMBER] = {
	{ CFGSOUND_SOUND_SW_MIN, CFGSOUND_SOUND_SW_MAX },
	{ CFGSOUND_BGM_OFF     , CFGSOUND_BGM_ON       },
	{ CFGSOUND_MIN_NUM_BGM , CFGSOUND_MAX_NUM_BGM  }
};

/* ====================================================================== */
/*
	メイン
*/
Gfx *makeMainGlistCfgSound( Gfx *gp )
{
	register int 			i, disp_type, gmesg_num, dx_sound;
	register int 			*int_p;
	register uint			font_flag;
	register sDispGMesg		*disp_p;
	char					str_work[10];
	
	if( gameModeChangeFlag ) {
		gameModeChangeFlag = 0;
		if( game_mode == GM_CFGSOUND ) {
			/* 初期化 */
			gp = clearAllFBuffer( gp );
			return( gp );
		}
	}

	/* ディスプレイリストの作成 */
	player_index = 0;
	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 );
	/* 枠表示 */
	gSPDisplayList( gp++, dlInitWaku );
	for( i = 0 ; i < CFGSOUND_MAX_NUM_MEMBER ; i ++ ) {
		gp = makeWakuGlist( gp, WAKU_KIND_256x32,
							DISPLAY_X1 + 20, DISPLAY_Y1 + 80 + 21 * i, 148, 16 );
		gp = makeWakuGlist( gp, WAKU_KIND_256x32,
							DISPLAY_X1 + 170, DISPLAY_Y1 + 80 + 21 * i, 105, 16 );
	}
	gp = makeWakuGlist( gp, WAKU_KIND_256x32,
						DISPLAY_X1 + 98, DISPLAY_Y1 + 143, 107, 16 );
	/* --- 文字表示 --- */
#if (SW_KN_LANGUAGE == KN_EU)
	if( euLanguage == EL_ENGLISH ) dx_sound = SX_SOUND18;
	else dx_sound = SX_SOUND18_GE;
#else
	dx_sound = SX_SOUND18;
#endif
	gp = makeInitStrGlist( gp, FONT_FLAG_NORMAL, 255,255,255, 255,255,255, 255,255,255, 255,255,255 );
	gp = makeGameMessageGlist( gp, GMESG_KIND_18, GMESG_SOUND18, DISPLAY_X1 + dx_sound, DISPLAY_Y1 + 30, 0, 0 );

	for( i = 0, disp_p = mCfgSoundMenu, int_p = cfgSoundMyData ; i < CFGSOUND_MAX_NUM_MEMBER ;
																 i ++, disp_p ++, int_p ++ ) {
		if( i == selectMemberNum ) font_flag = FONT_FLAG_FLASH_3;
		else font_flag = FONT_FLAG_NORMAL;
		gp = makeInitStrGlist( gp, font_flag, 255,255,255, 255,255,255, 255,255,255, 255,255,255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, disp_p->gmesgNum,
							  DISPLAY_X1 + 30 + (int)disp_p->dx, DISPLAY_Y1 + DY_SOUND_MENU + 21 * i, 0 , 0);
		gp = makeStrGlistSub( gp, FONT_TYPE_SELECT, ">",
						   DISPLAY_X1 + 150, DISPLAY_Y1 + 82 + 21 * i );
		if( i == selectMemberNum ) {
			if( *int_p == cfgSoundMyDataOrg[i] ) font_flag = FONT_FLAG_FLASH_3;
			else {
				if( i == CFGSOUND_MEMBER_SELECT_BGM ) font_flag = FONT_FLAG_FLASH_3;
				else font_flag = FONT_FLAG_FLASH_1;
			}
		}
		else font_flag = FONT_FLAG_NORMAL;
		gp = makeInitStrGlist( gp, font_flag, 255,255,255, 255,255,255, 255,255,255, 255,255,255 );
		if( i == CFGSOUND_MEMBER_SELECT_SOUND ) {
			disp_type = 0;
			gmesg_num = gmesgNumCfgSoundSelSound[*int_p];
		}
		else if( i == CFGSOUND_MEMBER_BGM_SW ) {
			disp_type = 0;
#if (SW_KN_LANGUAGE == KN_EU)
			if( euLanguage == EL_ENGLISH ) gmesg_num = gmesgNumCfgSoundBgmSw[*int_p];
			else gmesg_num = gmesgNumCfgSoundBgmSw_Ge[*int_p];
#else
			gmesg_num = gmesgNumCfgSoundBgmSw[*int_p];
#endif
		}
		else {
			disp_type = 1;
			sprintf( str_work, "%d", *int_p );
		}
		if( disp_type == 0 ) {
			gp = makeGameMessageGlist( gp, GMESG_KIND_12, gmesg_num,
							  DISPLAY_X1 + 180, DISPLAY_Y1 + DY_SOUND_MENU + 21 * i, 0, 0 );
		}
		else {
			gp = makeStrGlistSub( gp, FONT_TYPE_SELECT, str_work,
									 DISPLAY_X1 + 180, DISPLAY_Y1 + 82 + 21 * i );
		}
	}
	if( selectMemberNum == CFGSOUND_MEMBER_END ) font_flag = FONT_FLAG_FLASH_3;
	else font_flag = FONT_FLAG_NORMAL;
	gp = makeInitStrGlist( gp, font_flag, 255,255,255, 255,255,255, 255,255,255, 255,255,255 );
	gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_END12,
							  DISPLAY_X1 + 136, DISPLAY_Y1 + 146, 0, 0 );

	/* ゲームモードの変更 */
	if( game_mode == GM_CFGSOUND ) changeGameModeCfgSound();
	else {
		if( mMask.flag == MASK_FLAG_END ) {
			initMainGlistConfig();
			EepWriteDataClearFlag();
		}
	}

	return( gp );
}

/* ====================================================================== */
/*
	ゲームモードの変更
*/
static void changeGameModeCfgSound( void )
{
	register sKnMinMax	*minmax_p;
	register int		se_flag, f;

	f = 0;
	/* 決定 */
	if( mKnPad[KN_PAD_COMMON].pad.trig & BUTTON_ARG_ANY ) {
		if( selectMemberNum == CFGSOUND_MEMBER_SELECT_BGM ) {
			se_flag = 1;
			/* ＢＧＭの切り替え */
			#if SOUND_SW
			Nas_PlayBgmDirect( cfgSoundMyData[selectMemberNum] );
			#endif
		}
		else if( selectMemberNum == CFGSOUND_MEMBER_END ) {
			se_flag = 1;
			initMainGlistCfgSound2Next( GM_CONFIG );
		}
		/* SE */
		#if SOUND_SW
		if( se_flag ) Na_SystemSound( NA_SYS_DECIDE, 0 );
		#endif
	}
	/* キャンセル */
	else if( mKnPad[KN_PAD_COMMON].pad.trig & BUTTON_ARG_CANCEL ) {
		initMainGlistCfgSound2Next( GM_CONFIG );
		/* SE */
		#if SOUND_SW
		Na_SystemSound( NA_SYS_CANCEL, 0 );
		#endif
	}
	/* 上 */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_UP ) {
		selectMemberNum --;
		if( selectMemberNum < 0 ) selectMemberNum = CFGSOUND_MAX_NUM_MEMBER;
		#if SOUND_SW
		Na_SystemSound( NA_SYS_CURMOVE, 0 );
		#endif
	}
	/* 下 */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_DOWN ) {
		selectMemberNum ++;
		if( selectMemberNum >= CFGSOUND_MAX_NUM_MEMBER+1 ) selectMemberNum = 0;
		#if SOUND_SW
		Na_SystemSound( NA_SYS_CURMOVE, 0 );
		#endif
	}
	/* 左 */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		if( selectMemberNum != CFGSOUND_MEMBER_END ){
			minmax_p = &cfgSoundDataMinMax[selectMemberNum];
			cfgSoundMyData[selectMemberNum] --;
			if( cfgSoundMyData[selectMemberNum] < minmax_p->min ) {
				cfgSoundMyData[selectMemberNum] = minmax_p->max;
			}
			changeAudioMode();
		}
		#if SOUND_SW
		Na_SystemSound( NA_SYS_CURMOVE, 0 );
		#endif
	}
	/* 右 */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		if( selectMemberNum != CFGSOUND_MEMBER_END ){
			minmax_p = &cfgSoundDataMinMax[selectMemberNum];
			cfgSoundMyData[selectMemberNum] ++;
			if( cfgSoundMyData[selectMemberNum] > minmax_p->max ) {
				cfgSoundMyData[selectMemberNum] = minmax_p->min;
			}
			changeAudioMode();
		}
		#if SOUND_SW
		Na_SystemSound( NA_SYS_CURMOVE, 0 );
		#endif
	}
	else if( mKnPad[KN_PAD_1P].pad.trig & L_TRIG ) {
		if( selectMemberNum == CFGSOUND_MEMBER_BGM_SW ) {
			f = 1;
			bgmVolume --;
			if( bgmVolume < 0 ) bgmVolume = 0;
		}
	}
	else if( mKnPad[KN_PAD_1P].pad.trig & R_TRIG ) {
		if( selectMemberNum == CFGSOUND_MEMBER_BGM_SW ) {
			f = 1;
			bgmVolume ++;
			if( bgmVolume > 4 ) bgmVolume = 4;
		}
	}

	if( f ) {
		Nas_SetBgmVolume(bgmVolume);
	}
}

/* オーディオのモード変更 */
static void changeAudioMode( void )
{
	if( selectMemberNum == CFGSOUND_MEMBER_SELECT_SOUND ) {
		if( cfgSoundMyData[selectMemberNum] == CFGSOUND_STEREO ) {
			#if SOUND_SW
			Na_SetAModeStereo();
			#endif
			gameClearFlag &= GAME_CLEAR_FLAG_SOUND_CLR;
			#ifndef ROM_FLAG
			osSyncPrintf("STEREO\n");
			#endif
		}
		else if( cfgSoundMyData[selectMemberNum] == CFGSOUND_MONO ) {
			#if SOUND_SW
			Na_SetAModeMono();
			#endif
			gameClearFlag &= GAME_CLEAR_FLAG_SOUND_CLR;
			gameClearFlag |= GAME_CLEAR_FLAG_MONO;
			#ifndef ROM_FLAG
			osSyncPrintf("MONO\n");
			#endif
		}
		else {
			#if SOUND_SW
			Na_SetAModeHeadPhone();
			#endif
			gameClearFlag &= GAME_CLEAR_FLAG_SOUND_CLR;
			gameClearFlag |= GAME_CLEAR_FLAG_HEAD;
			#ifndef ROM_FLAG
			osSyncPrintf("HEADPHONE\n");
			#endif
		}
	}
	else if( selectMemberNum == CFGSOUND_MEMBER_BGM_SW ) {
		if( cfgSoundMyData[selectMemberNum] == CFGSOUND_BGM_ON ) {
			#if SOUND_SW
			Nas_RaceBgmOn();
			#endif
			gameClearFlag &= (GAME_CLEAR_FLAG_BGM_OFF^0xff);
			#ifndef ROM_FLAG
			osSyncPrintf("BGM ON\n");
			#endif
		}
		else {
			#if SOUND_SW
			Nas_RaceBgmOff();
			#endif
			gameClearFlag |= GAME_CLEAR_FLAG_BGM_OFF;
			#ifndef ROM_FLAG
			osSyncPrintf("BGM OFF\n");
			#endif
		}
	}
}

/* ====================================================================== */
/*
	次のゲームモードへ
*/
static void initMainGlistCfgSound2Next( int next_game_mode )
{
	/* ゲームモード */
	gameModeOld = game_mode;
	gameModeNext = next_game_mode;
	game_mode = GM_CFGSOUND2NEXT;
	game_stat = GAME_STAT_CFGSOUND;
	gameModeChangeFlag = 1;
	gameModeSeq = 0;
	gameModeCount = 0;
	vram_mode = VM_NORMAL;
	Graph_timing_req = GRAPH_TIMING_CFGSOUND;

	/* プレイヤー制御変数 */

	/* 初期化関数 */
	initMoveMask( MASK_MODE_FADE_OUT, MASK_FADE_OUT_COUNT, 0 );
	initGWord( GWORD_KIND_NOUSE, GWORD_FLAG_ALLCLR );


	/* 記録画面用カメラ */

	/* ホバー制御フラグ */
	/* シグナル制御 */
	#if SOUND_SW
	if( gameModeNext == GM_CONFIG ) Nas_SyncFadeOut( NA_SCENE_MENU );
	#endif

	
}
