/// <summary> /// mech's A.I. function. /// turns the body left. /// </summary> /// <param name="aiBase">current A.I.</param> /// <param name="gameTime"></param> public override void OnAITurnLeftEvent(AIBase aiBase) { MoveStop(); if (aiBase.IsActive) { float fTurnAngleSpeed = SpecData.TurnAngle; // Turning left Rotate(new Vector2(fTurnAngleSpeed, 0.0f)); ActionTurn(fTurnAngleSpeed); } else { if (isMoveBlocked) { CollideSphere collideSphere = Collide as CollideSphere; float movingTime = (float)HelperMath.Randomi(2) + HelperMath.RandomNormal(); Vector3 simulateAmount = new Vector3(0.0f, 0.0f, SpecData.MoveSpeed) * movingTime; simulateAmount = CalculateVelocity(simulateAmount); Vector3 start = WorldTransform.Translation + (WorldTransform.Up * 1.0f); // Test collision CollisionResult result = HitTestWithWorld(start, Direction); // clear moving way? if (result != null) { float moveDistance = SpecData.MoveSpeed * movingTime; float resultDistance = result.distance - collideSphere.Radius; if (resultDistance > 0.0f) { if (resultDistance < moveDistance) { // Recalculate moving time for move and stop movingTime *= resultDistance / moveDistance; isMoveBlocked = true; } else { isMoveBlocked = false; } } // Don't move else { isMoveBlocked = true; } } else { isMoveBlocked = false; } if (isMoveBlocked) { // turn right SetNextAI(AIType.TurnLeft, 90.0f / SpecData.TurnAngle); } else { SetNextAI(AIType.Move, movingTime); } } else { SetNextAI(AIType.Search, HelperMath.RandomNormal()); } } }