87 lines
1.7 KiB
C++
87 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include "Vehicle.h"
|
|
#include "Door.h"
|
|
|
|
enum
|
|
{
|
|
TRACK_ELTRAIN,
|
|
TRACK_SUBWAY
|
|
};
|
|
|
|
enum
|
|
{
|
|
TRAIN_DOOR_CLOSED,
|
|
TRAIN_DOOR_OPENING,
|
|
TRAIN_DOOR_OPEN,
|
|
TRAIN_DOOR_CLOSING
|
|
};
|
|
|
|
enum eTrainNodes
|
|
{
|
|
TRAIN_DOOR_LHS = 1,
|
|
TRAIN_DOOR_RHS,
|
|
NUM_TRAIN_NODES
|
|
};
|
|
|
|
struct CTrainNode
|
|
{
|
|
CVector p; // position
|
|
float t; // xy-distance from start on track
|
|
};
|
|
|
|
struct CTrainInterpolationLine
|
|
{
|
|
uint8 type;
|
|
float time; // when does this keyframe start
|
|
// initial values at start of frame
|
|
float position;
|
|
float speed;
|
|
float acceleration;
|
|
};
|
|
|
|
class CTrain : public CVehicle
|
|
{
|
|
public:
|
|
// 0x288
|
|
float m_fWagonPosition;
|
|
int16 m_nWagonId;
|
|
int16 m_isFarAway; // don't update so often?
|
|
int16 m_nCurTrackNode;
|
|
int16 m_nWagonGroup;
|
|
float m_fSpeed;
|
|
bool m_bProcessDoor;
|
|
bool m_bTrainStopping;
|
|
bool m_bIsFirstWagon;
|
|
bool m_bIsLastWagon;
|
|
uint8 m_nTrackId; // or m_bUsesSubwayTracks?
|
|
uint32 m_nDoorTimer;
|
|
int16 m_nDoorState;
|
|
CTrainDoor Doors[2];
|
|
RwFrame *m_aTrainNodes[NUM_TRAIN_NODES];
|
|
|
|
// unused
|
|
static CVector aStationCoors[3];
|
|
static CVector aStationCoors_S[4];
|
|
|
|
CTrain(int32 id, uint8 CreatedBy);
|
|
|
|
// from CEntity
|
|
void SetModelIndex(uint32 id);
|
|
void ProcessControl(void);
|
|
void PreRender(void);
|
|
void Render(void);
|
|
|
|
void AddPassenger(CPed *ped);
|
|
void OpenTrainDoor(float ratio);
|
|
void TrainHitStuff(CPtrList &list);
|
|
|
|
static void InitTrains(void);
|
|
static void Shutdown(void);
|
|
static void ReadAndInterpretTrackFile(Const char *filename, CTrainNode **nodes, int16 *numNodes, int32 numStations, float *stationDists,
|
|
float *totalLength, float *totalDuration, CTrainInterpolationLine *interpLines, bool rightRail);
|
|
static void UpdateTrains(void);
|
|
};
|
|
|
|
VALIDATE_SIZE(CTrain, 0x2E4);
|