Pioneer
Loading...
Searching...
No Matches
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
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) 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
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 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
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: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
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