//===========================================================================//
// File:	l4app.hpp																			  //
// Project: MUNGA           Brick: L4Application								  	  //
// Contents: Interface specification for L4Application							  //
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
// 01/21/95  ECH  Initial coding.												  		  //
//---------------------------------------------------------------------------//
// Copyright (C) 1994, Virtual World Entertainment, Inc.                     //
//   All Rights reserved worldwide.                                          //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL               //
//===========================================================================//

#if !defined(L4APP_HPP)
#	define L4APP_HPP

#	if !defined(APP_HPP)
#		include <app.hpp>
#	endif

	class DPLRenderer;
	class L4AudioRenderer;
	class L4GaugeRenderer;
	class L4NetworkManager;
	class LBE4ControlsManager;
	class L4IcomManager;

	//##########################################################################
	//########################    L4Application    #############################
	//##########################################################################

	class L4Application:
		public Application
	{
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Construction, Destruction, and Testing
	//
	public:
		L4Application(
			ResourceFile *resource_file,
			ApplicationID application_ID,
			ClassID class_ID=L4ApplicationClassID,
			SharedData &shared_data=DefaultData
		);
		~L4Application();

		Logical
			TestInstance() const;

		static Derivation ClassDerivations;
		static SharedData DefaultData;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Command line parsing
	//
	public:
		typedef Logical
			(*TokenParser)(int *argument, int argc, char *argv[]);
		static Logical
			ParseToken(
				int *argument,
				int argc,
				char *argv[]
			);
		static Logical
			ParseCommandLine(
				int argc,
				char *argv[],
				TokenParser parser = &L4Application::ParseToken
			);

		static int
			GetMissionReviewMode()
				{return missionReviewMode;}

		static Logical
			GetSeeSolids()
				{return seeSolids;}
		static unsigned long
			GetNetworkCommonFlatAddress()
				{return networkCommonFlatAddress;}
		static CString
			GetEggNotationFileName()
				{return eggNotationFileName;}
		static CString
			GetRIOPlaybackFileName()
				{return rioPlaybackFileName;}
		static CString
			GetRIORecordingFileName()
				{return rioRecordingFileName;}

	protected:
		static Logical
			seeSolids;
		static CString
			eggNotationFileName;
		static unsigned long
			networkCommonFlatAddress;
		static int
			missionReviewMode;
		static CString
			rioPlaybackFileName;
		static CString
			rioRecordingFileName;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Execution control
	//
	public:
		void
			Initialize();
		void
			InitializeTillConsole();

		Entity*
			MakeAndLinkViewpointEntity(Entity__MakeMessage *message);

		Entity*
			MakeViewpointEntity(Entity__MakeMessage *message);

		void
			Terminate();

		void
			TeslaCoil(Logical lights_on);

		void
			PilotIllumination(Logical lights_on);		// includes 'Tesla coil'

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Module accesors
	//
	public:
		DPLRenderer*
			GetVideoRenderer();

		L4AudioRenderer*
			GetAudioRenderer();

		L4GaugeRenderer*
			GetGaugeRenderer();

		L4NetworkManager*
			GetNetworkManager()
				{return (L4NetworkManager*)Application::GetNetworkManager();}
		LBE4ControlsManager*
			GetControlsManager()
				{return (LBE4ControlsManager*)Application::GetControlsManager();}
		L4IcomManager*
			GetIntercomManager()
				{return (L4IcomManager*)Application::GetIntercomManager();}

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Public data
	//
	public:
		char
			*divisionParameters;

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Module Creation
	//
	protected:
		ModeManager*
			MakeModeManager();

		ControlsManager*
			MakeControlsManager();

		IcomManager*
			MakeIntercomManager();

		NetworkManager*
			MakeNetworkManager();

		VideoRenderer*
			MakeVideoRenderer();

		AudioRenderer*
			MakeAudioRenderer();

		GaugeRenderer*
			MakeGaugeRenderer();

	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Message Support
	//
	public:
		enum
		{
			LightsOutMessageID = Application::NextMessageID,
			NextMessageID
		};

		static const HandlerEntry
			MessageHandlerEntries[];
		static MessageHandlerSet
			MessageHandlers;

		void
			LightsOutMessageHandler(Receiver::Message *message);
		void
			RunMissionMessageHandler(RunMissionMessage *message);
		void
			StopMissionMessageHandler(StopMissionMessage *message);
		void			 // HACK - the 'int' is actually 'ControlsKey'
			KeyCommandMessageHandler(ReceiverDataMessageOf<int> *message);
	};

	extern L4Application * &l4_application;

	//~~~~~~~~~~~~~~~~~~~~~ L4Application inlines ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	inline DPLRenderer*
		L4Application::GetVideoRenderer()
			{
				Check(this);
				return (DPLRenderer*)videoRenderer;
			}

	inline L4AudioRenderer*
		L4Application::GetAudioRenderer()
			{
				Check(this);
				return (L4AudioRenderer*)audioRenderer;
			}

	inline L4GaugeRenderer*
		L4Application::GetGaugeRenderer()
			{
				Check(this);
				return (L4GaugeRenderer*)gaugeRenderer;
			}

#endif

