/*
	スコアーアタック 総合ランク
*/
#include "ot_header.h"
#include "ot_newton.h"
#include "hjm_camera.h"
#include "ot_sea.h"
#include "ot_sub.h"
#include "ot_hover.h"

#include "endefine.h"
#include "enchkcrs.h"

#include "sot_world.h"

#include "dai_anim_data.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_screc.h"
#include "kn_restart.h"

/*******************************************************
	FUNCTION
*******************************************************/
Gfx 		*makeMainGlistScRec( Gfx *gp );
static void changeGameModeScRec( void );
static Gfx	*makeTotalRankingGlist( Gfx *gp );

/*******************************************************
	VARIABLE
*******************************************************/
/* --- 外部参照 --- */
/* Display list */
extern Gfx	dlInitMachineModel[];
/* コントローラー */
extern sKnPad	mKnPad[];

/* シーケンス */
static int seqScrec;
/* 汎用カウンタ */
static int countScrec;
/* 座標 */
static int screcScrRX, screcScrLX;
/* persp */
static ushort perspNorm;
/* ビューポート */
static Vp screcCalVp = {		/* 計算用 */
	SCREEN_WD*2, SCREEN_HT*2, G_MAXZ/2, 0,	/* scale */
	SCREEN_WD*2, SCREEN_HT*2, G_MAXZ/2, 0,	/* translate */
} ;

/* コース名 */
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
static int	dxCourseName18[] = {
	0,
	0,
	7,
	-8,
	11,
	0,
	0,
	5,
	12,
};
#elif (SW_KN_LANGUAGE == KN_US)
static int	dxCourseName18[] = {
	0,
	0,
	12,
	-8,
	12,
	20,
	0,
	4,
	-8,
};
#elif (SW_KN_LANGUAGE == KN_EU)
static int	dxCourseName18[] = {
	0,
	0,
	12,
	-8,
	12,
	20,
	0,
	4,
	-8,
};
#endif

/* DEFINE */
#define SY_RANKING	90
#define DY_RANKING	18

#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)

#define DY_RANK12	70
#define DY_NAME12	70
#define DY_SCORE12	70
#define DY_COURSENAME18		12

#elif (SW_KN_LANGUAGE == KN_US)

#define DY_RANK12	71
#define DY_NAME12	71
#define DY_SCORE12	71
#define DY_COURSENAME18		13

#elif (SW_KN_LANGUAGE == KN_EU)

#define DY_RANK12	71
#define DY_NAME12	71
#define DY_SCORE12	71
#define DY_COURSENAME18		13

#endif
/* ====================================================================== */
/*
	メイン
*/
void moveMainScRec( void )
{
	register	int		i, sx;
	Mtxf		mtxf_scale, mtxf_trans, mtxf_model;
	Mtx		mtx_scale, mtx_trans;

    if( gameModeChangeFlag ) {
		countScrec = 0;
		seqScrec = SCREC_SEQ_INIT;
		screcScrRX = SCREC_SCR_INIT_RX;
		screcScrLX = SCREC_SCR_INIT_LX;
	}

	/* ジェットの計算 */
	make_SCRmatrix( &(pKnDynamic->mtxMachineProj), &perspNorm,
					33.0f, 1.0f, 16.0f, 4096.0f, 0.0f, 0.0f );
	make_ROTSmatrix( &(mtx_scale),
					 0.0f, 0.0f, 1.0f,
					 0.0f, 1.0f, 0.0f,
					 0.0f, 0.0f, 0.0f, 0.025f ) ;
	make_LOOKmatrix( &mtx_trans, &mtxf_trans,
					500.0f, 0.0f, 0.0f,
					0.0f, 0.0f, 0.0f,
			 		0.0f, 1.0f, 0.0f );
	mtx2mtxf( &(mtx_scale), &(mtxf_scale) );
	mult_mtxf( &(mtxf_trans), &(mtxf_scale), &mtxf_model );
	
	for( i = 0 ; i < RANKING_MAX ; i ++ ) {
		if( i & 1 ) sx = screcScrLX;
		else sx = screcScrRX;
		mtxf2mtx( &(mtxf_model), &(pKnDynamic->mtxMachineModel[i]) );
		pKnDynamic->vpResult[i] = screcCalVp;
		pKnDynamic->vpResult[i].vp.vtrans[0] = (sx + DISPLAY_X1 + 32 + 16)<<2;
		pKnDynamic->vpResult[i].vp.vtrans[1] = (DISPLAY_Y1 + SY_RANKING + DY_RANKING * i + 12)<<2;
	}
	if( frank_sca == 0 ) {
		mtxf2mtx( &(mtxf_model), &(pKnDynamic->mtxMachineModel[i]) );
		pKnDynamic->vpResult[i] = screcCalVp;
		pKnDynamic->vpResult[i].vp.vtrans[0] = (screcScrLX + DISPLAY_X1 + 32 + 16)<<2;
		pKnDynamic->vpResult[i].vp.vtrans[1] = (DISPLAY_Y1 + 174 + 12)<<2;
	}
}
/* ====================================================================== */
/*
	メイン
*/
Gfx *makeMainGlistScRec( Gfx *gp )
{
	if( gameModeChangeFlag ) {
		gameModeChangeFlag = 0;
	}

	/* ディスプレイリストの作成 */
	player_index = 0;
    gp = make_world_glist( gp );
    gp = makeKnSeaBottomGlist( gp, ncourse );
    gp = make_sea_glist( gp );
	gp = makeTotalRankingGlist( gp );

	changeGameModeScRec();

	return( gp );
}

/* ====================================================================== */
/*
	ゲームモードの変更
*/
static void changeGameModeScRec( void )
{
	register int	se_flag;

	se_flag = 0;

	/* シーケンスごとの処理 */
	switch( seqScrec ) {
		case SCREC_SEQ_INIT:
			se_flag = 1;
			seqScrec = SCREC_SEQ_APPR;
			break;
		case SCREC_SEQ_APPR:
			screcScrRX -= SCREC_SCR_VX;
			if( screcScrRX < SCREC_SCR_STOP_RX ) {
				seqScrec = SCREC_SEQ_WAIT;
				screcScrRX = SCREC_SCR_STOP_RX;
			}
			break;
		case SCREC_SEQ_WAIT:
			if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
				seqScrec = SCREC_SEQ_DISAP;
				se_flag = 1;
			}
			break;
		case SCREC_SEQ_DISAP:
			screcScrRX -= SCREC_SCR_VX;
			if( screcScrRX < SCREC_SCR_INIT_LX ) {
				screcScrRX = SCREC_SCR_INIT_LX;
				seqScrec = SCREC_SEQ_EXIT;
				countScrec = 0;
			}
			break;
		case SCREC_SEQ_EXIT:
			countScrec ++;
			if( countScrec > 2 ) initMainGlistRestart();
			break;
	}

	#if SOUND_SW
	if( se_flag ) Na_SystemSound( NA_SYS_WIPE2, 0 );
	#endif

    /* スクリーンの左半分 */
    screcScrLX = SCREC_SCR_STOP_RX + (SCREC_SCR_STOP_RX - screcScrRX);
}

/* ====================================================================== */
/*
	総合ランキング
*/
static Gfx	*makeTotalRankingGlist( Gfx *gp )
{
    register int		i, sx;
    register uint		font_flag;
    register Scorerec	*score_p;
    char str_work[3];

    /* --- 枠表示 --- */
    gSPDisplayList( gp++, dlInitWaku );
    gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + screcScrRX, DISPLAY_Y1 +  10, 264, 24 );
    gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + screcScrLX, DISPLAY_Y1 +  68, 264, 16 );
    for( i = 0 ; i < RANKING_MAX ; i ++ ) {
	if( i & 1 ) sx = screcScrLX;
	else sx = screcScrRX;
	gp = makeWakuGlist( gp, WAKU_KIND_256x32,
						DISPLAY_X1 + sx, DISPLAY_Y1 + SY_RANKING + DY_RANKING * i, 264, 16 );
    }
    if( frank_sca == 0 ) {
		/* ランキングされなかった */
		gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + screcScrLX, DISPLAY_Y1 + 163, 264, 10 );
		gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + screcScrLX, DISPLAY_Y1 + 174, 264, 16 );
    }

    /* --- 黒四角表示 --- */
    gp = makeInitRectangleGlist( gp, 0, 0, 0, 255 );
    for( i = 0 ; i < RANKING_MAX ; i ++ ) {
		if( i & 1 ) sx = screcScrLX;
		else sx = screcScrRX;
		gp = makeRectangleGlist( gp,
				 (int)(sx + DISPLAY_X1 + 32),
				 (int)(DISPLAY_Y1 + SY_RANKING + 2 + DY_RANKING * i),
				 (int)(sx + DISPLAY_X1 + 32 + 26),
				 (int)(DISPLAY_Y1 + SY_RANKING + 2 + DY_RANKING * i + 12) );
    }
    if( frank_sca == 0 ) {
		/* ランキングされなかった */
		gp = makeRectangleGlist( gp,
					 (int)(DISPLAY_X1 + screcScrLX + 32),
					 (int)(DISPLAY_Y1 + 174 + 2),
					 (int)(DISPLAY_X1 + screcScrLX + 32 + 26),
					 (int)(DISPLAY_Y1 + 174 + 2 + 12) );
    }
    gDPPipeSync( gp++ );
	gDPSetScissor( gp++,G_SC_NON_INTERLACE, DISPLAY_X1, DISPLAY_Y1, DISPLAY_X2-1, DISPLAY_Y2-1 );
	/* --- ジェット表示 --- */
    gSPPerspNormalize( gp++, perspNorm );
    gSPMatrix( gp++, &rspKnDynamic.mtxMachineProj, G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
	gSPDisplayList( gp++, dlInitMachineModel );
	for( i = 0 ; i < RANKING_MAX ; i ++ ) {
		score_p = &sca_score_rec[ncourse][i];
		gSPViewport( gp++, &(rspKnDynamic.vpResult[i]) );
		gSPMatrix( gp++, &(rspKnDynamic.mtxMachineModel[i]), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
		gp = makeKnJetGlist( gp, score_p->nmachine, BASEPOSE_AN, 0, &(pKnDynamic->mtxMachine[i][0]) );
	}
	if( frank_sca == 0 ) {
		gSPViewport( gp++, &(rspKnDynamic.vpResult[i]) );
		gSPMatrix( gp++, &(rspKnDynamic.mtxMachineModel[i]),
			   G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
		gp = makeKnJetGlist( gp, rideMachineNum[my_hover], BASEPOSE_AN, 0, &(pKnDynamic->mtxMachine[i][0]) );
	}

    /* --- 文字表示 --- */
    gp = makeInitStrGlist( gp, FONT_FLAG_NORMAL, 255,255,255, 255,255,255, 255,255,255, 255,255,255 );
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
    gp = makeGameMessageGlist( gp, GMESG_KIND_18, courseNameTable18[ncourse],
			       DISPLAY_X1 + screcScrRX + 40, DISPLAY_Y1 + DY_COURSENAME18, 0, 0 );
#elif (SW_KN_LANGUAGE == KN_US)
    gp = makeGameMessageGlist( gp, GMESG_KIND_18, courseNameTable18[ncourse],
			       DISPLAY_X1 + screcScrRX + 48 + dxCourseName18[ncourse], DISPLAY_Y1 + DY_COURSENAME18, 0 , 0);
#elif (SW_KN_LANGUAGE == KN_EU)
    gp = makeGameMessageGlist( gp, GMESG_KIND_18, courseNameTable18[ncourse],
			       DISPLAY_X1 + screcScrRX + 48 + dxCourseName18[ncourse], DISPLAY_Y1 + DY_COURSENAME18, 0, 0  );
#endif
    gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_RANK12,
			       DISPLAY_X1 + screcScrLX +  15, DISPLAY_Y1 + DY_RANK12, 0, 0 );
    gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_NAME12,
			       DISPLAY_X1 + screcScrLX + 111, DISPLAY_Y1 + DY_NAME12, 0, 0 );
    gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_SCORE12,
			       DISPLAY_X1 + screcScrLX + 210, DISPLAY_Y1 + DY_SCORE12, 0, 0 );
    if( frank_sca == 0 ) {
	    gp = makeGameMessageGlist( gp, GMESG_KIND_8, GMESG_YOURSCORE8,
			       DISPLAY_X1 + screcScrLX + 10, DISPLAY_Y1 + 163+1, 0, 0 );
	}
    for( i = 0 ; i < RANKING_MAX ; i ++ ) {
		if( frank_sca ) {
		    if( frank_sca == 1 ) {
			if( frank_sca - 1 == i ) font_flag = FONT_FLAG_FLASH_1;
			else font_flag = FONT_FLAG_NORMAL;
		    }
		    else {
			if( frank_sca - 1 == i ) font_flag = FONT_FLAG_FLASH_3;
			else font_flag = FONT_FLAG_NORMAL;
		    }
		}
		else font_flag = FONT_FLAG_NORMAL;
		gp = makeInitStrGlist( gp, font_flag, 255,255,255, 255,255,255, 255,255,255, 255,255,255 );
		score_p = &sca_score_rec[ncourse][i];
		if( i & 1 ) sx = screcScrLX;
		else sx = screcScrRX;
		sprintf( str_work, "%1d", i + 1 );
		gp = makeStrGlistSub( gp, FONT_TYPE_SELECT, str_work, DISPLAY_X1 + sx + 9 + dxSelectNumber[i+1],
						   DISPLAY_Y1 + SY_RANKING + 2 + DY_RANKING * i );
		if( score_p->fcustom == 0 ) sprintf( str_work, "%s", "N" );
		else sprintf( str_work, "%s", "C" );
		gp = makeStrGlistSub( gp, FONT_TYPE_SMALL, str_work,
						   DISPLAY_X1 + sx + 51,
						   DISPLAY_Y1 + SY_RANKING + 2 + DY_RANKING * i );
		gp = makeStrGlistSub( gp, FONT_TYPE_SELECT, (char *)score_p->name,
						   DISPLAY_X1 + sx + 111,
						   DISPLAY_Y1 + SY_RANKING + 2 + DY_RANKING * i );
		gp = makePoint5Glist( gp, FONT_TYPE_SELECT, score_p->score,
						   DISPLAY_X1 + sx +  200,
						   DISPLAY_Y1 + SY_RANKING + 2 + DY_RANKING * i );
	}
	if( frank_sca == 0 ) {
		/* ランキングされなかった */
		gp = makeInitStrGlist( gp, FONT_FLAG_FLASH_3,
							   255,255,255, 255,255,255, 255,255,255, 255,255,255 );
		if( myMachineSetting == 0 ) sprintf( str_work, "%s", "N" );
		else sprintf( str_work, "%s", "C" );
		gp = makeStrGlistSub( gp, FONT_TYPE_SMALL, str_work,
						  screcScrLX + DISPLAY_X1 +  51, DISPLAY_Y1 + 174 + 2 );
		gp = makePoint5Glist( gp, FONT_TYPE_SELECT, sca_score,
						   DISPLAY_X1 + screcScrLX +  200,
						   DISPLAY_Y1 + 174 + 2 );
	}

	return( gp );
}
