Pioneer
ShipAICmd.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 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 "FrameId.h"
12 #include "FixedGuns.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:
69 
70  std::unique_ptr<AICommand> m_child;
71  bool m_is_flyto = false;
73 
74  int m_dBodyIndex; // deserialisation
75 };
76 
77 class AICmdDock : public AICommand {
78 public:
79  virtual bool TimeStepUpdate();
80  AICmdDock(DynamicBody *dBody, SpaceStation *target);
81 
82  virtual void GetStatusText(char *str);
83  virtual void SaveToJson(Json &jsonObj);
84  AICmdDock(const Json &jsonObj);
85  virtual void PostLoadFixup(Space *space);
86 
87  virtual void OnDeleted(const Body *body);
88 
89 private:
90  enum EDockingStates {
91  eDockGetDataStart = 0, // 0: get data for docking start pos
92  eDockFlyToStart = 1, // 1: Fly to docking start pos
93  eDockGetDataEnd = 2, // 2: get data for docking end pos
94  eDockFlyToEnd = 3, // 3: Fly to docking end pos
95  eDockingComplete = 4,
96  eInvalidDockingStage = 5
97  };
98 
99  SpaceStation *m_target;
100  vector3d m_dockpos; // offset in target's frame
101  vector3d m_dockdir;
102  vector3d m_dockupdir;
103  EDockingStates m_state; // see TimeStepUpdate()
104  int m_targetIndex; // used during deserialisation
105 
106  void IncrementState()
107  {
108  switch (m_state) {
109  case eDockGetDataStart: m_state = eDockFlyToStart; break;
110  case eDockFlyToStart: m_state = eDockGetDataEnd; break;
111  case eDockGetDataEnd: m_state = eDockFlyToEnd; break;
112  case eDockFlyToEnd: m_state = eDockingComplete; break;
113  case eDockingComplete: m_state = eInvalidDockingStage; break;
114  case eInvalidDockingStage: break;
115  }
116  }
117 };
118 
119 class AICmdFlyTo : public AICommand {
120 public:
121  virtual bool TimeStepUpdate();
122  AICmdFlyTo(DynamicBody *dBody, FrameId targframeId, const vector3d &posoff, double endvel, bool tangent);
123  AICmdFlyTo(DynamicBody *dBody, Body *target);
124 
125  virtual void GetStatusText(char *str);
126  virtual void SaveToJson(Json &jsonObj);
127  AICmdFlyTo(const Json &jsonObj);
128  virtual void PostLoadFixup(Space *space);
129 
130  virtual void OnDeleted(const Body *body);
131 
132 private:
133  Body *m_target; // target for vicinity. Either this or targframe is 0
134  double m_dist; // vicinity distance
135  FrameId m_targframeId; // target frame for waypoint
136  vector3d m_posoff; // offset in target frame
137  double m_endvel; // target speed in direction of motion at end of path, positive only
138  bool m_tangent; // true if path is to a tangent of the target frame's body
139  int m_state;
140 
141  bool m_lockhead;
142  int m_targetIndex; // used during deserialisation
143  vector3d m_reldir; // target direction relative to ship at last frame change
144  FrameId m_frameId; // last frame of ship
145 };
146 
147 class AICmdFlyAround : public AICommand {
148 public:
149  virtual bool TimeStepUpdate();
150  AICmdFlyAround(DynamicBody *dBody, Body *obstructor, double relalt, int mode = 2);
151  AICmdFlyAround(DynamicBody *dBody, Body *obstructor, double alt, double vel, int mode = 1);
152 
153  virtual void GetStatusText(char *str);
154  virtual void SaveToJson(Json &jsonObj);
155  AICmdFlyAround(const Json &jsonObj);
156  virtual void PostLoadFixup(Space *space);
157  virtual void OnDeleted(const Body *body)
158  {
159  AICommand::OnDeleted(body);
160  // check against obstructor?
161  }
162  void SetTargPos(const vector3d &targpos)
163  {
164  m_targpos = targpos;
165  m_targmode = 0;
166  }
167 
168 protected:
169  void Setup(Body *obstructor, double alt, double vel, int mode);
170  double MaxVel(double targdist, double targalt);
171 
172 private:
173  Body *m_obstructor; // body to fly around
174  int m_obstructorIndex; // deserialisation
175  double m_alt, m_vel;
176  int m_targmode; // 0 targpos termination, 1 infinite, 2+ orbital termination
177  vector3d m_targpos; // target position in ship space
178 };
179 
180 class AICmdKill : public AICommand {
181 public:
182  virtual bool TimeStepUpdate();
183  AICmdKill(DynamicBody *dBody, Ship *target);
184  AICmdKill(const Json &jsonObj);
185 
186  ~AICmdKill();
187 
188  // don't actually need to save all this crap
189  virtual void SaveToJson(Json &jsonObj);
190  void PostLoadFixup(Space *space);
191 
192  virtual void OnDeleted(const Body *body);
193 
194 private:
195  Ship *m_target;
196  double m_leadTime, m_evadeTime, m_closeTime;
197  vector3d m_leadOffset, m_leadDrift, m_lastVel;
198  int m_targetIndex; // used during deserialisation
199 };
200 
201 class AICmdKamikaze : public AICommand {
202 public:
203  virtual bool TimeStepUpdate();
204  AICmdKamikaze(DynamicBody *dBody, Body *target);
205 
206  virtual void SaveToJson(Json &jsonObj);
207  AICmdKamikaze(const Json &jsonObj);
208  virtual void PostLoadFixup(Space *space);
209 
210  virtual void OnDeleted(const Body *body);
211 
212 private:
213  Body *m_target;
214  int m_targetIndex; // used during deserialisation
215 };
216 
217 class AICmdHoldPosition : public AICommand {
218 public:
219  virtual bool TimeStepUpdate();
221  AICmdHoldPosition(const Json &jsonObj);
222 };
223 
224 class AICmdFormation : public AICommand {
225 public:
226  virtual bool TimeStepUpdate();
227  AICmdFormation(DynamicBody *dBody, DynamicBody *target, const vector3d &posoff);
228 
229  void GetStatusText(char *str);
230  virtual void SaveToJson(Json &jsonObj);
231  AICmdFormation(const Json &jsonObj);
232  virtual void PostLoadFixup(Space *space);
233 
234  virtual void OnDeleted(const Body *body);
235 
236 private:
237  DynamicBody *m_target; // target frame for waypoint
238  vector3d m_posoff; // offset in target frame
239 
240  int m_targetIndex; // used during deserialisation
241 };
242 
243 #endif /* _SHIPAICMD_H */
nlohmann::json Json
Definition: Json.h:8
Definition: ShipAICmd.h:77
virtual void SaveToJson(Json &jsonObj)
Definition: ShipAICmd.cpp:1212
virtual bool TimeStepUpdate()
Definition: ShipAICmd.cpp:1231
virtual void PostLoadFixup(Space *space)
Definition: ShipAICmd.cpp:1154
virtual void GetStatusText(char *str)
Definition: ShipAICmd.cpp:1146
virtual void OnDeleted(const Body *body)
Definition: ShipAICmd.cpp:1140
AICmdDock(DynamicBody *dBody, SpaceStation *target)
Definition: ShipAICmd.cpp:1163
Definition: ShipAICmd.h:147
double MaxVel(double targdist, double targalt)
Definition: ShipAICmd.cpp:1469
virtual void OnDeleted(const Body *body)
Definition: ShipAICmd.h:157
virtual void PostLoadFixup(Space *space)
Definition: ShipAICmd.cpp:1387
virtual bool TimeStepUpdate()
Definition: ShipAICmd.cpp:1482
virtual void SaveToJson(Json &jsonObj)
Definition: ShipAICmd.cpp:1455
virtual void GetStatusText(char *str)
Definition: ShipAICmd.cpp:1378
void Setup(Body *obstructor, double alt, double vel, int mode)
Definition: ShipAICmd.cpp:1396
AICmdFlyAround(DynamicBody *dBody, Body *obstructor, double relalt, int mode=2)
Definition: ShipAICmd.cpp:1420
void SetTargPos(const vector3d &targpos)
Definition: ShipAICmd.h:162
Definition: ShipAICmd.h:119
virtual void GetStatusText(char *str)
Definition: ShipAICmd.cpp:844
virtual void SaveToJson(Json &jsonObj)
Definition: ShipAICmd.cpp:929
virtual void OnDeleted(const Body *body)
Definition: ShipAICmd.cpp:838
AICmdFlyTo(DynamicBody *dBody, FrameId targframeId, const vector3d &posoff, double endvel, bool tangent)
Definition: ShipAICmd.cpp:898
virtual void PostLoadFixup(Space *space)
Definition: ShipAICmd.cpp:856
virtual bool TimeStepUpdate()
Definition: ShipAICmd.cpp:946
Definition: ShipAICmd.h:224
void GetStatusText(char *str)
Definition: ShipAICmd.cpp:1579
virtual void OnDeleted(const Body *body)
Definition: ShipAICmd.cpp:1573
AICmdFormation(DynamicBody *dBody, DynamicBody *target, const vector3d &posoff)
Definition: ShipAICmd.cpp:1588
virtual void PostLoadFixup(Space *space)
Definition: ShipAICmd.cpp:1620
virtual void SaveToJson(Json &jsonObj)
Definition: ShipAICmd.cpp:1608
virtual bool TimeStepUpdate()
Definition: ShipAICmd.cpp:1629
Definition: ShipAICmd.h:217
AICmdHoldPosition(DynamicBody *dBody)
Definition: ShipAICmd.cpp:1356
virtual bool TimeStepUpdate()
Definition: ShipAICmd.cpp:1371
Definition: ShipAICmd.h:201
virtual void PostLoadFixup(Space *space)
Definition: ShipAICmd.cpp:255
virtual void OnDeleted(const Body *body)
Definition: ShipAICmd.cpp:225
AICmdKamikaze(DynamicBody *dBody, Body *target)
Definition: ShipAICmd.cpp:231
virtual bool TimeStepUpdate()
Definition: ShipAICmd.cpp:264
virtual void SaveToJson(Json &jsonObj)
Definition: ShipAICmd.cpp:246
Definition: ShipAICmd.h:180
virtual bool TimeStepUpdate()
Definition: ShipAICmd.cpp:366
void PostLoadFixup(Space *space)
Definition: ShipAICmd.cpp:353
virtual void SaveToJson(Json &jsonObj)
Definition: ShipAICmd.cpp:339
AICmdKill(DynamicBody *dBody, Ship *target)
Definition: ShipAICmd.cpp:321
~AICmdKill()
Definition: ShipAICmd.cpp:348
virtual void OnDeleted(const Body *body)
Definition: ShipAICmd.cpp:315
Definition: ShipAICmd.h:19
std::unique_ptr< AICommand > m_child
Definition: ShipAICmd.h:70
virtual void GetStatusText(char *str)
Definition: ShipAICmd.h:43
DynamicBody * m_dBody
Definition: ShipAICmd.h:66
virtual void PostLoadFixup(Space *space)
Definition: ShipAICmd.cpp:75
static AICommand * LoadFromJson(const Json &jsonObj)
Definition: ShipAICmd.cpp:18
RefCountedPtr< FixedGuns > m_fguns
Definition: ShipAICmd.h:68
virtual void OnDeleted(const Body *body)
Definition: ShipAICmd.h:58
int m_dBodyIndex
Definition: ShipAICmd.h:74
bool ProcessChild()
Definition: ShipAICmd.cpp:82
CmdName m_cmdName
Definition: ShipAICmd.h:72
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:71
virtual ~AICommand()
Definition: ShipAICmd.h:39
RefCountedPtr< Propulsion > m_prop
Definition: ShipAICmd.h:67
virtual void SaveToJson(Json &jsonObj)
Definition: ShipAICmd.cpp:43
virtual bool TimeStepUpdate()=0
CmdName GetType() const
Definition: ShipAICmd.h:63
Definition: Body.h:54
Definition: DynamicBody.h:15
AIError AIMessage(AIError msg=AIERROR_NONE)
Definition: DynamicBody.h:73
@ AIERROR_NONE
Definition: DynamicBody.h:67
Definition: Ship.h:64
Definition: SpaceStation.h:30
Definition: Space.h:19
Definition: FrameId.h:9