#include "EnemyModeScene.h"

#include "StaticData.h"

namespace MotionTest {
using namespace HPL ;
using namespace E3D ;
using namespace General;
using namespace MotionTestConsts;
using namespace BasicStaticDataConsts;


EnemyModeScene::EnemyModeScene() : AbstractScene() {
}
EnemyModeScene::~EnemyModeScene() {
}

void EnemyModeScene::init() {
	int ret = 0;

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

	// マウスは自由に動けない
	staticData->set_Grab( TRUE );

	// 地形をテストフィールドにする
	staticData->set_GroundType( GroundType::TEST) ;

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

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

	// 服装初期化
	for(int i = 0; i < Parts::MAX_NUM; i ++ ) {
		staticData->m_aryPartsValidList[i] = TRUE;
		ret = E3DSetValidFlag( staticData->m_aryPlayerList[PlayerType::EVIGEN].m_nSigID,
			staticData->m_aryPartsIndexList[i], staticData->m_aryPartsValidList[i] );
		if(ret ) {
			_ASSERT(0);
		}
	}

	staticData->get_Player()->m_nEventNumber = 0;
	staticData->get_Player()->m_nUnderEventNumber = -1;

	{
		int baseList[] = {
			-1,
			0
		};
		int baseNoList[] = {
			0
		};
		int eventno = staticData->get_Player()->m_nEventNumber;
		ret = E3DSetMOAEventNoML( staticData->get_Player()->m_nSigID, eventno,
			baseList, baseNoList );
		if( ret ){
			_ASSERT( 0 );
			return ;
		}
		ret = E3DSetNewPoseML( staticData->get_Player()->m_nSigID );
		if( ret ){
			_ASSERT( 0 );
			return ;
		}
	}

	// 初期化
	staticData->m_EnemyManager.reset();
	staticData->m_ShotManager.reset();
	staticData->m_NeutralManager.reset();

	// 操作する敵を選ぶ
	m_Enemy = staticData->m_EnemyManager.search( EnemyType::TROL );

	// 視点を操作する敵を正面から見る位置に変える
	staticData->set_CameraInFrontOfObject( m_Enemy->m_nSigID, 0 );

	// 視点を敵中心にする
	staticData->m_nCameraTargetSigID = m_Enemy->m_nSigID;

	// 敵を配置
	ret = E3DSetPosOnGround( m_Enemy->m_nSigID, staticData->get_GroundSigID(), 
		MAP_HEIGHT, MAP_MIN, 10000, 10000 );
	if( ret ) {
		_ASSERT(0);
	}

	// 透明にする
	int mat = -1;
	/*
	// サイクロプス
	ret = E3DGetMaterialNoByName( m_Enemy->m_nSigID, "Material.001 _Untitled", &mat );
	if( ret ) {
		_ASSERT( 0 );
		return ;
	}*/
	// ワーム

	/*	// 半透明にする
	ret = E3DGetMaterialNoByName( m_Enemy->m_nSigID, "Material.001 _Untitled", &mat );
	if( ret ) {
		_ASSERT(0);
	}
	ret = E3DSetMaterialAlpha( m_Enemy->m_nSigID, mat, 0.8f);
	if( ret ) {
		_ASSERT(0);
	}*/


	// モス子登場
	for( int i = 0; i < MOSUKO_MAX; i ++ ) {
		E3DObject* obj = staticData->m_EnemyManager.search( EnemyType::MOSUKO );
		obj = staticData->m_EnemyManager.search( EnemyType::MOSUKO_LONG );
	}
}
void EnemyModeScene::process() {
	int ret = 0;

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

	// 描画等
	ret = this->render();
	if( ret ){
		_ASSERT( 0 );
		return ;
	}
}
void EnemyModeScene::quit() {
	// 視点をプレイヤー中心に戻す
	staticData->m_nCameraTargetSigID = staticData->get_Player()->m_nSigID;
	int mat;
	int ret = 0;
	ret = E3DGetMaterialNoByName( m_Enemy->m_nSigID, "Material.001 _Untitled", &mat );
	if(ret){
		_ASSERT(0);
	}
	ret = E3DSetMaterialAlpha( m_Enemy->m_nSigID, mat, 1.f);
	if(ret){
		_ASSERT(0);
	}
}

//! 文字列描画
int EnemyModeScene::drawText() {
	int ret = 0;
	float zoom = 1;

	ret = E3DTool::drawText(
		10, 10,			//pos XY
		255, 255, 255, 255,	//col RGBA
		zoom,				// zoom
		"FPS:%d", staticData->get_FPS() );
	if( ret ) {
		_ASSERT( 0 );
		return ret;
	}
	return 0;
}

//! レンダリング
int EnemyModeScene::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_EnemyManager.process();

		///////////////
		// 全ビルボード描画
		ret = E3DRenderBillboard( staticData->get_SwapChainID(), 0 );
		if( ret ) {
			_ASSERT( 0 );
			return ret;
		}

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

		// 文字列描画
		this->drawText();
		staticData->afterRenderCommon();
	if( E3DEndScene() ) {
		_ASSERT( 0 );
		return 1;
	}
	return 0;
}

//! フレームごとの移動処理
int EnemyModeScene::frameMove() {

	int ret = 0;


	if( staticData->is_Pause() == FALSE ) {
		// モーション変化
		ret = staticData->updatePlayerMotion();
		staticData->move_BillBoard();

	}

	DIMOUSESTATE2* mouse = staticData->get_DIMouse()->get_CurrentState();
	DIMOUSESTATE2* mousePreious = staticData->get_DIMouse()->get_PreviousState();

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

	return 0;
}


}
