#pragma once

#include "MW4.hpp"

#include "StickyMover.hpp"

namespace MechWarrior4
{	

	//##########################################################################
	//############################    Narc    ##################################
	//##########################################################################

	//-------------------------------------------------------------------------
	// The following helper classes must always be typedef'd or overriden by an
	// inheritor
	//
	typedef StickyMover__ExecutionStateEngine			Narc__ExecutionStateEngine;
	typedef StickyMover__GameModel						Narc__GameModel;
	typedef StickyMover__ClassData						Narc__ClassData;
	typedef StickyMover__Message						Narc__Message;
	typedef StickyMover__CreateMessage					Narc__CreateMessage;
	
	//-----------------------  End of inheritance stuff ------------------------

	class Narc:
		public StickyMover
	{
	public:
		static void
			InitializeClass();
		static void
			TerminateClass();

		typedef StickyMover BaseClass;

	//##########################################################################
	// Inheritance support
	//
	public:
		typedef Narc__ClassData						ClassData;
		typedef Narc__GameModel						GameModel;
		typedef Narc__Message						Message;
		typedef Narc__ExecutionStateEngine			ExecutionStateEngine;
		typedef Narc__CreateMessage					CreateMessage;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Run-time Construction and Destruction Support
	//
	public:
		static Narc* 
			Make(
				CreateMessage *message,
				ReplicatorID *base_id
			);

		Narc(
			ClassData *class_data,
			CreateMessage *message,
			ReplicatorID *base_id,
			ElementRenderer::Element *element
		);

		~Narc();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Class Data support
	//
	public:
		static ClassData
			*DefaultData;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Game Model support
	//
	public:
		const GameModel*
			GetGameModel()
				{return Cast_Pointer(const GameModel*, gameModelResource.GetPointer());}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Execution Support
	//
	public:
		void
			OnActiveTimeStart();
		void
			OnActiveTimeEnd();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Test Support
	//
	public:
		void
      		TestInstance() const;
	};
}
