#include "TitleScene.h"

#include "StaticData.h"

namespace MotionTest {
using namespace HPL;
using namespace General;
using namespace MotionTestConsts;
using namespace TitleSceneConsts;

TitleScene::TitleScene() : AbstractScene() {
	staticData->set_Pause( FALSE );
}
TitleScene::~TitleScene() {
}

void TitleScene::init() {

	// 背景設定
	//E3DCreateBG(staticData->get_SwapChainID(), "Media\\Sprite\\Title.png", "hoge", 
	//	0, 0, 0, 20000 );
	
	// 地形をテストフィールドにする
	// 地形をランダムにする
	staticData->set_GroundType( MathTool::nextRandom<int>(0, GroundType::MAX_NUM ));//GroundType::TEST ) ;

	// カメラの位置をプレイヤー準拠にする
	staticData->m_nCameraTargetSigID = staticData->get_Player()->m_nSigID;

	int ret = 0;
	ret = staticData->initUISceneCommon();

	// マウスは自由に動く
	//staticData->set_Grab( FALSE );

	staticData->set_WeaponIndex(WeaponType::GRANADE_LAUNCHER);
	// プレイヤー初期化
	BOOL bIsHPMax = TRUE;
	staticData->reset_Player( bIsHPMax );
	
	staticData->reset_EvigenMaterial();

	staticData->get_Player()->m_Game.reset();



	staticData->change_PlayerType( PlayerType::EVIGEN );


	// 視点をプレイヤーを正面から見る位置に変える
	staticData->set_CameraInFrontOfObject( staticData->m_nCameraTargetSigID, 0 );

	this->m_nSelectedButton = -1;

	// BGM変更
	staticData->set_BGMIndex( Sound::TITLE );

	staticData->m_bNearByConsole = FALSE;
}
void TitleScene::process() {
	int ret = 0;

	// キャラクターの移動等
	ret = this->frameMove();
	if( ret ){
		_ASSERT( 0 );
		return ;
	}

	// 描画等
	ret = this->render();
	if( ret ){
		_ASSERT( 0 );
		return ;
	}
}
void TitleScene::quit() {
}

//! 文字列描画
int TitleScene::drawText() {
	return 0;
}

//! レンダリング
int TitleScene::render() {

	int ret = 0;


	/////////////////////////////////////////
	// シーン描画開始
	ret = E3DBeginScene( staticData->get_SwapChainID(), 0 );//skipflag 
	if( ret ) { 
		_ASSERT( 0 );
		return 1;
	}



		int r = 255, g = 200, b = 200, a = 200;

		//////////
		// スプライト表示
		ret = E3DBeginSprite();

			// クライアント領域のサイズ取得
			RECT rClientRect;
			staticData->get_ClientRect( &rClientRect );
			int nClientHeight = rClientRect.bottom - rClientRect.top;
			int nClientWidth = rClientRect.right - rClientRect.left;

			// タイトル背景
			{
				int nSpriteW;
				int nSpriteH;
				ret = E3DGetSpriteSize( staticData->m_SpriteIndexManager.get( Sprite::TITLE_SCREEN ), 
					&nSpriteW, &nSpriteH );

				float fRateX = static_cast<float>(nClientWidth) / static_cast<float>(nSpriteW);
				float fRateY = static_cast<float>(nClientHeight) / static_cast<float>(768);

				ret = E3DRenderSprite( staticData->m_SpriteIndexManager.get( Sprite::TITLE_SCREEN),
					fRateX, fRateY, D3DXVECTOR3(0.f,
					0.f, 0.2f ) );
			}

			int TITLE_TOP_MERGINE =0;
			int TITLE_BUTTON_MERGINE = TITLE_TOP_MERGINE;

			int nTitleSpriteH = 128;
			// タイトル
			/*{
				int nSpriteW;
				int spid = staticData->m_SpriteIndexManager.get( Sprite::TITLE );
				ret = E3DGetSpriteSize( spid, 
					&nSpriteW, &nTitleSpriteH );
				int nLeft = nClientWidth / 4 * 3 - nSpriteW / 2;
				int nTop = TITLE_TOP_MERGINE ;

				//E3DCOLOR4UC uc = {a, r, g, b};
				// 赤くする
				//ret = E3DSetSpriteARGB( spid, uc );

				ret = E3DRenderSprite( spid,
					1, 1, D3DXVECTOR3(static_cast<FLOAT>(nLeft),
					static_cast<FLOAT>(nTop), 0.0f ) );
			}*/

			POINT p;
			GetCursorPos( &p);
			ScreenToClient( staticData->get_WindowHandle(), 
				&p );

			const int UI_TOP = static_cast<int>(nClientHeight / 2.f);
			// ボタン
			{
				const int BUTTON_NUM = 4;

				char LABELS[][100] = {
					"Scenario",
					"Enemy Mode",
					"Challenge Mode",
					"Exit"
				};
				const float HEIGHT_RATE = 0.7f;

				int nSpriteW;
				int nSpriteH;
				int nSpriteID = staticData->m_SpriteIndexManager.get( Sprite::TITLE_SUBJECT );
				ret = E3DGetSpriteSize( nSpriteID, 
					&nSpriteW, &nSpriteH );

				int nLeft = nClientWidth / 5 * 4 - nSpriteW / 2;
				int nInterval = static_cast<int>(nSpriteH * (HEIGHT_RATE + 0.01f) );


				this->m_nSelectedButton = -1;

				for(int i = 0; i < BUTTON_NUM; i ++ ) {
					int nTopNow = TITLE_TOP_MERGINE + nTitleSpriteH + TITLE_BUTTON_MERGINE +
						i * nInterval;//UI_TOP + i * nInterval;

					if( i >= 3){// BUTTON_NUM - 1 ) {

						if( staticData->m_nScreenWidth <= 640 ) {
							// 銃が見えるように、2個目以降はもっと下の方に設置
							nTopNow = UI_TOP + i * nInterval;
						} else if( staticData->m_nScreenWidth < 960 ) {

							// 800だとちょっとかぶる
							nTopNow = UI_TOP + i * nInterval + 10;
						} else { 
							// 大きい場合は、そのままで十分見られる
						}
					} else {
						if( staticData->m_nScreenWidth <= 640 ) {
							// 銃が見えるように、2個目以降はもっと下の方に設置
							nTopNow -= nTitleSpriteH / 2;
						}
					}
					if( staticData->set_MouseOverSpriteColor(
						nSpriteID, p.x, p.y, nLeft, nTopNow, nSpriteW, static_cast<int>(nSpriteH * HEIGHT_RATE), 
						255,100,100,200, 255,255,255, 200 ) )
					{
						this->m_nSelectedButton = i;
					}
/*					if( p.x >= nLeft && p.x <= nLeft + nSpriteW &&
						p.y >= nTopNow && p.y <= nTopNow + nSpriteH )
					{
						// カーソルが中に入った
						E3DCOLOR4UC uc = {200,255,100,100 };
						// 赤くする
						ret = E3DSetSpriteARGB( nSpriteID, uc );

						this->m_nSelectedButton = i;
					} else {
						E3DCOLOR4UC uc = {100,255,255,255 };
						ret = E3DSetSpriteARGB( nSpriteID, uc );
					}*/
					ret = E3DRenderSprite( nSpriteID,
						1, 0.7f, D3DXVECTOR3(static_cast<FLOAT>(nLeft),
						static_cast<FLOAT>(nTopNow), 0.1f ) );

					// 調整
					const int LEFT_TEXT_DELTA = 20;
					const int TOP_TEXT_DELTA = 10;
					// 文字列表示
					ret = E3DTool::drawTextWithFont(
						nLeft + LEFT_TEXT_DELTA, nTopNow +TOP_TEXT_DELTA,			//pos XY
						100, 10, 0, 255,	//col RGBA
						staticData->get_SwapChainID(),
						staticData->get_FontID(),
										// zoom
						"%s",
						LABELS[i]);
				}
				// 照準表示
				ret = E3DGetSpriteSize( staticData->m_SpriteIndexManager.get( Sprite::CROSS_HAIR ), 
					&nSpriteW, &nSpriteH );
				if( ret ) {
					_ASSERT( 0 );
					return ret;
				}
				ret = E3DRenderSprite( staticData->m_SpriteIndexManager.get( Sprite::CROSS_HAIR),
					1, 1, D3DXVECTOR3(static_cast<FLOAT>(p.x - nSpriteW / 2),
					static_cast<FLOAT>(p.y - nSpriteH / 2), 0.0f ) );
				if( ret ) {
					_ASSERT( 0 );
					return ret;
				}

				// 文字列表示
				ret = E3DTool::drawText(
					10, 10,			//pos XY
					255, 255, 255, 255,	//col RGBA
					1,				// zoom
					"p[%ld,%ld]",
					p.x, p.y);

			}

	/*		// オプション
			{
				// チェックボックス
				int nSpriteW;
				int nSpriteH;
				int nCheckedSpriteID = staticData->m_SpriteIndexManager.get( Sprite::CHECK_BOX_CHECKED ) ;
				int nNoCheckedSpriteID = staticData->m_SpriteIndexManager.get( Sprite::CHECK_BOX );

				ret = E3DGetSpriteSize( nCheckedSpriteID, 
					&nSpriteW, &nSpriteH );
				if( ret ) {
					_ASSERT( 0 );
					return ret;
				}

				int nLeft = nClientWidth  - OPTION_MERGINE_X;
				int nTop = UI_TOP;

				char aryLabelList[][100] = {
					"切断",
					"丸呑み透過",
					"黒",
					"寝ぼけて忘れた",
					"無限バンダナ",
				};

				// 間隔
				const int STEP = 32;
				for(int i = 0; i < TitleSceneConsts::CheckType::NUM_MAX; i ++ ) {
					// 首オプションの縦座標
					int nTopNow = nTop + STEP * i;

					int nSpriteID = staticData->m_aryOptionList[i] == TRUE ? nCheckedSpriteID : nNoCheckedSpriteID;
					BOOL bIsChecked = staticData->m_aryOptionList[i];

					// ボタンの上にカーソルが来ているか？は解除する
					this->m_aryIsChecked[i] = FALSE;

					if( staticData->set_MouseOverSpriteColor(
						nSpriteID, p.x, p.y, nLeft, nTopNow, nSpriteW, nSpriteH, 
						255,100,100,200, 255,255,255, 200 ) )
					{
						this->m_aryIsChecked[i] = TRUE;
					}

					ret = E3DRenderSprite( nSpriteID,
						1, 1, D3DXVECTOR3(static_cast<FLOAT>(nLeft),
						static_cast<FLOAT>(nTopNow), 0.0f ) );
					if( ret ) {
						_ASSERT( 0 );
						return ret;
					}



					// 文字列表示
					ret = E3DTool::drawTextWithFont(
						nLeft + nSpriteW, nTopNow + OPTION_TEXT_MERGINE_Y,
						255, 255, 255, 255,	//col RGBA
						staticData->get_SwapChainID(),
						staticData->get_FontID(),				// zoom
						aryLabelList[i]
						);

				}
			}*/

		ret = E3DEndSprite();

		staticData->afterRenderCommon();
	if( E3DEndScene() ) {
		_ASSERT( 0 );
		return 1;
	}
	return 0;
}

//! フレームごとの移動処理
int TitleScene::frameMove() {
	int ret = 0;

	////////////////////////
	// プレイヤー操作
	// プレイヤーWASD移動
	//staticData->movePlayer();

	// プレイヤーの弾の発射
	//staticData->shotPlayer();

	// モーション変化
	//ret = staticData->updatePlayerMotion();

	DIMOUSESTATE2* mouse = staticData->get_DIMouse()->get_CurrentState();
	DIMOUSESTATE2* mousePreious = staticData->get_DIMouse()->get_PreviousState();
	if( mouse->rgbButtons[0] && mousePreious->rgbButtons[0] == FALSE) {
		if( m_nSelectedButton == ButtonType::SCENARIO ) {
			// ゲームへ進む
			staticData->m_SceneManager.set_Scene( SceneType::SELECT_MISSION );
		} else if( m_nSelectedButton == ButtonType::ENEMY_MODE ) {
			// 敵モードへ進む
			staticData->m_SceneManager.set_Scene( SceneType::ENEMY_MODE );
		} else if( m_nSelectedButton == ButtonType::CHALLENGE_MODE ) {
			// ゲームへ進む
			// TODO チャレンジモードの作成
			staticData->m_SceneManager.set_Scene( SceneType::SELECT_MISSION );
		} else if( m_nSelectedButton == ButtonType::EXIT ) {
			PostQuitMessage( 0 );
		} else {
		/*	for( int i = 0; i < TitleSceneConsts::CheckType::NUM_MAX; i ++ ) {
				if( this->m_aryIsChecked[ i ] ) {
					staticData->m_aryOptionList[i] = !staticData->m_aryOptionList[i];

					// 保存する
					WritePrivateProfileString( _T("Evigen"), OPTION_ELEMENT_LIST[i] , 
						staticData->m_aryOptionList[i] ? _T("1"): _T("0"),
						OPTION_INI_FILE_PATH);
				}
			}*/
		}
	}
	///////////////////////////////
	// カメラ移動
	ret = staticData->moveCamera();
	if( ret ) {
		_ASSERT( 0 );
		return ret;
	}

	return 0;
}

}
