#pragma once #include "vtvsub.h" #include "..\munga\average.h" //########################################################################## //################ VTVControlsMapper::ModelResource ################## //########################################################################## class VTVControlsMapper: public VTVSubsystem { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Shared Data support // public: static Derivation *GetClassDerivations(); static SharedData DefaultData; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Messaging Support // public: enum { ConfigureControlsMessageID = VTVSubsystem::NextMessageID, ConfigureSideSlipMappablesMessageID, ChooseSideSlipMessageID, ConfigureLiftCutMappablesMessageID, ChooseLiftCutMessageID, ConfigureHornMappablesMessageID, ChooseHornMessageID, ActivateHornMessageID, ConfigurePTTMappablesMessageID, ChoosePTTMessageID, ActivatePTTMessageID, ToggleReticleMessageID, NextMessageID }; void ConfigureControlsMessageHandler( ReceiverDataMessageOf *message ); void ConfigureSideSlipMappablesMessageHandler( ReceiverDataMessageOf *message ); void ChooseSideSlipMessageHandler( ReceiverDataMessageOf *message ); void ConfigureLiftCutMappablesMessageHandler( ReceiverDataMessageOf *message ); void ChooseLiftCutMessageHandler( ReceiverDataMessageOf *message ); void ConfigureHornMappablesMessageHandler( ReceiverDataMessageOf *message ); void ChooseHornMessageHandler( ReceiverDataMessageOf *message ); void ActivateHornMessageHandler( ReceiverDataMessageOf *message ); void ConfigurePTTMappablesMessageHandler( ReceiverDataMessageOf *message ); void ChoosePTTMessageHandler( ReceiverDataMessageOf *message ); void ActivatePTTMessageHandler( ReceiverDataMessageOf *message ); void ToggleReticleMessageHandler( ReceiverDataMessageOf *message ); private: static const HandlerEntry MessageHandlerEntries[]; protected: //static MessageHandlerSet MessageHandlers; static MessageHandlerSet& GetMessageHandlers(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Attribute Support // public: enum { StickPositionAttributeID = VTVSubsystem::NextAttributeID, ThrottlePositionAttributeID, PedalsPositionAttributeID, ReverseThrustAttributeID, LiftCutAttributeID, SideSlipAttributeID, PowerDemandAttributeID, AngularVelocityDemandAttributeID, BrakeLightsAttributeID, LookLeftAttributeID, LookRightAttributeID, LookBehindAttributeID, LookUpAttributeID, ControlModeAttributeID, HornBlastAttributeID, MustMatchAttributeID, ReverseThrustEngagedAttributeID, // ECH 8/3/95 - HACK - deal with thrust LiftCutEngagedAttributeID, PTTStatusAttributeID, NextAttributeID }; private: static const IndexEntry AttributePointers[]; protected: //static AttributeIndexSet AttributeIndex static AttributeIndexSet& GetAttributeIndex(); // // public attribute declarations go here // public: ControlsJoystick stickPosition; Scalar throttlePosition; Scalar pedalsPosition; ControlsButton reverseThrust, liftCut, sideSlip, rollLeft, rollRight, pitchUp, pitchDown; Vector3D powerDemand, angularVelocityDemand; int brakeLights; ControlsButton lookLeft, lookRight, lookBehind, lookUp, hornBlast, pttStatus; // ECH 8/3/95 - HACK - deal with thrust AverageOf averageOfForwardThrustDemand; Scalar forwardThrustDemand; Logical reverseThrustEngaged; Logical liftCutEngaged; enum { BasicMode = 0, StandardMode, VeteranMode, MasterMode } controlMode; unsigned int mustMatch, mayMatch; protected: ControlsButton previousPTTStatus; // used to detect change in PTT status // // True from a respawn until the throttle control has been seen at // (near) zero. While set, InterpretControls behaves as though the // throttle were zero, whatever the hand is doing; the attribute // itself keeps the real lever value so the cockpit gauge shows the // player what they must bring down. See DeathReset. // Logical throttleLatched; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Model Support // public: enum { ConfigurationState = VTVSubsystem::StateCount, StateCount }; typedef void (VTVControlsMapper::*Performance)(Scalar time_slice); void SetPerformance(Performance performance) { Check(this); activePerformance = (Simulation::Performance)performance; } void InterpretControls(Scalar time_slice); void SetConfigurationState(Logical enter_config); // // Latch the throttle at zero until the player's control comes back to // zero. Called by VTV::Reset on a regular reset - a death respawn, and // the first spawn - because the hand that was holding full throttle // when the pod died is still holding it when the pod reappears, and // the pod used to launch on it. The arcade never had the problem the // same way: its throttle was a physical lever the pilot had to move // regardless. // // Football and mission review resets do not latch: one repositions // every pod mid-game where the friction is unwanted, the other has no // controls at all. // void DeathReset(int reset_command); virtual void CreateTemporaryEventMappings( Receiver *receiver, Receiver::MessageID config_message_id ), RemoveTemporaryEventMappings(), AddOrErase( unsigned int button_ID, Receiver *target, Receiver::MessageID message_ID ), AddOrErase( unsigned int button_ID, ControlsButton *destination ); virtual void NotifyOfControlModeChange(int new_mode); virtual void NotifyOfConfigurationModeChange(Logical new_state); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Construction and Destruction // public: VTVControlsMapper( VTV *owner, int subsystem_ID, SubsystemResource *subsystem_resource, SharedData &shared_data ); ~VTVControlsMapper(); Logical TestInstance() const; };