
#include "MW4Headers.hpp"
#include "Adept\AdeptHeaders.hpp"

#include "mw4.hpp"
#include "shooterai.hpp"

using namespace MechWarrior4;
using namespace MW4AI;


namespace ABL
{
	extern MechWarrior4::MoverAI* CurMoverAI;
};



//#############################################################################
//###############################    AI      ##################################
//#############################################################################

ShooterAI::ClassData* ShooterAI::DefaultData = NULL;

const Receiver::MessageEntry ShooterAI::MessageEntries[]=
{
	MESSAGE_ENTRY(ShooterAI, DebugText),
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void ShooterAI::InitializeClass()
{
	Verify(!DefaultData);
	DefaultData =
	new ClassData(
							 ShooterAIClassID,
							 "MechWarrior4::ShooterAI",
							 CombatAI::DefaultData,
							 ELEMENTS(MessageEntries), MessageEntries,
							 (Entity::Factory)Make,
							 (Entity::CreateMessage::Factory)CreateMessage::ConstructCreateMessage,
							 ExecutionStateEngine::DefaultData,
							 (Entity::GameModel::Factory)GameModel::ConstructGameModel,
							 NULL,
							 (Entity::GameModel::ReadAndVerifier)GameModel::ReadAndVerify,
							 (Entity::GameModel::ModelWrite)GameModel::WriteToText,
							 (Entity::GameModel::ModelSave)GameModel::SaveGameModel
							 );
	Register_Object(DefaultData);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void ShooterAI::TerminateClass()
{
	Unregister_Object(DefaultData);
	delete DefaultData;
	DefaultData = NULL;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ShooterAI* ShooterAI::Make(CreateMessage *message,ReplicatorID *base_id)
{
	AutoHeap local_heap (g_AIHeap);
	Check_Object(message);
	ShooterAI *new_entity = new ShooterAI(DefaultData, message, base_id, NULL);
	Check_Object(new_entity);
	new_entity->SyncMatrices(true);
	return new_entity;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ShooterAI::ShooterAI(ClassData *class_data,CreateMessage *message,ReplicatorID *base_id,ElementRenderer::Element *element)
	: CombatAI(class_data, message, base_id, element)
{
	Check_Pointer(this);
	Check_Object(message);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ShooterAI::~ShooterAI()
{
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void ShooterAI::PreCollisionExecute(Time till)
{
	Check_Object(this);
	PRECOLLISION_LOGIC("ShooterAI");

	CombatAI::Update(till);

	if ((m_CurMove != 0) &&
		(m_CurMove->MoveType () == MOVE_LOOKOUT))
	{
		MoverAI::PreCollisionExecute(till);
	}
	else
	{
		ABL::CurMoverAI = this;
		AI::PreCollisionExecute(till);
		ABL::CurMoverAI = NULL;
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void ShooterAI::TestInstance() const
{
	Verify(IsDerivedFrom(DefaultData));
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void ShooterAI::DebugTextMessageHandler(Adept::ReceiverDataMessageOf<int> *message)
{
	inherited::DebugTextMessageHandler(message);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool ShooterAI::CanMove() const
{
	return (false);
}
