//-------------------------------------
//explosion.cpp
//爆発プログラム
//作成者：牧野駿太
//作成日：2016/06/20
//-------------------------------------


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


/*マクロ定義*/
#define EXPLOSION_MAX ( 10 )   //爆発の最大数
#define EXPLOSION_WIDTH ( 50.0f )   //爆発の幅
#define EXPLOSION_HEIGHT ( 50.0f )   //爆発の高さ
#define EXPLOSION_TX_WIDTH ( 0.2f )   //爆発テクスチャの幅
#define EXPLOSION_TX_HEIGHT ( 0.5f )   //爆発の高さ

/*グローバル変数*/
LPDIRECT3DTEXTURE9 g_pTextureExplosion[ 4 ] = { };   //テクスチャインターフェースへのポインタ
LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferExplosion = NULL;   //頂点バッファ管理インタフェースへのポインタ
EXPLOSION g_aExplosion[ EXPLOSION_MAX ];   //爆発情報   //ここが弾の数になる!!!

/*プロトタイプ宣言*/
void MakeVertexExplosion( LPDIRECT3DDEVICE9 pDevice );



//----------------------------
//InitExplosion関数
//爆発の初期化
//----------------------------
void InitExplosion( void )
{
	int nLoop = 0;

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

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

	/*爆発の頂点の作成*/
	MakeVertexExplosion( pDevice );

	/*爆発のフラグ*/
	for( nLoop = 0; nLoop < EXPLOSION_MAX; nLoop++ )
	{
		g_aExplosion[nLoop].bUse = false;
		g_aExplosion[ nLoop ].nTxMode = 0;
		g_aExplosion[ nLoop ].nColor = 0;
	}
}


//----------------------------
//UninitExplosion関数
//爆発の終了処理
//----------------------------
void UninitExplosion( void )
{
	/*g_pTextureExplosionの解放*/
	SAFE_RELEASE( g_pTextureExplosion[ 0 ] );
	SAFE_RELEASE( g_pTextureExplosion[ 1 ] );
	SAFE_RELEASE( g_pTextureExplosion[ 2 ] );
	SAFE_RELEASE( g_pTextureExplosion[ 3 ] );

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


//----------------------------
//UpdateExplosion関数
//爆発の更新
//----------------------------
void UpdateExplosion( void )
{
	//----------------------------
	//UpdateExplosionTx関数
	//爆発の頂点座標を進める
	//----------------------------
		int nLoop = 0;   //ループ用の変数
		int nLoop2 = 0;   //ループ用の変数
		VERTEX_2D *pVtx = NULL;   //仮想アドレスを取得するためのポインタ

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

		/*敵テクスチャ座標の更新更新*/
		for (nLoop = 0; nLoop < 4 * EXPLOSION_MAX; nLoop += 4, nLoop2++)
		{
			/*爆発状態だったら*/
			if (g_aExplosion[nLoop2].bUse == true)
			{
				/*爆発までのカウントを進める*/
				g_aExplosion[nLoop2].nCntTx++;

				/*一定間隔で更新する*/

				/////ここで爆発のテクスチャ座標を進める
				g_aExplosion[nLoop2].TxPos.x = (g_aExplosion[nLoop2].nTxMode % 5) * EXPLOSION_TX_WIDTH;
				g_aExplosion[nLoop2].TxPos.y = (g_aExplosion[nLoop2].nTxMode / 5) * EXPLOSION_TX_HEIGHT;

				/*テクスチャ座標の更新*/
				pVtx[nLoop].tex = D3DXVECTOR2(g_aExplosion[nLoop2].TxPos.x, g_aExplosion[nLoop2].TxPos.y);
				pVtx[nLoop + 1].tex = D3DXVECTOR2(g_aExplosion[nLoop2].TxPos.x + EXPLOSION_TX_WIDTH, g_aExplosion[nLoop2].TxPos.y);
				pVtx[nLoop + 2].tex = D3DXVECTOR2(g_aExplosion[nLoop2].TxPos.x, g_aExplosion[nLoop2].TxPos.y + EXPLOSION_TX_HEIGHT);
				pVtx[nLoop + 3].tex = D3DXVECTOR2(g_aExplosion[nLoop2].TxPos.x + EXPLOSION_TX_WIDTH, g_aExplosion[nLoop2].TxPos.y + EXPLOSION_TX_HEIGHT);

				g_aExplosion[nLoop2].nTxMode++;

				/*爆発のカウントがマックスになったら*/
				if (g_aExplosion[nLoop2].nCntTx > 20)
				{
					/*爆発を終える*/
					g_aExplosion[nLoop2].bUse = false;
					g_aExplosion[nLoop2].nTxMode = 0;
					g_aExplosion[nLoop2].nCntTx = 0.0f;
				}
			}
		}

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


//----------------------------
//DrawExplosion関数
//爆発の描画
//----------------------------
void DrawExplosion( void )
{
	int nLoop = 0;   //ループ用の変数

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

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

	//頂点フォーマット設定
	pDevice -> SetFVF( FVF_VERTEX_2D );
	
	/*爆発の数だけループ*/
	for( nLoop = 0; nLoop < EXPLOSION_MAX; nLoop++ )
	{
		/*爆発状態だったら*/
		if( g_aExplosion[ nLoop ].bUse == true )
		{
			/*テクスチャーの貼り付け*/
			pDevice -> SetTexture( 0 , g_pTextureExplosion[ g_aExplosion[ nLoop ].nColor ] );

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


//----------------------------
//MakeVertexExplosion関数
//爆発の頂点の作成
//----------------------------
void MakeVertexExplosion( LPDIRECT3DDEVICE9 pDevice )
{
	int nLoop = 0;   //ループ用の変数
	VERTEX_2D *pVtx = NULL;   //仮想アドレスを取得するためのポインタ

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

	//頂点バッファをロックして、仮想アドレスを取得する
	g_pVtxBufferExplosion->Lock( 0 , 0 , ( void **)&pVtx , 0 );
	
	/*車の数だけループ*/
	for( nLoop = 0; nLoop < 4 * EXPLOSION_MAX; nLoop += 4 )
	{
		//頂点座標の設定(2D座標・右回り)
		pVtx[ nLoop ].pos = D3DXVECTOR3( 0.0f , 0.0f , 0.0f );
		pVtx[ nLoop + 1 ].pos = D3DXVECTOR3( 0.0f , 0.0f , 0.0f );
		pVtx[ nLoop + 2 ].pos = D3DXVECTOR3( 0.0f , 0.0f , 0.0f );
		pVtx[ nLoop + 3 ].pos = D3DXVECTOR3( 0.0f , 0.0f , 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_pVtxBufferExplosion->Unlock( );
}


//----------------------------
//SetVerTexExplosion関数
//爆発の頂点の更新
//----------------------------
void SetVerTexExplosion( ENEMY *pEnemy )
{
	//int nLoop = 0;   //ループ用の変数
	//int nLoop2 = 0;   //ループ用の変数
	//VERTEX_2D *pVtx = NULL;   //仮想アドレスを取得するためのポインタ

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

	///*敵の数分の更新*/
	//for( nLoop = 0; nLoop < 4 * EXPLOSION_MAX; nLoop += 4 , nLoop2++ )
	//{
	//	/*敵の情報をもらってくる*/
	//	pEnemy = GetEnemy( nLoop2 );

	//	if( pEnemy->bUsed == false && g_aExplosion[ nLoop2 ].bUse == false )
	//	{
	//		g_aExplosion[ nLoop2 ].bUse = true;

	//		/*死んだ弾の座標を取得する*/
	//		g_aExplosion[ nLoop2 ].Pos = pEnemy->pEnemyBody->cBody.GetPosCenter( );

	//		/*色がほしいいいいいいいいいいいいいい*/
	//		switch (pEnemy->type)
	//		{
	//		case TYPE_YELLOW:
	//			g_aExplosion[nLoop2].nColor = 0;
	//			break;
	//		case TYPE_RED:
	//			g_aExplosion[nLoop2].nColor = 1;
	//			break;
	//		case TYPE_GREEN:
	//			g_aExplosion[nLoop2].nColor = 2;
	//			break;
	//		case TYPE_BLUE:
	//			g_aExplosion[nLoop2].nColor = 3;
	//			break;
	//		}
	//	//	g_aExplosion[ nLoop2 ].nColor = ;

	//		//頂点座標の設定(2D座標・右回り)
	//		pVtx[ nLoop ].pos = D3DXVECTOR3( g_aExplosion[ nLoop2 ].Pos.x - 15, g_aExplosion[ nLoop2 ].Pos.y - 15, 0.0f );
	//		pVtx[ nLoop + 1 ].pos = D3DXVECTOR3( g_aExplosion[ nLoop2 ].Pos.x + EXPLOSION_WIDTH - 15 , g_aExplosion[ nLoop2 ].Pos.y - 15 , 0.0f );
	//		pVtx[ nLoop + 2 ].pos = D3DXVECTOR3( g_aExplosion[ nLoop2 ].Pos.x - 15 , g_aExplosion[ nLoop2 ].Pos.y + EXPLOSION_HEIGHT - 15 , 0.0f );
	//		pVtx[ nLoop + 3 ].pos = D3DXVECTOR3( g_aExplosion[ nLoop2 ].Pos.x + EXPLOSION_WIDTH - 15 , g_aExplosion[ nLoop2 ].Pos.y + EXPLOSION_HEIGHT - 15 , 0.0f );

	//		/*爆発カウントの初期化*/
	//		g_aExplosion[ nLoop ].nCntTx = 0;

	//		break;
	//	}
	//}

	//nLoop2 = 0;

	///*敵テクスチャ座標の更新更新*/
	//for( nLoop = 0; nLoop < 4 * EXPLOSION_MAX; nLoop += 4 , nLoop2++ )
	//{
	//	/*爆発状態だったら*/
	//	if( g_aExplosion[ nLoop2 ].bUse == true )
	//	{
	//		/*爆発までのカウントを進める*/
	//		g_aExplosion[ nLoop2 ].nCntTx++;

	//		/*一定間隔で更新する*/
	//	
	//		/////ここで爆発のテクスチャ座標を進める
	//		g_aExplosion[ nLoop2 ].TxPos.x = ( g_aExplosion[ nLoop2 ].nTxMode % 5 ) * EXPLOSION_TX_WIDTH;
	//		g_aExplosion[ nLoop2 ].TxPos.y = ( g_aExplosion[ nLoop2 ].nTxMode / 5 ) * EXPLOSION_TX_HEIGHT;

	//		/*テクスチャ座標の更新*/
	//		pVtx[ nLoop ].tex = D3DXVECTOR2( g_aExplosion[ nLoop2 ].TxPos.x , g_aExplosion[ nLoop2 ].TxPos.y );
	//		pVtx[ nLoop + 1 ].tex = D3DXVECTOR2( g_aExplosion[ nLoop2 ].TxPos.x + EXPLOSION_TX_WIDTH , g_aExplosion[ nLoop2 ].TxPos.y );
	//		pVtx[ nLoop + 2 ].tex = D3DXVECTOR2( g_aExplosion[ nLoop2 ].TxPos.x , g_aExplosion[ nLoop2 ].TxPos.y + EXPLOSION_TX_HEIGHT );
	//		pVtx[ nLoop + 3 ].tex = D3DXVECTOR2( g_aExplosion[ nLoop2 ].TxPos.x + EXPLOSION_TX_WIDTH , g_aExplosion[ nLoop2 ].TxPos.y + EXPLOSION_TX_HEIGHT );

	//		g_aExplosion[ nLoop2 ].nTxMode++;
	//		
	//		/*爆発のカウントがマックスになったら*/
	//		if( g_aExplosion[ nLoop2 ].nCntTx > 20 )
	//		{
	//			/*爆発を終える*/
	//			g_aExplosion[ nLoop2 ].bUse = false;
	//			g_aExplosion[ nLoop2 ].nTxMode = 0;
	//			g_aExplosion[ nLoop2 ].nCntTx = 0.0f;
	//		}
	//	}
	//}

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




	int nLoop = 0;   //ループ用の変数
	int nLoop2 = 0;   //ループ用の変数
	VERTEX_2D *pVtx = NULL;   //仮想アドレスを取得するためのポインタ

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

	/*敵の数分の更新*/
	for (nLoop = 0; nLoop < 4 * EXPLOSION_MAX; nLoop += 4, nLoop2++)
	{
		/*敵の情報をもらってくる*/
		pEnemy = GetEnemy(nLoop2);

		if (pEnemy->bUsed == false && g_aExplosion[nLoop2].bUse == false)
		{
			g_aExplosion[nLoop2].bUse = true;

			/*死んだ弾の座標を取得する*/
			g_aExplosion[nLoop2].Pos = pEnemy->pEnemyBody->cBody.GetPosCenter();

			/*色がほしいいいいいいいいいいいいいい*/
			pEnemy = GetEnemy(nLoop2);

			if (pEnemy->bUsed == false && g_aExplosion[nLoop2].bUse == false)
			{
				g_aExplosion[nLoop2].bUse = true;

				/*死んだ弾の座標を取得する*/
				g_aExplosion[nLoop2].Pos = pEnemy->pEnemyBody->cBody.GetPosCenter();

				/*色がほしいいいいいいいいいいいいいい*/
				switch (pEnemy->type)
				{
				case TYPE_YELLOW:
					g_aExplosion[nLoop2].nColor = 0;
					break;
				case TYPE_RED:
					g_aExplosion[nLoop2].nColor = 1;
					break;
				case TYPE_GREEN:
					g_aExplosion[nLoop2].nColor = 2;
					break;
				case TYPE_BLUE:
					g_aExplosion[nLoop2].nColor = 3;
					break;
				}

				//頂点座標の設定(2D座標・右回り)
				pVtx[nLoop].pos = D3DXVECTOR3(g_aExplosion[nLoop2].Pos.x - 15, g_aExplosion[nLoop2].Pos.y - 15, 0.0f);
				pVtx[nLoop + 1].pos = D3DXVECTOR3(g_aExplosion[nLoop2].Pos.x + EXPLOSION_WIDTH - 15, g_aExplosion[nLoop2].Pos.y - 15, 0.0f);
				pVtx[nLoop + 2].pos = D3DXVECTOR3(g_aExplosion[nLoop2].Pos.x - 15, g_aExplosion[nLoop2].Pos.y + EXPLOSION_HEIGHT - 15, 0.0f);
				pVtx[nLoop + 3].pos = D3DXVECTOR3(g_aExplosion[nLoop2].Pos.x + EXPLOSION_WIDTH - 15, g_aExplosion[nLoop2].Pos.y + EXPLOSION_HEIGHT - 15, 0.0f);

				/*爆発カウントの初期化*/
				g_aExplosion[nLoop].nCntTx = 0;

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