OpenTTD Source: src/train_cmd.cpp File Reference

OpenTTD Source 15.0-beta1

Data Structures | Typedefs | Functions | Variables
train_cmd.cpp File Reference

Handling of trains. More...

`#include "stdafx.h"`
`#include "error.h"`
`#include "articulated_vehicles.h"`
`#include "command_func.h"`
`#include "error_func.h"`
`#include "pathfinder/yapf/yapf.hpp"`
`#include "news_func.h"`
`#include "company_func.h"`
`#include "newgrf_sound.h"`
`#include "newgrf_text.h"`
`#include "strings_func.h"`
`#include "viewport_func.h"`
`#include "vehicle_func.h"`
`#include "sound_func.h"`
`#include "ai/ai.hpp"`
`#include "game/game.hpp"`
`#include "newgrf_station.h"`
`#include "effectvehicle_func.h"`
`#include "network/network.h"`
`#include "spritecache.h"`
`#include "core/random_func.hpp"`
`#include "company_base.h"`
`#include "newgrf.h"`
`#include "order_backup.h"`
`#include "zoom_func.h"`
`#include "newgrf_debug.h"`
`#include "framerate_type.h"`
`#include "train_cmd.h"`
`#include "misc_cmd.h"`
`#include "timer/timer_game_calendar.h"`
`#include "timer/timer_game_economy.h"`
`#include "table/strings.h"`
`#include "table/train_sprites.h"`
`#include "safeguards.h"`

Go to the source code of this file.

## Data Structures
class | VehicleOrderSaver
| This class will save the current order of a vehicle and restore it on destruction. More...
struct | AccelerationSlowdownParams
| Data structure for storing engine speed changes of an acceleration type. More...
struct | TrainCollideChecker
| Temporary data storage for testing collisions. More...

## Typedefs
typedef std::vector< Train * > | TrainList
| Helper type for lists/vectors of trains.

## Functions
static Track | ChooseTrainTrack (Train *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool force_res, bool *got_reservation, bool mark_stuck)
static bool | TrainCheckIfLineEnds (Train *v, bool reverse)
| Checks for line end.
bool | TrainController (Train *v, Vehicle *nomove, bool reverse)
| Move a vehicle chain one movement stop forwards.
static TileIndex | TrainApproachingCrossingTile (const Train *v)
| Determines whether train is approaching a rail-road crossing (thus making it barred)
static void | CheckIfTrainNeedsService (Train *v)
| Check whether a train needs service, and if so, find a depot or service it.
static void | CheckNextTrainTile (Train *v)
| Check if the train is on the last reserved tile and try to extend the path then.
template<>
bool | IsValidImageIndex< VEH_TRAIN > (uint8_t image_index)
uint8_t | FreightWagonMult (CargoID cargo)
| Return the cargo weight multiplier to use for a rail vehicle.
void | CheckTrainsLengths ()
| Checks if lengths of all rail vehicles are valid.
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.
static SpriteID | GetDefaultTrainSprite (uint8_t spritenum, Direction direction)
static void | GetRailIcon (EngineID engine, bool rear_head, int &y, EngineImageType image_type, VehicleSpriteSeq *result)
void | DrawTrainEngine (int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type)
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).
static CommandCost | CmdBuildRailWagon (DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret)
| Build a railroad wagon.
void | NormalizeTrainVehInDepot (const Train *u)
| Move all free vehicles in the depot to the train.
static void | AddRearEngineToMultiheadedTrain (Train *v)
CommandCost | CmdBuildRailVehicle (DoCommandFlag flags, TileIndex tile, const Engine *e, Vehicle **ret)
| Build a railroad vehicle.
static Train * | FindGoodVehiclePos (const Train *src)
static void | MakeTrainBackup (TrainList &list, Train *t)
| Make a backup of a train into a train list.
static void | RestoreTrainBackup (TrainList &list)
| Restore the train from the backup list.
static void | RemoveFromConsist (Train *part, bool chain=false)
| Remove the given wagon from its consist.
static void | InsertInConsist (Train *dst, Train *chain)
| Inserts a chain into the train at dst.
static void | NormaliseDualHeads (Train *t)
| Normalise the dual heads in the train, i.e.
static void | NormaliseSubtypes (Train *chain)
| Normalise the sub types of the parts in this chain.
static CommandCost | CheckNewTrain (Train *original_dst, Train *dst, Train *original_src, Train *src)
| Check/validate whether we may actually build a new train.
static CommandCost | CheckTrainAttachment (Train *t)
| Check whether the train parts can be attached.
static CommandCost | ValidateTrains (Train *original_dst, Train *dst, Train *original_src, Train *src, bool check_limit)
| Validate whether we are going to create valid trains.
static void | ArrangeTrains (Train **dst_head, Train *dst, Train **src_head, Train *src, bool move_chain)
| Arrange the trains in the wanted way.
static void | NormaliseTrainHead (Train *head)
| Normalise the head of the train again, i.e.
CommandCost | CmdMoveRailVehicle (DoCommandFlag flags, VehicleID src_veh, VehicleID dest_veh, bool move_chain)
| Move a rail vehicle around inside the depot.
CommandCost | CmdSellRailWagon (DoCommandFlag flags, Vehicle *t, bool sell_chain, bool backup_order, ClientID user)
| Sell a (single) train wagon/engine.
static void | MarkTrainAsStuck (Train *v)
| Mark a train as stuck and stop it if it isn't stopped right now.
static void | SwapTrainFlags (uint16_t *swap_flag1, uint16_t *swap_flag2)
| Swap the two up/down flags in two ways:
static void | UpdateStatusAfterSwap (Train *v)
| Updates some variables after swapping the vehicle.
void | ReverseTrainSwapVeh (Train *v, int l, int r)
| Swap vehicles l and r in consist v, and reverse their direction.
static Vehicle * | TrainOnTileEnum (Vehicle *v, void *)
| Check if the vehicle is a train.
bool | TrainOnCrossing (TileIndex tile)
| Check if a level crossing tile has a train on it.
static Vehicle * | TrainApproachingCrossingEnum (Vehicle *v, void *data)
| Checks if a train is approaching a rail-road crossing.
static bool | TrainApproachingCrossing (TileIndex tile)
| Finds a vehicle approaching rail-road crossing.
static bool | CheckLevelCrossing (TileIndex tile)
| Check if a level crossing should be barred.
static void | UpdateLevelCrossingTile (TileIndex tile, bool sound, bool force_barred)
| Sets a level crossing tile to the correct state.
void | UpdateLevelCrossing (TileIndex tile, bool sound, bool force_bar)
| Update a level crossing to barred or open (crossing may include multiple adjacent tiles).
void | MarkDirtyAdjacentLevelCrossingTiles (TileIndex tile, Axis road_axis)
| Find adjacent level crossing tiles in this multi-track crossing and mark them dirty.
void | UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval (TileIndex tile, Axis road_axis)
| Update adjacent level crossing tiles in this multi-track crossing, due to removal of a level crossing tile.
static void | MaybeBarCrossingWithSound (TileIndex tile)
| Bars crossing and plays ding-ding sound if not barred already.
static void | AdvanceWagonsBeforeSwap (Train *v)
| Advances wagons for train reversing, needed for variable length wagons.
static void | AdvanceWagonsAfterSwap (Train *v)
| Advances wagons for train reversing, needed for variable length wagons.
static bool | IsWholeTrainInsideDepot (const Train *v)
void | ReverseTrainDirection (Train *v)
| Turn a train around.
CommandCost | CmdReverseTrainDirection (DoCommandFlag flags, VehicleID veh_id, bool reverse_single_veh)
| Reverse train.
CommandCost | CmdForceTrainProceed (DoCommandFlag flags, VehicleID veh_id)
| Force a train through a red signal.
static FindDepotData | FindClosestTrainDepot (Train *v, int max_distance)
| Try to find a depot nearby.
static bool | CheckTrainStayInDepot (Train *v)
| Will the train stay in the depot the next tick?
static void | ClearPathReservation (const Train *v, TileIndex tile, Trackdir track_dir)
| Clear the reservation of tile that was just left by a wagon on track_dir.
void | FreeTrainTrackReservation (const Train *v)
| Free the reserved path in front of a vehicle.
static Track | DoTrainPathfind (const Train *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found, bool do_track_reservation, PBSTileInfo *dest, TileIndex *final_dest)
| Perform pathfinding for a train.
static PBSTileInfo | ExtendTrainReservation (const Train *v, TrackBits *new_tracks, DiagDirection *enterdir)
| Extend a train path as far as possible.
static bool | TryReserveSafeTrack (const Train *v, TileIndex tile, Trackdir td, bool override_railtype)
| Try to reserve any path to a safe tile, ignoring the vehicle's destination.
bool | TryPathReserve (Train *v, bool mark_as_stuck, bool first_tile_okay)
| Try to reserve a path to a safe position.
static bool | CheckReverseTrain (const Train *v)
static void | TrainEnterStation (Train *v, StationID station)
| Trains enters a station, send out a news item if it is the first train, and start loading.
static bool | CheckCompatibleRail (const Train *v, TileIndex tile)
static void | AffectSpeedByZChange (Train *v, int old_z)
| Modify the speed of the vehicle due to a change in altitude.
static bool | TrainMovedChangeSignals (TileIndex tile, DiagDirection dir)
static uint | TrainCrashed (Train *v)
| Marks train as crashed and creates an AI event.
static Vehicle * | FindTrainCollideEnum (Vehicle *v, void *data)
| Collision test function.
static bool | CheckTrainCollision (Train *v)
| Checks whether the specified train has a collision with another vehicle.
static Vehicle * | CheckTrainAtSignal (Vehicle *v, void *data)
static Vehicle * | CollectTrackbitsFromCrashedVehiclesEnum (Vehicle *v, void *data)
| Collect trackbits of all crashed train vehicles on a tile.
static bool | IsRailStationPlatformOccupied (TileIndex tile)
static void | DeleteLastWagon (Train *v)
| Deletes/Clears the last wagon of a crashed train.
static void | ChangeTrainDirRandomly (Train *v)
| Rotate all vehicles of a (crashed) train chain randomly to animate the crash.
static bool | HandleCrashedTrain (Train *v)
| Handle a crashed train.
static bool | TrainApproachingLineEnd (Train *v, bool signal, bool reverse)
| Train is approaching line end, slow down and possibly reverse.
static bool | TrainCanLeaveTile (const Train *v)
| Determines whether train would like to leave the tile.
static bool | TrainLocoHandler (Train *v, bool mode)

## Variables
static const uint8_t | _vehicle_initial_x_fract [4] = {10, 8, 4, 8}
static const uint8_t | _vehicle_initial_y_fract [4] = { 8, 4, 8, 10}
static const uint8_t | _initial_tile_subcoord [6][4][3]
static const AccelerationSlowdownParams | _accel_slowdown []
| Speed update fractions for each acceleration type.
static const uint16_t | _breakdown_speeds [16]
| Maximum speeds for train that is broken down or approaching line end.

## Detailed Description

Handling of trains.

Definition in file train_cmd.cpp.

## Typedef Documentation

## ◆ TrainList

typedef std::vector<Train *> TrainList

Helper type for lists/vectors of trains.

Definition at line 845 of file train_cmd.cpp.

## Function Documentation

## ◆ AddRearEngineToMultiheadedTrain()

static void AddRearEngineToMultiheadedTrain | ( | Train * | v | ) |
| static

Definition at line 706 of file train_cmd.cpp.

## ◆ AdvanceWagonsAfterSwap()

static void AdvanceWagonsAfterSwap | ( | Train * | v | ) |
| static

Advances wagons for train reversing, needed for variable length wagons.

This one is called after the train is reversed.

Parameters

  v | First vehicle in chain

Definition at line 1902 of file train_cmd.cpp.

References Train::CalcNextVehicleOffset(), GetRailDepotTrack(), SpecializedVehicle< T, Type >::Last(), SpecializedVehicle< T, Type >::Next(), SpecializedVehicle< T, Type >::Previous(), TicksToLeaveDepot(), Vehicle::tile, TRACK_BIT_DEPOT, TrackToTrackBits(), TrainController(), and Vehicle::vehstatus.

Referenced by ReverseTrainDirection().

## ◆ AdvanceWagonsBeforeSwap()

static void AdvanceWagonsBeforeSwap | ( | Train * | v | ) |
| static

Advances wagons for train reversing, needed for variable length wagons.

This one is called before the train is reversed.

Parameters

  v | First vehicle in chain

Definition at line 1874 of file train_cmd.cpp.

References Train::CalcNextVehicleOffset(), SpecializedVehicle< T, Type >::Last(), SpecializedVehicle< T, Type >::Next(), SpecializedVehicle< T, Type >::Previous(), and TrainController().

Referenced by ReverseTrainDirection().

## ◆ AffectSpeedByZChange()

static void AffectSpeedByZChange | ( | Train * | v,
|  | int | old_z
| ) |  |
| inlinestatic

Modify the speed of the vehicle due to a change in altitude.

Parameters

  v | Train to update.
  old_z | Previous height.

Definition at line 3059 of file train_cmd.cpp.

References _accel_slowdown, _settings_game, RailTypeInfo::acceleration_type, Vehicle::cur_speed, GetRailTypeInfo(), VehicleSettings::train_acceleration_model, GameSettings::vehicle, AccelerationSlowdownParams::z_down, Vehicle::z_pos, and AccelerationSlowdownParams::z_up.

Referenced by TrainController().

## ◆ ArrangeTrains()

static void ArrangeTrains | ( | Train ** | dst_head,
|  | Train * | dst,
|  | Train ** | src_head,
|  | Train * | src,
|  | bool | move_chain
| ) |  |
| static

Arrange the trains in the wanted way.

Parameters

  dst_head | The destination chain of the to be moved vehicle.
  dst | The destination for the to be moved vehicle.
  src_head | The source chain of the to be moved vehicle.
  src | The to be moved vehicle.
  move_chain | Whether to move all vehicles after src or not.

Definition at line 1122 of file train_cmd.cpp.

References Train::GetNextUnit(), SpecializedVehicle< T, Type >::GetNextVehicle(), InsertInConsist(), GroundVehicle< T, Type >::IsMultiheaded(), NormaliseDualHeads(), and RemoveFromConsist().

Referenced by CmdMoveRailVehicle(), and CmdSellRailWagon().

## ◆ ChangeTrainDirRandomly()

static void ChangeTrainDirRandomly | ( | Train * | v | ) |
| static

Rotate all vehicles of a (crashed) train chain randomly to animate the crash.

Parameters

  v | First crashed vehicle.

Definition at line 3707 of file train_cmd.cpp.

References ChangeDir(), DIRDIFF_45LEFT, DIRDIFF_45RIGHT, DIRDIFF_SAME, Vehicle::direction, GB(), SpecializedVehicle< T, Type >::Next(), TRACK_BIT_WORMHOLE, GroundVehicle< T, Type >::UpdateInclination(), Vehicle::UpdatePosition(), SpecializedVehicle< T, Type >::UpdateViewport(), Vehicle::vehstatus, and VS_HIDDEN.

Referenced by HandleCrashedTrain().

## ◆ CheckCompatibleRail()

static bool CheckCompatibleRail | ( | const Train * | v,
|  | TileIndex | tile
| ) |  |
| inlinestatic

Definition at line 3032 of file train_cmd.cpp.

## ◆ CheckIfTrainNeedsService()

static void CheckIfTrainNeedsService | ( | Train * | v | ) |
| static

Check whether a train needs service, and if so, find a depot or service it.

Returns
  v Train to check.

Definition at line 4138 of file train_cmd.cpp.

References _settings_game, FindDepotData::best_length, Chance16(), Vehicle::current_order, Vehicle::dest_tile, FindClosestTrainDepot(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), GetDepotIndex(), Order::GetDestination(), GroundVehicle< T, Type >::gv_flags, GVF_SUPPRESS_IMPLICIT_ORDERS, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, GroundVehicle< T, Type >::IsChainInDepot(), Order::IsType(), Order::MakeDummy(), Order::MakeGoToDepot(), YAPFSettings::maximum_go_to_depot_penalty, Vehicle::NeedsAutomaticServicing(), ODATFB_NEAREST_DEPOT, ODTFB_SERVICE, ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS, Vehicle::owner, GameSettings::pf, SetBit(), SetWindowWidgetDirty(), FindDepotData::tile, VehicleServiceInDepot(), WC_VEHICLE_VIEW, WID_VV_START_STOP, and PathfinderSettings::yapf.

Referenced by Train::OnNewEconomyDay().

## ◆ CheckLevelCrossing()

static bool CheckLevelCrossing | ( | TileIndex | tile | ) |
| inlinestatic

Check if a level crossing should be barred.

Parameters

  tile | The tile to check.

Returns
  True if the crossing should be barred, else false.

Definition at line 1738 of file train_cmd.cpp.

References HasCrossingReservation(), TrainApproachingCrossing(), and TrainOnCrossing().

Referenced by UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval(), UpdateLevelCrossing(), and UpdateLevelCrossingTile().

## ◆ CheckNewTrain()

static CommandCost CheckNewTrain | ( | Train * | original_dst,
|  | Train * | dst,
|  | Train * | original_src,
|  | Train * | src
| ) |  |
| static

Check/validate whether we may actually build a new train.

Note
  All vehicles are/were 'heads' of their chains.

Parameters

  original_dst | The original destination chain.
  dst | The destination chain after constructing the train.
  original_src | The original source chain.
  src | The source chain after constructing the train.

Returns
  possible error of this command.

Definition at line 969 of file train_cmd.cpp.

References _settings_game, GetFreeUnitNumber(), GroundVehicle< T, Type >::IsEngine(), VehicleSettings::max_trains, VEH_TRAIN, and GameSettings::vehicle.

Referenced by ValidateTrains().

## ◆ CheckNextTrainTile()

static void CheckNextTrainTile | ( | Train * | v | ) |
| static

Check if the train is on the last reserved tile and try to extend the path then.

Parameters

  v | Train that needs its path extended.

Definition at line 2201 of file train_cmd.cpp.

References _settings_game, Vehicle::current_order, Vehicle::dest_tile, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::exitdir, FindFirstTrackdir(), CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::Follow(), Order::GetDestination(), Vehicle::GetNumOrders(), GetSignalStateByTrackdir(), GetStationIndex(), GetTileRailType(), Order::GetType(), Train::GetVehicleTrackdir(), HasPbsSignalOnTrackdir(), HasReservedTracks(), HasSignalOnTrackdir(), IsRailStationTile(), IsRailWaypointTile(), IsTileType(), KillFirstBit(), MP_RAILWAY, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::new_td_bits, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::new_tile, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::old_td, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::old_tile, PathfinderSettings::path_backoff_interval, GameSettings::pf, ProcessOrders(), Rail90DegTurnDisallowed(), Order::ShouldStopAtStation(), SIGNAL_STATE_RED, Vehicle::tile, TRACK_BIT_DEPOT, TRACKDIR_BIT_NONE, TrackdirBitsToTrackBits(), and TrackdirToTrack().

Referenced by ReverseTrainDirection(), and TrainController().

## ◆ CheckReverseTrain()

static bool CheckReverseTrain | ( | const Train * | v | ) |
| static

Definition at line 2933 of file train_cmd.cpp.

## ◆ CheckTrainAtSignal()

static Vehicle * CheckTrainAtSignal | ( | Vehicle * | v,
|  | void * | data
| ) |  |
| static

Definition at line 3256 of file train_cmd.cpp.

## ◆ CheckTrainAttachment()

static CommandCost CheckTrainAttachment | ( | Train * | t | ) |
| static

Check whether the train parts can be attached.

Parameters

  t | the train to check

Returns
  possible error of this command.

Definition at line 993 of file train_cmd.cpp.

References _settings_game, GroundVehicleCache::cached_veh_length, CALLBACK_FAILED, CBID_TRAIN_ALLOW_WAGON_ATTACH, Vehicle::engine_type, ErrorUnknownCallbackResult(), GroundVehicleCache::first_engine, GroundVehicle< T, Type >::gcache, Vehicle::GetGRF(), Vehicle::GetGRFID(), GetGRFStringID(), GetVehicleCallbackParent(), INVALID_ENGINE, Vehicle::InvalidateNewGRFCache(), Vehicle::IsArticulatedPart(), GroundVehicle< T, Type >::IsEngine(), GroundVehicle< T, Type >::IsRearDualheaded(), VehicleSettings::max_train_length, SpecializedVehicle< T, Type >::Next(), Vehicle::SetNext(), TILE_SIZE, and GameSettings::vehicle.

Referenced by ValidateTrains().

## ◆ CheckTrainCollision()

static bool CheckTrainCollision | ( | Train * | v | ) |
| static

Checks whether the specified train has a collision with another vehicle.

If so, destroys this vehicle, and the other vehicle if its subtype has TS_Front. Reports the incident in a flashy news item, modifies station ratings and plays a sound.

Parameters

  v | Train to test.

Definition at line 3226 of file train_cmd.cpp.

References _settings_client, SoundSettings::disaster, FindTrainCollideEnum(), FindVehicleOnPos(), FindVehicleOnPosXY(), GetOtherTunnelBridgeEnd(), NT_ACCIDENT, TrainCollideChecker::num, Vehicle::owner, SetDParam(), SND_13_TRAIN_COLLISION, ClientSettings::sound, Vehicle::tile, TileVirtXY(), TRACK_BIT_DEPOT, TRACK_BIT_WORMHOLE, TrainCollideChecker::v, Vehicle::x_pos, and Vehicle::y_pos.

## ◆ CheckTrainsLengths()

void CheckTrainsLengths | ( |  | ) |

Checks if lengths of all rail vehicles are valid.

If not, shows an error message.

Definition at line 76 of file train_cmd.cpp.

References _networking, abs(), INVALID_STRING_ID, SpecializedVehicle< T, Type >::Iterate(), SpecializedVehicle< T, Type >::Next(), PM_PAUSED_ERROR, SetDParam(), ShowErrorMessage(), TicksToLeaveDepot(), TRACK_BIT_DEPOT, VS_CRASHED, and WL_CRITICAL.

Referenced by InitializeWindowsAndCaches(), and ReloadNewGRFData().

## ◆ CheckTrainStayInDepot()

static bool CheckTrainStayInDepot | ( | Train * | v | ) |
| static

Will the train stay in the depot the next tick?

Parameters

  v | Train to check.

Returns
  True if it stays in the depot, false otherwise.

Definition at line 2263 of file train_cmd.cpp.

References _settings_client, _settings_game, GroundVehicleCache::cached_power, Vehicle::cur_speed, Vehicle::current_order, Vehicle::dest_tile, Vehicle::direction, GroundVehicle< T, Type >::gcache, ClientSettings::gui, HasDepotReservation(), INVALID_DIAGDIR, InvalidateWindowData(), Order::IsType(), Vehicle::IsWaitingForUnbunching(), Vehicle::LeaveUnbunchingDepot(), MarkTileDirtyByTile(), MarkTrainAsStuck(), SpecializedVehicle< T, Type >::Next(), Vehicle::owner, GameSettings::pf, Train::PlayLeaveStationSound(), PathfinderSettings::reserve_paths, SetDepotReservation(), SetWindowClassesDirty(), SetWindowDirty(), GUISettings::show_track_reservation, SIGSEG_FULL, SIGSEG_PBS, TFP_NONE, Vehicle::tile, TRACK_BIT_DEPOT, TRACK_BIT_X, TRACK_BIT_Y, TryPathReserve(), Train::UpdateAcceleration(), Vehicle::UpdatePosition(), UpdateSignalsOnSegment(), SpecializedVehicle< T, Type >::UpdateViewport(), VehicleEnterDepot(), VehicleServiceInDepot(), Vehicle::vehstatus, VS_STOPPED, Train::wait_counter, WC_TRAINS_LIST, and WC_VEHICLE_DEPOT.

## ◆ ChooseTrainTrack()

static Track ChooseTrainTrack | ( | Train * | v,
|  | TileIndex | tile,
|  | DiagDirection | enterdir,
|  | TrackBits | tracks,
|  | bool | force_res,
|  | bool * | got_reservation,
|  | bool | mark_stuck
| ) |  |
| static

Definition at line 2694 of file train_cmd.cpp.

## ◆ ClearPathReservation()

static void ClearPathReservation | ( | const Train * | v,
|  | TileIndex | tile,
|  | Trackdir | track_dir
| ) |  |
| static

Clear the reservation of tile that was just left by a wagon on track_dir.

Parameters

  v | Train owning the reservation.
  tile | Tile with reservation to clear.
  track_dir | Track direction to clear.

Definition at line 2345 of file train_cmd.cpp.

References _settings_client, GetOtherTunnelBridgeEnd(), GetTunnelBridgeDirection(), ClientSettings::gui, IsBridge(), IsCompatibleTrainStationTile(), IsRailStationTile(), IsTileType(), MarkBridgeDirty(), MarkTileDirtyByTile(), MP_TUNNELBRIDGE, ReverseDiagDir(), SetRailStationPlatformReservation(), SetTunnelBridgeReservation(), GUISettings::show_track_reservation, TileAddByDiagDir(), TrackdirToExitdir(), TrackdirToTrack(), TunnelBridgeIsFree(), and UnreserveRailTrack().

Referenced by Train::Crash(), FreeTrainTrackReservation(), and TrainController().

## ◆ CmdBuildRailVehicle()

CommandCost CmdBuildRailVehicle | ( | DoCommandFlag | flags,
|  | TileIndex | tile,
|  | const Engine * | e,
|  | Vehicle ** | ret
| ) |  |

Build a railroad vehicle.

Parameters

  | flags | type of operation.
  | tile | tile of the depot where rail-vehicle is built.
  | e | the engine to build.
  [out] | ret | the vehicle that has been built.

Returns
  the cost of this operation or an error.

Definition at line 750 of file train_cmd.cpp.

References _current_company, AddArticulatedParts(), Vehicle::build_year, RailVehicleInfo::capacity, Vehicle::cargo_cap, Vehicle::cargo_type, CCF_ARRANGE, CheckConsistencyOfArticulatedVehicle(), CMD_ERROR, CmdBuildRailWagon(), Train::ConsistChanged(), TimerGameCalendar::date, TimerGameEconomy::date, Vehicle::date_of_last_service, Vehicle::date_of_last_service_newgrf, DC_EXEC, DEFAULT_GROUP, DiagDirToDir(), Vehicle::direction, ENGINE_EXCLUSIVE_PREVIEW, Vehicle::engine_type, GroundVehicleCache::first_engine, Engine::flags, GroundVehicle< T, Type >::gcache, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), Engine::GetDefaultCargoType(), Engine::GetLifeLengthInDays(), GetRailDepotDirection(), GetRailType(), GetSlopePixelZ(), Vehicle::group_id, HasPowerOnRail(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, INVALID_ENGINE, IsValidCargoID(), Vehicle::last_loading_station, Vehicle::last_station_visited, Vehicle::max_age, Vehicle::owner, RailVehicleInfo::railtype, RAILVEH_MULTIHEAD, RAILVEH_WAGON, Vehicle::random_bits, Vehicle::refit_cap, Engine::reliability, Vehicle::reliability, Engine::reliability_spd_dec, Vehicle::reliability_spd_dec, VehicleSpriteSeq::Set(), SetBit(), GroundVehicle< T, Type >::SetEngine(), GroundVehicle< T, Type >::SetFrontEngine(), settings, Vehicle::sprite_cache, MutableSpriteCache::sprite_seq, Vehicle::spritenum, TestVehicleBuildProbability(), Vehicle::tile, TILE_SIZE, TileX(), TileY(), TRACK_BIT_DEPOT, Vehicle::UpdatePosition(), UpdateTrainGroupID(), BaseConsist::vehicle_flags, Vehicle::vehstatus, VF_BUILT_AS_PROTOTYPE, VRF_REVERSE_DIRECTION, VS_DEFPAL, VS_HIDDEN, VS_STOPPED, Vehicle::x_pos, Vehicle::y_pos, TimerGameCalendar::year, and Vehicle::z_pos.

Referenced by CmdBuildVehicle().

## ◆ CmdBuildRailWagon()

static CommandCost CmdBuildRailWagon | ( | DoCommandFlag | flags,
|  | TileIndex | tile,
|  | const Engine * | e,
|  | Vehicle ** | ret
| ) |  |
| static

Build a railroad wagon.

Parameters

  | flags | type of operation.
  | tile | tile of the depot where rail-vehicle is built.
  | e | the engine to build.
  [out] | ret | the vehicle that has been built.

Returns
  the cost of this operation or an error.

< Same depot

< A free wagon chain

< Same type

< Don't connect to ourself

< Not crashed/flooded

Definition at line 616 of file train_cmd.cpp.

References _current_company, AddArticulatedParts(), Vehicle::build_year, RailVehicleInfo::capacity, Vehicle::cargo_cap, Vehicle::cargo_type, CCF_ARRANGE, CheckConsistencyOfArticulatedVehicle(), CMD_ERROR, TimerGameCalendar::date, TimerGameEconomy::date, Vehicle::date_of_last_service, Vehicle::date_of_last_service_newgrf, DC_EXEC, DEFAULT_GROUP, DiagDirToDir(), Vehicle::direction, Vehicle::engine_type, SpecializedVehicle< T, Type >::First(), GroundVehicleCache::first_engine, GroundVehicle< T, Type >::gcache, Engine::GetDefaultCargoType(), GetRailDepotDirection(), GetRailType(), GetSlopePixelZ(), Vehicle::group_id, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, INVALID_ENGINE, InvalidateWindowData(), IsCompatibleRail(), IsValidCargoID(), SpecializedVehicle< T, Type >::Iterate(), Vehicle::owner, RailVehicleInfo::railtype, Vehicle::random_bits, Vehicle::refit_cap, VehicleSpriteSeq::Set(), SetBit(), GroundVehicle< T, Type >::SetFreeWagon(), GroundVehicle< T, Type >::SetWagon(), Vehicle::sprite_cache, MutableSpriteCache::sprite_seq, Vehicle::spritenum, TestVehicleBuildProbability(), Vehicle::tile, TILE_SIZE, TileX(), TileY(), TRACK_BIT_DEPOT, Vehicle::UpdatePosition(), UpdateTrainGroupID(), Vehicle::vehstatus, VRF_REVERSE_DIRECTION, VS_CRASHED, VS_DEFPAL, VS_HIDDEN, WC_VEHICLE_DEPOT, Vehicle::x_pos, Vehicle::y_pos, TimerGameCalendar::year, and Vehicle::z_pos.

Referenced by CmdBuildRailVehicle().

## ◆ CmdForceTrainProceed()

CommandCost CmdForceTrainProceed | ( | DoCommandFlag | flags,
|  | VehicleID | veh_id
| ) |  |

Force a train through a red signal.

Parameters

  flags | type of operation
  veh_id | train to ignore the red signal

Returns
  the cost of this operation or an error

Definition at line 2132 of file train_cmd.cpp.

References CheckOwnership(), CMD_ERROR, DC_EXEC, CommandCost::Failed(), SpecializedVehicle< T, Type >::GetIfValid(), HasBit(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, GroundVehicle< T, Type >::IsChainInDepot(), Train::IsPrimaryVehicle(), Vehicle::owner, BaseConsist::ResetDepotUnbunching(), SetWindowDirty(), TFP_NONE, TFP_SIGNAL, TFP_STUCK, VRF_TRAIN_STUCK, and WC_VEHICLE_VIEW.

## ◆ CmdMoveRailVehicle()

CommandCost CmdMoveRailVehicle | ( | DoCommandFlag | flags,
|  | VehicleID | src_veh,
|  | VehicleID | dest_veh,
|  | bool | move_chain
| ) |  |

Move a rail vehicle around inside the depot.

Parameters

  flags | type of operation Note: DC_AUTOREPLACE is set when autoreplace tries to undo its modifications or moves vehicles to temporary locations inside the depot.
  src_veh | source vehicle index
  dest_veh | what wagon to put the source wagon AFTER, XXX - INVALID_VEHICLE to make a new line
  move_chain | move all vehicles following the source vehicle

Returns
  the cost of this operation or an error

Definition at line 1193 of file train_cmd.cpp.

References _current_company, Vehicle::AddToShared(), ArrangeTrains(), CheckCargoCapacity(), CheckOwnership(), CloseWindowById(), CMD_ERROR, Vehicle::CopyVehicleConfigAndStatistics(), GroupStatistics::CountVehicle(), DC_AUTOREPLACE, DC_EXEC, DC_NO_CARGO_CAP_CHECK, DEFAULT_GROUP, DeleteNewGRFInspectWindow(), DeleteVehicleOrders(), CommandCost::Failed(), SpecializedVehicle< T, Type >::First(), SpecializedVehicle< T, Type >::GetFirstEnginePart(), SpecializedVehicle< T, Type >::GetIfValid(), SpecializedVehicle< T, Type >::GetLastEnginePart(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, INVALID_VEHICLE, InvalidateWindowClassesData(), InvalidateWindowData(), GroundVehicle< T, Type >::IsEngine(), Vehicle::IsFrontEngine(), GroundVehicle< T, Type >::IsRearDualheaded(), Vehicle::IsStoppedInDepot(), MakeTrainBackup(), BaseConsist::name, NormaliseSubtypes(), NormaliseTrainHead(), Vehicle::orders, Vehicle::owner, Vehicle::ReleaseUnitNumber(), RestoreTrainBackup(), SetTrainGroupID(), SetWindowDirty(), Vehicle::tile, ValidateTrains(), Vehicle::vehstatus, VS_CRASHED, WC_COMPANY, WC_TRAINS_LIST, WC_VEHICLE_DEPOT, WC_VEHICLE_DETAILS, WC_VEHICLE_ORDERS, WC_VEHICLE_REFIT, WC_VEHICLE_TIMETABLE, and WC_VEHICLE_VIEW.

## ◆ CmdReverseTrainDirection()

CommandCost CmdReverseTrainDirection | ( | DoCommandFlag | flags,
|  | VehicleID | veh_id,
|  | bool | reverse_single_veh
| ) |  |

Reverse train.

Parameters

  flags | type of operation
  veh_id | train to reverse
  reverse_single_veh | if true, reverse a unit in a train (needs to be in a depot)

Returns
  the cost of this operation or an error

Definition at line 2059 of file train_cmd.cpp.

References _settings_game, Vehicle::breakdown_ctr, EngineInfo::callback_mask, CBM_VEHICLE_ARTIC_ENGINE, CCF_ARRANGE, CheckOwnership(), CMD_ERROR, Train::ConsistChanged(), Vehicle::cur_speed, Vehicle::current_order, DC_EXEC, Vehicle::engine_type, CommandCost::Failed(), Vehicle::fill_percent_te_id, SpecializedVehicle< T, Type >::First(), SpecializedVehicle< T, Type >::GetIfValid(), GetStationIndex(), HasBit(), HideFillingPercent(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, GroundVehicle< T, Type >::IsMultiheaded(), Train::IsPrimaryVehicle(), Vehicle::IsStoppedInDepot(), IsTileType(), Order::IsType(), Vehicle::LeaveStation(), MP_STATION, Vehicle::Next(), Vehicle::owner, BaseConsist::ResetDepotUnbunching(), ReverseTrainDirection(), GroundVehicle< T, Type >::SetLastSpeed(), SetWindowClassesDirty(), SetWindowDirty(), TFP_NONE, Vehicle::tile, ToggleBit(), VehicleSettings::train_acceleration_model, GameSettings::vehicle, Vehicle::vehstatus, VRF_REVERSE_DIRECTION, VS_CRASHED, WC_TRAINS_LIST, WC_VEHICLE_DEPOT, WC_VEHICLE_DETAILS, and WC_VEHICLE_VIEW.

## ◆ CmdSellRailWagon()

CommandCost CmdSellRailWagon | ( | DoCommandFlag | flags,
|  | Vehicle * | t,
|  | bool | sell_chain,
|  | bool | backup_order,
|  | ClientID | user
| ) |  |

Sell a (single) train wagon/engine.

Parameters

  flags | type of operation
  t | the train wagon to sell
  sell_chain | the selling mode sell_chain = false: only sell the single dragged wagon/engine (and any belonging rear-engines) sell_chain = true: sell the vehicle and all vehicles following it in the chain if the wagon is dragged, don't delete the possibly belonging rear-engine to some front
  backup_order | make order backup?
  user | the user for the order backup.

Returns
  the cost of this operation or an error

Definition at line 1391 of file train_cmd.cpp.

References CommandCost::AddCost(), Vehicle::AddToShared(), ArrangeTrains(), OrderBackup::Backup(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_orderlist_pool >::CanAllocateItem(), Vehicle::CopyVehicleConfigAndStatistics(), GroupStatistics::CountVehicle(), DC_AUTOREPLACE, DC_EXEC, DeleteVehicleOrders(), EXPENSES_NEW_VEHICLES, CommandCost::Failed(), SpecializedVehicle< T, Type >::First(), SpecializedVehicle< T, Type >::From(), SpecializedVehicle< T, Type >::GetFirstEnginePart(), InvalidateWindowClassesData(), InvalidateWindowData(), GroundVehicle< T, Type >::IsEngine(), Vehicle::IsFrontEngine(), Train::IsPrimaryVehicle(), GroundVehicle< T, Type >::IsRearDualheaded(), MakeTrainBackup(), SpecializedVehicle< T, Type >::Next(), NormaliseSubtypes(), NormaliseTrainHead(), Vehicle::orders, RestoreTrainBackup(), Vehicle::tile, ValidateTrains(), WC_TRAINS_LIST, and WC_VEHICLE_DEPOT.

Referenced by CmdSellVehicle().

## ◆ CollectTrackbitsFromCrashedVehiclesEnum()

static Vehicle * CollectTrackbitsFromCrashedVehiclesEnum | ( | Vehicle * | v,
|  | void * | data
| ) |  |
| static

Collect trackbits of all crashed train vehicles on a tile.

Parameters

  v | Vehicle passed from Find/HasVehicleOnPos()
  data | trackdirbits for the result

Returns
  nullptr to iterate over all vehicles on the tile.

Definition at line 3599 of file train_cmd.cpp.

References DiagDirToDiagTrackBits(), SpecializedVehicle< T, Type >::From(), GetTunnelBridgeDirection(), Vehicle::tile, TRACK_BIT_DEPOT, TRACK_BIT_WORMHOLE, BaseVehicle::type, VEH_TRAIN, Vehicle::vehstatus, and VS_CRASHED.

Referenced by DeleteLastWagon().

## ◆ DeleteLastWagon()

static void DeleteLastWagon | ( | Train * | v | ) |
| static

Deletes/Clears the last wagon of a crashed train.

It takes the engine of the train, then goes to the last wagon and deletes that. Each call to this function will remove the last wagon of a crashed train. If this wagon was on a crossing, or inside a tunnel/bridge, recalculate the signals as they might need updating

Parameters

  v | the Vehicle of which last wagon is to be removed

Definition at line 3637 of file train_cmd.cpp.

References AxisToDiagDir(), CCF_ARRANGE, CollectTrackbitsFromCrashedVehiclesEnum(), Train::ConsistChanged(), DiagDirToDiagTrackBits(), FindVehicleOnPos(), SpecializedVehicle< T, Type >::First(), GetRailStationAxis(), GetTunnelBridgeDirection(), HasReservedTracks(), INVALID_DIAGDIR, IsLevelCrossingTile(), IsRailDepotTile(), IsRailStationTile(), IsTileType(), Vehicle::last_station_visited, MP_TUNNELBRIDGE, SpecializedVehicle< T, Type >::Next(), Vehicle::owner, ReverseDiagDir(), Vehicle::SetNext(), SetRailStationPlatformReservation(), SetSignalsOnBothDir(), SetWindowDirty(), Vehicle::tile, TRACK_BEGIN, TRACK_BIT_DEPOT, TRACK_BIT_NONE, TRACK_BIT_WORMHOLE, TRACK_X, TRACK_Y, TrackBitsToTrack(), TryReserveRailTrack(), UnreserveRailTrack(), UpdateLevelCrossing(), UpdateSignalsOnSegment(), and WC_VEHICLE_DEPOT.

Referenced by HandleCrashedTrain().

## ◆ DoTrainPathfind()

static Track DoTrainPathfind | ( | const Train * | v,
|  | TileIndex | tile,
|  | DiagDirection | enterdir,
|  | TrackBits | tracks,
|  | bool & | path_found,
|  | bool | do_track_reservation,
|  | PBSTileInfo * | dest,
|  | TileIndex * | final_dest
| ) |  |
| static

Perform pathfinding for a train.

Parameters

  | v | The train
  | tile | The tile the train is about to enter
  | enterdir | Diagonal direction the train is coming from
  | tracks | Usable tracks on the new tile
  [out] | path_found | Whether a path has been found or not.
  | do_track_reservation | Path reservation is requested
  [out] | dest | State and destination of the requested path
  [out] | final_dest | Final tile of the best path found

Returns
  The best track the train should follow

Definition at line 2469 of file train_cmd.cpp.

References INVALID_TILE, and YapfTrainChooseTrack().

## ◆ DrawTrainEngine()

void DrawTrainEngine | ( | int | left,
|  | int | right,
|  | int | preferred_x,
|  | int | y,
|  | EngineID | engine,
|  | PaletteID | pal,
|  | EngineImageType | image_type
| ) |  |

Definition at line 538 of file train_cmd.cpp.

## ◆ ExtendTrainReservation()

static PBSTileInfo ExtendTrainReservation | ( | const Train * | v,
|  | TrackBits * | new_tracks,
|  | DiagDirection * | enterdir
| ) |  |
| static

Extend a train path as far as possible.

Stops on encountering a safe tile, another reservation or a track choice.

Returns
  INVALID_TILE indicates that the reservation failed.

Definition at line 2480 of file train_cmd.cpp.

References _settings_game, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::exitdir, FindFirstTrackdir(), CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::Follow(), FollowTrainReservation(), PathfinderSettings::forbid_90_deg, GetSignalStateByTrackdir(), GetTileRailType(), HasOnewaySignalBlockingTrackdir(), HasPbsSignalOnTrackdir(), HasReservedTracks(), CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::is_station, IsPlainRail(), IsSafeWaitingPosition(), IsTileType(), IsWaitingPositionFree(), KillFirstBit(), MarkTileDirtyByTile(), MP_RAILWAY, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::new_td_bits, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::new_tile, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::old_td, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::old_tile, GameSettings::pf, Rail90DegTurnDisallowed(), ReverseTrackdir(), SetSignalStateByTrackdir(), SIGNAL_STATE_GREEN, SIGNAL_STATE_RED, PBSTileInfo::tile, TileOffsByDiagDir(), CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::tiles_skipped, PBSTileInfo::trackdir, TRACKDIR_BIT_NONE, TrackdirBitsToTrackBits(), TrackdirReachesTrackdirs(), TrackdirToTrack(), TryReserveRailTrack(), and UnreserveRailTrack().

## ◆ FindClosestTrainDepot()

static FindDepotData FindClosestTrainDepot | ( | Train * | v,
|  | int | max_distance
| ) |  |
| static

Try to find a depot nearby.

Parameters

  v | Train that wants a depot.
  max_distance | Maximal search distance.

Returns
  Information where the closest train depot is located.

Precondition
  The given vehicle must not be crashed!

Definition at line 2166 of file train_cmd.cpp.

References Vehicle::vehstatus, VS_CRASHED, and YapfTrainFindNearestDepot().

Referenced by CheckIfTrainNeedsService(), and Train::FindClosestDepot().

## ◆ FindGoodVehiclePos()

static Train * FindGoodVehiclePos | ( | const Train * | src | ) |
| static

Definition at line 825 of file train_cmd.cpp.

## ◆ FindTrainCollideEnum()

static Vehicle * FindTrainCollideEnum | ( | Vehicle * | v,
|  | void * | data
| ) |  |
| static

Collision test function.

Parameters

  v | Train vehicle to test collision with.
  data | Train being examined.

Returns
  `nullptr` (always continue search)

Definition at line 3179 of file train_cmd.cpp.

References abs(), GroundVehicleCache::cached_veh_length, SpecializedVehicle< T, Type >::First(), SpecializedVehicle< T, Type >::From(), GroundVehicle< T, Type >::gcache, TrainCollideChecker::num, Vehicle::owner, TRACK_BIT_DEPOT, TrainCrashed(), BaseVehicle::type, TrainCollideChecker::v, VEH_TRAIN, Vehicle::x_pos, Vehicle::y_pos, and Vehicle::z_pos.

Referenced by CheckTrainCollision().

## ◆ FreeTrainTrackReservation()

void FreeTrainTrackReservation | ( | const Train * | v | ) |

Free the reserved path in front of a vehicle.

Parameters

  v | Train owning the reserved path.

Definition at line 2386 of file train_cmd.cpp.

References AddSideToSignalBuffer(), ClearPathReservation(), RailTypeInfo::compatible_railtypes, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::Follow(), GetRailDepotDirection(), GetRailTypeInfo(), GetReservedTrackbits(), GetSignalStateByTrackdir(), GetStationIndex(), Train::GetVehicleTrackdir(), HasPbsSignalOnTrackdir(), HasSignalOnTrackdir(), CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::is_bridge, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::is_station, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::is_tunnel, Vehicle::IsFrontEngine(), IsOnewaySignal(), IsRailDepotTile(), IsRailStationTile(), IsTileType(), IsValidTrackdir(), MarkTileDirtyByTile(), MP_RAILWAY, MP_TUNNELBRIDGE, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::new_td_bits, CFollowTrackT< Ttr_type_, VehicleType, T90deg_turns_allowed_, Tmask_reserved_tracks >::new_tile, SpecializedVehicle< T, Type >::Next(), Vehicle::owner, RemoveFirstTrackdir(), ReverseTrackdir(), SetSignalStateByTrackdir(), SIGNAL_STATE_RED, Vehicle::tile, TRACK_BIT_DEPOT, TrackBitsToTrackdirBits(), TRACKDIR_BIT_NONE, TrackdirToExitdir(), TrackdirToTrack(), TracksOverlap(), TrackToTrackBits(), UnreserveRailTrack(), and UpdateSignalsInBuffer().

Referenced by CmdBuildSingleSignal(), CmdConvertRail(), CmdRemoveSingleRail(), Train::Crash(), DoClearBridge(), DoClearTunnel(), FreeTrainReservation(), and ReverseTrainDirection().

## ◆ FreightWagonMult()

uint8_t FreightWagonMult | ( | CargoID | cargo | ) |

Return the cargo weight multiplier to use for a rail vehicle.

Parameters

  cargo | Cargo type to get multiplier for

Returns
  Cargo weight multiplier

Definition at line 69 of file train_cmd.cpp.

References _settings_game, VehicleSettings::freight_trains, CargoSpec::Get(), and GameSettings::vehicle.

Referenced by DrawTrainDetails(), TrainDetailsCapacityTab(), and TrainDetailsCargoTab().

## ◆ GetDefaultTrainSprite()

static SpriteID GetDefaultTrainSprite | ( | uint8_t | spritenum,
|  | Direction | direction
| ) |  |
| static

Definition at line 482 of file train_cmd.cpp.

## ◆ GetRailIcon()

static void GetRailIcon | ( | EngineID | engine,
|  | bool | rear_head,
|  | int & | y,
|  | EngineImageType | image_type,
|  | VehicleSpriteSeq * | result
| ) |  |
| static

Definition at line 515 of file train_cmd.cpp.

## ◆ GetTrainSpriteSize()

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).

Parameters

  | engine | The engine to get the sprite from.
  [out] | width | The width of the sprite.
  [out] | height | The height of the sprite.
  [out] | xoffs | Number of pixels to shift the sprite to the right.
  [out] | yoffs | Number of pixels to shift the sprite downwards.
  | image_type | Context the sprite is used in.

Definition at line 581 of file train_cmd.cpp.

References VehicleSpriteSeq::GetBounds(), Rect::Height(), RAILVEH_MULTIHEAD, ScaleSpriteTrad(), UnScaleGUI(), and Rect::Width().

Referenced by EnginePreviewWindow::UpdateWidgetSize().

## ◆ GetTrainStopLocation()

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.

Parameters

  station_id | the ID of the station where we're stopping
  tile | the tile where the vehicle currently is
  v | the vehicle to get the stop location of
  station_ahead | 'return' the amount of 1/16th tiles in front of the train
  station_length | 'return' the station length in 1/16th tiles

Returns
  the location, calculated from the begin of the station to stop at.

Definition at line 263 of file train_cmd.cpp.

References GroundVehicleCache::cached_total_length, GroundVehicleCache::cached_veh_length, Vehicle::current_order, Vehicle::direction, DirToDiagDir(), GroundVehicle< T, Type >::gcache, SpecializedStation< Station, false >::Get(), Order::GetDestination(), Station::GetPlatformLength(), Order::GetStopLocation(), Order::IsType(), OSL_PLATFORM_FAR_END, OSL_PLATFORM_MIDDLE, OSL_PLATFORM_NEAR_END, and TILE_SIZE.

Referenced by Train::GetCurrentMaxSpeed().

## ◆ HandleCrashedTrain()

static bool HandleCrashedTrain | ( | Train * | v | ) |
| static

Handle a crashed train.

Parameters

  v | First train vehicle.

Returns
  Vehicle chain still exists.

Definition at line 3735 of file train_cmd.cpp.

References Chance16R(), ChangeTrainDirRandomly(), Train::crash_anim_pos, CreateEffectVehicleRel(), DeleteLastWagon(), EV_EXPLOSION_LARGE, EV_EXPLOSION_SMALL, GB(), Vehicle::Next(), SpecializedVehicle< T, Type >::Next(), Vehicle::tick_counter, Vehicle::vehstatus, and VS_HIDDEN.

## ◆ InsertInConsist()

static void InsertInConsist | ( | Train * | dst,
|  | Train * | chain
| ) |  |
| static

Inserts a chain into the train at dst.

Parameters

  dst | the place where to append after.
  chain | the chain to actually add.

Definition at line 901 of file train_cmd.cpp.

References SpecializedVehicle< T, Type >::Last(), SpecializedVehicle< T, Type >::Next(), and Vehicle::SetNext().

Referenced by ArrangeTrains(), and NormaliseDualHeads().

## ◆ IsRailStationPlatformOccupied()

static bool IsRailStationPlatformOccupied | ( | TileIndex | tile | ) |
| static

Definition at line 3616 of file train_cmd.cpp.

## ◆ IsValidImageIndex< VEH_TRAIN >()

template<>

bool IsValidImageIndex< VEH_TRAIN > | ( | uint8_t | image_index | ) |

Definition at line 58 of file train_cmd.cpp.

## ◆ IsWholeTrainInsideDepot()

static bool IsWholeTrainInsideDepot | ( | const Train * | v | ) |
| static

Definition at line 1955 of file train_cmd.cpp.

## ◆ MakeTrainBackup()

static void MakeTrainBackup | ( | TrainList & | list,
|  | Train * | t
| ) |  |
| static

Make a backup of a train into a train list.

Parameters

  list | to make the backup in
  t | the train to make the backup of

Definition at line 852 of file train_cmd.cpp.

References SpecializedVehicle< T, Type >::Next().

Referenced by CmdMoveRailVehicle(), and CmdSellRailWagon().

## ◆ MarkDirtyAdjacentLevelCrossingTiles()

void MarkDirtyAdjacentLevelCrossingTiles | ( | TileIndex | tile,
|  | Axis | road_axis
| ) |  |

Find adjacent level crossing tiles in this multi-track crossing and mark them dirty.

Parameters

  tile | The tile which causes the update.
  road_axis | The road axis.

Definition at line 1805 of file train_cmd.cpp.

References AxisToDiagDir(), GetCrossingRoadAxis(), IsLevelCrossingTile(), MarkTileDirtyByTile(), ReverseDiagDir(), Map::Size(), and TileAddByDiagDir().

Referenced by CmdBuildRoad(), and CmdBuildSingleRail().

## ◆ MarkTrainAsStuck()

static void MarkTrainAsStuck | ( | Train * | v | ) |
| static

Mark a train as stuck and stop it if it isn't stopped right now.

Parameters

  v | Train to mark as being stuck.

Definition at line 1541 of file train_cmd.cpp.

References Vehicle::cur_speed, HasBit(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, SetBit(), GroundVehicle< T, Type >::SetLastSpeed(), SetWindowWidgetDirty(), Vehicle::subspeed, VRF_TRAIN_STUCK, Train::wait_counter, WC_VEHICLE_VIEW, and WID_VV_START_STOP.

Referenced by CheckTrainStayInDepot(), ReverseTrainDirection(), TrainController(), and TryPathReserve().

## ◆ MaybeBarCrossingWithSound()

static void MaybeBarCrossingWithSound | ( | TileIndex | tile | ) |
| inlinestatic

Bars crossing and plays ding-ding sound if not barred already.

Parameters

  tile | tile with crossing

Precondition
  tile is a rail-road crossing

Definition at line 1860 of file train_cmd.cpp.

References IsCrossingBarred(), SetCrossingReservation(), and UpdateLevelCrossing().

Referenced by ReverseTrainDirection(), and TrainCheckIfLineEnds().

## ◆ NormaliseDualHeads()

static void NormaliseDualHeads | ( | Train * | t | ) |
| static

Normalise the dual heads in the train, i.e.

if one is missing move that one to this train.

Parameters

  t | the train to normalise.

Definition at line 915 of file train_cmd.cpp.

References SpecializedVehicle< T, Type >::GetNextVehicle(), InsertInConsist(), GroundVehicle< T, Type >::IsEngine(), GroundVehicle< T, Type >::IsMultiheaded(), SpecializedVehicle< T, Type >::Next(), and RemoveFromConsist().

Referenced by ArrangeTrains().

## ◆ NormaliseSubtypes()

static void NormaliseSubtypes | ( | Train * | chain | ) |
| static

Normalise the sub types of the parts in this chain.

Parameters

  chain | the chain to normalise.

Definition at line 937 of file train_cmd.cpp.

References GroundVehicle< T, Type >::ClearFreeWagon(), GroundVehicle< T, Type >::ClearFrontEngine(), GroundVehicle< T, Type >::IsEngine(), GroundVehicle< T, Type >::IsWagon(), SpecializedVehicle< T, Type >::Next(), SpecializedVehicle< T, Type >::Previous(), GroundVehicle< T, Type >::SetFreeWagon(), and GroundVehicle< T, Type >::SetFrontEngine().

Referenced by CmdMoveRailVehicle(), and CmdSellRailWagon().

## ◆ NormaliseTrainHead()

static void NormaliseTrainHead | ( | Train * | head | ) |
| static

Normalise the head of the train again, i.e.

that is tell the world that we have changed and update all kinds of variables.

Parameters

  head | the train to update.

Definition at line 1163 of file train_cmd.cpp.

References CCF_ARRANGE, Train::ConsistChanged(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), GetFreeUnitNumber(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, InvalidateWindowData(), Vehicle::IsFrontEngine(), Vehicle::owner, SetWindowWidgetDirty(), BaseVehicle::type, Vehicle::unitnumber, UpdateTrainGroupID(), VEH_TRAIN, VIWD_CONSIST_CHANGED, WC_VEHICLE_REFIT, WC_VEHICLE_VIEW, and WID_VV_REFIT.

Referenced by CmdMoveRailVehicle(), and CmdSellRailWagon().

## ◆ NormalizeTrainVehInDepot()

void NormalizeTrainVehInDepot | ( | const Train * | u | ) |

Move all free vehicles in the depot to the train.

Definition at line 693 of file train_cmd.cpp.

References DC_EXEC, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, GroundVehicle< T, Type >::IsEngine(), SpecializedVehicle< T, Type >::Iterate(), Vehicle::tile, and TRACK_BIT_DEPOT.

Referenced by CmdBuildVehicle().

## ◆ RemoveFromConsist()

static void RemoveFromConsist | ( | Train * | part,
|  | bool | chain = `false`
| ) |  |
| static

Remove the given wagon from its consist.

Parameters

  part | the part of the train to remove.
  chain | whether to remove the whole chain.

Definition at line 884 of file train_cmd.cpp.

References SpecializedVehicle< T, Type >::GetLastEnginePart(), SpecializedVehicle< T, Type >::Last(), SpecializedVehicle< T, Type >::Next(), SpecializedVehicle< T, Type >::Previous(), and Vehicle::SetNext().

Referenced by ArrangeTrains(), and NormaliseDualHeads().

## ◆ RestoreTrainBackup()

static void RestoreTrainBackup | ( | TrainList & | list | ) |
| static

Restore the train from the backup list.

Parameters

  list | the train to restore.

Definition at line 861 of file train_cmd.cpp.

References SpecializedVehicle< T, Type >::Previous(), and Vehicle::SetNext().

Referenced by CmdMoveRailVehicle(), and CmdSellRailWagon().

## ◆ ReverseTrainDirection()

void ReverseTrainDirection | ( | Train * | v | ) |

Turn a train around.

Parameters

  v | Train to turn around.

Definition at line 1967 of file train_cmd.cpp.

References _settings_game, AdvanceWagonsAfterSwap(), AdvanceWagonsBeforeSwap(), CCF_TRACK, CheckNextTrainTile(), ClrBit(), Train::ConsistChanged(), Vehicle::current_order, Vehicle::direction, FindFirstTrack(), FreeTrainTrackReservation(), GetRailDepotDirection(), Order::GetType(), Train::GetVehicleTrackdir(), HasBit(), HasSignalOnTrackdir(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, INVALID_DIAGDIR, INVALID_TILE, InvalidateWindowData(), IsRailDepotTile(), IsRailStationTile(), IsTileType(), MarkTrainAsStuck(), MaybeBarCrossingWithSound(), MP_RAILWAY, MP_TUNNELBRIDGE, SpecializedVehicle< T, Type >::Next(), Vehicle::owner, GameSettings::pf, PathfinderSettings::reserve_paths, ReverseTrainSwapVeh(), SetRailStationPlatformReservation(), SetWindowWidgetDirty(), SIGSEG_PBS, Vehicle::tile, ToggleBit(), TRACK_BIT_DEPOT, TrackdirToExitdir(), TrainApproachingCrossingTile(), TryPathReserve(), UpdateLevelCrossing(), UpdateSignalsOnSegment(), SpecializedVehicle< T, Type >::UpdateViewport(), VehicleExitDir(), VRF_TOGGLE_REVERSE, VRF_TRAIN_STUCK, Train::wait_counter, WC_VEHICLE_DEPOT, WC_VEHICLE_VIEW, and WID_VV_START_STOP.

Referenced by CmdReverseTrainDirection(), TrainApproachingLineEnd(), and TrainController().

## ◆ ReverseTrainSwapVeh()

void ReverseTrainSwapVeh | ( | Train * | v,
|  | int | l,
|  | int | r
| ) |  |

Swap vehicles l and r in consist v, and reverse their direction.

Parameters

  v | Consist to change.
  l | Vehicle index in the consist of the first vehicle.
  r | Vehicle index in the consist of the second vehicle.

Definition at line 1630 of file train_cmd.cpp.

References Vehicle::direction, GroundVehicle< T, Type >::gv_flags, SpecializedVehicle< T, Type >::Next(), Swap(), SwapTrainFlags(), Vehicle::tile, UpdateStatusAfterSwap(), Vehicle::vehstatus, VS_HIDDEN, Vehicle::x_pos, Vehicle::y_pos, and Vehicle::z_pos.

Referenced by FixupTrainLengths(), and ReverseTrainDirection().

## ◆ SwapTrainFlags()

static void SwapTrainFlags | ( | uint16_t * | swap_flag1,
|  | uint16_t * | swap_flag2
| ) |  |
| static

Swap the two up/down flags in two ways:

- Swap values of swap_flag1 and swap_flag2, and
- If going up previously (GVF_GOINGUP_BIT set), the GVF_GOINGDOWN_BIT is set, and vice versa.
  Parameters

    [in,out] | swap_flag1 | First train flag.
    [in,out] | swap_flag2 | Second train flag.

Definition at line 1565 of file train_cmd.cpp.

References ClrBit(), GVF_GOINGDOWN_BIT, GVF_GOINGUP_BIT, HasBit(), and SetBit().

Referenced by ReverseTrainSwapVeh().

## ◆ TrainApproachingCrossing()

static bool TrainApproachingCrossing | ( | TileIndex | tile | ) |
| static

Finds a vehicle approaching rail-road crossing.

Parameters

  tile | tile to test

Returns
  true if a vehicle is approaching the crossing

Precondition
  tile is a rail-road crossing

Definition at line 1718 of file train_cmd.cpp.

References AxisToDiagDir(), GetCrossingRailAxis(), HasVehicleOnPos(), IsLevelCrossingTile(), ReverseDiagDir(), TileOffsByDiagDir(), and TrainApproachingCrossingEnum().

Referenced by CheckLevelCrossing().

## ◆ TrainApproachingCrossingEnum()

static Vehicle * TrainApproachingCrossingEnum | ( | Vehicle * | v,
|  | void * | data
| ) |  |
| static

Checks if a train is approaching a rail-road crossing.

Parameters

  v | vehicle on tile
  data | tile with crossing we are testing

Returns
  v if it is approaching a crossing, nullptr otherwise

Definition at line 1697 of file train_cmd.cpp.

References SpecializedVehicle< T, Type >::From(), Vehicle::IsFrontEngine(), TrainApproachingCrossingTile(), BaseVehicle::type, VEH_TRAIN, Vehicle::vehstatus, and VS_CRASHED.

Referenced by TrainApproachingCrossing().

## ◆ TrainApproachingCrossingTile()

static TileIndex TrainApproachingCrossingTile | ( | const Train * | v | ) |
| static

Determines whether train is approaching a rail-road crossing (thus making it barred)

Parameters

  v | front engine of train

Returns
  TileIndex of crossing the train is approaching, else INVALID_TILE

Precondition
  v in non-crashed front engine

Definition at line 3862 of file train_cmd.cpp.

References DiagDirToAxis(), Vehicle::direction, GetCrossingRoadAxis(), INVALID_TILE, Vehicle::IsFrontEngine(), IsLevelCrossingTile(), Vehicle::tile, TileOffsByDiagDir(), TrainCanLeaveTile(), VehicleExitDir(), Vehicle::vehstatus, and VS_CRASHED.

Referenced by Train::Crash(), ReverseTrainDirection(), TrainApproachingCrossingEnum(), and TrainController().

## ◆ TrainApproachingLineEnd()

static bool TrainApproachingLineEnd | ( | Train * | v,
|  | bool | signal,
|  | bool | reverse
| ) |  |
| static

Train is approaching line end, slow down and possibly reverse.

Parameters

  v | front train engine
  signal | not line end, just a red signal
  reverse | Set to false to not execute the vehicle reversing. This does not change any other logic.

Returns
  true iff we did NOT have to reverse

Definition at line 3787 of file train_cmd.cpp.

References _breakdown_speeds, GroundVehicleCache::cached_veh_length, Vehicle::cur_speed, DIR_E, DIR_N, DIR_NE, DIR_NW, DIR_S, DIR_SE, DIR_W, Vehicle::direction, GroundVehicle< T, Type >::gcache, IsDiagonalDirection(), ReverseTrainDirection(), TILE_SIZE, Vehicle::vehstatus, VS_TRAIN_SLOWING, Vehicle::x_pos, and Vehicle::y_pos.

Referenced by TrainCheckIfLineEnds().

## ◆ TrainCanLeaveTile()

static bool TrainCanLeaveTile | ( | const Train * | v | ) |
| static

Determines whether train would like to leave the tile.

Parameters

  v | train to test

Returns
  true iff vehicle is NOT entering or inside a depot or tunnel/bridge

Definition at line 3832 of file train_cmd.cpp.

References DiagDirToDir(), Vehicle::direction, GetRailDepotDirection(), GetTunnelBridgeDirection(), IsRailDepotTile(), IsTileType(), MP_TUNNELBRIDGE, ReverseDiagDir(), Vehicle::tile, TRACK_BIT_DEPOT, and TRACK_BIT_WORMHOLE.

Referenced by TrainApproachingCrossingTile(), and TrainCheckIfLineEnds().

## ◆ TrainCheckIfLineEnds()

static bool TrainCheckIfLineEnds | ( | Train * | v,
|  | bool | reverse
| ) |  |
| static

Checks for line end.

Also, bars crossing at next tile if needed

Parameters

  v | vehicle we are checking
  reverse | Set to false to not execute the vehicle reversing. This does not change any other logic.

Returns
  true iff we did NOT have to reverse

Definition at line 3889 of file train_cmd.cpp.

References _breakdown_speeds, Vehicle::breakdown_ctr, Vehicle::cur_speed, DiagdirReachesTrackdirs(), Vehicle::direction, FindFirstTrack(), GB(), GetTileRailType(), GetTileTrackStatus(), IsLevelCrossingTile(), MaybeBarCrossingWithSound(), Rail90DegTurnDisallowed(), ReverseDiagDir(), Vehicle::tile, TileOffsByDiagDir(), TRACK_BIT_NONE, TrackdirBitsToTrackBits(), TrackStatusToRedSignals(), TrackStatusToTrackdirBits(), TrainApproachingLineEnd(), TrainCanLeaveTile(), TRANSPORT_RAIL, VehicleExitDir(), Vehicle::vehstatus, and VS_TRAIN_SLOWING.

Referenced by TrainController().

## ◆ TrainController()

bool TrainController | ( | Train * | v,
|  | Vehicle * | nomove,
|  | bool | reverse
| ) |  |

Move a vehicle chain one movement stop forwards.

Parameters

  v | First vehicle to move.
  nomove | Stop moving this and all following vehicles.
  reverse | Set to false to not execute the vehicle reversing. This does not change any other logic.

Returns
  True if the vehicle could be moved forward, false otherwise.

Definition at line 3278 of file train_cmd.cpp.

References _accel_slowdown, _settings_client, _settings_game, RailTypeInfo::acceleration_type, AffectSpeedByZChange(), SoundSettings::ambient, TrainCache::cached_max_curve_speed, CCF_TRACK, CheckNextTrainTile(), ClearPathReservation(), Vehicle::cur_speed, Ticks::DAY_TICKS, DIAGDIR_BEGIN, DIAGDIR_END, DiagdirBetweenTiles(), DiagdirReachesTrackdirs(), DiagDirToDiagTrack(), DIRDIFF_45LEFT, DIRDIFF_45RIGHT, DirDifference(), Vehicle::direction, FindFirstBit(), FindFirstTrack(), FindFirstTrackdir(), SpecializedVehicle< T, Type >::First(), Train::GetCurveSpeedLimit(), GetNewVehiclePos(), GetOtherTunnelBridgeEnd(), GetRailTypeInfo(), GetReservedTrackbits(), GetTileRailType(), GetTileTrackStatus(), GetTunnelBridgeDirection(), Train::GetVehicleTrackdir(), HasBit(), HasCrossingReservation(), HasOnewaySignalBlockingTrackdir(), HasPbsSignalOnTrackdir(), HasReservedTracks(), HasSignalOnTrackdir(), HasSignals(), HasVehicleOnPos(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, INVALID_TILE, Vehicle::IsFrontEngine(), IsLevelCrossingTile(), IsPlainRailTile(), IsTileType(), IsTunnel(), IsValidDiagDirection(), AccelerationSlowdownParams::large_turn, MarkTileDirtyByTile(), MarkTrainAsStuck(), MP_TUNNELBRIDGE, GetNewVehiclePosResult::new_tile, SpecializedVehicle< T, Type >::Next(), GetNewVehiclePosResult::old_tile, Vehicle::owner, PathfinderSettings::path_backoff_interval, GameSettings::pf, SpecializedVehicle< T, Type >::Previous(), Vehicle::progress, Rail90DegTurnDisallowed(), PathfinderSettings::reverse_at_signals, ReverseDiagDir(), ReverseTrackdir(), ReverseTrainDirection(), SetSignalStateByTrackdir(), SetWindowDirty(), SIGNAL_STATE_RED, SIGSEG_PBS, SIGTYPE_PBS, AccelerationSlowdownParams::small_turn, SND_0E_LEVEL_CROSSING, ClientSettings::sound, Vehicle::subspeed, TFP_NONE, TFP_SIGNAL, TFP_STUCK, Vehicle::tick_counter, Vehicle::tile, TileAddByDiagDir(), TRACK_BIT_DEPOT, TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_NONE, TRACK_BIT_RIGHT, TRACK_BIT_UPPER, TRACK_BIT_WORMHOLE, TRACK_BIT_X, TRACK_BIT_Y, TrackBitsToTrack(), TrackdirBitsToTrackBits(), TrackDirectionToTrackdir(), TrackdirToExitdir(), TrackdirToTrack(), TrackStatusToRedSignals(), TrackStatusToTrackdirBits(), TrackToTrackBits(), VehicleSettings::train_acceleration_model, TrainApproachingCrossingTile(), TrainCheckIfLineEnds(), TrainEnterStation(), TRANSPORT_RAIL, TryPathReserve(), TryReserveRailTrack(), Train::UpdateDeltaXY(), GroundVehicle< T, Type >::UpdateInclination(), UpdateLevelCrossing(), Vehicle::UpdatePosition(), UpdateSignalsOnSegment(), GameSettings::vehicle, VehicleEnterTile(), Vehicle::vehstatus, VETS_CANNOT_ENTER, VETS_ENTERED_STATION, VETS_ENTERED_WORMHOLE, VETS_STATION_ID_OFFSET, VRF_TRAIN_STUCK, VS_HIDDEN, Train::wait_counter, PathfinderSettings::wait_oneway_signal, PathfinderSettings::wait_twoway_signal, WC_VEHICLE_VIEW, Vehicle::x_pos, GetNewVehiclePosResult::y, and Vehicle::y_pos.

Referenced by AdvanceWagonsAfterSwap(), AdvanceWagonsBeforeSwap(), and FixupTrainLengths().

## ◆ TrainCrashed()

static uint TrainCrashed | ( | Train * | v | ) |
| static

Marks train as crashed and creates an AI event.

Doesn't do anything if the train is crashed already.

Parameters

  v | first vehicle of chain

Returns
  number of victims (including 2 drivers; zero if train was already crashed)

Definition at line 3149 of file train_cmd.cpp.

References Train::Crash(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Game::NewEvent(), AI::NewEvent(), Vehicle::owner, Train::ReserveTrackUnderConsist(), Vehicle::tile, Vehicle::vehstatus, and VS_CRASHED.

Referenced by FindTrainCollideEnum().

## ◆ TrainEnterStation()

static void TrainEnterStation | ( | Train * | v,
|  | StationID | station
| ) |  |
| static

Trains enters a station, send out a news item if it is the first train, and start loading.

Parameters

  v | Train that entered the station.
  station | Station visited.

Definition at line 3003 of file train_cmd.cpp.

References _local_company, AddVehicleNewsItem(), Vehicle::BeginLoading(), SpecializedStation< Station, false >::Get(), HVOT_TRAIN, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Vehicle::last_station_visited, Game::NewEvent(), AI::NewEvent(), NT_ARRIVAL_COMPANY, NT_ARRIVAL_OTHER, Vehicle::owner, SAT_TRAIN_ARRIVES, SetDParam(), SetWindowDirty(), SRT_TRAIN_ARRIVES, TFP_NONE, Vehicle::tile, TriggerStationRandomisation(), and WC_VEHICLE_VIEW.

Referenced by TrainController().

## ◆ TrainLocoHandler()

static bool TrainLocoHandler | ( | Train * | v,
|  | bool | mode
| ) |  |
| static

Definition at line 3940 of file train_cmd.cpp.

## ◆ TrainMovedChangeSignals()

static bool TrainMovedChangeSignals | ( | TileIndex | tile,
|  | DiagDirection | dir
| ) |  |
| static

Definition at line 3073 of file train_cmd.cpp.

## ◆ TrainOnCrossing()

bool TrainOnCrossing | ( | TileIndex | tile | ) |

Check if a level crossing tile has a train on it.

Parameters

  tile | tile to test

Returns
  true if a train is on the crossing

Precondition
  tile is a level crossing

Definition at line 1683 of file train_cmd.cpp.

References HasVehicleOnPos(), IsLevelCrossingTile(), and TrainOnTileEnum().

Referenced by CheckLevelCrossing().

## ◆ TrainOnTileEnum()

static Vehicle * TrainOnTileEnum | ( | Vehicle * | v,
|  | void * |
| ) |  |
| static

Check if the vehicle is a train.

Parameters

  v | vehicle on tile

Returns
  v if it is a train, nullptr otherwise

Definition at line 1672 of file train_cmd.cpp.

References BaseVehicle::type, and VEH_TRAIN.

Referenced by TrainOnCrossing().

## ◆ TryPathReserve()

bool TryPathReserve | ( | Train * | v,
|  | bool | mark_as_stuck,
|  | bool | first_tile_okay
| ) |  |

Try to reserve a path to a safe position.

Parameters

  v | The vehicle
  mark_as_stuck | Should the train be marked as stuck on a failed reservation?
  first_tile_okay | True if no path should be reserved if the current tile is a safe position.

Returns
  True if a path could be reserved.

Definition at line 2866 of file train_cmd.cpp.

References _settings_client, ClrBit(), DiagdirReachesTrackdirs(), DiagdirReachesTracks(), FollowTrainReservation(), GetRailDepotDirection(), GetTileRailType(), GetTileTrackStatus(), ClientSettings::gui, HasBit(), HasDepotReservation(), HasReservedTracks(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Vehicle::IsFrontEngine(), MarkTileDirtyByTile(), MarkTrainAsStuck(), PBSTileInfo::okay, Rail90DegTurnDisallowed(), SetDepotReservation(), SetWindowWidgetDirty(), GUISettings::show_track_reservation, PBSTileInfo::tile, Vehicle::tile, TileAddByDiagDir(), TRACK_BIT_DEPOT, PBSTileInfo::trackdir, TrackdirBitsToTrackBits(), TrackdirToExitdir(), TrackdirToTrack(), TrackStatusToTrackdirBits(), TRANSPORT_RAIL, VRF_TRAIN_STUCK, Train::wait_counter, WC_VEHICLE_VIEW, and WID_VV_START_STOP.

Referenced by CheckTrainStayInDepot(), CmdBuildSingleSignal(), CmdConvertRail(), CmdRemoveSingleRail(), CmdRemoveSingleSignal(), DoClearBridge(), DoClearTunnel(), RestoreTrainReservation(), ReverseTrainDirection(), and TrainController().

## ◆ TryReserveSafeTrack()

static bool TryReserveSafeTrack | ( | const Train * | v,
|  | TileIndex | tile,
|  | Trackdir | td,
|  | bool | override_railtype
| ) |  |
| static

Try to reserve any path to a safe tile, ignoring the vehicle's destination.

Safe tiles are tiles in front of a signal, depots and station tiles at end of line.

Parameters

  v | The vehicle.
  tile | The tile the search should start from.
  td | The trackdir the search should start from.
  override_railtype | Whether all physically compatible railtypes should be followed.

Returns
  True if a path to a safe stopping tile could be reserved.

Definition at line 2593 of file train_cmd.cpp.

References YapfTrainFindNearestSafeTile().

## ◆ UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval()

void UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval | ( | TileIndex | tile,
|  | Axis | road_axis
| ) |  |

Update adjacent level crossing tiles in this multi-track crossing, due to removal of a level crossing tile.

Parameters

  tile | The crossing tile which has been or is about to be removed, and which caused the update.
  road_axis | The road axis.

Definition at line 1822 of file train_cmd.cpp.

References AxisToDiagDir(), CheckLevelCrossing(), GetCrossingRoadAxis(), IsCrossingBarred(), IsLevelCrossingTile(), MarkTileDirtyByTile(), ReverseDiagDir(), SetCrossingBarred(), Map::Size(), and TileOffsByDiagDir().

Referenced by CmdRemoveSingleRail(), and RemoveRoad().

## ◆ UpdateLevelCrossing()

void UpdateLevelCrossing | ( | TileIndex | tile,
|  | bool | sound,
|  | bool | force_bar
| ) |  |

Update a level crossing to barred or open (crossing may include multiple adjacent tiles).

Parameters

  tile | Tile which causes the update.
  sound | Should we play sound?
  force_bar | Should we force the crossing to be barred?

Definition at line 1773 of file train_cmd.cpp.

References AxisToDiagDir(), CheckLevelCrossing(), GetCrossingRoadAxis(), IsLevelCrossingTile(), ReverseDiagDir(), Map::Size(), TileAddByDiagDir(), and UpdateLevelCrossingTile().

Referenced by AfterLoadGame(), ChangeOwnershipOfCompanyItems(), CmdBuildRoad(), CmdBuildSingleRail(), Train::Crash(), DeleteLastWagon(), MaybeBarCrossingWithSound(), ReverseTrainDirection(), TrainController(), TryReserveRailTrack(), and UnreserveRailTrack().

## ◆ UpdateLevelCrossingTile()

static void UpdateLevelCrossingTile | ( | TileIndex | tile,
|  | bool | sound,
|  | bool | force_barred
| ) |  |
| static

Sets a level crossing tile to the correct state.

Parameters

  tile | Tile to update.
  sound | Should we play sound?
  force_barred | Should we set the crossing to barred?

Precondition
  tile is a rail-road crossing.

Definition at line 1751 of file train_cmd.cpp.

References _settings_client, SoundSettings::ambient, CheckLevelCrossing(), IsCrossingBarred(), IsLevelCrossingTile(), MarkTileDirtyByTile(), SetCrossingBarred(), SND_0E_LEVEL_CROSSING, and ClientSettings::sound.

Referenced by UpdateLevelCrossing().

## ◆ UpdateStatusAfterSwap()

static void UpdateStatusAfterSwap | ( | Train * | v | ) |
| static

Updates some variables after swapping the vehicle.

Parameters

  v | swapped vehicle

Definition at line 1593 of file train_cmd.cpp.

References Vehicle::direction, IsBridgeTile(), IsTileType(), MP_TUNNELBRIDGE, ReverseDir(), Vehicle::tile, TileVirtXY(), TRACK_BIT_DEPOT, TRACK_BIT_WORMHOLE, GroundVehicle< T, Type >::UpdateInclination(), Vehicle::UpdatePosition(), SpecializedVehicle< T, Type >::UpdateViewport(), VehicleEnterTile(), Vehicle::x_pos, and Vehicle::y_pos.

Referenced by ReverseTrainSwapVeh().

## ◆ ValidateTrains()

static CommandCost ValidateTrains | ( | Train * | original_dst,
|  | Train * | dst,
|  | Train * | original_src,
|  | Train * | src,
|  | bool | check_limit
| ) |  |
| static

Validate whether we are going to create valid trains.

Note
  All vehicles are/were 'heads' of their chains.

Parameters

  original_dst | The original destination chain.
  dst | The destination chain after constructing the train.
  original_src | The original source chain.
  src | The source chain after constructing the train.
  check_limit | Whether to check the vehicle limit.

Returns
  possible error of this command.

Definition at line 1102 of file train_cmd.cpp.

References CheckNewTrain(), CheckTrainAttachment(), and CommandCost::Failed().

Referenced by CmdMoveRailVehicle(), and CmdSellRailWagon().

## Variable Documentation

## ◆ _accel_slowdown

const AccelerationSlowdownParams _accel_slowdown[]
| static

Initial value:
= {
{256 / 4, 256 / 2, 256 / 4, 2},
{256 / 4, 256 / 2, 256 / 4, 2},
{0, 256 / 2, 256 / 4, 2},
}

Speed update fractions for each acceleration type.

Definition at line 3047 of file train_cmd.cpp.

Referenced by AffectSpeedByZChange(), and TrainController().

## ◆ _breakdown_speeds

const uint16_t _breakdown_speeds[16]
| static

Initial value:
= {
225, 210, 195, 180, 165, 150, 135, 120, 105, 90, 75, 60, 45, 30, 15, 15
}

Maximum speeds for train that is broken down or approaching line end.

Definition at line 3774 of file train_cmd.cpp.

Referenced by TrainApproachingLineEnd(), and TrainCheckIfLineEnds().

## ◆ _initial_tile_subcoord

const uint8_t _initial_tile_subcoord[6][4][3]
| static

Initial value:
= {
{{ 15, 8, 1 }, { 0, 0, 0 }, { 0, 8, 5 }, { 0, 0, 0 }},
{{ 0, 0, 0 }, { 8, 0, 3 }, { 0, 0, 0 }, { 8, 15, 7 }},
{{ 0, 0, 0 }, { 7, 0, 2 }, { 0, 7, 6 }, { 0, 0, 0 }},
{{ 15, 8, 2 }, { 0, 0, 0 }, { 0, 0, 0 }, { 8, 15, 6 }},
{{ 15, 7, 0 }, { 8, 0, 4 }, { 0, 0, 0 }, { 0, 0, 0 }},
{{ 0, 0, 0 }, { 0, 0, 0 }, { 0, 8, 4 }, { 7, 15, 0 }},
}

Definition at line 2447 of file train_cmd.cpp.

## ◆ _vehicle_initial_x_fract

const uint8_t _vehicle_initial_x_fract[4] = {10, 8, 4, 8}
| static

Definition at line 54 of file train_cmd.cpp.

## ◆ _vehicle_initial_y_fract

const uint8_t _vehicle_initial_y_fract[4] = { 8, 4, 8, 10}
| static

Definition at line 55 of file train_cmd.cpp.