Pioneer
Loading...
Searching...
No Matches
ShipAICmd.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#ifndef _SHIPAICMD_H
5#define _SHIPAICMD_H
6
7#include "GameSaveError.h"
8#include "JsonFwd.h"
9
10#include "DynamicBody.h"
11#include "FixedGuns.h"
12#include "FrameId.h"
13#include "ship/Propulsion.h"
14
15class Ship;
16class Space;
17class SpaceStation;
18
19class AICommand {
20public:
21 // This enum is solely to make the serialization work
22 enum CmdName { // <enum scope='AICommand::CmdName' name=ShipAICmdName public>
31 };
32
34 m_dBody(dBody),
35 m_cmdName(name)
36 {
38 }
39 virtual ~AICommand() {}
40
41 virtual bool TimeStepUpdate() = 0;
42 bool ProcessChild(); // returns false if child is active
43 virtual void GetStatusText(char *str)
44 {
45 if (m_child)
46 m_child->GetStatusText(str);
47 else
48 strcpy(str, "AI state unknown");
49 }
50
51 // Serialisation functions
52 static AICommand *LoadFromJson(const Json &jsonObj);
53 AICommand(const Json &jsonObj, CmdName name);
54 virtual void SaveToJson(Json &jsonObj);
55 virtual void PostLoadFixup(Space *space);
56
57 // Signal functions
58 virtual void OnDeleted(const Body *body)
59 {
60 if (m_child) m_child->OnDeleted(body);
61 }
62
63 CmdName GetType() const { return m_cmdName; }
64
65protected:
68
69 std::unique_ptr<AICommand> m_child;
70 bool m_is_flyto = false;
72
73 int m_dBodyIndex; // deserialisation
74};
75
76class AICmdDock : public AICommand {
77public:
78 virtual bool TimeStepUpdate();
79 AICmdDock(DynamicBody *dBody, SpaceStation *target);
80
81 virtual void GetStatusText(char *str);
82 virtual void SaveToJson(Json &jsonObj);
83 AICmdDock(const Json &jsonObj);
84 virtual void PostLoadFixup(Space *space);
85
86 virtual void OnDeleted(const Body *body);
87
88private:
89 enum EDockingStates {
90 eDockGetDataStart = 0, // 0: get data for docking start pos
91 eDockFlyToStart = 1, // 1: Fly to docking start pos
92 eDockGetDataEnd = 2, // 2: get data for docking end pos
93 eDockFlyToEnd = 3, // 3: Fly to docking end pos
94 eDockingComplete = 4,
95 eInvalidDockingStage = 5
96 };
97
98 SpaceStation *m_target;
99 vector3d m_dockpos; // offset in target's frame
100 vector3d m_dockdir;
101 vector3d m_dockupdir;
102 EDockingStates m_state; // see TimeStepUpdate()
103 int m_targetIndex; // used during deserialisation
104
105 void IncrementState()
106 {
107 switch (m_state) {
108 case eDockGetDataStart: m_state = eDockFlyToStart; break;
109 case eDockFlyToStart: m_state = eDockGetDataEnd; break;
110 case eDockGetDataEnd: m_state = eDockFlyToEnd; break;
111 case eDockFlyToEnd: m_state = eDockingComplete; break;
112 case eDockingComplete: m_state = eInvalidDockingStage; break;
113 case eInvalidDockingStage: break;
114 }
115 }
116};
117
118class AICmdFlyTo : public AICommand {
119public:
120 virtual bool TimeStepUpdate();
121 AICmdFlyTo(DynamicBody *dBody, FrameId targframeId, const vector3d &posoff, double endvel, bool tangent);
122 AICmdFlyTo(DynamicBody *dBody, Body *target);
123
124 virtual void GetStatusText(char *str);
125 virtual void SaveToJson(Json &jsonObj);
126 AICmdFlyTo(const Json &jsonObj);
127 virtual void PostLoadFixup(Space *space);
128
129 virtual void OnDeleted(const Body *body);
130
131private:
132 Body *m_target; // target for vicinity. Either this or targframe is 0
133 double m_dist; // vicinity distance
134 FrameId m_targframeId; // target frame for waypoint
135 vector3d m_posoff; // offset in target frame
136 double m_endvel; // target speed in direction of motion at end of path, positive only
137 bool m_tangent; // true if path is to a tangent of the target frame's body
138 int m_state;
139
140 int m_targetIndex; // used during deserialisation
141 vector3d m_reldir; // target direction relative to ship at last frame change
142 FrameId m_frameId; // last frame of ship
143 bool m_suicideRecovery;
144};
145
146class AICmdFlyAround : public AICommand {
147public:
148 virtual bool TimeStepUpdate();
149 AICmdFlyAround(DynamicBody *dBody, Body *obstructor, double relalt, int mode = 2);
150 AICmdFlyAround(DynamicBody *dBody, Body *obstructor, double alt, double vel, int mode = 1);
151
152 virtual void GetStatusText(char *str);
153 virtual void SaveToJson(Json &jsonObj);
154 AICmdFlyAround(const Json &jsonObj);
155 virtual void PostLoadFixup(Space *space);
156 virtual void OnDeleted(const Body *body)
157 {
159 // check against obstructor?
160 }
161 void SetTargPos(const vector3d &targpos)
162 {
163 m_targpos = targpos;
164 m_targmode = 0;
165 }
166
167protected:
168 void Setup(Body *obstructor, double alt, double vel, int mode);
169 double MaxVel(double targdist, double targalt);
170
171private:
172 Body *m_obstructor; // body to fly around
173 int m_obstructorIndex; // deserialisation
174 double m_alt, m_vel;
175 int m_targmode; // 0 targpos termination, 1 infinite, 2+ orbital termination
176 vector3d m_targpos; // target position in ship space
177};
178
179class AICmdKill : public AICommand {
180public:
181 virtual bool TimeStepUpdate();
182 AICmdKill(DynamicBody *dBody, Ship *target);
183 AICmdKill(const Json &jsonObj);
184
185 ~AICmdKill();
186
187 // don't actually need to save all this crap
188 virtual void SaveToJson(Json &jsonObj);
189 void PostLoadFixup(Space *space);
190
191 virtual void OnDeleted(const Body *body);
192
193 const Ship* GetTarget() const { return m_target; }
194
195private:
196 FixedGuns *m_fguns;
197 Ship *m_target;
198 double m_leadTime, m_evadeTime, m_closeTime;
199 vector3d m_leadOffset, m_leadDrift, m_lastVel;
200 int m_targetIndex; // used during deserialisation
201};
202
203class AICmdKamikaze : public AICommand {
204public:
205 virtual bool TimeStepUpdate();
206 AICmdKamikaze(DynamicBody *dBody, Body *target);
207
208 virtual void SaveToJson(Json &jsonObj);
209 AICmdKamikaze(const Json &jsonObj);
210 virtual void PostLoadFixup(Space *space);
211
212 virtual void OnDeleted(const Body *body);
213
214 const Body* GetTarget() const { return m_target; }
215private:
216 Body *m_target;
217 int m_targetIndex; // used during deserialisation
218};
219
221public:
222 virtual bool TimeStepUpdate();
224 AICmdHoldPosition(const Json &jsonObj);
225};
226
227class AICmdFormation : public AICommand {
228public:
229 virtual bool TimeStepUpdate();
230 AICmdFormation(DynamicBody *dBody, DynamicBody *target, const vector3d &posoff);
231
232 void GetStatusText(char *str);
233 virtual void SaveToJson(Json &jsonObj);
234 AICmdFormation(const Json &jsonObj);
235 virtual void PostLoadFixup(Space *space);
236
237 virtual void OnDeleted(const Body *body);
238
239private:
240 DynamicBody *m_target; // target frame for waypoint
241 vector3d m_posoff; // offset in target frame
242
243 int m_targetIndex; // used during deserialisation
244};
245
246#endif /* _SHIPAICMD_H */
nlohmann::json Json
Definition Json.h:8
Definition ShipAICmd.h:76
virtual void SaveToJson(Json &jsonObj)
Definition ShipAICmd.cpp:1306
virtual bool TimeStepUpdate()
Definition ShipAICmd.cpp:1325
virtual void PostLoadFixup(Space *space)
Definition ShipAICmd.cpp:1248
virtual void GetStatusText(char *str)
Definition ShipAICmd.cpp:1240
virtual void OnDeleted(const Body *body)
Definition ShipAICmd.cpp:1234
Definition ShipAICmd.h:146
double MaxVel(double targdist, double targalt)
Definition ShipAICmd.cpp:1564
virtual void OnDeleted(const Body *body)
Definition ShipAICmd.h:156
virtual void PostLoadFixup(Space *space)
Definition ShipAICmd.cpp:1481
virtual bool TimeStepUpdate()
Definition ShipAICmd.cpp:1577
virtual void SaveToJson(Json &jsonObj)
Definition ShipAICmd.cpp:1550
virtual void GetStatusText(char *str)
Definition ShipAICmd.cpp:1472
void Setup(Body *obstructor, double alt, double vel, int mode)
Definition ShipAICmd.cpp:1490
void SetTargPos(const vector3d &targpos)
Definition ShipAICmd.h:161
Definition ShipAICmd.h:118
virtual void GetStatusText(char *str)
Definition ShipAICmd.cpp:894
virtual void SaveToJson(Json &jsonObj)
Definition ShipAICmd.cpp:983
virtual void OnDeleted(const Body *body)
Definition ShipAICmd.cpp:888
virtual void PostLoadFixup(Space *space)
Definition ShipAICmd.cpp:906
virtual bool TimeStepUpdate()
Definition ShipAICmd.cpp:1001
Definition ShipAICmd.h:227
void GetStatusText(char *str)
Definition ShipAICmd.cpp:1668
virtual void OnDeleted(const Body *body)
Definition ShipAICmd.cpp:1662
virtual void PostLoadFixup(Space *space)
Definition ShipAICmd.cpp:1709
virtual void SaveToJson(Json &jsonObj)
Definition ShipAICmd.cpp:1697
virtual bool TimeStepUpdate()
Definition ShipAICmd.cpp:1718
Definition ShipAICmd.h:220
virtual bool TimeStepUpdate()
Definition ShipAICmd.cpp:1465
Definition ShipAICmd.h:203
virtual void PostLoadFixup(Space *space)
Definition ShipAICmd.cpp:256
const Body * GetTarget() const
Definition ShipAICmd.h:214
virtual void OnDeleted(const Body *body)
Definition ShipAICmd.cpp:226
virtual bool TimeStepUpdate()
Definition ShipAICmd.cpp:265
virtual void SaveToJson(Json &jsonObj)
Definition ShipAICmd.cpp:247
Definition ShipAICmd.h:179
virtual bool TimeStepUpdate()
Definition ShipAICmd.cpp:367
void PostLoadFixup(Space *space)
Definition ShipAICmd.cpp:354
const Ship * GetTarget() const
Definition ShipAICmd.h:193
virtual void SaveToJson(Json &jsonObj)
Definition ShipAICmd.cpp:340
~AICmdKill()
Definition ShipAICmd.cpp:349
virtual void OnDeleted(const Body *body)
Definition ShipAICmd.cpp:316
Definition ShipAICmd.h:19
std::unique_ptr< AICommand > m_child
Definition ShipAICmd.h:69
virtual void GetStatusText(char *str)
Definition ShipAICmd.h:43
DynamicBody * m_dBody
Definition ShipAICmd.h:66
virtual void PostLoadFixup(Space *space)
Definition ShipAICmd.cpp:76
static AICommand * LoadFromJson(const Json &jsonObj)
Definition ShipAICmd.cpp:19
virtual void OnDeleted(const Body *body)
Definition ShipAICmd.h:58
int m_dBodyIndex
Definition ShipAICmd.h:73
bool ProcessChild()
Definition ShipAICmd.cpp:83
CmdName m_cmdName
Definition ShipAICmd.h:71
AICommand(DynamicBody *dBody, CmdName name)
Definition ShipAICmd.h:33
CmdName
Definition ShipAICmd.h:22
@ CMD_KILL
Definition ShipAICmd.h:27
@ CMD_HOLDPOSITION
Definition ShipAICmd.h:29
@ CMD_FLYTO
Definition ShipAICmd.h:25
@ CMD_FORMATION
Definition ShipAICmd.h:30
@ CMD_NONE
Definition ShipAICmd.h:23
@ CMD_KAMIKAZE
Definition ShipAICmd.h:28
@ CMD_FLYAROUND
Definition ShipAICmd.h:26
@ CMD_DOCK
Definition ShipAICmd.h:24
bool m_is_flyto
Definition ShipAICmd.h:70
virtual ~AICommand()
Definition ShipAICmd.h:39
virtual void SaveToJson(Json &jsonObj)
Definition ShipAICmd.cpp:44
virtual bool TimeStepUpdate()=0
Propulsion * m_prop
Definition ShipAICmd.h:67
CmdName GetType() const
Definition ShipAICmd.h:63
Definition Body.h:57
Definition DynamicBody.h:15
AIError AIMessage(AIError msg=AIERROR_NONE)
Definition DynamicBody.h:73
@ AIERROR_NONE
Definition DynamicBody.h:67
Definition FixedGuns.h:21
Definition Propulsion.h:25
Definition Ship.h:64
Definition SpaceStation.h:30
Definition Space.h:19
Definition FrameId.h:9