#pragma once

#include "MW4.hpp"

#include <Adept\Entity.hpp>

namespace MechWarrior4
{

	typedef Adept::Entity__CreateMessage				LightEntity__CreateMessage;
	typedef Adept::Entity__GameModel					LightEntity__GameModel;
	typedef Adept::Entity__Message						LightEntity__Message;
	typedef Adept::Entity__ExecutionStateEngine			LightEntity__ExecutionStateEngine;

	//##########################################################################
	//##########################   LightEntity    ##############################
	//##########################################################################

	class LightEntity:
		public Adept::Entity
	{
	public:
		static void
			InitializeClass();
		static void
			TerminateClass();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Run-time Construction and Destruction Support
	//
	public:
		typedef LightEntity__CreateMessage						CreateMessage;
		typedef LightEntity__GameModel							GameModel;
		typedef LightEntity__Message							Message;
		typedef LightEntity__ExecutionStateEngine				ExecutionStateEngine;

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

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

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

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Flag Support
	//
	public:
		enum 
		{
			DefaultFlags = HermitMode
		};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Execution Support
	//
	public:
		int
			GetExecutionSlot();

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

}


