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