Pioneer
Loading...
Searching...
No Matches
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
12public:
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.
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);
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>
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
78private:
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;
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
InputBindings::Action Action
Definition Input.h:48
InputBindings::Axis Axis
Definition Input.h:47