#pragma once

#include "MW4.hpp"
#include "ProjectileWeapon.hpp"

namespace MechWarrior4
{
	
	//##########################################################################
	//###########################   ArtilleryWeapon    #########################
	//##########################################################################

	typedef ProjectileWeapon__GameModel					ArtilleryWeapon__GameModel;
	typedef ProjectileWeapon__CreateMessage				ArtilleryWeapon__CreateMessage;
	typedef ProjectileWeapon__ExecutionStateEngine		ArtilleryWeapon__ExecutionStateEngine;
	typedef ProjectileWeapon__Message					ArtilleryWeapon__Message;
	typedef ProjectileWeapon__ClassData					ArtilleryWeapon__ClassData;

	class ArtilleryWeapon:
		public ProjectileWeapon
	{
	public:
		static void
			InitializeClass();
		static void
			TerminateClass();

	//##########################################################################
	// Inheritance support
	//
	public:
		typedef ArtilleryWeapon__ClassData							ClassData;
		typedef ArtilleryWeapon__GameModel							GameModel;
		typedef ArtilleryWeapon__Message							Message;
		typedef ArtilleryWeapon__ExecutionStateEngine				ExecutionStateEngine;
		typedef ArtilleryWeapon__CreateMessage						CreateMessage;


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

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

		~ArtilleryWeapon();

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

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Simulation Support
	//
	public:
		void
			CreateProjectile(Stuff::Time till);

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


