#include "BriefingScene.h"
#include "StaticData.h"

namespace MotionTest {
using namespace HPL;
using namespace E3D;

using namespace General;
using namespace MotionTestConsts;
BriefingScene::BriefingScene() : AbstractScene(){

	int ret = 0;
	// シナリオアイテム読み込み
	ret = m_ScenarioManager.load_ScenariosFromOneText( "Media\\Scenario\\Briefing.txt");

}
BriefingScene::~BriefingScene() {
}

void BriefingScene::init() {
	int ret = 0;
	ret = staticData->initUISceneCommon();

	// 背景
	ret = E3DCreateBG( staticData->get_SwapChainID(), "Media\\sea03.png", "hoge", 0, 0, 0, 20000 );

	// ダニモスルーム
	staticData->set_GroundType( GroundType::DANIMOTH_ROOM );
	// プレイヤー初期化

	BOOL bHPMax = TRUE;
	staticData->reset_Player( bHPMax );


	// マウスをキャッチ
	staticData->set_Grab( TRUE );

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

	staticData->m_EnemyManager.reset();
	staticData->m_ShotManager.reset();
	staticData->m_NeutralManager.reset();

	// ダニモス追加
	E3DObject* obj = staticData->m_NeutralManager.search( NeutralType::DANIMOTH );
	if( obj != NULL ) {
		// 配置
		
		ret = E3DSetPosOnGround( obj->m_nSigID, staticData->get_GroundSigID(), MAP_HEIGHT, MAP_MIN, 70000.f, 70000.f);
		
		ret = E3DGetPos( obj->m_nSigID, &obj->m_Move.m_vPosition );

		// ちょっと上にする
		obj->m_Move.m_vPosition.y = 25000.f;
		ret = E3DSetPos( obj->m_nSigID, obj->m_Move.m_vPosition );

	}

	// 黒下着になる
	if( staticData->m_aryOptionList[TitleSceneConsts::CheckType::BLACK] ) {
		staticData->setup_Under( 1);
	} else {
		staticData->setup_Under( 0);
	}
	// 下着姿になる
	if( staticData->m_aryOptionList[TitleSceneConsts::CheckType::NO_CLOTH] ) {
		int nPartsList[] = {
			Parts::CLOTH,
			Parts::APRON,
		};
		for(int i = 0; i < sizeof(nPartsList) / sizeof(int); i ++ ) {
			// 消す
			staticData->m_aryPartsValidList[nPartsList[i]] = FALSE;
			E3DSetValidFlag( staticData->m_aryPlayerList[PlayerType::EVIGEN].m_nSigID,
				staticData->m_aryPartsIndexList[nPartsList[i]], staticData->m_aryPartsValidList[nPartsList[i]] );
		}
	}

	
	//////////////////////////
	// シナリオリセット
	m_ScenarioManager.reset();

	int id = -1;
	if( staticData->m_nScenarioIndex == 0 ) {
		id = 0;
	} else if( staticData->m_nScenarioIndex == 1 ) {
		id = 1;
	} else if( staticData->m_nScenarioIndex == 2 ) {
		id = 2;
	}
	if( id >= 0 ) {
		// シナリオスタート
		m_ScenarioItem = m_ScenarioManager.get(id )->next();
	} else {
		m_ScenarioItem = NULL;
	}
}
void BriefingScene::process() {
	int ret = 0;

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

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

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

//! レンダリング
int BriefingScene::render() {
	int ret = 0;

	// 地面のチェックイン
	ret = staticData->checkInGround();
	if( ret ){
		_ASSERT( 0 );
		return 1;
	}

	/////////////////////////////////////////
	// プレイヤー関連
	// プレイヤーモデルチェックイン
	int status;
	if( E3DChkInView( staticData->get_SwapChainID(), staticData->get_Player()->m_nSigID, &status ) ){
		_ASSERT( 0 );
		return 1;
	}

	// 地面との接触判定
	ret = staticData->checkPlayerOnGround();
	if( ret ){
		_ASSERT( 0 );
		return 1;
	}

	/////////////////////////////////////////
	// 影付き描画
	staticData->renderWithShadow( TRUE, TRUE, FALSE, FALSE );

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

		////////////////
		// そのたの動作と描画
		ret = staticData->m_NeutralManager.process();

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

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


			// シナリオ表示
			staticData->draw_Scenario( this->m_ScenarioItem );

			// 文字列表示
			ret = E3DTool::drawText(
				500, 10,			//pos XY
				255, 255, 255, 255,	//col RGBA
				1,				// zoom
				"Briefing");

		ret = E3DEndSprite();

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

//! フレームごとの移動処理
int BriefingScene::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_ScenarioItem == NULL || staticData->m_nScenarioIndex < 0) {
			// ゲームへ進む
			staticData->m_SceneManager.set_Scene( SceneType::GAME );
		} else {
			// まだアイテムがあるか？
			this->m_ScenarioItem = this->m_ScenarioManager.get(staticData->m_nScenarioIndex)->next();
			if( this->m_ScenarioItem == NULL ) {
				// ゲームへ進む
				staticData->m_SceneManager.set_Scene( SceneType::GAME );
			}

		}
	}
	///////////////////////////////
	// カメラ移動
	ret = staticData->moveCamera();
	if( ret ) {
		_ASSERT( 0 );
		return ret;
	}

	return 0;
}
}
