
#pragma once
#ifndef AI_TACTICINTERFACE_HPP
#define AI_TACTICINTERFACE_HPP

#include <Stuff\Scalar.hpp>
#include <Stuff\Point3D.hpp>
#include "AI_FireStyle.hpp"
#include "AI_Moods.hpp"
#include "AI_FireData.hpp"



namespace MechWarrior4
{
	class MWObject;
};

#define INTERFACE_TacticInterface(post)								\
  public:															\
	virtual void MoveTo(const Point3D& point, bool move_forward = true, bool throttle_override = false, MWObject* ram_target = 0) ##post	\
	virtual bool PointIsValid(const Point3D& point, bool ignore_mission_bounds = false, bool ignore_squads = false) const ##post	\
	virtual bool HasPath() const ##post								\
	virtual bool Moving() const ##post								\
	virtual void Stop() ##post										\
	virtual void ClearMoveOrder() ##post							\
	virtual Stuff::Point3D GetAimPoint() const ##post				\
	virtual void TrackTo(const Stuff::Point3D& point) ##post		\
	virtual void TurnTo(const Stuff::Point3D& point, bool must_be_torso_twisted = true) ##post		\
	virtual void PitchTo(const Stuff::Point3D& point) ##post										\
	virtual Stuff::Scalar WeaponRange(WR_WHO who, WR_QUALIFIER qualifier) const ##post				\
	virtual void Fire(FireStyles::FireStyleID style = FireStyles::FIRE_MAXIMUM) ##post	\
	virtual MechWarrior4::MWObject& GetSelf() const ##post					\
	virtual MechWarrior4::Vehicle* GetSelf_AsVehicle() const ##post			\
	virtual MechWarrior4::MWObject& GetTarget() const ##post				\
	virtual MechWarrior4::Vehicle* GetTarget_AsVehicle() const ##post		\
	virtual MechWarrior4::MWObject* GetNearest(bool fMustBeEnemy = false) ##post		\
	virtual Stuff::Scalar GetDistanceFromTargetSquared() const ##post		\
	virtual Stuff::Scalar GetDistanceFromDestinationSquared() const ##post	\
	virtual Moods::ID GetMood() const ##post								\
	virtual bool ProjectileApproaching(Stuff::Scalar interval = 4.0f) ##post	\
	virtual const Stuff::Point3D& GetProjectileOrigin() ##post				\
	virtual void Stand() ##post										\
	virtual void Crouch() ##post									\
	virtual bool Crouching() const ##post							\
	virtual FireData::HIT_RESULT GetLastHitResult() const ##post	\
	virtual void ThrottleOverride(Stuff::Scalar duration, bool force = false) ##post	\
	virtual bool GetLastMoveDest(Stuff::Point3D& dest, bool ignore_movement = false) const ##post	\
	virtual bool ShotWithin(Stuff::Scalar lastvalid) const ##post		\
	virtual bool FiredWithin(Stuff::Scalar lastvalid) const ##post	\
	virtual void Jump(Stuff::Scalar duration) ##post					\
	virtual void Jump() ##post										\
	virtual void StopJumping() ##post								\
	virtual bool GetUnableToFireDuration(Stuff::Scalar duration) const ##post	\
	virtual bool ShouldForceDestinationRecalc() const ##post		\
	virtual int GetEliteLevel() const ##post						\
	virtual Stuff::Scalar GetTimeTargetedByEnemy() const ##post		\
	virtual Stuff::Scalar GetAttackThrottle() const ##post			\
	virtual void ForceDestinationRecalc() ##post					\
	virtual Stuff::Point3D GetMoveDest() const ##post				\
	virtual Stuff::Scalar GetLastTimeRammedTarget() const ##post		\
	virtual Stuff::Scalar GetLastTimeJumped() const ##post			\
	virtual Stuff::LinearMatrix4D GetAttackOrderPosition() const ##post	\
	virtual Stuff::LinearMatrix4D GetLastMoveOrderPosition() const ##post	\
	virtual bool GetEscapeRegionFocusIfAvailable(Stuff::Point3D& focus) const ##post	\
	virtual void SurrenderPose() ##post								\
	virtual void SetSpeed(Stuff::Scalar speed) ##post				\
	virtual bool SuicideIsOK() const ##post							\
	virtual unsigned int NumLegsDestroyed() const ##post				\
	virtual Stuff::Scalar GetMovementScore() const ##post			\
	virtual void SetMovementScore(Stuff::Scalar score) ##post		\
	virtual bool PointIsInBadNeighborhood(const Stuff::Point3D& point) const ##post	\
	virtual bool ShouldRun() const ##post							\
	virtual Stuff::Scalar GetCombatRadiusForRange(Stuff::Scalar percentile_range) ##post	\
	virtual Stuff::Scalar GetNormalizedJumpJetFuel() ##post			\
	virtual bool CanRetreat() const ##post							\
	virtual Stuff::Scalar GetCurrentVulnerableComponent() ##post	\
	virtual bool CanJump() const ##post								\
	virtual bool CanCrouch() const ##post							\
	virtual void FloatToPoint(const Stuff::Point3D& point) ##post	\
	virtual bool IsShootOnlyAI() const ##post						\
	virtual void SetFallDampingEnabled(bool enabled) ##post			\
	virtual Adept::ObjectID GetObjectID() const ##post				\
	virtual Stuff::Scalar GetMaxFireCheatAngle() const ##post		\
	virtual bool LineMightHitFriendlyUnits(const Stuff::Line3D& line) const ##post	\
	virtual bool MovedWithin(Stuff::Scalar duration) const ##post	\
	virtual void ContinuousFlyBy(const Stuff::Point3D& loc) ##post			\
	virtual bool RecentPathsFailed() const ##post					\
	virtual bool CanMove() const ##post								\
	virtual bool MoveRequestPending() const ##post					\
	virtual bool CanTrack() const ##post							\
	virtual bool CanTurn() const ##post								\
	virtual Stuff::Scalar DamageTakenSinceAttackOrder() const ##post \
	virtual Stuff::Point3D GetLeashCenter() const ##post			\
	virtual Stuff::Scalar GetLeashRadius() const ##post

#define PURE_TacticInterface	INTERFACE_TacticInterface(=0;)
#define DERIVED_TacticInterface INTERFACE_TacticInterface(;)


namespace MechWarrior4
{
	class Vehicle;
};

namespace MW4AI
{
	class TacticInterface
	{
	  protected:
	    TacticInterface() {};
		virtual ~TacticInterface() {};

	  public:
		enum WR_WHO
		{
			SELF,
			TARGET
		};
		enum WR_QUALIFIER
		{
			MIN,
			MAX
		};

		PURE_TacticInterface;
	};
};



#endif // AI_TACTICINTERFACE_HPP