Pioneer
Loading...
Searching...
No Matches
SpaceStation.h
Go to the documentation of this file.
1// Copyright © 2008-2024 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
13class Body;
14class Camera;
15class CityOnPlanet;
16class Frame;
17class NavLights;
18class Ship;
19class Space;
20class SystemBody;
21
22namespace Graphics {
23 class Renderer;
24}
25
26namespace SceneGraph {
27 class Animation;
28}
29
30class SpaceStation : public ModelBody {
31public:
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
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
85protected:
86 virtual void SaveToJson(Json &jsonObj, Space *space) override;
87
88private:
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);
93 void DoLawAndOrder(const double timeStep);
94 bool IsPortLocked(const int bay) const;
95 void LockPort(const int bay, const bool lockIt);
96 double GetDockAnimStageDuration(const int bay, const DockStage stage) const;
97 double GetUndockAnimStageDuration(const int bay, const DockStage stage) const;
98
99 struct shipDocking_t {
100 shipDocking_t() :
101 ship(0),
102 shipIndex(0),
103 stage(DockStage::NONE),
104 stagePos(0),
105 fromPos(0.0),
106 fromRot(1.0, 0.0, 0.0, 0.0),
107 maxOffset(0)
108 {}
109
110 Ship *ship;
111 int shipIndex; // deserialisation
112 DockStage stage;
113 double stagePos; // 0 -> 1.0
114 vector3d fromPos; // in station model coords
115 Quaterniond fromRot;
116 double maxOffset;
117 };
118 typedef std::vector<shipDocking_t>::const_iterator constShipDockingIter;
119 typedef std::vector<shipDocking_t>::iterator shipDockingIter;
120 std::vector<shipDocking_t> m_shipDocking;
121
123
124 double m_oldAngDisplacement;
125
126 void SwitchToStage(Uint32 bay, DockStage stage);
127 matrix4x4d GetBayTransform(Uint32 bay) const;
128
129 void InitStation();
130 const SpaceStationType *m_type;
131 const SystemBody *m_sbody;
132 CityOnPlanet *m_adjacentCity;
133 enum { NUM_STATIC_SLOTS = 4 };
134 bool m_staticSlot[NUM_STATIC_SLOTS];
135
136 SceneGraph::Animation *m_doorAnimation;
137 double m_doorAnimationStep;
138 double m_doorAnimationState;
139
140 std::unique_ptr<NavLights> m_navLights;
141};
142
143#endif /* _SPACESTATION_H */
nlohmann::json Json
Definition: Json.h:8
DockStage
Definition: SpaceStationType.h:22
@ NONE
Definition: WorldView.h:25
Definition: Body.h:65
Definition: Camera.h:85
Definition: CityOnPlanet.h:37
Definition: Frame.h:28
Definition: Renderer.h:45
Definition: ModelBody.h:26
Definition: NavLights.h:21
Definition: Animation.h:19
Definition: Ship.h:64
Definition: SpaceStationType.h:68
std::vector< SPort > TPorts
Definition: SpaceStationType.h:91
float AngVel() const
Definition: SpaceStationType.h:152
unsigned int NumDockingPorts() const
Definition: SpaceStationType.h:155
Definition: SpaceStation.h:30
SpaceStation()=delete
bool AllocateStaticSlot(int &slot)
Definition: SpaceStation.cpp:822
virtual void Render(Graphics::Renderer *r, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) override
Definition: SpaceStation.cpp:781
virtual vector3d GetAngVelocity() const override
Definition: SpaceStation.h:47
OBJDEF(SpaceStation, ModelBody, SPACESTATION)
virtual void SaveToJson(Json &jsonObj, Space *space) override
Definition: SpaceStation.cpp:108
int NumShipsDocked() const
Definition: SpaceStation.cpp:263
bool LaunchShip(Ship *ship, const int port)
Definition: SpaceStation.cpp:320
virtual void PostLoadFixup(Space *space) override
Definition: SpaceStation.cpp:157
bool GetDockingClearance(Ship *s)
Definition: SpaceStation.cpp:363
bool DoShipDamage(Ship *s, Uint32 flags, double relVel)
Definition: SpaceStation.cpp:481
virtual void StaticUpdate(const float timeStep) override
Definition: SpaceStation.cpp:718
virtual void NotifyRemoved(const Body *const removedBody) override
Definition: SpaceStation.cpp:246
const SpaceStationType * GetStationType() const
Definition: SpaceStation.h:74
virtual const SystemBody * GetSystemBody() const override
Definition: SpaceStation.h:54
virtual void SetLabel(const std::string &label) override
Definition: SpaceStation.cpp:812
int GetDockingPortCount() const
Definition: SpaceStation.h:69
vector3d GetTargetIndicatorPosition() const override
Definition: SpaceStation.cpp:839
int GetMyDockingPort(const Ship *s) const
Definition: SpaceStation.cpp:255
int GetFreeDockingPort(const Ship *s) const
Definition: SpaceStation.cpp:273
void SetDocked(Ship *ship, const int port)
Definition: SpaceStation.cpp:293
static void Init()
Definition: SpaceStation.cpp:103
void SwapDockedShipsPort(const int oldPort, const int newPort)
Definition: SpaceStation.cpp:306
int GetNearbyTraffic(double radius)
Definition: SpaceStation.cpp:352
virtual ~SpaceStation()
Definition: SpaceStation.cpp:241
virtual bool OnCollision(Body *b, Uint32 flags, double relVel) override
Definition: SpaceStation.cpp:410
bool IsGroundStation() const
Definition: SpaceStation.cpp:773
DockingRefusedReason
Definition: SpaceStation.h:35
virtual void TimeStepUpdate(const float timeStep) override
Definition: SpaceStation.cpp:724
virtual void UpdateInterpTransform(double alpha) override
Definition: SpaceStation.cpp:762
Definition: Space.h:19
Definition: SystemBody.h:137
Definition: Background.h:14
Definition: CityOnPlanet.h:32
vector3< double > vector3d
Definition: vector3.h:329