Pioneer
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 
15 class Ship;
16 class Space;
17 class SpaceStation;
18 
19 class AICommand {
20 public:
21  // This enum is solely to make the serialization work
22  enum CmdName { // <enum scope='AICommand::CmdName' name=ShipAICmdName public>
31  };
32 
33  AICommand(DynamicBody *dBody, CmdName name) :
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 
65 protected:
68 
69  std::unique_ptr<AICommand> m_child;
70  bool m_is_flyto = false;
72 
73  int m_dBodyIndex; // deserialisation
74 };
75 
76 class AICmdDock : public AICommand {
77 public:
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 
88 private:
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 
118 class AICmdFlyTo : public AICommand {
119 public:
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 
131 private:
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 
146 class AICmdFlyAround : public AICommand {
147 public:
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  {
158  AICommand::OnDeleted(body);
159  // check against obstructor?
160  }
161  void SetTargPos(const vector3d &targpos)
162  {
163  m_targpos = targpos;
164  m_targmode = 0;
165  }
166 
167 protected:
168  void Setup(Body *obstructor, double alt, double vel, int mode);
169  double MaxVel(double targdist, double targalt);
170 
171 private:
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 
179 class AICmdKill : public AICommand {
180 public:
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 
195 private:
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 
203 class AICmdKamikaze : public AICommand {
204 public:
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; }
215 private:
216  Body *m_target;
217  int m_targetIndex; // used during deserialisation
218 };
219 
220 class AICmdHoldPosition : public AICommand {
221 public:
222  virtual bool TimeStepUpdate();
224  AICmdHoldPosition(const Json &jsonObj);
225 };
226 
227 class AICmdFormation : public AICommand {
228 public:
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 
239 private:
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
AICmdDock(DynamicBody *dBody, SpaceStation *target)
Definition: ShipAICmd.cpp:1257
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
AICmdFlyAround(DynamicBody *dBody, Body *obstructor, double relalt, int mode=2)
Definition: ShipAICmd.cpp:1515
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
AICmdFlyTo(DynamicBody *dBody, FrameId targframeId, const vector3d &posoff, double endvel, bool tangent)
Definition: ShipAICmd.cpp:948
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
AICmdFormation(DynamicBody *dBody, DynamicBody *target, const vector3d &posoff)
Definition: ShipAICmd.cpp:1677
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
AICmdHoldPosition(DynamicBody *dBody)
Definition: ShipAICmd.cpp:1450
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
AICmdKamikaze(DynamicBody *dBody, Body *target)
Definition: ShipAICmd.cpp:232
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
virtual void SaveToJson(Json &jsonObj)
Definition: ShipAICmd.cpp:340
AICmdKill(DynamicBody *dBody, Ship *target)
Definition: ShipAICmd.cpp:322
const Ship * GetTarget() const
Definition: ShipAICmd.h:193
~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