Pioneer
PlayerShipController.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #pragma once
5 
6 #include "Input.h"
7 #include "ShipController.h"
8 #include "ConnectionTicket.h"
9 
10 // autopilot AI + input
12 public:
15 
16  Type GetType() override { return PLAYER; }
17  void SaveToJson(Json &jsonObj, Space *s) override;
18  void LoadFromJson(const Json &jsonObj) override;
19  void PostLoadFixup(Space *s) override;
20  void StaticUpdate(float timeStep) override;
21  bool IsMouseActive() const { return m_mouseActive; }
22  void SetDisableMouseFacing(bool disabled) { m_disableMouseFacing = disabled; }
23  double GetCruiseSpeed() const override { return m_cruiseSpeed; }
24  void ChangeCruiseSpeed(double delta) override { m_cruiseSpeed += delta; }
25  FlightControlState GetFlightControlState() const override { return m_flightControlState; }
26  vector3d GetMouseDir() const; // in local frame
27 
28  // Return the current mouse direction in camera space.
29  vector3d GetMouseViewDir() const;
30  void SetMouseForRearView(bool enable) { m_invertMouse = enable; }
32  float GetLowThrustPower() const { return m_lowThrustPower; }
33  void SetLowThrustPower(float power);
34 
35  bool GetRotationDamping() const { return m_rotationDamping; }
36  void SetRotationDamping(bool enabled);
37  void ToggleRotationDamping();
38  void FireMissile();
39  void ToggleCruise();
40  void SelectTarget();
41  void CycleHostiles();
42 
43 
44 
45  //targeting
46  //XXX AI should utilize one or more of these
47  Body *GetCombatTarget() const;
48  Body *GetNavTarget() const;
49  Body *GetFollowTarget() const override;
50  void SetCombatTarget(Body *const target, bool setFollowTo = false);
51  void SetNavTarget(Body *const target);
52  void SetFollowTarget(Body *const target);
53 
54  sigc::signal<void> onRotationDampingChanged;
55  sigc::signal<void> onChangeTarget;
56  sigc::signal<void> onChangeFlightControlState;
57 
58  enum CruiseDirection { // <enum scope='PlayerShipController' name=CruiseDirection public>
60  CRUISE_UP
61  };
62 
63  enum FollowMode { // <enum scope='PlayerShipController' name=FollowMode public>
66  };
67 
69  CruiseDirection GetCruiseDirection() const { return m_cruiseDirection; }
70  void SetFollowMode(FollowMode mode) { m_followMode = mode; }
71  FollowMode GetFollowMode() const { return m_followMode; }
72  void SetSpeedLimit(double limit) { m_speedLimit = limit; }
73  double GetSpeedLimit() { return m_speedLimit; }
74  void SetSpeedLimiterActive(bool active) { m_speedLimiterActive = active; }
75  bool IsSpeedLimiterActive() const { return m_speedLimiterActive; }
76  bool IsShipDrifting(); // 'setted' speed is very different from real speed
77 
78 private:
79  struct InputBinding : public Input::InputFrame {
80  using InputFrame::InputFrame;
81 
82  // Weapons
83  Action *targetObject;
84  Action *cycleHostiles;
85  Action *primaryFire;
86  Action *secondaryFire;
87 
88  // Flight
89  Axis *pitch;
90  Axis *yaw;
91  Axis *roll;
92  Action *killRot;
93  Action *toggleRotationDamping;
94 
95  // Manual Control
96  Axis *thrustForward;
97  Axis *thrustUp;
98  Axis *thrustLeft;
99  Action *thrustLowPower;
100 
101  // Speed Control
102  Axis *speedControl;
103  Action *toggleCruise;
104  Action *toggleSpeedLimiter;
105 
106  // Landing Controls
107  Action *toggleLandingGear;
108  Axis *controlLandingGear;
109 
110  void RegisterBindings() override;
111  } InputBindings;
112 
113  // cumulative action from the input and flight assistance
114  struct TotalDesiredAction;
115  // static functions with access to private members
116  struct Util;
117 
118  // Poll controls, set gun states
119  void PollControls(float timeStep, int *mouseMotion, TotalDesiredAction &outParams);
120  // desired speed of linear and rotary movement, calculated by flight control assistance
121  void FlightAssist(const float timeStep, TotalDesiredAction &outParams);
122  // send a control request to propulsion
123  void ApplyTotalAction(const TotalDesiredAction &params);
124 
125  void OnToggleLandingGear();
126  void UpdateLandingGear();
127 
128  // FIXME: separate the propusion controller from the input system, pass in wanted velocity correction directly.
129  friend class Propulsion;
130 
131  double m_speedLimit = 0.0;
132  bool m_speedLimiterActive = false;
133  bool IsAnyAngularThrusterKeyDown();
134  bool IsAnyLinearThrusterKeyDown();
135  //do a variety of checks to see if input is allowed
136  bool AreControlsLocked();
137  Body *m_combatTarget;
138  Body *m_navTarget;
139  Body *m_followTarget;
140  bool m_invertMouse; // used for rear view, *not* for invert Y-axis option (which is Pi::input->IsMouseYInvert)
141  bool m_mouseActive;
142  bool m_disableMouseFacing;
143  bool m_rotationDamping;
144  bool m_stickySpeedKey = false; // helps cruise speed sticks to 0 when it crosses it
145  matrix3x3d m_followTargetPrevOrient;
146  vector3d m_followTargetPrevVel;
147  double m_mouseX;
148  double m_mouseY;
149  double m_cruiseSpeed;
150  FlightControlState m_flightControlState;
151  float m_fovY; //for mouse acceleration adjustment
152  float m_joystickDeadzone;
153  float m_lowThrustPower;
154  float m_aimingSens;
155  int m_combatTargetIndex; //for PostLoadFixUp
156  int m_navTargetIndex;
157  int m_followTargetIndex;
158  vector3d m_mouseDir;
159 
160  FollowMode m_followMode = FOLLOW_POS;
161  CruiseDirection m_cruiseDirection = CRUISE_FWD;
162 
163  ConnectionTicket m_connRotationDampingToggleKey;
164  ConnectionTicket m_fireMissileKey;
165  ConnectionTicket m_toggleCruise;
166  ConnectionTicket m_toggleSpeedLimiter;
167  ConnectionTicket m_selectTarget;
168  ConnectionTicket m_cycleHostiles;
169  ConnectionTicket m_toggleLandingGear;
170 };
nlohmann::json Json
Definition: Json.h:8
FlightControlState
Definition: ShipController.h:16
Definition: Body.h:57
Definition: PlayerShipController.h:11
void SetFollowMode(FollowMode mode)
Definition: PlayerShipController.h:70
void SetCombatTarget(Body *const target, bool setFollowTo=false)
Definition: PlayerShipController.cpp:964
void SetSpeedLimit(double limit)
Definition: PlayerShipController.h:72
Body * GetCombatTarget() const
Definition: PlayerShipController.cpp:949
void SetFlightControlState(FlightControlState s) override
Definition: PlayerShipController.cpp:739
void SetMouseForRearView(bool enable)
Definition: PlayerShipController.h:30
bool IsSpeedLimiterActive() const
Definition: PlayerShipController.h:75
CruiseDirection GetCruiseDirection() const
Definition: PlayerShipController.h:69
bool GetRotationDamping() const
Definition: PlayerShipController.h:35
PlayerShipController()
Definition: PlayerShipController.cpp:168
void SetRotationDamping(bool enabled)
Definition: PlayerShipController.cpp:764
void ToggleCruise()
Definition: PlayerShipController.cpp:937
vector3d GetMouseViewDir() const
Definition: PlayerShipController.cpp:601
sigc::signal< void > onChangeFlightControlState
Definition: PlayerShipController.h:56
FollowMode
Definition: PlayerShipController.h:63
@ FOLLOW_ORI
Definition: PlayerShipController.h:65
@ FOLLOW_POS
Definition: PlayerShipController.h:64
void SetSpeedLimiterActive(bool active)
Definition: PlayerShipController.h:74
bool IsShipDrifting()
Definition: PlayerShipController.cpp:1000
void CycleHostiles()
Definition: PlayerShipController.cpp:931
sigc::signal< void > onChangeTarget
Definition: PlayerShipController.h:55
void SetCruiseDirection(CruiseDirection mode)
Definition: PlayerShipController.cpp:993
void SetDisableMouseFacing(bool disabled)
Definition: PlayerShipController.h:22
sigc::signal< void > onRotationDampingChanged
Definition: PlayerShipController.h:54
void SetFollowTarget(Body *const target)
Definition: PlayerShipController.cpp:979
Body * GetFollowTarget() const override
Definition: PlayerShipController.cpp:959
FlightControlState GetFlightControlState() const override
Definition: PlayerShipController.h:25
void FireMissile()
Definition: PlayerShipController.cpp:777
~PlayerShipController()
Definition: PlayerShipController.cpp:245
Type GetType() override
Definition: PlayerShipController.h:16
Body * GetNavTarget() const
Definition: PlayerShipController.cpp:954
void ToggleRotationDamping()
Definition: PlayerShipController.cpp:772
void LoadFromJson(const Json &jsonObj) override
Definition: PlayerShipController.cpp:267
void SaveToJson(Json &jsonObj, Space *s) override
Definition: PlayerShipController.cpp:250
void StaticUpdate(float timeStep) override
Definition: PlayerShipController.cpp:493
void SetLowThrustPower(float power)
Definition: PlayerShipController.cpp:758
CruiseDirection
Definition: PlayerShipController.h:58
@ CRUISE_FWD
Definition: PlayerShipController.h:59
@ CRUISE_UP
Definition: PlayerShipController.h:60
FollowMode GetFollowMode() const
Definition: PlayerShipController.h:71
void SelectTarget()
Definition: PlayerShipController.cpp:840
double GetCruiseSpeed() const override
Definition: PlayerShipController.h:23
double GetSpeedLimit()
Definition: PlayerShipController.h:73
bool IsMouseActive() const
Definition: PlayerShipController.h:21
float GetLowThrustPower() const
Definition: PlayerShipController.h:32
void PostLoadFixup(Space *s) override
Definition: PlayerShipController.cpp:289
void SetNavTarget(Body *const target)
Definition: PlayerShipController.cpp:973
vector3d GetMouseDir() const
Definition: PlayerShipController.cpp:594
void ChangeCruiseSpeed(double delta) override
Definition: PlayerShipController.h:24
Definition: Propulsion.h:25
Definition: ShipController.h:32
Type
Definition: ShipController.h:35
@ PLAYER
Definition: ShipController.h:37
Definition: Space.h:19
Definition: InputBindings.h:14
Definition: ConnectionTicket.h:12
Definition: Input.h:46