//---------------------------------------------------
//処理（score.cpp）
//Author : SYUNTA MAKINO
//作成日 : 2016/05/31
//---------------------------------------------------


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

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

#define TEXTURE_NAME "data/TEXTURE/degifont.png"

#define SCORE_DIGIT ( 5 )   //スコアの桁数
#define SCORE_INIT_POS_X ( 500.0f )   //右端のスコアのX座標
#define SCORE_POS_Y ( 5.0f )   //スコアのY座標
#define SCORE_WIDTH ( 20.0f )   //スコアの幅
#define SCORE_HEIGHT ( 45.0f )   //スコアの高さ
#define SCORE_TX_WIDTH ( 0.2f )   //スコアテクスチャの幅
#define SCORE_TX_HEIGHT ( 0.5f )   //スコアクスチャの高さ

#define BONUS ( 100 )   //ボーナス


/*グローバル変数*/
LPDIRECT3DTEXTURE9 g_pTextureScore = nullptr;			//テクスチャインターフェースへのポインタ
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferScore = NULL;		//頂点バッファ管理インタフェースへのポインタ
int g_nCntScore;   //現在のスコア表示までのカウント
int g_nCurrentScore;   //現在のスコア

/*プロトタイプ宣言*/
void MakeVertexScore( LPDIRECT3DDEVICE9 pDevice );
void SetVertexScore( void );
void ScoreAdd( void );   //スコアを加算する


//----------------------------
//InitScore関数
//スコアの初期化
//----------------------------
void InitScore( void )
{
	/*デバイスの情報を取得*/
	LPDIRECT3DDEVICE9 pDevice = GetDevice( );

	/*テクスチャの読み込み*/
	if( FAILED( D3DXCreateTextureFromFile( pDevice , TEXTURE_NAME , &g_pTextureScore ) ) )
	{
		MessageBox( NULL , "テクスチャが読み込めませんでした" , "エラー" , MB_OK );
	}

	/*スコアの頂点の作成*/
	MakeVertexScore( pDevice );

	g_nCntScore = 0;
	g_nCurrentScore = 0;   //現在のスコアが入る！！！！
}


//----------------------------
//UninitScore関数
//スコアの終了処理
//----------------------------
void UninitScore( void )
{
	/*g_pTextureScoreの解放*/
	SAFE_RELEASE( g_pTextureScore );

	/*g_pVtxBufferScoreの解放*/
	SAFE_RELEASE( g_pVtxBufferScore );
}


//----------------------------
//UpdateScore関数
//スコアの更新
//----------------------------
void UpdateScore( void )
{
	/*スコアを加算する*/
	ScoreAdd( );

	/*スコアの頂点の更新*/
	SetVertexScore( );
}	


//----------------------------
//DrawScore関数
//スコアの描画
//----------------------------
void DrawScore( void )
{
	int nLoop = 0;   //ループ用の変数

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

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

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

	/*スコアの値の描画*/
	/*テクスチャーの貼り付け*/
	pDevice -> SetTexture( 0 , g_pTextureScore );

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

}


//----------------------------
//MakeVertexScore関数
//スコアの頂点の作成
//----------------------------
void MakeVertexScore( LPDIRECT3DDEVICE9 pDevice )
{
	int nLoop = 0;
	int nLoop2 = 0;
	float g_fScorePosXTmp = SCORE_INIT_POS_X;

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

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

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

	/*下画面のスコアの設定*/
	for( nLoop = 0; nLoop < NUM_VERTEX * SCORE_DIGIT ; nLoop += NUM_VERTEX , nLoop2++ )
	{
		//頂点座標の設定(2D座標・右回り)
		pVtx[ nLoop ].pos = D3DXVECTOR3( SCORE_INIT_POS_X + g_fScorePosXTmp , SCORE_POS_Y , 0.0f );
		pVtx[ nLoop + 1 ].pos = D3DXVECTOR3( SCORE_INIT_POS_X + SCORE_WIDTH + g_fScorePosXTmp , SCORE_POS_Y , 0.0f );
		pVtx[ nLoop + 2 ].pos = D3DXVECTOR3( SCORE_INIT_POS_X + g_fScorePosXTmp , SCORE_POS_Y + SCORE_HEIGHT , 0.0f );
		pVtx[ nLoop + 3 ].pos = D3DXVECTOR3( SCORE_INIT_POS_X + SCORE_WIDTH + g_fScorePosXTmp , SCORE_POS_Y + SCORE_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 );

		/*X座標を進める*/
		g_fScorePosXTmp -= SCORE_WIDTH;
	}

	//頂点バッファのロックを解除する
	g_pVtxBufferScore->Unlock( );
}


//----------------------------
//SetVertexScore関数
//スコアの頂点の作成
//----------------------------
void SetVertexScore( void )
{
	int nLoop = 0;
	int nValue = 0;
	int nTmp = g_nCntScore;
	D3DXVECTOR2 ScoreTxPos;   //ランキングのテクスチャ座標
	VERTEX_2D *pVtx = NULL;   //仮想アドレスを取得するためのポインタ

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

	/*頂点情報の更新*/
	for( nLoop = 0; nLoop < NUM_VERTEX * SCORE_DIGIT; nLoop += NUM_VERTEX )
	{
		/*テクスチャ座標の更新*/
		nValue = nTmp % 10;
		nTmp /= 10;
		ScoreTxPos.x = ( nValue % 5 ) * SCORE_TX_WIDTH;
		ScoreTxPos.y = ( nValue / 5 ) * SCORE_TX_HEIGHT;
		pVtx[ nLoop ].tex = D3DXVECTOR2( ScoreTxPos.x , ScoreTxPos.y );
		pVtx[ nLoop + 1 ].tex = D3DXVECTOR2( ScoreTxPos.x + SCORE_TX_WIDTH , ScoreTxPos.y );
		pVtx[ nLoop + 2 ].tex = D3DXVECTOR2( ScoreTxPos.x , ScoreTxPos.y + SCORE_TX_HEIGHT );
		pVtx[ nLoop + 3 ].tex = D3DXVECTOR2( ScoreTxPos.x + SCORE_TX_WIDTH , ScoreTxPos.y + SCORE_TX_HEIGHT );
	}

	//頂点バッファのロックを解除する
	g_pVtxBufferScore->Unlock( );
}

//----------------------------
//ScoreAdd関数
//スコアを加算する
//----------------------------
void ScoreAdd( void )
{

	DIMOUSESTATE2 *Dims = NULL;   //マウス情報へのポインタ

	if( g_nCntScore < g_nCurrentScore )
	{
		g_nCntScore+=2;
	}

}

// スコア値の取得
void SetScore( int point )
{

	// スコア値の加算
	g_nCurrentScore += point;

}

// スコア値の取得
int GetScore( void )
{

	return g_nCntScore;

}


