
#pragma once

#include "MW4.hpp"
#include "MissileWeapon.hpp"

namespace MechWarrior4
{
	
	//##########################################################################
	//###########################   ClusterBombWeaponSubsystem    ##################
	//##########################################################################

	typedef MissileWeapon__GameModel					ClusterBombWeaponSubsystem__GameModel;
	typedef MissileWeapon__CreateMessage				ClusterBombWeaponSubsystem__CreateMessage;
	typedef MissileWeapon__ExecutionStateEngine			ClusterBombWeaponSubsystem__ExecutionStateEngine;
	typedef MissileWeapon__Message						ClusterBombWeaponSubsystem__Message;
	typedef MissileWeapon__ClassData					ClusterBombWeaponSubsystem__ClassData;

	class ClusterBombWeaponSubsystem:
		public MissileWeapon
	{
	public:
		static void
			InitializeClass();
		static void
			TerminateClass();

	//##########################################################################
	// Inheritance support
	//
	public:
		typedef ClusterBombWeaponSubsystem__ClassData						ClassData;
		typedef ClusterBombWeaponSubsystem__GameModel						GameModel;
		typedef ClusterBombWeaponSubsystem__Message							Message;
		typedef ClusterBombWeaponSubsystem__ExecutionStateEngine			ExecutionStateEngine;
		typedef ClusterBombWeaponSubsystem__CreateMessage					CreateMessage;

	//auto cluster support

	private: //the cycle for the cluster
		enum
		{
			ClusterCycle = 4
		};
		static YawPitchRoll* m_clusterVectors [ClusterCycle];
		int m_clusterInc; //Goes through the cluster cycle



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

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

		~ClusterBombWeaponSubsystem();

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

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


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


