#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::move( E3DObject* obj ) {
	int ret= 0;

	// 移動前の方向
	D3DXVECTOR3 vOldFaceDirection;
	ret = E3DGetCharaDir( obj->m_nSigID, 0,0, &vOldFaceDirection );

	BOOL bGotoPlayer = TRUE;
	if( staticData->is_SkipPlayer(obj) ) {
		bGotoPlayer = FALSE;
	}

	// モーションを停止する
	BOOL bStopMotion = FALSE;

	float fSpeedRate = 1.0f;

	if( obj->m_nSigID == staticData->m_nCameraTargetSigID ) {
		// この敵は操作対象の敵である

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

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

		// 敵を移動

		ret = this->key_Move(obj);

		// 他の敵との当り判定
		checkHitToEnemy( obj );
	} else {

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

		float fDegXZ = 0;

		// モーションが続いているか？
		BOOL bIsContinueMotion = obj->m_nOldEventNumber == obj->m_nEventNumber && motid != 0;

		// 移動させる
		//E3DPosForward( obj->m_nSigID, PLAYER_RUN_SPEED );

		// 現在位置取得
		D3DXVECTOR3 vPosition;
		ret = E3DGetPos( obj->m_nSigID, &vPosition );

		// 現在の方向取得(方向が必ずしもVelocityになるとは限らない)
		D3DXVECTOR3 vDirection = vOldFaceDirection;

		// プレイヤーの位置
		D3DXVECTOR3 vTargetPosition;
		ret = E3DGetPos( staticData->m_nCameraTargetSigID, &vTargetPosition );

		// 間の距離
		D3DXVECTOR3 vDistance = vTargetPosition - vPosition;
		float fDistance = D3DXVec3Length( &vDistance);

		if( obj->m_Game.m_bRecognized == FALSE ) {
			if( fDistance <= RECOGNIZE_THRESHOLD ) {
				obj->m_Game.m_bRecognized = TRUE;
			}
		} else if( obj->m_Game.m_nType == EnemyType::TROL ) {
			// プレイヤーの方向を向く。状況によってはランダムな方向になる
			this->rotate_AgainstTarget( obj, staticData->m_nCameraTargetSigID );

		} else if( obj->m_Game.m_nType == EnemyType::CYCLOPS ) {
			// サイクロプス

			// プレイヤーの方向を向く。状況によってはランダムな方向になる
			this->rotate_AgainstTarget( obj, staticData->m_nCameraTargetSigID );

		} else if( obj->m_Game.m_nType == EnemyType::MOSUKO ||
			obj->m_Game.m_nType == EnemyType::MOSUKO_LONG)
		{
			// もすこ
			// 操作対象の方向を向く。状況によってはランダムな方向になる

			int eventno = obj->m_nEventNumber;

			// ある程度近づいたら横歩き or 回り込み。
			float DECIDE_THRESHOLD = 8000.f;

			// プレイヤーからこれだけ離れた場所を目標地点にする
			float GOAL_RADIUS = 3000.f;
			// ゴールとの距離がここまで来たら横歩き/攻撃に移行
			float GOAL_THRESHOLD = 1000.f;

			BOOL bFaceToTarget = FALSE;

			int nFaceMaterial = -1;

			if( eventno == Motion::Mosuko::IDLE ) {
				// RUNに移行
				eventno = Motion::Mosuko::RUN;

			} else if( eventno == Motion::Mosuko::RUN ) {

				if( obj->m_Game.m_nMoveType < 0 ) {

					if( fDistance <= DECIDE_THRESHOLD ) {
						obj->m_Game.m_nMoveType = MathTool::nextRandom<int>(0,2);
						if( obj->m_Game.m_nMoveType == 1 ) {
							// そのまま横歩き
							obj->m_Game.m_nMoveType = -1;
							eventno = Motion::Mosuko::SIDEWALK;
						} else {
							// 回り込む

							// 敵からプレイヤーを見たとき、その方向から左右60度付近に突っ走る

							// プレイヤーから敵への方向
							D3DXVECTOR3 vEnemyToTarget = vTargetPosition - vPosition;

							// y軸回転のみ
							vEnemyToTarget.y = 0;

							float BASIC_DEGREE = 60;
							float ERR_DEGREE = 10;
							// 左右 (±)60deg + ERR(10deg)だけ回転
							D3DXVECTOR3 vRotatedDirection;
							VectorTool::rotateHorizontal( &vRotatedDirection, &vEnemyToTarget, 
								static_cast<float>(MathTool::nextRandom<int>(0,2) * 2 - 1) * BASIC_DEGREE +
								MathTool::nextRandom<float>(-ERR_DEGREE, ERR_DEGREE ));

							// normalize
							D3DXVec3Normalize( &vRotatedDirection, &vRotatedDirection );
							// scale
							D3DXVec3Scale( &vRotatedDirection, &vRotatedDirection, GOAL_RADIUS );

							obj->m_Move.m_vGoalPosition = vTargetPosition + vRotatedDirection;
						}
					}
					bFaceToTarget = TRUE;
					
				} else {
					// ゴール目指す
					D3DXVECTOR3 vEnemyToGoal = obj->m_Move.m_vGoalPosition - vPosition;

					// y軸回転のみ
					vEnemyToGoal.y = 0;

					float fDistanceToGoal = D3DXVec3Length( &vEnemyToGoal );

					// 正規化
					//D3DXVec3Normalize( &vEnemyToGoal, &vEnemyToGoal );

					// その方向を向く
					staticData->face( -vEnemyToGoal, 2, obj->m_nSigID, obj->m_Move.m_nQuoatanion );

					// 移動させる
					obj->m_Move.m_vVelocity = vEnemyToGoal;

					// ゴールに近づいた
					if( fDistanceToGoal <= GOAL_THRESHOLD ) {
						obj->m_Game.m_nMoveType = -1;
						eventno = Motion::Mosuko::SIDEWALK ;
					}
				}



			} else if( eventno == Motion::Mosuko::SIDEWALK ) {

				// ただ方向を向くだけ
				staticData->faceToTarget( obj, staticData->m_nCameraTargetSigID, 1 );

				fDegXZ = 90;

				if( fDistance > DECIDE_THRESHOLD ) {
					// 離れてしまった
					eventno = Motion::Mosuko::RUN;
				} else {
					if( obj->m_Game.m_Counter->step() & CounterStateType::ALL_LOOP_END ){
						// しびれを切らした

						// カウンタリセット
						obj->m_Game.m_Counter->reset();

						/*if( obj->m_Game.m_nWeaponType == MosukoWeaponType::BOTH ||
							obj->m_Game.m_nWeaponType == MosukoWeaponType::KATANA )
						{*/

							// 攻撃に移る
						if( MathTool::nextRandom<int>(0,2 ) == 1 ) {
							eventno = Motion::Mosuko::ATTACK_A;
						} else {
							eventno = Motion::Mosuko::GUN;
						}

						// 攻撃表情
						nFaceMaterial = Material::MOSUKO_KAO_2;
						//}
					}
				}
			} else if( eventno == Motion::Mosuko::ATTACK_A ) {
				bFaceToTarget = TRUE;
				if( bIsContinueMotion && frameno > 32){
					eventno = Motion::Mosuko::ATTACK_B;
				}
			} else if( eventno == Motion::Mosuko::ATTACK_B ) {
				bFaceToTarget = TRUE;
				if( bIsContinueMotion && frameno > 32){
					eventno = Motion::Mosuko::ATTACK_C;
				}
			} else if( eventno == Motion::Mosuko::ATTACK_C ) {
				bFaceToTarget = TRUE;
				if( bIsContinueMotion && frameno > 42){

					eventno = Motion::Mosuko::IDLE;
					nFaceMaterial = Material::MOSUKO_KAO_1;
				}
			} else if( eventno == Motion::Mosuko::GUN ) {
				if( obj->m_Game.m_Counter->step() & CounterStateType::ALL_LOOP_END ) {
					eventno = Motion::Mosuko::IDLE;
					obj->m_Game.m_Counter->reset();
					nFaceMaterial = Material::MOSUKO_KAO_1;
				}
				/*
				if( bIsContinueMotion && frameno > 4){
					eventno = Motion::Mosuko::IDLE;
				}*/
			}

			// 横歩きからしばらくたったら攻撃A→B→C


			if( eventno == Motion::Mosuko::RUN) {
				fSpeedRate = 3.f;
			} else if( eventno == Motion::Mosuko::ATTACK_A ||
				eventno == Motion::Mosuko::ATTACK_B  ||
				eventno == Motion::Mosuko::ATTACK_C )
			{
				fSpeedRate = 0.5f;
			} else if( eventno == Motion::Mosuko::SIDEWALK ) {
				fSpeedRate = 1.8f;

			} else if( eventno == Motion::Mosuko::IDLE ||
				eventno == Motion::Mosuko::GUN ) {
				fSpeedRate = 0;
			} else {
				_ASSERT(0);
			}

			float NEARBY_THRESHOLD = 1200.f;

			if( //eventno == Motion::Mosuko::RUN ||
				eventno == Motion::Mosuko::SIDEWALK ||
				eventno == Motion::Mosuko::ATTACK_A ||
				eventno == Motion::Mosuko::ATTACK_B ||
				eventno == Motion::Mosuko::ATTACK_C
				)
			{
				if( fDistance <= NEARBY_THRESHOLD ) {
					// 近づきすぎた
					// 移動を止める
					fSpeedRate = 0.f;
				}
			}


			if( nFaceMaterial >= 0 ){
				// 表情変更
				staticData->set_Texture( obj->m_nSigID, "me", nFaceMaterial , FALSE);
				staticData->set_Texture( obj->m_nSigID, "mayu", nFaceMaterial , FALSE );
				staticData->set_Texture( obj->m_nSigID, "kuchi", nFaceMaterial , FALSE );
			}
			if( bFaceToTarget ) {
				// プレイヤーの方向を向く。状況によってはランダムな方向になる
				this->rotate_AgainstTarget( obj, staticData->m_nCameraTargetSigID );
			}

			obj->m_nEventNumber = eventno;

		} else if( obj->m_Game.m_nType == EnemyType::ZOMBIE_B ) {

			int eventno = obj->m_nEventNumber ;

			BOOL bFaceToTarget = FALSE;

			float DECIDE_THRESHOLD = 8000.f;

			float ATTACK_THRESHOLD = 3000.f;

			if( eventno == Motion::Zombie_B::RUN ) {
				bFaceToTarget = TRUE;

				if( obj->m_Game.m_nMoveType < 0 && fDistance <= DECIDE_THRESHOLD ) {
					// 近づいたが、まだ行動方針を決めていない

					// 行動方針決定（ランダム）
					obj->m_Game.m_nMoveType = MathTool::nextRandom<int>(0,2 );

				}

				if( fDistance <= ATTACK_THRESHOLD ) {
					if( obj->m_Game.m_nMoveType == 0 ) {
						eventno = Motion::Zombie_B::ATTACK_A;
					} 
				} else if( fDistance <= DECIDE_THRESHOLD ) {
					if( obj->m_Game.m_nMoveType == 1 ) {
						eventno = Motion::Zombie_B::JUMP_ON;
					}
				} else {
					obj->m_Game.m_nMoveType = -1;
				}

			} else if( eventno == Motion::Zombie_B::DEAD ) {
				if( bIsContinueMotion && frameno > 43 )
				{
					// モーションを変化しない
					bStopMotion = TRUE;

					if( obj->m_Game.m_DeathCounter->step() & CounterStateType::ALL_LOOP_END ) {
						// 消える
						obj->set_Valid( FALSE );
						E3DSetValidFlag( obj->m_nSigID, -1, FALSE );
					}
				}
			} else if( eventno == Motion::Zombie_B::JUMP_ON ) {
				if( bIsContinueMotion &&
					frameno > 13)
				{
					// 準備完了
					// 飛ぶ

					obj->m_Move.m_vVelocity.y = ZOMBIE_B_JUMP_SPEED;

					eventno = Motion::Zombie_B::JUMP_ATTACK;

					obj->m_Move.set_Trigger( TriggerType::ON_THE_GROUND , FALSE );
				}
			} else if( eventno == Motion::Zombie_B::JUMP_ATTACK ) {

				// 向いている向きへ移動する
				staticData->set_DirectionToVelocity( obj, 3.f);

				if( bIsContinueMotion &&
					frameno > 68 ) 
				{
					bStopMotion = TRUE;
					if( obj->m_Move.get_Trigger( TriggerType::ON_THE_GROUND ) == TRUE ) {
						// 戻る
						eventno = Motion::Zombie_B::IDLE;
					}
				}

			} else if( eventno == Motion::Zombie_B::IDLE ) {
				eventno = Motion::Zombie_B::RUN;
			} else if( eventno == Motion::Zombie_B::AIR_DAMAGE ) {
				if( bIsContinueMotion &&
					frameno > 42 ) 
				{
					// 戻る
					eventno = Motion::Zombie_B::IDLE;
				}
			
			} else if( eventno == Motion::Zombie_B::ATTACK_A ) {
				if( bIsContinueMotion &&
					frameno > 97 ) 
				{
					// 戻る
					eventno = Motion::Zombie_B::IDLE;
				}
			
			} else {
				_ASSERT(0);
				// jumpon 14
				// jump_attack 69
				// attack 26~98
				// air_damage 43
				eventno = Motion::Zombie_B::RUN;
				bFaceToTarget = TRUE;
			}

			if( bFaceToTarget ) {
				// プレイヤーの方向を向く。状況によってはランダムな方向になる
				this->rotate_AgainstTarget( obj, staticData->m_nCameraTargetSigID );
			}

			
			obj->m_nEventNumber = eventno;

			if( eventno == Motion::Zombie_B::RUN ) {
				fSpeedRate = 2.f;
			} else if( eventno == Motion::Zombie_B::JUMP_ATTACK ) {
				fSpeedRate = 3.f;
			} else if( eventno == Motion::Zombie_B::ATTACK_A ) {
				fSpeedRate = 1.f;
			} else {
				fSpeedRate = 0.f;
			}
		} else if( obj->m_Game.m_nType == EnemyType::ZOMBIE ) {

			int eventno = obj->m_nEventNumber;

			BOOL bFaceToTarget = FALSE;

			//eventno = Motion::Zombie::WALK;

			const float THRESHOLD = 1000.f;

			
			
			if( eventno == Motion::Zombie::IDLE )  {
				eventno = Motion::Zombie::WALK;

			} else if( eventno == Motion::Zombie::WALK ) {

				bFaceToTarget = TRUE;

				if( obj->m_Game.m_nMoveType < 0 && fDistance <= THRESHOLD ) {
					// 近づいたが、まだ行動方針を決めていない

					// 行動方針決定（ランダム）
					obj->m_Game.m_nMoveType = MathTool::nextRandom<int>(0,3 );

				}

				if( fDistance <= THRESHOLD ) {
					if( obj->m_Game.m_nMoveType == 0 ) {
						eventno = Motion::Zombie::ATTACK_A;
					} else if( obj->m_Game.m_nMoveType == 1 ) {
						eventno = Motion::Zombie::ATTACK_B;
					} else if( obj->m_Game.m_nMoveType == 2 ) {
						eventno = Motion::Zombie::ATTACK_C;
					}
				} else {
					obj->m_Game.m_nMoveType = -1;
				}
			} else if( eventno == Motion::Zombie::ATTACK_A ) {

				if( bIsContinueMotion &&
					frameno > 88 )
				{
					// 移動へ戻る
					eventno = Motion::Zombie::WALK;
				}
			} else if( eventno == Motion::Zombie::ATTACK_B ) {
				if( bIsContinueMotion &&
					frameno > 88 )
				{
					eventno = Motion::Zombie::WALK;
				}
			} else if( eventno == Motion::Zombie::ATTACK_C ) {
				if( obj->m_Game.m_nHoldTargetSigID >= 0 ) {
					// 捕まえた

					// ホールド状態にする
					eventno = Motion::Zombie::HOLD;

				} else if( bIsContinueMotion &&
					frameno > 88 )
				{
					// 空振り

					// 歩きに戻す
					eventno = Motion::Zombie::WALK;
				}
			} else if( eventno == Motion::Zombie::HOLD ) {
				// プレイヤーを固定する
				hold_Player( obj );

				if( bIsContinueMotion &&
					frameno > 88 )
				{
					if( obj->m_Game.m_nHoldTargetSigID >= 0 ) {
						// そのまま
					} else {
						// もしつかんでいなかったら戻る
						eventno = Motion::Zombie::WALK;
					}
				}
			} else if( eventno == Motion::Zombie::RELEASE ) {
				if( bIsContinueMotion &&
					frameno > 38 )
				{
					// 移動に戻る
					eventno = Motion::Zombie::WALK;

				}
			} else if( eventno == Motion::Zombie::DEAD ) {
				if( bIsContinueMotion &&
					frameno > 57 )
				{
					bStopMotion = TRUE;

					if( obj->m_Game.m_DeathCounter->step() & CounterStateType::ALL_LOOP_END ) {
						// 消える
						obj->set_Valid( FALSE );
						E3DSetValidFlag( obj->m_nSigID, -1, FALSE );
					}
				}

				
			}

			if( bFaceToTarget ) {
				// プレイヤーの方向を向く。状況によってはランダムな方向になる
				this->rotate_AgainstTarget( obj, staticData->m_nCameraTargetSigID );
			}

			obj->m_nEventNumber = eventno;

			if( 
				eventno == Motion::Zombie::ATTACK_A ||
				eventno == Motion::Zombie::ATTACK_B ||
				eventno == Motion::Zombie::ATTACK_C ||
				eventno == Motion::Zombie::DEAD ||
				eventno == Motion::Zombie::IDLE ||
				eventno == Motion::Zombie::HOLD
				) 
			{
				//if( bStopMotion == FALSE ) {
					// 動かない
					fSpeedRate = 0.f;
				//} else {
					// モーション停止状態では通常通り動く
				//	fSpeedRate = 1.f;
				//}

				
			} else {
				fSpeedRate = 0.6f;
			}


		} else if( obj->m_Game.m_nType == EnemyType::WORM_BIG ||
			obj->m_Game.m_nType == EnemyType::WORM_SMALL )
		{
			float THRESHOLD = 10000.f;
			if(obj->m_Game.m_nType == EnemyType::WORM_SMALL ) {
				THRESHOLD = 2000.f;
			}
			int eventno = obj->m_nEventNumber;

			// 方向設定
			float fY = obj->m_Move.m_vVelocity.y;
			obj->m_Move.m_vVelocity.x = vDirection.x;
			obj->m_Move.m_vVelocity.z = vDirection.z;
			//obj->m_Move.m_vVelocity.y = 0;
			obj->m_Move.m_vVelocity.y = 0;
			D3DXVec3Normalize( &obj->m_Move.m_vVelocity, &obj->m_Move.m_vVelocity );

			obj->m_Move.m_vVelocity *= obj->m_Move.m_fSpeed;
			obj->m_Move.m_vVelocity.y = fY;

			BOOL bFaceToTarget = FALSE;

			// ワーム
			if( obj->m_nEventNumber == Motion::Worm::MOVE ||
				obj->m_nEventNumber == Motion::Worm::TURN_LEFT ||
				obj->m_nEventNumber == Motion::Worm::TURN_RIGHT )
			{
				// プレイヤーの方向を向く
				bFaceToTarget = TRUE;

				if( obj->m_Game.m_nMoveType < 0 && fDistance < THRESHOLD ) {
					obj->m_Game.m_nMoveType = MathTool::nextRandom<int>(0,3);
				}
				if( fDistance < THRESHOLD ) {
					// 近づいた

					if( obj->m_Game.m_nMoveType == 0 ) {
						// 立ち上がる
						eventno = Motion::Worm::STAND;
						obj->m_Game.m_nMoveType = -1;
					} else if( obj->m_Game.m_nMoveType == 1 ){
						// 突進
						eventno = Motion::Worm::BRITS;
						obj->m_Game.m_nMoveType = -1;
					} else if( obj->m_Game.m_nMoveType == 2){
						// もぐる
						eventno = Motion::Worm::DIVE;
						// 
						obj->m_Game.m_nMoveType = -1;

						// 潜り用カウンタ
						obj->m_Game.m_Counter->reset();
					}

				} else if( fDistance > THRESHOLD ) {
					// 遠ざかった

					// 行動方針リセット
					obj->m_Game.m_nMoveType = -1;
					
				}
			} else if( obj->m_nEventNumber == Motion::Worm::DIVE ||
				obj->m_nEventNumber == Motion::Worm::DOWN_DIVE )
			{
				int nMax = 58;
				if( obj->m_nEventNumber == Motion::Worm::DOWN_DIVE ) {
					nMax = 68;
				}
				if( motid != 0 && frameno > nMax ) {
					// 潜りきった
					
					/*if( obj->m_Game.m_nMoveType < 0 && fDistance < THRESHOLD) {
						// 近づいて、かつ行動決定していない
						//obj->m_Game.m_nMoveType = MathTool::nextRandom<int>(0,2);
						obj->m_Game.m_nMoveType = 0;
					}*/

					/*if( obj->m_Game.m_nMoveType == 0 && fDistance < THRESHOLD ) {
						// 近づいた

						// 登場
						eventno = Motion::Worm::APPEAR;

					} else */if(// obj->m_Game.m_nMoveType == 0 &&
						fDistance < THRESHOLD / 6 ){
						// もっと近づいた
						// 攻撃
						eventno = Motion::Worm::ATTACK_B;
						bStopMotion = TRUE;

					} else {
						// まだ近くに居ない

						// とりあえずそのまま潜航
						bStopMotion = TRUE;

						// プレイヤーの方向を向く
						bFaceToTarget = TRUE;

						// 一定時間たったら出てくる
						if( obj->m_Game.m_Counter->step() & CounterStateType::ALL_LOOP_END ) {
							obj->m_Game.m_Counter->reset();

							eventno = Motion::Worm::APPEAR;
						}
					}
				}
			} else if( obj->m_nEventNumber == Motion::Worm::APPEAR ) {
				if( motid != 0 && motid != 5 && motid!= 9 && frameno > 58 ) {
					eventno = Motion::Worm::MOVE;
				}
			} else if( obj->m_nEventNumber == Motion::Worm::ATTACK_A ) {
				// 立った状態から噛み付き攻撃

				if( motid != 0 && frameno > 48 ) {
					if( fDistance < THRESHOLD ) {
						// 攻撃
						eventno = Motion::Worm::ATTACK_A;

						// プレイヤーの方向を向く
						bFaceToTarget = TRUE;
					} else {
						// たち状態からMOVEへ移る
						eventno = Motion::Worm::DOWN;
					}
				}
			} else if( obj->m_nEventNumber == Motion::Worm::DOWN ) {
				if( motid != 0 && frameno > 28 ) {
					// 通常
					eventno = Motion::Worm::MOVE;

				}
			} else if( obj->m_nEventNumber == Motion::Worm::ATTACK_B ) {
				// 地中から飲み込み攻撃
				if( motid != 0 && motid == 11 && frameno > 58 ) {
					// 通常
					eventno = Motion::Worm::MOVE;
				}
			} else if( obj->m_nEventNumber == Motion::Worm::BRITS ) {
				// 突進噛み付き
				if( motid != 0 && frameno > 58 ) {
					// 通常
					eventno = Motion::Worm::MOVE;
				}
			} else if( obj->m_nEventNumber == Motion::Worm::STAND ) {
				if( motid != 0 && frameno > 38 ) {
					if( fDistance < THRESHOLD * 2.f ) {
						// 攻撃
						eventno = Motion::Worm::ATTACK_A;
					} else {
						// また潜る
						eventno = Motion::Worm::DOWN_DIVE;
					}
				}
			} else if( obj->m_nEventNumber == Motion::Worm::DEAD ) {
				if( motid != 0 && frameno > 88 ) {
					// 動かない
					bStopMotion = TRUE;


					// TODO ボス仕様にする
					if( obj->m_Game.m_DeathCounter->step() & CounterStateType::ALL_LOOP_END ) {
						// 消える
						obj->set_Valid( FALSE );
						E3DSetValidFlag( obj->m_nSigID, -1, FALSE );
					}
				}
			} else if( obj->m_nEventNumber == Motion::Worm::SWALLOW ) {

				// プレイヤーを固定する
				hold_Player( obj );

				if( motid != 0 ) {
					if( frameno > 438 ) {
						// モーション終了

						// 動かない
						bStopMotion = TRUE;

					} else if( frameno == 200 && staticData->m_aryOptionList[ TitleSceneConsts::CheckType::TRANSPARENT_]) {
						// 半透明になる
						int mat = 0;
						ret = E3DGetMaterialNoByName( obj->m_nSigID, "worm", &mat );
						ret = E3DSetMaterialAlpha( obj->m_nSigID, mat, 0.8f);
					} 
				}
			} else if( obj->m_nEventNumber == Motion::Worm::IDLE ){
				eventno = Motion::Worm::MOVE;//obj->m_nEventNumber;

			} else {
				_ASSERT(0);

			}

			if( bFaceToTarget ) {
				// プレイヤーの方向を向く。状況によってはランダムな方向になる
				this->rotate_AgainstTarget( obj, staticData->m_nCameraTargetSigID );
			}

			obj->m_nEventNumber = eventno;

			if( eventno == Motion::Worm::BRITS ) {
				// 移動速度アップ
				fSpeedRate = 2.f;
			} else if( 
				//eventno == Motion::Worm::ATTACK_A ||
				eventno == Motion::Worm::APPEAR ||
				eventno == Motion::Worm::ATTACK_B ||
				eventno == Motion::Worm::DIVE ||
				eventno == Motion::Worm::DOWN_DIVE ||
				eventno == Motion::Worm::IDLE ||
				eventno == Motion::Worm::STAND ||
				eventno == Motion::Worm::VOMIT || 
				eventno == Motion::Worm::DOWN ) 
			{
				if( bStopMotion == FALSE ) {
					// 動かない
					fSpeedRate = 0.f;
				} else {
					// モーション停止状態では通常通り動く
					fSpeedRate = 1.f;
				}

				
			} else if( eventno == Motion::Worm::DEAD ||
				eventno == Motion::Worm::SWALLOW ) {
				fSpeedRate = 0;
			}

		}

		D3DXVECTOR3 vNewFaceDirection;
		ret = E3DGetCharaDir( obj->m_nSigID, fDegXZ ,0, &vNewFaceDirection );

		vOldFaceDirection.y = 0;
		vNewFaceDirection.y = 0;


		// Y軸を0にする
		float fY = obj->m_Move.m_vVelocity.y;
		obj->m_Move.m_vVelocity.y = 0;
		//vDirection.y = 0;

		// 正規化
		D3DXVec3Normalize( &obj->m_Move.m_vVelocity, &obj->m_Move.m_vVelocity );

		// Scale
		obj->m_Move.m_vVelocity *=  obj->m_Move.m_fSpeed * fSpeedRate ;

		// ジャンプ等の処理のため、Y軸は保存しておいたものを利用する
		obj->m_Move.m_vVelocity.y = fY;

		// Add
		vPosition += obj->m_Move.m_vVelocity;

		// 位置に設定
		ret = E3DSetPos( obj->m_nSigID, vPosition );
		obj->m_Move.m_vPosition = vPosition;
	}

	// モーション変更
	if( bStopMotion == FALSE ) {
		int eventno = 0;

		if( obj->m_Game.m_nType == EnemyType::CYCLOPS ) {
			eventno = 1;
		} else //if( obj->m_Game.m_nType == EnemyType::WORM_BIG ||
			//obj->m_Game.m_nType == EnemyType::WORM_SMALL 
			//)
		{
			eventno = obj->m_nEventNumber;


			
		}
		// テスト
		for(int i = 0; i < 12; i ++ ) {
			int nKey = '1' + i - 4;
			if( staticData->get_CurrentKeyBuffer(nKey ) ) {
				eventno = i;
			}
		}
	
		obj->m_nEventNumber = eventno;
		ret = E3DSetNewPoseByMOA( obj->m_nSigID, eventno );
		if( ret ){
			_ASSERT( 0 );
			return 1;
		}
	}

	obj->m_nOldEventNumber = obj->m_nEventNumber;

	return 0;
}

void EnemyManager::hold_Player( E3DObject* obj ) {
	// プレイヤーを固定する

	// 敵の位置
	D3DXVECTOR3 vPos;
	E3DGetPos( obj->m_nSigID, &vPos );



	// 方向もそろえる
	D3DXVECTOR3 vDir;
	E3DGetCharaDir(obj->m_nSigID, 0,0, &vDir );

	// ずらす
	D3DXVECTOR3 vDelta(0,0,0);
	if( obj->m_Game.m_nType == EnemyType::ZOMBIE ) {

		// ゾンビの方向にする
		vDelta = D3DXVECTOR3( vDir.x, 0, vDir.z );

		D3DXVec3Normalize( &vDelta, &vDelta ) ;
		// 距離
		vDelta *= ZOMBIE_HOLD_DISTANCE;

	} else if( obj->m_Game.m_nType == EnemyType::WORM_BIG ||
		obj->m_Game.m_nType == EnemyType::WORM_SMALL ) 
	{
	}

	// 位置を設定
	E3DSetPos( staticData->get_Player()->m_nSigID, vPos + vDelta );

	// 方向調整
	if( obj->m_Game.m_nType == EnemyType::ZOMBIE ) {
	} else if( obj->m_Game.m_nType == EnemyType::WORM_BIG ||
		obj->m_Game.m_nType == EnemyType::WORM_SMALL ) 
	{
		vDir *= -1;
	}

	// 方向を設定
	staticData->face( vDir, 1, staticData->get_Player()->m_nSigID, staticData->get_Player()->m_Move.m_nQuoatanion );
}

}
