Pioneer
SpaceStation.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 _SPACESTATION_H
5 #define _SPACESTATION_H
6 
7 #include "ModelBody.h"
8 #include "Quaternion.h"
9 #include "SpaceStationType.h"
10 
11 #define MAX_DOCKING_PORTS 240 //256-(0x10), 0x10 is used because the collision surfaces use it as an identifying flag
12 
13 class Body;
14 class Camera;
15 class CityOnPlanet;
16 class Frame;
17 class NavLights;
18 class Ship;
19 class Space;
20 class SystemBody;
21 
22 namespace Graphics {
23  class Renderer;
24 }
25 
26 namespace SceneGraph {
27  class Animation;
28 }
29 
30 class SpaceStation : public ModelBody {
31 public:
33  static void Init();
34 
35  enum class DockingRefusedReason { // <enum scope='SpaceStation::DockingRefusedReason' name='DockingRefusedReason' public>
39  };
40 
41  SpaceStation() = delete;
42  // Should point to SystemBody in Pi::currentSystem
43  SpaceStation(const SystemBody *);
44  SpaceStation(const Json &jsonObj, Space *space);
45 
46  virtual ~SpaceStation();
47  virtual vector3d GetAngVelocity() const override { return vector3d(0, m_type->AngVel(), 0); }
48  virtual bool OnCollision(Body *b, Uint32 flags, double relVel) override;
49  bool DoShipDamage(Ship *s, Uint32 flags, double relVel);
50  virtual void Render(Graphics::Renderer *r, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) override;
51  virtual void StaticUpdate(const float timeStep) override;
52  virtual void TimeStepUpdate(const float timeStep) override;
53 
54  virtual const SystemBody *GetSystemBody() const override { return m_sbody; }
55  virtual void PostLoadFixup(Space *space) override;
56  virtual void NotifyRemoved(const Body *const removedBody) override;
57 
58  virtual void SetLabel(const std::string &label) override;
59 
60  // should call Ship::Undock and Ship::SetDockedWith instead
61  // Returns true on success, false if permission denied
62  bool LaunchShip(Ship *ship, const int port);
63  void SetDocked(Ship *ship, const int port);
64  void SwapDockedShipsPort(const int oldPort, const int newPort);
65 
66  int GetNearbyTraffic(double radius);
67 
68  bool GetDockingClearance(Ship *s);
69  int GetDockingPortCount() const { return m_type->NumDockingPorts(); }
70  int GetFreeDockingPort(const Ship *s) const; // returns -1 if none free
71  int GetMyDockingPort(const Ship *s) const;
72  int NumShipsDocked() const;
73 
74  const SpaceStationType *GetStationType() const { return m_type; }
75  bool IsGroundStation() const;
76 
77  bool AllocateStaticSlot(int &slot);
78 
79  // use docking bay position, if player has been granted permission
80  vector3d GetTargetIndicatorPosition() const override;
81 
82  // need this now because stations rotate in their frame
83  virtual void UpdateInterpTransform(double alpha) override;
84 
85 protected:
86  virtual void SaveToJson(Json &jsonObj, Space *space) override;
87 
88 private:
89  void DockingUpdate(const double timeStep);
90  void PositionDockingShip(Ship *ship, int port) const;
91  void PositionDockedShip(Ship *ship, int port) const;
92  bool LevelShip(Ship *ship, int port, const float timeStep) const;
93  void DoLawAndOrder(const double timeStep);
94  bool IsPortLocked(const int bay) const;
95  void LockPort(const int bay, const bool lockIt);
96 
97  /* Stage 0 means docking port empty
98  * Stage 1 means docking clearance granted to ->ship
99  * Stage 2 to m_type->numDockingStages is docking animation
100  * Stage m_type->numDockingStages+1 means evaluating repos
101  * Stage m_type->numDockingStages+2 means ship is repositioning
102  * Stage m_type->numDockingStages+3 means ship is just docked
103  * Stage m_type->numDockingStages+4 means ship is docked
104  * Stage -1 to -m_type->numUndockStages is undocking animation
105  */
106  struct shipDocking_t {
107  shipDocking_t() :
108  ship(0),
109  shipIndex(0),
110  stage(0),
111  stagePos(0),
112  fromPos(0.0),
113  fromRot(1.0, 0.0, 0.0, 0.0),
114  maxOffset(0)
115  {}
116 
117  Ship *ship;
118  int shipIndex; // deserialisation
119  int stage;
120  double stagePos; // 0 -> 1.0
121  vector3d fromPos; // in station model coords
122  Quaterniond fromRot;
123  double maxOffset;
124  };
125  typedef std::vector<shipDocking_t>::const_iterator constShipDockingIter;
126  typedef std::vector<shipDocking_t>::iterator shipDockingIter;
127  std::vector<shipDocking_t> m_shipDocking;
128 
129  SpaceStationType::TPorts m_ports;
130 
131  double m_oldAngDisplacement;
132 
133  void InitStation();
134  const SpaceStationType *m_type;
135  const SystemBody *m_sbody;
136  CityOnPlanet *m_adjacentCity;
137  enum { NUM_STATIC_SLOTS = 4 };
138  bool m_staticSlot[NUM_STATIC_SLOTS];
139 
140  SceneGraph::Animation *m_doorAnimation;
141  double m_doorAnimationStep;
142  double m_doorAnimationState;
143 
144  std::unique_ptr<NavLights> m_navLights;
145 };
146 
147 #endif /* _SPACESTATION_H */
nlohmann::json Json
Definition: Json.h:8
Definition: Body.h:57
Definition: Camera.h:80
Definition: CityOnPlanet.h:36
Definition: Frame.h:28
Definition: Renderer.h:44
Definition: ModelBody.h:25
Definition: NavLights.h:21
Definition: Animation.h:19
Definition: Ship.h:64
Definition: SpaceStationType.h:16
std::vector< SPort > TPorts
Definition: SpaceStationType.h:39
float AngVel() const
Definition: SpaceStationType.h:87
unsigned int NumDockingPorts() const
Definition: SpaceStationType.h:90
Definition: SpaceStation.h:30
SpaceStation()=delete
bool AllocateStaticSlot(int &slot)
Definition: SpaceStation.cpp:785
virtual void Render(Graphics::Renderer *r, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) override
Definition: SpaceStation.cpp:739
virtual const SystemBody * GetSystemBody() const override
Definition: SpaceStation.h:54
virtual vector3d GetAngVelocity() const override
Definition: SpaceStation.h:47
OBJDEF(SpaceStation, ModelBody, SPACESTATION)
virtual void SaveToJson(Json &jsonObj, Space *space) override
Definition: SpaceStation.cpp:101
int NumShipsDocked() const
Definition: SpaceStation.cpp:242
bool LaunchShip(Ship *ship, const int port)
Definition: SpaceStation.cpp:299
virtual void PostLoadFixup(Space *space) override
Definition: SpaceStation.cpp:144
bool GetDockingClearance(Ship *s)
Definition: SpaceStation.cpp:334
bool DoShipDamage(Ship *s, Uint32 flags, double relVel)
Definition: SpaceStation.cpp:453
virtual void StaticUpdate(const float timeStep) override
Definition: SpaceStation.cpp:669
virtual void NotifyRemoved(const Body *const removedBody) override
Definition: SpaceStation.cpp:225
virtual void SetLabel(const std::string &label) override
Definition: SpaceStation.cpp:775
int GetDockingPortCount() const
Definition: SpaceStation.h:69
vector3d GetTargetIndicatorPosition() const override
Definition: SpaceStation.cpp:802
int GetMyDockingPort(const Ship *s) const
Definition: SpaceStation.cpp:234
int GetFreeDockingPort(const Ship *s) const
Definition: SpaceStation.cpp:252
void SetDocked(Ship *ship, const int port)
Definition: SpaceStation.cpp:272
static void Init()
Definition: SpaceStation.cpp:96
void SwapDockedShipsPort(const int oldPort, const int newPort)
Definition: SpaceStation.cpp:285
int GetNearbyTraffic(double radius)
Definition: SpaceStation.cpp:323
virtual ~SpaceStation()
Definition: SpaceStation.cpp:220
virtual bool OnCollision(Body *b, Uint32 flags, double relVel) override
Definition: SpaceStation.cpp:383
bool IsGroundStation() const
Definition: SpaceStation.cpp:727
DockingRefusedReason
Definition: SpaceStation.h:35
const SpaceStationType * GetStationType() const
Definition: SpaceStation.h:74
virtual void TimeStepUpdate(const float timeStep) override
Definition: SpaceStation.cpp:675
virtual void UpdateInterpTransform(double alpha) override
Definition: SpaceStation.cpp:716
Definition: Space.h:19
Definition: SystemBody.h:19
Definition: Background.h:14
Definition: CityOnPlanet.h:31
vector3< double > vector3d
Definition: vector3.h:290