#include "EnemyManager.h"
#include "StaticData.h"
#include <cstdlib>

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

int EnemyManager::key_Move( HPL::E3D::E3DObject* obj ) {
	int ret = 0;
	//////////////////////////////
	// プレイヤーの移動等
	D3DXVECTOR3 vCameraPosition;
	E3DGetCameraPos( & vCameraPosition );

	D3DXVECTOR3 vPlayerPosition;
	E3DGetPos( obj->m_nSigID, &vPlayerPosition );

	// 
	D3DXVECTOR3 vDiff = vPlayerPosition - vCameraPosition;

	// 方向固定？
	BOOL bSTRAIF = FALSE;

	if( obj->m_Game.m_nType != EnemyType::TROL ) {
		_ASSERT(0);
	}

	if( staticData->get_CameraMode() == CameraMode::SHOT_BEHIND_MODE ) 
	{
		// 方向固定
		bSTRAIF = TRUE;

		// 射撃モードはプレイヤーからサブサテライト（照準）への方向を基本とする

		D3DXVECTOR3 vSatellitePosition ;

		staticData->get_Camera()->get_SatellitePosition( vPlayerPosition,
			&vSatellitePosition );
		vDiff = vSatellitePosition - vPlayerPosition;

	} else if( staticData->get_CameraMode() == CameraMode::SNIPER_MODE ) {
		// 方向固定
		bSTRAIF = TRUE;

		// すないぽんと射撃モードはプレイヤーから目標への方向を基本とする

		D3DXVECTOR3 vSatellitePosition ;

		staticData->get_Camera()->get_SatellitePosition( vPlayerPosition,
			&vSatellitePosition );
		vDiff = vSatellitePosition - vPlayerPosition;
	}

	// Y軸方向は水平
	vDiff.y = 0;

	// 最終的な方向
	D3DXVECTOR3 vFinalDirection(0,0,0); 

	// 移動あり？
	BOOL bToMove = FALSE;

	// 現在のフレームNoを取得
//	int motid;
//	int frameno;
	//ret = E3DGetMotionFrameNoML( obj->m_nSigID, obj->m_nUpperBoneNumber, &motid, &frameno );

	// キャラクター移動
	if( staticData->get_CurrentKeyBuffer( 'W' ) != 0 ) {
		bToMove = TRUE;

		// そのままの方向へ向かせて移動させる
		D3DXVECTOR3 vDirection = vDiff;

		vFinalDirection += vDiff;

	}
	if( staticData->get_CurrentKeyBuffer( 'S' ) != 0 ) {
		bToMove = TRUE;
		
		// 逆方向
		D3DXVECTOR3 vDirection = vDiff * -1;

		vFinalDirection += vDirection;

	}
	if( staticData->get_CurrentKeyBuffer( 'D' ) != 0 ) {
		bToMove = TRUE;

		// 左へ90度回転させた方向へ向かせる＆移動させる
		D3DXMATRIX matrix;									//マトリクス用意
		D3DXMatrixRotationY( &matrix, D3DXToRadian( 90) );

		D3DXVECTOR3 vDirection;
		D3DXVec3TransformCoord( &vDirection, &vDiff, &matrix );

		vFinalDirection += vDirection;

	}
	if( staticData->get_CurrentKeyBuffer( 'A' ) != 0 ) {
		bToMove = TRUE;

		// 右へ90度回転させた方向へ向かせる＆移動させる
		D3DXMATRIX matrix;									//マトリクス用意
		D3DXMatrixRotationY( &matrix, D3DXToRadian( -90) );

		D3DXVECTOR3 vDirection;
		D3DXVec3TransformCoord( &vDirection, &vDiff, &matrix );

		vFinalDirection += vDirection;

	}

	///////////////////////////
	/// モーション変更
	int eventno = obj->m_nEventNumber;

	if(bToMove == TRUE) {

		// 指定した方向をクォータニオンにセットする
		if( bSTRAIF ) {
			// 射撃モードなど、方向が前方固定
			staticData->face( -1 * vDiff, PLAYER_ROTATE_DIVISION, obj->m_nSigID,
				obj->m_Move.m_nQuoatanion);
		} else {
			// 前後左右にプレイヤーも向かせる
			staticData->face( -1 * vFinalDirection, PLAYER_ROTATE_DIVISION, obj->m_nSigID,
				obj->m_Move.m_nQuoatanion);
		}

		float fSpeed = PLAYER_WALK_SPEED;


		eventno = Motion::Trol::WALK;

		if( !staticData->get_CurrentKeyBuffer(VK_SHIFT )  &&
			staticData->is_Runnable() == TRUE)
		{
			fSpeed = PLAYER_RUN_SPEED;
		}else {
		}

		// 指定した方向へ移動させる
		D3DXVECTOR3 vOldVelocity = obj->m_Move.m_vVelocity;

		D3DXVECTOR3 vVelocity = staticData->move( 
			vFinalDirection, fSpeed , 
			obj->m_Move.m_vPosition,
			&obj->m_Move.m_vPosition);
		E3DSetPos( obj->m_nSigID, obj->m_Move.m_vPosition );
		obj->m_Move.m_vVelocity.x = vVelocity.x;
		obj->m_Move.m_vVelocity.z = vVelocity.z;

		// 現在と次ので外積を求め、右に回ったか左に回ったか判断する
		D3DXVECTOR3 vOutterProduct;
		D3DXVec3Cross( &vOutterProduct, &vOldVelocity, &obj->m_Move.m_vVelocity );
//		nRotateY = MathTool::get_Sgn<float, int>( vOutterProduct.y );

		// 位置設定
		ret = E3DGetPos( obj->m_nSigID, &obj->m_Move.m_vPosition);
		if(ret ) {
			_ASSERT(0);
			return ret;
		}

	
	} else if( obj->m_Move.get_Trigger( TriggerType::ON_THE_GROUND ) ) {
		eventno = Motion::Trol::IDLE;
	}

	if( obj->m_Move.get_Trigger( TriggerType::ON_THE_GROUND ) ) {
		// 地面に居る
		if( staticData->get_CurrentKeyBuffer(VK_SPACE ) && staticData->get_PreviousKeyBuffer( VK_SPACE ) == 0 ) {
			// 地面にいるときにジャンプボタン

			// 初速度
			obj->m_Move.m_vVelocity.y = PLAYER_JUMP_ACCEL_Y;

			// くうちゅう に いる
			obj->m_Move.set_Trigger( TriggerType::ON_THE_GROUND, FALSE );

			// 移動させる
			obj->m_Move.m_vPosition += obj->m_Move.m_vVelocity;
			E3DSetPos( obj->m_nSigID, obj->m_Move.m_vPosition );
		}
	} else {
		// 空中に居る
		if( obj->m_Move.m_vVelocity.y > 0.f) {
			// 上昇中
			eventno = Motion::Trol::JUMP_UP;

		} else {
			eventno = Motion::Trol::JUMP_DOWN;
		}
		if(obj->m_Move.m_bJumpAccelable ){
			// ジャンプ可能状態
			if( staticData->get_CurrentKeyBuffer( VK_SPACE ) == 0) {
				// ボタンを離した
				obj->m_Move.m_bJumpAccelable = ( FALSE );
			}else if( obj->m_Move.m_vVelocity.y > PLAYER_JUMP_SPEED_Y ) {
				// 最高速度に達した
				obj->m_Move.m_bJumpAccelable = ( FALSE );
			}else {
				// ジャンプ加速
				obj->m_Move.m_vVelocity.y += PLAYER_JUMP_ACCEL_Y;
				// 移動させる
				obj->m_Move.m_vPosition += obj->m_Move.m_vVelocity;
				E3DSetPos( obj->m_nSigID, obj->m_Move.m_vPosition );
			}
		}
	}


	// 攻撃
	DIMOUSESTATE2* mouse = staticData->get_DIMouse()->get_CurrentState();
//	DIMOUSESTATE2* previousMouse = staticData->get_DIMouse()->get_PreviousState();

	if( mouse->rgbButtons[0] ) {
		// 攻撃モーション
		eventno = Motion::Trol::ATTACK;
	}

	// モーション変更
	obj->m_nEventNumber = eventno;

	return 0;
}
}
