//-------------------------------------
//ranking.cpp
//ランキングプログラム
//作成者：牧野駿太
//作成日：2016/07/01
//-------------------------------------


/*ヘッダファイル*/
#include "main.h"
#include "ranking.h"
#include "score.h"

#include "sound.h"
//#include "combo.h"

/*マクロ定義*/
#define NUM_POLYGON ( 2 )
#define NUM_VERTEX ( 4 )

#define SOUND_SEREMONY ( 4 )
#define SOUND_FAILED   ( 5 )

#define RANKING_MAX ( 6 )   //ランキング表示の最大数
#define RANKING_DIGIT ( 25 )   //ランキングの桁数
#define RANKING_INIT_POS_X ( 830.0f )   //右端のX座標
#define RANKING_INIT_POS_Y ( 210.0f )   //上端のY座標
#define RANKING_TX_WIDTH ( 0.2f )   //ランキングテクスチャの幅
#define RANKING_TX_HEIGHT ( 0.5f )   //ランキングテクスチャの高さ
#define RANKING_WIDTH ( 50.0f )   //一桁の幅
#define RANKING_HEIGHT ( 70.0f )   //一桁の高さ

#define FLAG_POS_X ( 240.0f )   //フラッグのX座標
#define FLAG_WIDTH ( 50.0f )   //フラッグの高さ
#define FLAG_HEIGHT ( 50.0f )   //フラッグの高さ


// プロトタイプ宣言
HRESULT MakeVertexRanking( LPDIRECT3DDEVICE9 pDevice );


// グローバル変数
LPDIRECT3DTEXTURE9 g_pTextureRanking[ 2 ] = { };   //テクスチャインターフェースへのポインタ
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferRanking = NULL;   //頂点バッファ管理インタフェースへのポインタ
RANKING Ranking[ RANKING_MAX ];   //ランキング情報
int g_No;   //自分の順位

RANKING_TYPE g_type = RANKING_TYPE_SHOW_ONLY;	// ランキングの使用方法


//----------------------------
//InitRanking関数
//ランキングの初期化
//----------------------------
HRESULT InitRanking( void )
{

	

	int nLoop = 0;   //ループ用の変数
	int nLoop2 = 0;   //ループ用の変数
	int nTmp = 0;   //並べ替えの一時変数
	FILE *Fp = NULL;   //ファイルポインタ
	int g_nScore = GetScore( );//GetComboScore();//スコアを格納    //ここで、自分のスコアを取得します！！！！！！

	/*順位の初期化*/
	g_No = 5;

	/*デバイスの情報を取得*/
	LPDIRECT3DDEVICE9 pDevice = GetDevice( );

	/*テクスチャの読み込み*/
	if( FAILED( D3DXCreateTextureFromFile( pDevice , "data/TEXTURE/degifont.png" , &g_pTextureRanking[ 0 ] ) ) ){
		MessageBox( NULL , "テクスチャが読み込めませんでした" , "エラー" , MB_OK );
	}


	// ファイルを読み込みモードで開く
	Fp = fopen( "data\\bin\\ranking.txt" , "r" );

	// ファイルが開けたら
	if( Fp != NULL )
	{
		// ファイルからスコアを読み込む
		for( nLoop = 0; nLoop < RANKING_MAX - 1; nLoop++ )
		{
			fscanf( Fp , "%d" , &Ranking[ nLoop ].nScore );
		}

		// 配列の最後に自分のスコアを格納
		if( g_type ){

			Ranking[ RANKING_MAX-1 ].nScore = g_nScore;
		}

		// スコアの並べ替え
		for( nLoop = 0; nLoop < RANKING_MAX - 1; nLoop++ )
		{
			for( nLoop2 = nLoop + 1; nLoop2 < RANKING_MAX; nLoop2++ )
			{
				// 順位を入れ替える
				if( Ranking[ nLoop ].nScore < Ranking[ nLoop2 ].nScore )
				{
					nTmp = Ranking[ nLoop ].nScore;
					Ranking[ nLoop ].nScore = Ranking[ nLoop2 ].nScore;
					Ranking[ nLoop2 ].nScore = nTmp;
				}
			}
		}

		// 自分のスコアがランキングに入っていたら
		if( Ranking[ RANKING_MAX - 1 ].nScore != g_nScore )
		{
			// 自分が何番目なのかを探す
			for( nLoop = 1; nLoop < RANKING_MAX - 1; nLoop++ )
			{
				// 自分の順位を格納
				if( Ranking[ nLoop - 1 ].nScore == g_nScore )
				{
					g_No = nLoop;
				}
			}
		}

		// ファイルを閉じる
		fclose( Fp );

		// ゲーム結果として表示した場合の機能
		if( g_type ){

			// おめでとうサウンドエフェクトの再生
			if( g_No < 5 ){

				PlayOneShotSoundEffect( SOUND_SEREMONY );
		
			}else{
			
				PlayOneShotSoundEffect( SOUND_FAILED );
			
			}

			// ファイルを書き込みモードで開く
			Fp = fopen( "data\\bin\\ranking.txt" , "w" );

			// ファイルにスコアを書き込む
			for( nLoop = 0; nLoop < RANKING_MAX - 1; nLoop++ )
			{
				fprintf( Fp , "%d\n" , Ranking[ nLoop ].nScore );
			}

			/*ファイルを閉じる*/
			fclose( Fp );

		}


	}

	/*ファイルが開けなかったら*/
	else
	{
		/*「失敗した」という情報を返す*/
		return E_FAIL;
	}


	/*ランキングの頂点の作成*/
	if( FAILED( MakeVertexRanking( pDevice ) ) )
	{
		/*「失敗した」という情報を返す*/
		return E_FAIL;
	}

	/*「成功した」という情報を返す*/
	return S_OK;
}

//----------------------------
//UninitRanking関数
//ランキングの終了処理
//----------------------------
void UninitRanking( void )
{
	/*g_pTextureRankingの解放*/
	if( g_pTextureRanking[ 0 ] != NULL ){
		g_pTextureRanking[ 0 ]->Release();												// 頂点バッファ管理用インターフェースの解放
		g_pTextureRanking[ 0 ]= NULL;
	}

	/*g_pTextureRankingの解放*/
	if( g_pTextureRanking[ 1 ] != NULL ){
		g_pTextureRanking[ 1 ]->Release();												// 頂点バッファ管理用インターフェースの解放
		g_pTextureRanking[ 1 ]= NULL;
	}

	/*g_pVtxBufferRankingの解放*/
	if( g_pVtxBufferRanking != NULL ){
		g_pVtxBufferRanking->Release();												// テクスチャインターフェースの解放
		g_pVtxBufferRanking = NULL;
	}

	// サウンドエフェクトの停止
	StopOneShotSoundEffect( SOUND_SEREMONY );
	StopOneShotSoundEffect( SOUND_FAILED );


}

//----------------------------
//UpdateRanking関数
//ランキングの更新
//----------------------------
void UpdateRanking( void )
{



}

//----------------------------
//DrawRanking関数
//ランキングの描画
//----------------------------
void DrawRanking( void )
{
	int nLoop = 0;   //ループ用の変数

	/*デバイスの情報を取得*/
	LPDIRECT3DDEVICE9 pDevice = GetDevice( );

	/*パイプラインを繋げる*/
	pDevice->SetStreamSource( 0 , g_pVtxBufferRanking , 0 , sizeof( VERTEX_2D ) );

	//頂点フォーマット設定
	pDevice->SetFVF( FVF_VERTEX_2D );

	/*テクスチャーの貼り付け*/
	pDevice->SetTexture( 0 , g_pTextureRanking[ 0 ] );

	/*桁数分の描画*/
	for( nLoop = 0; nLoop < RANKING_DIGIT; nLoop++ )
	{	
		//プリミティブの描画
		pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP ,   //プリミティブの種類
								nLoop * NUM_VERTEX ,   //オフセット（頂点数）
								NUM_VERTEX );   //プリミティブ数
	}

	/*
	//ランキング内に入っていたら旗を描画
	if( g_No != 0 )
	{
		/*テクスチャーの貼り付け
		pDevice->SetTexture( 0 , g_pTextureRanking[ 1 ] );

		//プリミティブの描画
		pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP ,   //プリミティブの種類
								nLoop * NUM_VERTEX ,   //オフセット（頂点数）
								NUM_VERTEX );   //プリミティブ数
	}*/
}

//----------------------------
//MakeVertexRanking関数
//ランキングの頂点の作成
//----------------------------
HRESULT MakeVertexRanking( LPDIRECT3DDEVICE9 pDevice )
{
	int nLoop = 0;   //ループ用の変数
	int Index = 0;   //配列の添え字
	int nRankingPosXTmp = 0;   //X座標の一時変数
	int nRankingPosYTmp = 0;   //Y座標の一時変数
	D3DXVECTOR2 RankingTxPos;   //ランキングのテクスチャ座標
	int nValue = 0;
	int nTmp = 0;

	VERTEX_2D *pVtx = NULL;   //仮想アドレスを取得するためのポインタ

	if( FAILED( pDevice->CreateVertexBuffer( sizeof( VERTEX_2D ) * NUM_VERTEX * ( RANKING_DIGIT + 1 ) ,   //作成したい頂点バッファのサイズ
											 D3DUSAGE_WRITEONLY ,
											 FVF_VERTEX_2D ,
											 D3DPOOL_MANAGED ,   //メモリ管理方法（デバイスにお任せ）
										     &g_pVtxBufferRanking ,
											 NULL ) ) )
	{
		/*「失敗した」という情報を返す*/
		return E_FAIL;
	}

	//頂点バッファをロックして、仮想アドレスを取得する
	g_pVtxBufferRanking->Lock( 0 , 0 , ( void **)&pVtx , 0 );

	/*頂点情報の設定*/
	for( nLoop = 0; nLoop < NUM_VERTEX * RANKING_DIGIT; nLoop += NUM_VERTEX )
	{
		/*一人分の結果を表示したら*/
		if( nLoop != 0 && nLoop % 20 == 0 )
		{
			/*一時変数の初期化*/
			nRankingPosXTmp = 0;

			/*Y座標を下にずらす*/
			nRankingPosYTmp += RANKING_HEIGHT;

			/*次の配列に進む*/
			Index++;

			nValue = 0;
			nTmp = 0;
		}

		//頂点座標の設定(2D座標・右回り)
		pVtx[ nLoop ].pos = D3DXVECTOR3( RANKING_INIT_POS_X - nRankingPosXTmp , RANKING_INIT_POS_Y + nRankingPosYTmp , 0.0f );
		pVtx[ nLoop + 1 ].pos = D3DXVECTOR3( RANKING_INIT_POS_X - nRankingPosXTmp + RANKING_WIDTH , RANKING_INIT_POS_Y + nRankingPosYTmp , 0.0f );
		pVtx[ nLoop + 2 ].pos = D3DXVECTOR3( RANKING_INIT_POS_X - nRankingPosXTmp , RANKING_INIT_POS_Y + RANKING_HEIGHT + nRankingPosYTmp , 0.0f );
		pVtx[ nLoop + 3 ].pos = D3DXVECTOR3( RANKING_INIT_POS_X - nRankingPosXTmp + RANKING_WIDTH , RANKING_INIT_POS_Y + RANKING_HEIGHT + nRankingPosYTmp , 0.0f );

		//rhwの設定（必ず1.0f）
		pVtx[ nLoop ].rhw = 1.0f;
		pVtx[ nLoop + 1 ].rhw = 1.0f;
		pVtx[ nLoop + 2 ].rhw = 1.0f;
		pVtx[ nLoop + 3 ].rhw = 1.0f;

		//頂点カラーの設定
		/*
		pVtx[ nLoop ].color = D3DCOLOR_RGBA( 153 , 153 , 153 , 255 );
		pVtx[ nLoop + 1 ].color = D3DCOLOR_RGBA( 153 , 153 , 153 , 255 );
		pVtx[ nLoop + 2 ].color = D3DCOLOR_RGBA( 153 , 153 , 153 , 255 );
		pVtx[ nLoop + 3 ].color = D3DCOLOR_RGBA( 153 , 153 , 153 , 255 );
		*/
		pVtx[ nLoop ].color     = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
		pVtx[ nLoop + 1 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
		pVtx[ nLoop + 2 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
		pVtx[ nLoop + 3 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );

		/*テクスチャ座標の更新*/
		nValue = Ranking[ Index ].nScore % 10;
		Ranking[ Index ].nScore /= 10;
		RankingTxPos.x = ( nValue % 5 ) * RANKING_TX_WIDTH;
		RankingTxPos.y = ( nValue / 5 ) * RANKING_TX_HEIGHT;
		pVtx[ nLoop ].tex = D3DXVECTOR2( RankingTxPos.x , RankingTxPos.y );
		pVtx[ nLoop + 1 ].tex = D3DXVECTOR2( RankingTxPos.x + RANKING_TX_WIDTH , RankingTxPos.y );
		pVtx[ nLoop + 2 ].tex = D3DXVECTOR2( RankingTxPos.x , RankingTxPos.y + RANKING_TX_HEIGHT );
		pVtx[ nLoop + 3 ].tex = D3DXVECTOR2( RankingTxPos.x + RANKING_TX_WIDTH , RankingTxPos.y + RANKING_TX_HEIGHT );

		/*桁の座標をずらす*/
		nRankingPosXTmp += RANKING_WIDTH + 18;
	}

	//頂点座標の設定(2D座標・右回り)
	nRankingPosYTmp = RANKING_INIT_POS_Y + ( RANKING_HEIGHT * ( g_No - 1 ) );
	pVtx[ nLoop ].pos = D3DXVECTOR3( FLAG_POS_X , nRankingPosYTmp , 0.0f );
	pVtx[ nLoop + 1 ].pos = D3DXVECTOR3( FLAG_POS_X + FLAG_WIDTH , nRankingPosYTmp , 0.0f );
	pVtx[ nLoop + 2 ].pos = D3DXVECTOR3( FLAG_POS_X , nRankingPosYTmp + FLAG_HEIGHT , 0.0f );
	pVtx[ nLoop + 3 ].pos = D3DXVECTOR3( FLAG_POS_X + FLAG_WIDTH , nRankingPosYTmp + FLAG_HEIGHT , 0.0f );

	//rhwの設定（必ず1.0f）
	pVtx[ nLoop ].rhw = 1.0f;
	pVtx[ nLoop + 1 ].rhw = 1.0f;
	pVtx[ nLoop + 2 ].rhw = 1.0f;
	pVtx[ nLoop + 3 ].rhw = 1.0f;

	//頂点カラーの設定
	pVtx[ nLoop ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
	pVtx[ nLoop + 1 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
	pVtx[ nLoop + 2 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );
	pVtx[ nLoop + 3 ].color = D3DCOLOR_RGBA( 255 , 255 , 255 , 255 );

	/*テクスチャ座標の更新*/
	pVtx[ nLoop ].tex = D3DXVECTOR2( 0.0f , 0.0f );
	pVtx[ nLoop + 1 ].tex = D3DXVECTOR2( 1.0f , 0.0f );
	pVtx[ nLoop + 2 ].tex = D3DXVECTOR2( 0.0f, 1.0f );
	pVtx[ nLoop + 3 ].tex = D3DXVECTOR2( 1.0f , 1.0f );
	
	//頂点バッファのロックを解除する
	g_pVtxBufferRanking->Unlock( );

	///*「成功した」という情報を返す*/
	return S_OK;
}

// ランキングモードの設定
void SetRankingType( RANKING_TYPE type )
{

	// ランキングタイプの設定
	g_type = type;

}

