
#pragma once
#ifndef AI_ACTION_HPP
#define AI_ACTION_HPP

#include <Stuff\Auto_Ptr.hpp>
#include "AI_Fuzzy.hpp"
#include "AI_TacticInterface.hpp"
#include "aiutils.hpp"




namespace MW4AI
{
	namespace Actions
	{
		void Fire(TacticInterface& i,
				  FireStyles::FireStyleID style);

		enum MoveType
		{
			MOVE_FORWARD,
			MOVE_BACKWARD,
			MOVE_TO_FACE_TARGET
		};

		void ApproachTarget(TacticInterface& i, MoveType move_type);
		void ApproachTarget(TacticInterface& i, Stuff::Scalar when);
		void FleeTarget(TacticInterface& i);
		void Jump(TacticInterface& i);
		void Crouch(TacticInterface& i);
		void ThrottleOverride(TacticInterface& i);
		void FleeNearest(TacticInterface& i, Stuff::Scalar nearest);
		void Disengage(TacticInterface& i, Stuff::Scalar distance);
		void FindBetterLineOfFire(TacticInterface& i);
		void GoToDistanceFromTarget(TacticInterface& i, Stuff::Scalar distance, MoveType move_type);
		void GoToDistanceFromNearestEnemy(TacticInterface& i, Stuff::Scalar distance, MoveType move_type);
		void GoToOtherSideOfTarget(TacticInterface& i, Stuff::Scalar distance);
		void StopIfMoving(TacticInterface& i);
		void Dodge(TacticInterface& i, Stuff::Scalar distance, MoveType move_type);
		void Circle(TacticInterface& i, MoveType move_type, Stuff::Scalar distance = 0);
		void CircleRandomly(TacticInterface& i);
		void CircleFloat(TacticInterface& i, Stuff::Scalar distance);
		void CircleToBehindTarget(TacticInterface& i, Stuff::Scalar maximum);
		void CircleToFrontOfTarget(TacticInterface& i, Stuff::Scalar maximum);
		void MoveForward(TacticInterface& i, Stuff::Scalar distance);
		void CircleTargetNearEnemies(TacticInterface& i, Stuff::Scalar distance);
		void GoBehindTarget(TacticInterface& i, Stuff::Scalar min_distance);
		void GoInFrontOfTarget(TacticInterface& i, Stuff::Scalar min_distance);
		void ForceDestinationRecalc(TacticInterface& i);
		void RamTarget(TacticInterface& i, Stuff::Scalar recalc_tolerance = 8.0f);
		void PatrolWithinRadiusOfAttackOrderPosition(TacticInterface& i, Stuff::Scalar inner_radius, Stuff::Scalar outer_radius);
		void JumpToHeight(TacticInterface& i, Stuff::Scalar height);

		enum FastCircleMoveType
		{
			MOVE_CLOSER,
			MOVE_FARTHER,
			MOVE_RANDOM
		};
		void DoFastCircle(TacticInterface& i, FastCircleMoveType move_type);

		enum TrackTarget
		{
			TO_TARGET,
			TO_NEAREST_ENEMY,
			TO_NEAREST_ENEMY_OR_TARGET
		};

		void Track(TacticInterface& i,
				   TrackTarget target,
				   bool fTrack = true,
				   bool fTurn = true,
				   bool fPitch = false);

		bool ShouldMoveForwardToPoint(TacticInterface& i, const Stuff::Point3D& dest);

		extern bool g_HelicoptersIgnoreMissionBounds;
	};
};



#endif // AI_ACTION