OpenTTD Source  20241124-master-g9399a92a4f
train.h
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #ifndef TRAIN_H
11 #define TRAIN_H
12 
13 #include "core/enum_type.hpp"
14 
15 #include "newgrf_engine.h"
16 #include "cargotype.h"
17 #include "rail.h"
18 #include "engine_base.h"
19 #include "rail_map.h"
20 #include "ground_vehicle.hpp"
21 
22 struct Train;
23 
26  VRF_REVERSING = 0,
29 
34 };
35 
37 enum TrainForceProceeding : uint8_t {
38  TFP_NONE = 0,
39  TFP_STUCK = 1,
40  TFP_SIGNAL = 2,
41 };
42 
45  CCF_LENGTH = 0x01,
46  CCF_CAPACITY = 0x02,
47 
48  CCF_TRACK = 0,
54 };
56 
58 
59 void CheckTrainsLengths();
60 
61 void FreeTrainTrackReservation(const Train *v);
62 bool TryPathReserve(Train *v, bool mark_as_stuck = false, bool first_tile_okay = false);
63 
64 int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, int *station_ahead, int *station_length);
65 
66 void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type);
67 
69 void NormalizeTrainVehInDepot(const Train *u);
70 
72 struct TrainCache {
73  /* Cached wagon override spritegroup */
74  const struct SpriteGroup *cached_override;
75 
76  /* cached values, recalculated on load and each time a vehicle is added to/removed from the consist. */
77  bool cached_tilt;
78  uint8_t user_def_data;
79 
82 
83  auto operator<=>(const TrainCache &) const = default;
84 };
85 
89 struct Train final : public GroundVehicle<Train, VEH_TRAIN> {
90  uint16_t flags;
91  uint16_t crash_anim_pos;
92  uint16_t wait_counter;
93 
94  TrainCache tcache;
95 
96  /* Link between the two ends of a multiheaded engine */
97  Train *other_multiheaded_part;
98 
99  RailTypes compatible_railtypes;
100  RailType railtype;
101 
102  TrackBits track;
103  TrainForceProceeding force_proceed;
104 
108  virtual ~Train() { this->PreDestructor(); }
109 
110  friend struct GroundVehicle<Train, VEH_TRAIN>; // GroundVehicle needs to use the acceleration functions defined at Train.
111 
112  void MarkDirty() override;
113  void UpdateDeltaXY() override;
114  ExpensesType GetExpenseType(bool income) const override { return income ? EXPENSES_TRAIN_REVENUE : EXPENSES_TRAIN_RUN; }
115  void PlayLeaveStationSound(bool force = false) const override;
116  bool IsPrimaryVehicle() const override { return this->IsFrontEngine(); }
117  void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override;
118  int GetDisplaySpeed() const override { return this->gcache.last_speed; }
119  int GetDisplayMaxSpeed() const override { return this->vcache.cached_max_speed; }
120  Money GetRunningCost() const override;
121  int GetCursorImageOffset() const;
122  int GetDisplayImageWidth(Point *offset = nullptr) const;
123  bool IsInDepot() const override { return this->track == TRACK_BIT_DEPOT; }
124  bool Tick() override;
125  void OnNewCalendarDay() override;
126  void OnNewEconomyDay() override;
127  uint Crash(bool flooded = false) override;
128  Trackdir GetVehicleTrackdir() const override;
129  TileIndex GetOrderStationLocation(StationID station) override;
130  ClosestDepot FindClosestDepot() override;
131 
132  void ReserveTrackUnderConsist() const;
133 
134  uint16_t GetCurveSpeedLimit() const;
135 
136  void ConsistChanged(ConsistChangeFlags allowed_changes);
137 
138  int UpdateSpeed();
139 
140  void UpdateAcceleration();
141 
142  int GetCurrentMaxSpeed() const override;
143 
148  inline Train *GetNextUnit() const
149  {
150  Train *v = this->GetNextVehicle();
151  if (v != nullptr && v->IsRearDualheaded()) v = v->GetNextVehicle();
152 
153  return v;
154  }
155 
160  inline Train *GetPrevUnit()
161  {
162  Train *v = this->GetPrevVehicle();
163  if (v != nullptr && v->IsRearDualheaded()) v = v->GetPrevVehicle();
164 
165  return v;
166  }
167 
173  {
174  /* For vehicles with odd lengths the part before the center will be one unit
175  * longer than the part after the center. This means we have to round up the
176  * length of the next vehicle but may not round the length of the current
177  * vehicle. */
178  return this->gcache.cached_veh_length / 2 + (this->Next() != nullptr ? this->Next()->gcache.cached_veh_length + 1 : 0) / 2;
179  }
180 
181 protected: // These functions should not be called outside acceleration code.
182 
187  inline uint16_t GetPower() const
188  {
189  /* Power is not added for articulated parts */
190  if (!this->IsArticulatedPart() && HasPowerOnRail(this->railtype, GetRailType(this->tile))) {
191  uint16_t power = GetVehicleProperty(this, PROP_TRAIN_POWER, RailVehInfo(this->engine_type)->power);
192  /* Halve power for multiheaded parts */
193  if (this->IsMultiheaded()) power /= 2;
194  return power;
195  }
196 
197  return 0;
198  }
199 
204  inline uint16_t GetPoweredPartPower(const Train *head) const
205  {
206  /* For powered wagons the engine defines the type of engine (i.e. railtype) */
207  if (HasBit(this->flags, VRF_POWEREDWAGON) && HasPowerOnRail(head->railtype, GetRailType(this->tile))) {
208  return RailVehInfo(this->gcache.first_engine)->pow_wag_power;
209  }
210 
211  return 0;
212  }
213 
218  inline uint16_t GetWeight() const
219  {
220  uint16_t weight = CargoSpec::Get(this->cargo_type)->WeightOfNUnitsInTrain(this->cargo.StoredCount());
221 
222  /* Vehicle weight is not added for articulated parts. */
223  if (!this->IsArticulatedPart()) {
224  weight += GetVehicleProperty(this, PROP_TRAIN_WEIGHT, RailVehInfo(this->engine_type)->weight);
225  }
226 
227  /* Powered wagons have extra weight added. */
228  if (HasBit(this->flags, VRF_POWEREDWAGON)) {
229  weight += RailVehInfo(this->gcache.first_engine)->pow_wag_weight;
230  }
231 
232  return weight;
233  }
234 
239  uint16_t GetMaxWeight() const override;
240 
245  inline uint8_t GetTractiveEffort() const
246  {
247  return GetVehicleProperty(this, PROP_TRAIN_TRACTIVE_EFFORT, RailVehInfo(this->engine_type)->tractive_effort);
248  }
249 
254  inline uint8_t GetAirDragArea() const
255  {
256  /* Air drag is higher in tunnels due to the limited cross-section. */
257  return (this->track == TRACK_BIT_WORMHOLE && this->vehstatus & VS_HIDDEN) ? 28 : 14;
258  }
259 
264  inline uint8_t GetAirDrag() const
265  {
266  return RailVehInfo(this->engine_type)->air_drag;
267  }
268 
274  {
275  return (this->vehstatus & VS_STOPPED) || HasBit(this->flags, VRF_REVERSING) || HasBit(this->flags, VRF_TRAIN_STUCK) ? AS_BRAKE : AS_ACCEL;
276  }
277 
282  inline uint16_t GetCurrentSpeed() const
283  {
284  return this->cur_speed;
285  }
286 
291  inline uint32_t GetRollingFriction() const
292  {
293  /* Rolling friction for steel on steel is between 0.1% and 0.2%.
294  * The friction coefficient increases with speed in a way that
295  * it doubles at 512 km/h, triples at 1024 km/h and so on. */
296  return 15 * (512 + this->GetCurrentSpeed()) / 512;
297  }
298 
303  inline int GetAccelerationType() const
304  {
305  return GetRailTypeInfo(this->railtype)->acceleration_type;
306  }
307 
312  inline uint32_t GetSlopeSteepness() const
313  {
315  }
316 
321  inline uint16_t GetMaxTrackSpeed() const
322  {
323  return GetRailTypeInfo(GetRailType(this->tile))->max_speed;
324  }
325 
330  inline int16_t GetCurveSpeedModifier() const
331  {
332  return GetVehicleProperty(this, PROP_TRAIN_CURVE_SPEED_MOD, RailVehInfo(this->engine_type)->curve_speed_mod, true);
333  }
334 
339  inline bool TileMayHaveSlopedTrack() const
340  {
341  /* Any track that isn't TRACK_BIT_X or TRACK_BIT_Y cannot be sloped. */
342  return this->track == TRACK_BIT_X || this->track == TRACK_BIT_Y;
343  }
344 
351  {
352  return false;
353  }
354 };
355 
356 #endif /* TRAIN_H */
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
uint8_t CargoID
Cargo slots to indicate a cargo type within a game.
Definition: cargo_type.h:22
Types/functions related to cargoes.
uint16_t max_speed
Maximum speed for vehicles travelling on this rail type.
Definition: rail.h:231
uint8_t acceleration_type
Acceleration type of this rail type.
Definition: rail.h:226
uint StoredCount() const
Returns sum of cargo on board the vehicle (ie not only reserved).
Definition: cargopacket.h:434
DECLARE_ENUM_AS_BIT_SET(GenderEthnicity) enum CompanyManagerFaceVariable
Bitgroups of the CompanyManagerFace variable.
Direction
Defines the 8 directions on the map.
ExpensesType
Types of expenses.
Definition: economy_type.h:172
@ EXPENSES_TRAIN_RUN
Running costs trains.
Definition: economy_type.h:175
@ EXPENSES_TRAIN_REVENUE
Revenue from trains.
Definition: economy_type.h:180
Base class for engines.
uint16_t EngineID
Unique identification number of an engine.
Definition: engine_type.h:21
Type (helpers) for enums.
Base class and functions for all vehicles that move through ground.
AccelStatus
What is the status of our acceleration?
@ AS_BRAKE
We want to stop.
@ AS_ACCEL
We want to go faster, if possible of course.
Functions for NewGRF engines.
@ PROP_TRAIN_CURVE_SPEED_MOD
Modifier to maximum speed in curves.
@ PROP_TRAIN_WEIGHT
Weight in t (if dualheaded: for each single vehicle)
@ PROP_TRAIN_TRACTIVE_EFFORT
Tractive effort coefficient in 1/256.
@ PROP_TRAIN_POWER
Power in hp (if dualheaded: sum of both vehicles)
Rail specific functions.
const RailTypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
Definition: rail.h:307
bool HasPowerOnRail(RailType enginetype, RailType tiletype)
Checks if an engine of the given RailType got power on a tile with a given RailType.
Definition: rail.h:335
Hides the direct accesses to the map array with map accessors.
RailType GetRailType(Tile t)
Gets the rail type of the given tile.
Definition: rail_map.h:115
RailTypes
Allow incrementing of Track variables.
Definition: rail_type.h:44
RailType
Enumeration for all possible railtypes.
Definition: rail_type.h:27
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:57
static CargoSpec * Get(size_t index)
Retrieve cargo details for the given cargo ID.
Definition: cargotype.h:134
Structure to return information about the closest depot location, and whether it could be found.
Definition: vehicle_base.h:230
VehicleSettings vehicle
options for vehicles
EngineID first_engine
Cached EngineID of the front vehicle. INVALID_ENGINE for the front vehicle itself.
uint16_t last_speed
The last speed we did display, so we only have to redraw when this changes.
uint8_t cached_veh_length
Length of this vehicle in units of 1/VEHICLE_LENGTH of normal length. It is cached because this can b...
Base class for all vehicles that move through ground.
GroundVehicleCache gcache
Cache of often calculated values.
bool IsRearDualheaded() const
Tell if we are dealing with the rear end of a multiheaded engine.
bool IsMultiheaded() const
Check if the vehicle is a multiheaded engine.
Coordinates of a point in 2D.
uint16_t pow_wag_power
Extra power applied to consist if wagon should be powered.
Definition: engine_type.h:56
uint8_t air_drag
Coefficient of air drag.
Definition: engine_type.h:61
uint8_t pow_wag_weight
Extra weight applied to consist if wagon should be powered.
Definition: engine_type.h:57
T * GetPrevVehicle() const
Get the previous real (non-articulated part) vehicle in the consist.
T * GetNextVehicle() const
Get the next real (non-articulated part) vehicle in the consist.
T * Next() const
Get next vehicle in the chain.
Variables that are cached to improve performance and such.
Definition: train.h:72
uint16_t cached_max_curve_speed
max consist speed limited by curves
Definition: train.h:81
int16_t cached_curve_speed_mod
curve speed modifier of the entire train
Definition: train.h:80
uint8_t user_def_data
Cached property 0x25. Can be set by Callback 0x36.
Definition: train.h:78
bool cached_tilt
train can tilt; feature provides a bonus in curves
Definition: train.h:77
'Train' is either a loco or a wagon.
Definition: train.h:89
void PlayLeaveStationSound(bool force=false) const override
Play a sound for a train leaving the station.
Definition: train_cmd.cpp:2182
Train * GetNextUnit() const
Get the next real (non-articulated part and non rear part of dualheaded engine) vehicle in the consis...
Definition: train.h:148
int GetAccelerationType() const
Allows to know the acceleration type of a vehicle.
Definition: train.h:303
bool IsInDepot() const override
Check whether the vehicle is in the depot.
Definition: train.h:123
void UpdateAcceleration()
Update acceleration of the train from the cached power and weight.
Definition: train_cmd.cpp:430
void OnNewCalendarDay() override
Calendar day handler.
Definition: train_cmd.cpp:4176
Trackdir GetVehicleTrackdir() const override
Get the tracks of the train vehicle.
Definition: train_cmd.cpp:4220
void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override
Get the sprite to display the train.
Definition: train_cmd.cpp:494
int GetDisplayMaxSpeed() const override
Gets the maximum speed in km-ish/h that can be sent into SetDParam for string processing.
Definition: train.h:119
uint16_t crash_anim_pos
Crash animation counter.
Definition: train.h:91
uint8_t GetTractiveEffort() const
Allows to know the tractive effort value that this vehicle will use.
Definition: train.h:245
bool Tick() override
Update train vehicle data for a tick.
Definition: train_cmd.cpp:4109
bool HasToUseGetSlopePixelZ()
Trains can always use the faster algorithm because they have always the same direction as the track u...
Definition: train.h:350
uint16_t GetCurrentSpeed() const
Calculates the current speed of this vehicle.
Definition: train.h:282
void ReserveTrackUnderConsist() const
Tries to reserve track under whole train consist.
Definition: train_cmd.cpp:3088
TileIndex GetOrderStationLocation(StationID station) override
Get the location of the next station to visit.
Definition: train_cmd.cpp:2951
uint16_t GetPoweredPartPower(const Train *head) const
Returns a value if this articulated part is powered.
Definition: train.h:204
uint32_t GetRollingFriction() const
Returns the rolling friction coefficient of this vehicle.
Definition: train.h:291
int GetDisplayImageWidth(Point *offset=nullptr) const
Get the width of a train vehicle image in the GUI.
Definition: train_cmd.cpp:460
ClosestDepot FindClosestDepot() override
Find the closest depot for this vehicle and tell us the location, DestinationID and whether we should...
Definition: train_cmd.cpp:2173
void UpdateDeltaXY() override
Updates the x and y offsets and the size of the sprite used for this vehicle.
Definition: train_cmd.cpp:1465
uint16_t GetMaxTrackSpeed() const
Gets the maximum speed allowed by the track for this vehicle.
Definition: train.h:321
int CalcNextVehicleOffset() const
Calculate the offset from this vehicle's center to the following center taking the vehicle lengths in...
Definition: train.h:172
Train * GetPrevUnit()
Get the previous real (non-articulated part and non rear part of dualheaded engine) vehicle in the co...
Definition: train.h:160
uint16_t GetMaxWeight() const override
Calculates the weight value that this vehicle will have when fully loaded with its current cargo.
Definition: train_cmd.cpp:4237
uint16_t GetCurveSpeedLimit() const
Computes train speed limit caused by curves.
Definition: train_cmd.cpp:307
uint8_t GetAirDrag() const
Gets the air drag coefficient of this vehicle.
Definition: train.h:264
bool IsPrimaryVehicle() const override
Whether this is the primary vehicle in the chain.
Definition: train.h:116
void MarkDirty() override
Goods at the consist have changed, update the graphics, cargo, and acceleration.
Definition: train_cmd.cpp:2966
int GetDisplaySpeed() const override
Gets the speed in km-ish/h that can be sent into SetDParam for string processing.
Definition: train.h:118
int UpdateSpeed()
This function looks at the vehicle and updates its speed (cur_speed and subspeed) variables.
Definition: train_cmd.cpp:2986
uint Crash(bool flooded=false) override
The train vehicle crashed! Update its status and other parts around it.
Definition: train_cmd.cpp:3110
Train()
We don't want GCC to zero our struct! It already is zeroed and has an index!
Definition: train.h:106
AccelStatus GetAccelerationStatus() const
Checks the current acceleration status of this vehicle.
Definition: train.h:273
virtual ~Train()
We want to 'destruct' the right class.
Definition: train.h:108
void OnNewEconomyDay() override
Economy day handler.
Definition: train_cmd.cpp:4182
int16_t GetCurveSpeedModifier() const
Returns the curve speed modifier of this vehicle.
Definition: train.h:330
bool TileMayHaveSlopedTrack() const
Checks if the vehicle is at a tile that can be sloped.
Definition: train.h:339
uint16_t GetWeight() const
Allows to know the weight value that this vehicle will use.
Definition: train.h:218
void ConsistChanged(ConsistChangeFlags allowed_changes)
Recalculates the cached stuff of a train.
Definition: train_cmd.cpp:110
Money GetRunningCost() const override
Get running cost for the train consist.
Definition: train_cmd.cpp:4084
uint8_t GetAirDragArea() const
Gets the area used for calculating air drag.
Definition: train.h:254
uint16_t GetPower() const
Allows to know the power value that this vehicle will use.
Definition: train.h:187
uint16_t wait_counter
Ticks waiting in front of a signal, ticks being stuck or a counter for forced proceeding through sign...
Definition: train.h:92
uint32_t GetSlopeSteepness() const
Returns the slope steepness used by this vehicle.
Definition: train.h:312
int GetCurrentMaxSpeed() const override
Calculates the maximum speed of the vehicle under its current conditions.
Definition: train_cmd.cpp:382
uint16_t cached_max_speed
Maximum speed of the consist (minimum of the max speed of all vehicles in the consist).
Definition: vehicle_base.h:126
uint8_t train_slope_steepness
Steepness of hills for trains when using realistic acceleration.
Sprite sequence for a vehicle part.
Definition: vehicle_base.h:135
EngineID engine_type
The type of engine used for this vehicle.
Definition: vehicle_base.h:323
Direction direction
facing
Definition: vehicle_base.h:307
VehicleCargoList cargo
The cargo this vehicle is carrying.
Definition: vehicle_base.h:341
bool IsArticulatedPart() const
Check if the vehicle is an articulated part of an engine.
Definition: vehicle_base.h:954
debug_inline bool IsFrontEngine() const
Check if the vehicle is a front engine.
Definition: vehicle_base.h:945
void PreDestructor()
Destroy all stuff that (still) needs the virtual functions to work properly.
Definition: vehicle.cpp:826
CargoID cargo_type
type of cargo this vehicle is carrying
Definition: vehicle_base.h:342
uint8_t vehstatus
Status.
Definition: vehicle_base.h:354
VehicleCache vcache
Cache of often used vehicle values.
Definition: vehicle_base.h:364
virtual ExpensesType GetExpenseType([[maybe_unused]] bool income) const
Sets the expense type associated to this vehicle type.
Definition: vehicle_base.h:466
uint16_t cur_speed
current speed
Definition: vehicle_base.h:328
TileIndex tile
Current tile index.
Definition: vehicle_base.h:264
TrackBits
Allow incrementing of Track variables.
Definition: track_type.h:35
@ TRACK_BIT_WORMHOLE
Bitflag for a wormhole (used for tunnels)
Definition: track_type.h:52
@ TRACK_BIT_DEPOT
Bitflag for a depot.
Definition: track_type.h:53
@ TRACK_BIT_Y
Y-axis track.
Definition: track_type.h:38
@ TRACK_BIT_X
X-axis track.
Definition: track_type.h:37
Trackdir
Enumeration for tracks and directions.
Definition: track_type.h:67
bool TryPathReserve(Train *v, bool mark_as_stuck=false, bool first_tile_okay=false)
Try to reserve a path to a safe position.
Definition: train_cmd.cpp:2866
VehicleRailFlags
Rail vehicle flags.
Definition: train.h:25
@ VRF_POWEREDWAGON
Wagon is powered.
Definition: train.h:27
@ VRF_LEAVING_STATION
Train is just leaving a station.
Definition: train.h:33
@ VRF_TOGGLE_REVERSE
Used for vehicle var 0xFE bit 8 (toggled each time the train is reversed, accurate for first vehicle ...
Definition: train.h:31
@ VRF_REVERSE_DIRECTION
Reverse the visible direction of the vehicle.
Definition: train.h:28
@ VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL
Electric train engine is allowed to run on normal rail. *‍/.
Definition: train.h:30
@ VRF_TRAIN_STUCK
Train can't get a path reservation.
Definition: train.h:32
void NormalizeTrainVehInDepot(const Train *u)
Move all free vehicles in the depot to the train.
Definition: train_cmd.cpp:693
uint8_t FreightWagonMult(CargoID cargo)
Return the cargo weight multiplier to use for a rail vehicle.
Definition: train_cmd.cpp:69
void FreeTrainTrackReservation(const Train *v)
Free the reserved path in front of a vehicle.
Definition: train_cmd.cpp:2386
ConsistChangeFlags
Flags for Train::ConsistChanged.
Definition: train.h:44
@ CCF_AUTOREFIT
Valid changes for autorefitting in stations.
Definition: train.h:50
@ CCF_CAPACITY
Allow vehicles to change capacity.
Definition: train.h:46
@ CCF_ARRANGE
Valid changes for arranging the consist in a depot.
Definition: train.h:52
@ CCF_LENGTH
Allow vehicles to change length.
Definition: train.h:45
@ CCF_REFIT
Valid changes for refitting in a depot.
Definition: train.h:51
@ CCF_TRACK
Valid changes while vehicle is driving, and possibly changing tracks.
Definition: train.h:48
@ CCF_LOADUNLOAD
Valid changes while vehicle is loading/unloading.
Definition: train.h:49
@ CCF_SAVELOAD
Valid changes when loading a savegame. (Everything that is not stored in the save....
Definition: train.h:53
void CheckTrainsLengths()
Checks if lengths of all rail vehicles are valid.
Definition: train_cmd.cpp:76
bool TrainOnCrossing(TileIndex tile)
Check if a level crossing tile has a train on it.
Definition: train_cmd.cpp:1683
int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, int *station_ahead, int *station_length)
Get the stop location of (the center) of the front vehicle of a train at a platform of a station.
Definition: train_cmd.cpp:263
TrainForceProceeding
Modes for ignoring signals.
Definition: train.h:37
@ TFP_SIGNAL
Ignore next signal, after the signal ignore being stuck.
Definition: train.h:40
@ TFP_NONE
Normal operation.
Definition: train.h:38
@ TFP_STUCK
Proceed till next signal, but ignore being stuck till then. This includes force leaving depots.
Definition: train.h:39
void GetTrainSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type)
Get the size of the sprite of a train sprite heading west, or both heads (used for lists).
Definition: train_cmd.cpp:581
@ VS_STOPPED
Vehicle is stopped by the player.
Definition: vehicle_base.h:34
@ VS_HIDDEN
Vehicle is not visible.
Definition: vehicle_base.h:33
EngineImageType
Visualisation contexts of vehicles and engines.
Definition: vehicle_type.h:78
@ VEH_TRAIN
Train vehicle type.
Definition: vehicle_type.h:24