#pragma once

#include "MW4.hpp"
#include "Mech.hpp"

namespace Adept
{
	class Effect;
}

namespace MechWarrior4
{

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Gyro
	//
	typedef Adept::Receiver__ClassData			Gyro__ClassData;
	typedef Adept::Receiver__Message			Gyro__Message;

	class Gyro:
		public Adept::Receiver
	{
	
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Inheritance Support
	//
	public:
		typedef Gyro__ClassData			ClassData;
		typedef Gyro__Message			Message;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Construction, Destruction, Testing
	//
	public:
		static void
			InitializeClass();
		static void
			TerminateClass();

		Gyro(Mech *parent);
		~Gyro();

		void 
			Reuse();
		void
      		TestInstance();
	
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Class Data support
	//
	public:
		static ClassData 
			*DefaultData;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Simulation support
	//
	public:
		void
			Execute();
		void
			FallDown(
				Mech::FallMode fall_mode,
				Stuff::Scalar delay
			);
		void
			AbortFall();
		Stuff::Scalar
			GetTimeTillFall();	// Will return -1.0 if not falling

	protected:
		Mech
			*m_parentMech;
		Stuff::Time
			m_fallDownTime;
		Mech::FallMode
			m_fallMode;
	};
}
