summaryrefslogtreecommitdiff
path: root/src/vehicles/Ferry.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vehicles/Ferry.h')
-rw-r--r--src/vehicles/Ferry.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/vehicles/Ferry.h b/src/vehicles/Ferry.h
new file mode 100644
index 00000000..f7936da9
--- /dev/null
+++ b/src/vehicles/Ferry.h
@@ -0,0 +1,143 @@
+#pragma once
+
+#include "Vehicle.h"
+#include "Door.h"
+
+enum eFerryNodes
+{
+ FERRY_DOOR_FRONT = 1,
+ FERRY_RAMP_FRONT,
+ FERRY_DOOR_BACK,
+ FERRY_RAMP_BACK,
+ NUM_FERRY_NODES
+};
+
+enum {
+ NUM_FERRY_STATIONS = 2,
+ NUM_FERRIES = NUM_FERRY_PATHS * 2,
+ NUM_WAKE_POINTS = 64
+};
+
+enum {
+ FERRY_STOPPED = 0,
+ FERRY_CRUISING,
+ FERRY_SLOWING,
+ FERRY_ACCELERATING
+};
+
+enum
+{
+ FERRY_DOOR_CLOSED = 0,
+ FERRY_DOOR_OPENING,
+ FERRY_DOOR_OPEN,
+ FERRY_DOOR_CLOSING
+};
+
+struct CFerryNode
+{
+ float x;
+ float y;
+ float z;
+ float t;
+};
+
+struct CFerryInterpolationLine
+{
+ uint8 type;
+ float time; // when does this keyframe start
+ // initial values at start of frame
+ float position;
+ float speed;
+ float acceleration;
+};
+
+struct CFerryPath
+{
+ float TotalLengthOfTrack;
+ float TotalDurationOfTrack;
+ int16 NumTrackNodes;
+ CFerryNode* aTrackNodes;
+ CFerryInterpolationLine* aLineBits;
+};
+
+class CFerry;
+
+class CFerryInst
+{
+public:
+ CFerryPath* pPathData[NUM_FERRY_PATHS];
+ float m_afPositions[NUM_FERRIES];
+ float m_afSpeeds[NUM_FERRIES];
+ CFerry* m_apFerries[NUM_FERRIES];
+ bool m_bFerriesDisabled;
+ uint16 m_anNumWakePoints[NUM_FERRIES];
+ CVector2D m_avWakePoints[NUM_FERRIES][NUM_WAKE_POINTS];
+ float m_afWakePointTimer[NUM_FERRIES][NUM_WAKE_POINTS];
+};
+
+class CFerry : public CVehicle
+{
+public:
+ int16 m_nFerryId;
+ uint16 m_isFarAway;
+ uint16 m_nCurTrackNode;
+ float m_fSpeed;
+ bool m_bFerryDocked;
+ uint32 m_nDoorTimer;
+ uint32 m_nTimeLeftStation;
+ int16 m_nDoorState;
+ bool m_bApproachingDock;
+ uint8 m_nSkipFerryStatus;
+ uint32 m_nTimeAlongPath;
+ bool m_bUseFrontDoor;
+ CVector m_vecForwardSpeed;
+ CColModel* m_pDefaultColModel;
+ uint8 m_nCollision;
+ CDoor m_doors[4];
+ RwFrame* m_aFerryNodes[NUM_FERRY_NODES];
+ bool m_bAlreadyRendered;
+ bool m_bPlayerArrivedHorn;
+
+ static CFerryInst* mspInst;
+
+ enum eSpaceUse {
+ FERRY_SPACE_PED = 0,
+ FERRY_SPACE_CAR
+ };
+ enum eSpaceStyle {
+ FERRY_SPACE_STYLE_0 = 0,
+ FERRY_SPACE_STYLE_1
+ };
+ void Render(void);
+ static void EnableFerryPath(int);
+ CFerry(int32, uint8);
+ void SetModelIndex(uint32);
+ static void InitFerrys(void);
+ static void Init(void*);
+ void ProcessControl(void);
+ void PlayArrivedHorn(void);
+ void AddWakePoint(CVector);
+ void PruneWakeTrail(void);
+ void SkipFerryToNextDock(void);
+ static void DissableFerryPath(int);
+ void CompleteDorrMovement(void);
+ bool IsDoorOpen(void);
+ void CloseDoor(void);
+ bool IsDocked(void);
+ static CFerry* GetClosestFerry(float, float);
+ CVector GetBoardingSpace(CFerry::eSpaceUse, CFerry::eSpaceStyle, uint8);
+ CVector GetNearestDoor(CVector);
+ void OpenFerryDoor(float);
+ void FerryHitStuff(CPtrList&);
+ static void RenderAllRemaning(void);
+ static void UpdateFerrys(void);
+ static void SwitchFerryCollision(int);
+ void SetupForMultiplayer(void);
+ void Write(base::cRelocatableChunkWriter&);
+ virtual void OpenDoor(void);
+ void PreRender(void);
+ virtual bool IsDoorClosed(void);
+
+ static CFerry* GetFerry(int i) { return mspInst ? mspInst->m_apFerries[i] : nil; }
+ static void SetFerriesDisabled(bool disabled) { mspInst->m_bFerriesDisabled = disabled; }
+};