//=========================================================================//
// File:	seeker.hpp                                                          	//
// Project: BattleTech																			//
// Contents: A subsystem which guides, seek out and find a target           	//
//----------------------------------------------------------------------------//
//   Date    Who  Modification                                               	//
// --------  ---  ------------------------------------------------------------//
// 04/13/95  JM  Initial coding.                                              //
// 07/12/95  GDU  Complied with new libraries, added seeker logic             //
//----------------------------------------------------------------------------//
// Copyright (C) 1995, Virtual World Entertainment, Inc. All Rights reserved  //
//                   	PROPRIETARY AND CONFIDENTIAL                          //
//============================================================================//

#if !defined (SEEKER_HPP)
#define	SEEKER_HPP

#if !defined(SUBSYSTM_HPP)
	#include <subsystm.hpp>
#endif

#if !defined(POINT3D_HPP)
	#include <point3d.hpp>
#endif



//######################### Forward Class Declarations ########################
	class Missile;
	class Entity;

//######################### Seeker Subsystem Resource ##########################
	struct Seeker__SubsystemResource:
		public Subsystem::SubsystemResource
		{


		};
//###########################################################################
//#########################     CLASS -- Seeker    ##########################
//###########################################################################
	class Seeker : public Subsystem
	{
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Messaging Support
	//
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Shared Data Support
	//
	public:
		static Derivation ClassDerivations;
		static SharedData DefaultData;


	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Attribute Support
	//
	public:
		enum {
			TargetPositionAttributeID = Subsystem::NextAttributeID,
			RangeToTargetAttributeID,
			RangeFromCreationAttributeID,
			NextAttributeID
		};

	private:
		static const IndexEntry AttributePointers[];

	protected:
		static AttributeIndexSet	AttributeIndex;

	//
	// public attribute declarations go here
	//
	public:
		Point3D			targetPosition;          // for thruster
		const Point3D			creationPoint;			 // where the missile was fired from
		Entity	      *targetEntity;
		const Point3D       targetOffset;
		Scalar			 rangeToTarget, rangeFromCreation, startingRangeToTarget;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Model Support
	//
	public:
		enum {
			Empty = Subsystem::StateCount,
			StateCount};

		typedef void
			(Seeker::*Performance)(Scalar time_slice);


		void
			LeadTarget();
		void
			FindTarget(Scalar time_slice);

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

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// 	TestClass Support
	//
	public:

		static Logical
			TestClass(Missile &);
		void
			ResetToInitialState();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Construction and Destruction
	//         
	public:
		typedef Seeker__SubsystemResource SubsystemResource;

		Seeker  (
			Missile			*owner,
			int				subsystem_ID,
			SubsystemResource	*subsystem_resource,
			Entity *target,
			const Point3D offset
		);
		~Seeker();

		Logical
      	TestInstance() const;
	};
#endif
