//===========================================================================//
// File:    btdirect.hh                                                      //
// Project: Red Planet                                                 		  //
// Contents: Chooses from a Selection of Camerea's and provides information  //
//	to any number of cameraship's as to which player to follow					  //
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
// 01/15/95  JM  Initial coding.                                             //
//---------------------------------------------------------------------------//
// Copyright (C) 1995, Virtual World Entertainment, Inc.                     //
// All Rights reserved worldwide                                             //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL               //
//===========================================================================//
//
// SURVIVING HEADER (ground truth -- reproduced verbatim from
//   410SRC/Telsa40/Rel410/CODE/BT/BT/BTDIRECT.HPP).
//
// The block below was added during reconstruction (see btdirect.cpp for the
// per-method @ADDR evidence) and is *commentary only* -- the class body is
// unchanged from the shipped header.
//
// vtable        @005134c4   (PTR_FUN_005134c4; CLASSMAP listed 5134b8 -- that
//                            is actually mid-string in the "BTCameraDirector"
//                            ClassDerivations name @005134b1; the real vtable
//                            starts 0xC later at 005134c4).  17 slots, only
//                            slot0 (the scalar-deleting dtor @004c1484) is a
//                            BT override; slots 1..16 inherit CameraDirector.
// ClassDerivations  @00513414      DefaultData  @00513444
// object size   0x238  (allocated by Make @004c1454 and by the entity factory
//                       @004c15f0)
//
// BTCameraDirector adds NO data members of its own -- everything it touches
// lives in the engine CameraDirector base (DIRECTOR.HPP; base vtable
// @004e6b4c, base ctor @0042eec8).  Base offsets observed in the decomp:
//      this+0x1c   activePerformance      (Simulation::Performance, 12 bytes)
//      this+0x28   simulationFlags        ((flags & 0xc)==4 => replicant copy)
//      this+0x1fc  cameraShip receiver    (base idx 0x7f; setup target)
//      this+0x20c  followedVehicle        (embedded target Connection/SlotOf,
//                                          base idx 0x83, ctor @0042f121)
//      this+0x218  switchTimer  (Scalar; base idx 0x86; base inits -1.0f,
//                                base BeADirector resets 10.0f, BTCameraDirector
//                                resets 30.0f)
//      this+0x21c  cameraShip*  (Receiver*; base idx 0x87; Dispatch target)
//

#if !defined (BTDIRECT_HPP)
#	define BTDIRECT_HPP

#	if !defined (DIRECTOR_HPP)
#		include <director.hpp>
#	endif

#	if !defined (BTPLAYER_HPP) && 0
#		include <btplayer.hpp>
#	endif


class BTCameraDirector :
	public CameraDirector
{
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Shared Data support
	//
	public:

		static Derivation ClassDerivations;
		static SharedData DefaultData;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Simulation Support
	//
	public:

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

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

		void
			CreateBTCameraShip(Scalar);

		void
			BeABTDirector(Scalar);

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Construction and Destruction Support
	//
		BTCameraDirector(
			MakeMessage	*creation_message,
			SharedData &virtual_data = DefaultData
		);

		static BTCameraDirector*
			BTCameraDirector::Make(CameraDirector::MakeMessage *creation_message);

		~BTCameraDirector();

		Logical
			TestInstance() const;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Player-selection support
	//
	// @0042efe4 in the shipped binary documented this as a CameraDirector
	// base helper that walked the "Players" EntityGroup returning the player
	// whose display/slot index == i.  The modernized engine CameraDirector
	// exposes only FindPlayerByRank(rank); BTCameraDirector needs the by-slot
	// variant, so it is declared here (BT-local) and defined in btdirect.cpp.
	//
	private:

		Player*
			GetPlayerByIndex(int index);
};
#endif
