/***************************************************************/
//
//
//		DirectX	[game.cpp]
//
//										Author	kazuki tanaka
//										Date	2016 07/08
/*---------------------------------------------------------------
■Update : 2016/06/16

/*---------------------------------------------------------------
	インクルードファイル
---------------------------------------------------------------*/

#include "main.h"

#include "game_background.h"
#include "frame.h"
#include "player.h"
#include "enemy.h"
#include "timer_logo.h"
//#include "timer.h"
#include "score.h"
#include "score_logo.h"
#include "goal.h"
#include "particle.h"
#include "explosion.h"
#include "sound.h"
#include "stage.h"
#include "stage_effect.h"
#include "emitter.h"
#include "timer.h"
#include "locus.h"

#include "KF_BodyContact.h"

/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/
/*---------------------------------------------------------------
	定数定義
---------------------------------------------------------------*/

#define NUM_VERTEX (4)

#define GAME_BGM (1)

#define GAME_TEXTURENAME "data/TEXTURE/bg005.jpg"

#define GAME_POS_X (0)						//背景の表示位置X
#define GAME_POS_Y (0)						//背景の表示位置Y
#define GAME_WIDTH (SCREEN_WIDTH)			//背景の幅
#define GAME_HEIGHT (SCREEN_HEIGHT)			//背景の高さ

/*---------------------------------------------------------------
	プロトタイプ宣言
---------------------------------------------------------------*/
void InitTexGame( void );					//ゲーム用テクスチャの初期化 
void UninitTexGame( void );					//ゲーム用テクスチャの終了処理
void UpdateTexGame( void );					//ゲーム用テクスチャの更新
void DrawTexGame( void );					//ゲーム用テクスチャの描画
HRESULT MakeVertexGame( LPDIRECT3DDEVICE9 pDevice );
											//ゲーム用テクスチャの頂点情報
/*----------------------------------------------------------------
	グローバル変数
----------------------------------------------------------------*/

LPDIRECT3DTEXTURE9 g_pTextureGame=nullptr;	//テクスチャ-インターフェ-ス用

LPDIRECT3DVERTEXBUFFER9 g_pVtxBufferGame=nullptr;
											//頂点バッファインターフェースへのポインタ

EMITTER g_emitter;


// 初期化処理
void InitGame( void )
{

	// 各関数の初期化処理
	//InitGameBackground( );
	InitStage( );
	InitStageEffect( );
	InitFrame( );
	InitPlayer( );
	InitExplosion();
	InitEnemy( );
	InitBodyContact( );
	InitTimerLogo( );
	InitScoreLogo( );
	InitScore( );
	InitTimer( );  
	InitGoal();
	InitParticle( );
	InitLocus( );

	PlaySound( GAME_BGM , true );

	g_emitter.nLife = 0;
	g_emitter.Pos.x = 400;
	g_emitter.Pos.y = 300;
	g_emitter.Speed.x = 10;
	g_emitter.Speed.y = 10;
	g_emitter.Acceleration.x = 0.95f;
	g_emitter.Acceleration.y = 0.95f;
	g_emitter.nNum = 30;				// 生成個数

}

// 終了処理
void UninitGame(void)
{

	// 各関数の解放処理
	//UninitGameBackground( );
	UninitStage( );
	UninitStageEffect( );
	UninitFrame( );
	UninitPlayer( );
	UninitExplosion();
	UninitEnemy( );
	UninitBodyContact( );
	UninitTimerLogo( );
	UninitScoreLogo( );
	UninitScore( );
	UninitTimer( );  
	UninitGoal();
	UninitParticle( );
	UninitLocus( );

	StopSound( GAME_BGM );

}

// 更新処理
void UpdateGame( void )
{

	// 各関数の更新
	//UpdateGameBackground( );
	UpdateStage( );
	UpdateStageEffect( );
	UpdateFrame( );
	UpdatePlayer( );
	UpdateExplosion();
	UpdateEnemy( );
	UpdateBodyContact( );
	UpdateTimerLogo( );
	UpdateScoreLogo( );
	UpdateScore( );
	UpdateTimer( );  
	UpdateLocus( );
	UpdateGoal();


	// effect更新
	if (g_emitter.nTime > 0)
	{
		g_emitter.nTime--;
	}
	
	if (g_emitter.nTime != 0)
	{
		EmitParticle(&g_emitter, GetParticle());
	}
	

	UpdateParticle( );


	// ボリュームの変更
	ControlVolume( GAME_BGM );

}

// 描画処理
void DrawGame ( void )
{

	// 各関数の描画
	//DrawGameBackground( );
	DrawStage( );
	DrawLocus( );
	DrawPlayer( );
	DrawExplosion();
	DrawEnemy( );
	DrawStageEffect( );
	DrawFrame( );
	DrawTimerLogo( );
	DrawScoreLogo( );
	DrawScore( );
	DrawTimer( );  
	DrawGoal();

	DrawParticle( );

}

// 背景の初期化
void InitTexGame( void )
{

	LPDIRECT3DDEVICE9 g_pPD3DDevice = nullptr;		//デバイス受け取り用関数

	// デバイスの受け取り
	g_pPD3DDevice = GetDevice( );

	// VERTEX_2Dの設定
	MakeVertexGame(g_pPD3DDevice);

	// テクスチャの読み込み
	if(FAILED(D3DXCreateTextureFromFile(g_pPD3DDevice,GAME_TEXTURENAME,&g_pTextureGame)))
	{
		MessageBox(NULL,"テクスチャのファイルの読み込みに失敗しました","失敗", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2);
	}

}

// 背景の終了処理
void UninitTexGame( void ){

	// テクスチャインターフェースの開放
	SAFE_RELEASE(g_pTextureGame)

	// 頂点バッファインターフェースの開放
	SAFE_RELEASE(g_pVtxBufferGame)


}

// 背景の更新
void UpdateTexGame( void ){

	
}

// 背景の描画
void DrawTexGame( void )
{

	LPDIRECT3DDEVICE9 g_pPD3DDevice=nullptr;			//デバイス受け取り用関数


	// デバイスの受け取り処理
	g_pPD3DDevice=GetDevice( );

	// ストリーム
	g_pPD3DDevice->SetStreamSource(0,					//MS
	g_pVtxBufferGame,									//どの頂点バッファ―と結ぶか...
	0,													//データのオフセット
	sizeof(VERTEX_2D));									//ストライド値(バイト)

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

	// テクスチャの設定
	g_pPD3DDevice->SetTexture(0,g_pTextureGame);			//頂点にUVデータをセットする
	
	// ポリゴンの描画
	g_pPD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,NUM_VERTEX);


}

// 頂点の作成
HRESULT MakeVertexGame( LPDIRECT3DDEVICE9 pDevice )
{

	VERTEX_2D *pVtx;									//仮想アドレス

	if(FAILED(pDevice->CreateVertexBuffer(
			sizeof(VERTEX_2D) * NUM_VERTEX,				//確保するバッファサイズ(頂点数分確保) 単位:バイト
			D3DUSAGE_WRITEONLY,							//使用方法
			FVF_VERTEX_2D,								//使用する頂点フォーマット(特殊な処理をしない限り参照されないので0でよい)
			D3DPOOL_MANAGED,							//バッファの管理方法(バッファの中に書き込んだものの管理方法)
			&g_pVtxBufferGame,							//格納するポインタ先
			NULL)))
	{

		MessageBox(NULL,"バッファへの書き込みに失敗しました!!","vertex buffer ERROR!!",MB_OK);
		return E_FAIL;
	}

	// バッファをロックし仮想アドレスを取得する
	g_pVtxBufferGame -> Lock(0,0,(void**)&pVtx,0);			//GPUからのVRAMへの操作をロックする



	// 頂点座標の設定

	pVtx[0].pos=D3DXVECTOR3( GAME_POS_X, GAME_POS_Y, 0.0f);
	pVtx[1].pos=D3DXVECTOR3( GAME_WIDTH, GAME_POS_Y, 0.0f);
	pVtx[2].pos=D3DXVECTOR3( GAME_POS_X, GAME_HEIGHT,0.0f);
	pVtx[3].pos=D3DXVECTOR3( GAME_WIDTH, GAME_HEIGHT,0.0f);

	pVtx[0].rhw=1.0f;
	pVtx[1].rhw=1.0f;
	pVtx[2].rhw=1.0f;
	pVtx[3].rhw=1.0f;

	pVtx[0].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[1].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[2].color=D3DCOLOR_RGBA(255,255,255,255);
	pVtx[3].color=D3DCOLOR_RGBA(255,255,255,255);

	pVtx[0].tex=D3DXVECTOR2( 0.0f, 0.0f );
	pVtx[1].tex=D3DXVECTOR2( 1.0f, 0.0f );
	pVtx[2].tex=D3DXVECTOR2( 0.0f, 1.0f );
	pVtx[3].tex=D3DXVECTOR2( 1.0f, 1.0f );


	// バッファのアンロック
	g_pVtxBufferGame->Unlock();

	return S_OK;

}

void SetEmitter(D3DXVECTOR3 vPos)
{
	g_emitter.nTime = 3;
	g_emitter.nLife = 10;
	g_emitter.Pos.x = vPos.x;
	g_emitter.Pos.y = vPos.y;
	g_emitter.Speed.x = 10;
	g_emitter.Speed.y = 10;
	g_emitter.Acceleration.x = 0.95f;
	g_emitter.Acceleration.y = 0.95f;
	g_emitter.nNum = 30;
}
