#if !defined(MECHTECH_HPP)
#	define MECHTECH_HPP

#	if !defined(MECHSUB_HPP)
#		include <mechsub.hpp>
#	endif

	//##########################################################################
	//######################    MechTech::StatusInfo    ########################
	//##########################################################################

	struct MechTech__StatusInfo SIGNATURED
	{
	public:
		int
			currentStatus,
			wooHooed;
		Time
			startTime,
			wooHooEnd;
	};

	//##########################################################################
	//###############3###    MechTech::SubsystemMonitor    #####################
	//##########################################################################

	struct MechTech__SubsystemMonitor:
		public Plug
	{
		friend class MechTech;

	//##########################################################################
	// Memory Allocation Support
	//
	private:
		static MemoryBlock AllocatedMemory;

		void*
			operator new(size_t)
				{return AllocatedMemory.New();}
		void
			operator delete(void *where)
				{AllocatedMemory.Delete(where);}

	public:
		MechTech__StatusInfo statusArray[MechSubsystem::TechStatusTypeCount];
		MechSubsystem *monitoredSubsystem;

		MechTech__SubsystemMonitor(MechSubsystem *subsystem);
		~MechTech__SubsystemMonitor();
	};

	//##########################################################################
	//#####################    MechTech::ModelResource    ######################
	//##########################################################################

	struct MechTech__SubsystemResource:
		public Subsystem::SubsystemResource
	{
		ResourceDescription::ResourceID
			alarmModel;
		Scalar
			wooHooMinimumDuration,
			wooHooDurationRange,
			wooHooChance;
	};

	//##########################################################################
	//############################    MechTech    ##############################
	//##########################################################################

	class MechTech:
		public Subsystem
	{
	//##########################################################################
	// Shared Data Support
	//
	public:
		static Derivation ClassDerivations;
		static SharedData DefaultData;

	//##########################################################################
	// Attribute Support
	//
	public:
		typedef MechTech__StatusInfo StatusInfo;
		typedef MechTech__SubsystemMonitor SubsystemMonitor;
		typedef MechTech__SubsystemResource SubsystemResource;

	//##########################################################################
	// Construction and Destruction Support
	//
	public:
		~MechTech();

		static Logical
			CreateStreamedSubsystem(
				NotationFile	*model_file,
				const char* model_name,
				const char* subsystem_name,
				SubsystemResource *subsystem_resource,
				NotationFile *subsystem_file,
				const ResourceDirectories *directories,
				ResourceFile *resource_file
			);

		MechTech(
			Mech *entity,
			int subsystem_id,
			SubsystemResource *model,
			SharedData &shared_data = DefaultData
		);

		Logical
			TestInstance() const;

	//##########################################################################
	// Model support
	//
	public:
		typedef void
			(MechTech::*Performance)(Scalar time_slice);

		void
			SetPerformance(Performance performance)
				{
					Check(this);
					activePerformance = (Simulation::Performance)performance;
				}

		ChainOf<SubsystemMonitor*> subsystemMonitors;
		Scalar
			wooHooMinimumDuration,
			wooHooDurationRange,
			wooHooChance;

		ResourceDescription::ResourceID
			alarmModel;

		void
			TechnicalAssistance(Scalar time_slice);

		Mech*
			GetEntity()
				{return (Mech*)Subsystem::GetEntity();}
	};

#endif

