OpenTTD Source 20241224-master-gee860a5c8e
rail_cmd.cpp File Reference

Handling of rail tiles. More...

#include "stdafx.h"
#include "viewport_func.h"
#include "command_func.h"
#include "depot_base.h"
#include "pathfinder/yapf/yapf_cache.h"
#include "newgrf_debug.h"
#include "newgrf_railtype.h"
#include "train.h"
#include "autoslope.h"
#include "water.h"
#include "tunnelbridge_map.h"
#include "vehicle_func.h"
#include "sound_func.h"
#include "tunnelbridge.h"
#include "elrail_func.h"
#include "town.h"
#include "pbs.h"
#include "company_base.h"
#include "core/backup_type.hpp"
#include "core/container_func.hpp"
#include "timer/timer_game_calendar.h"
#include "strings_func.h"
#include "company_gui.h"
#include "object_map.h"
#include "rail_cmd.h"
#include "landscape_cmd.h"
#include "table/strings.h"
#include "table/railtypes.h"
#include "table/track_land.h"
#include "safeguards.h"

Go to the source code of this file.

Data Structures

struct  FenceOffset
 Offsets for drawing fences. More...
 

Typedefs

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

Enumerations

enum  SignalOffsets {
  SIGNAL_TO_SOUTHWEST , SIGNAL_TO_NORTHEAST , SIGNAL_TO_SOUTHEAST , SIGNAL_TO_NORTHWEST ,
  SIGNAL_TO_EAST , SIGNAL_TO_WEST , SIGNAL_TO_SOUTH , SIGNAL_TO_NORTH
}
 Enum holding the signal offset in the sprite sheet according to the side it is representing. More...
 

Functions

void ResetRailTypes ()
 Reset all rail type information to its default values.
 
void ResolveRailTypeGUISprites (RailTypeInfo *rti)
 
static bool CompareRailTypes (const RailType &first, const RailType &second)
 Compare railtypes based on their sorting order.
 
void InitRailTypes ()
 Resolve sprites of custom rail types.
 
RailType AllocateRailType (RailTypeLabel label)
 Allocate a new rail type label.
 
static CommandCost EnsureNoTrainOnTrack (TileIndex tile, Track track)
 Tests if a vehicle interacts with the specified track.
 
static CommandCost CheckTrackCombination (TileIndex tile, TrackBits to_build)
 Check that the new track bits may be built.
 
Foundation GetRailFoundation (Slope tileh, TrackBits bits)
 Checks if a track combination is valid on a specific slope and returns the needed foundation.
 
static CommandCost CheckRailSlope (Slope tileh, TrackBits rail_bits, TrackBits existing, TileIndex tile)
 Tests if a track can be build on a tile.
 
static bool ValParamTrackOrientation (Track track)
 
CommandCost CmdBuildSingleRail (DoCommandFlag flags, TileIndex tile, RailType railtype, Track track, bool auto_remove_signals)
 Build a single piece of rail.
 
CommandCost CmdRemoveSingleRail (DoCommandFlag flags, TileIndex tile, Track track)
 Remove a single piece of track.
 
bool FloodHalftile (TileIndex t)
 Called from water_cmd if a non-flat rail-tile gets flooded and should be converted to shore.
 
static CommandCost ValidateAutoDrag (Trackdir *trackdir, TileIndex start, TileIndex end)
 
static CommandCost CmdRailTrackHelper (DoCommandFlag flags, TileIndex tile, TileIndex end_tile, RailType railtype, Track track, bool remove, bool auto_remove_signals, bool fail_on_obstacle)
 Build or remove a stretch of railroad tracks.
 
CommandCost CmdBuildRailroadTrack (DoCommandFlag flags, TileIndex end_tile, TileIndex start_tile, RailType railtype, Track track, bool auto_remove_signals, bool fail_on_obstacle)
 Build rail on a stretch of track.
 
CommandCost CmdRemoveRailroadTrack (DoCommandFlag flags, TileIndex end_tile, TileIndex start_tile, Track track)
 Build rail on a stretch of track.
 
CommandCost CmdBuildTrainDepot (DoCommandFlag flags, TileIndex tile, RailType railtype, DiagDirection dir)
 Build a train depot.
 
CommandCost CmdBuildSingleSignal (DoCommandFlag flags, TileIndex tile, Track track, SignalType sigtype, SignalVariant sigvar, bool convert_signal, bool skip_existing_signals, bool ctrl_pressed, SignalType cycle_start, SignalType cycle_stop, uint8_t num_dir_cycle, uint8_t signals_copy)
 Build signals, alternate between double/single, signal/semaphore, pre/exit/combo-signals, and what-else not.
 
static bool AdvanceSignalAutoFill (TileIndex &tile, Trackdir &trackdir, bool remove)
 
static CommandCost CmdSignalTrackHelper (DoCommandFlag flags, TileIndex tile, TileIndex end_tile, Track track, SignalType sigtype, SignalVariant sigvar, bool mode, bool remove, bool autofill, bool minimise_gaps, int signal_density)
 Build many signals by dragging; AutoSignals.
 
CommandCost CmdBuildSignalTrack (DoCommandFlag flags, TileIndex tile, TileIndex end_tile, Track track, SignalType sigtype, SignalVariant sigvar, bool mode, bool autofill, bool minimise_gaps, uint8_t signal_density)
 Build signals on a stretch of track.
 
CommandCost CmdRemoveSingleSignal (DoCommandFlag flags, TileIndex tile, Track track)
 Remove signals.
 
CommandCost CmdRemoveSignalTrack (DoCommandFlag flags, TileIndex tile, TileIndex end_tile, Track track, bool autofill)
 Remove signals on a stretch of track.
 
static VehicleUpdateTrainPowerProc (Vehicle *v, void *data)
 Update power of train under which is the railtype being converted.
 
CommandCost CmdConvertRail (DoCommandFlag flags, TileIndex tile, TileIndex area_start, RailType totype, bool diagonal)
 Convert one rail type to the other.
 
static CommandCost RemoveTrainDepot (TileIndex tile, DoCommandFlag flags)
 
static CommandCost ClearTile_Track (TileIndex tile, DoCommandFlag flags)
 
static uint GetSaveSlopeZ (uint x, uint y, Track track)
 Get surface height in point (x,y) On tiles with halftile foundations move (x,y) to a safe point wrt.
 
static void DrawSingleSignal (TileIndex tile, const RailTypeInfo *rti, Track track, SignalState condition, SignalOffsets image, uint pos)
 
static void DrawTrackFence (const TileInfo *ti, SpriteID base_image, uint num_sprites, RailFenceOffset rfo)
 Draw a track fence.
 
static void DrawTrackFence_NW (const TileInfo *ti, SpriteID base_image, uint num_sprites)
 Draw fence at NW border matching the tile slope.
 
static void DrawTrackFence_SE (const TileInfo *ti, SpriteID base_image, uint num_sprites)
 Draw fence at SE border matching the tile slope.
 
static void DrawTrackFence_NE (const TileInfo *ti, SpriteID base_image, uint num_sprites)
 Draw fence at NE border matching the tile slope.
 
static void DrawTrackFence_SW (const TileInfo *ti, SpriteID base_image, uint num_sprites)
 Draw fence at SW border matching the tile slope.
 
static void DrawTrackDetails (const TileInfo *ti, const RailTypeInfo *rti)
 Draw track fences.
 
static void DrawTrackSprite (SpriteID sprite, PaletteID pal, const TileInfo *ti, Slope s)
 
static void DrawTrackBitsOverlay (TileInfo *ti, TrackBits track, const RailTypeInfo *rti)
 
static void DrawTrackBits (TileInfo *ti, TrackBits track)
 Draw ground sprite and track bits.
 
static void DrawSignals (TileIndex tile, TrackBits rails, const RailTypeInfo *rti)
 
static void DrawTile_Track (TileInfo *ti)
 
void DrawTrainDepotSprite (int x, int y, int dir, RailType railtype)
 
static int GetSlopePixelZ_Track (TileIndex tile, uint x, uint y, bool)
 
static Foundation GetFoundation_Track (TileIndex tile, Slope tileh)
 
static void TileLoop_Track (TileIndex tile)
 
static TrackStatus GetTileTrackStatus_Track (TileIndex tile, TransportType mode, uint, DiagDirection side)
 
static bool ClickTile_Track (TileIndex tile)
 
static void GetTileDesc_Track (TileIndex tile, TileDesc *td)
 
static void ChangeTileOwner_Track (TileIndex tile, Owner old_owner, Owner new_owner)
 
int TicksToLeaveDepot (const Train *v)
 Compute number of ticks when next wagon will leave a depot.
 
static VehicleEnterTileStatus VehicleEnter_Track (Vehicle *u, TileIndex tile, int x, int y)
 Tile callback routine when vehicle enters tile.
 
static CommandCost TestAutoslopeOnRailTile (TileIndex tile, uint flags, int z_old, Slope tileh_old, int z_new, Slope tileh_new, TrackBits rail_bits)
 Tests if autoslope is allowed.
 
static VehicleEnsureNoShipProc (Vehicle *v, void *)
 Test-procedure for HasVehicleOnPos to check for a ship.
 
static CommandCost TerraformTile_Track (TileIndex tile, DoCommandFlag flags, int z_new, Slope tileh_new)
 

Variables

RailTypeInfo _railtypes [RAILTYPE_END]
 
std::vector< RailType_sorted_railtypes
 
RailTypes _railtypes_hidden_mask
 
static const uint8_t _track_sloped_sprites [14]
 
static const TrackBits _valid_tracks_without_foundation [15]
 Valid TrackBits on a specific (non-steep)-slope without foundation.
 
static const TrackBits _valid_tracks_on_leveled_foundation [15]
 Valid TrackBits on a specific (non-steep)-slope with leveled foundation.
 
static const TileIndexDiffC _trackdelta []
 
static uint32_t _drawtile_track_palette
 
static FenceOffset _fence_offsets []
 Offsets for drawing fences.
 
static const int INF = 1000
 
static const SubSprite _halftile_sub_sprite [4]
 
static const uint8_t _fractcoords_behind [4] = { 0x8F, 0x8, 0x80, 0xF8 }
 
static const uint8_t _fractcoords_enter [4] = { 0x8A, 0x48, 0x84, 0xA8 }
 
static const int8_t _deltacoord_leaveoffset [8]
 
const TileTypeProcs _tile_type_rail_procs
 

Detailed Description

Handling of rail tiles.

Definition in file rail_cmd.cpp.

Typedef Documentation

◆ TrainList

typedef std::vector<Train *> TrainList

Helper type for lists/vectors of trains.

Definition at line 44 of file rail_cmd.cpp.

Enumeration Type Documentation

◆ SignalOffsets

Enum holding the signal offset in the sprite sheet according to the side it is representing.

Definition at line 51 of file rail_cmd.cpp.

Function Documentation

◆ AdvanceSignalAutoFill()

static bool AdvanceSignalAutoFill ( TileIndex tile,
Trackdir trackdir,
bool  remove 
)
static

Definition at line 1199 of file rail_cmd.cpp.

◆ AllocateRailType()

◆ ChangeTileOwner_Track()

static void ChangeTileOwner_Track ( TileIndex  tile,
Owner  old_owner,
Owner  new_owner 
)
static

Definition at line 2874 of file rail_cmd.cpp.

◆ CheckRailSlope()

static CommandCost CheckRailSlope ( Slope  tileh,
TrackBits  rail_bits,
TrackBits  existing,
TileIndex  tile 
)
static

Tests if a track can be build on a tile.

Parameters
tilehTile slope.
rail_bitsTracks to build.
existingTracks already built.
tileTile (used for water test)
Returns
Error message or cost for foundation building.

Definition at line 392 of file rail_cmd.cpp.

References _settings_game, _valid_tracks_on_leveled_foundation, ConstructionSettings::build_on_slopes, GameSettings::construction, EXPENSES_CONSTRUCTION, FLOOD_NONE, FOUNDATION_INVALID, FOUNDATION_NONE, GetFloodingBehaviour(), GetRailFoundation(), and IsSteepSlope().

Referenced by CmdBuildSingleRail(), and TestAutoslopeOnRailTile().

◆ CheckTrackCombination()

static CommandCost CheckTrackCombination ( TileIndex  tile,
TrackBits  to_build 
)
static

Check that the new track bits may be built.

Parameters
tileTile to build on.
to_buildNew track bits.
Returns
Succeeded or failed command.

Definition at line 241 of file rail_cmd.cpp.

References GetTrackBits(), and IsPlainRail().

Referenced by CmdBuildSingleRail().

◆ ClearTile_Track()

static CommandCost ClearTile_Track ( TileIndex  tile,
DoCommandFlag  flags 
)
static

Definition at line 1800 of file rail_cmd.cpp.

◆ ClickTile_Track()

static bool ClickTile_Track ( TileIndex  tile)
static

Definition at line 2773 of file rail_cmd.cpp.

◆ CmdBuildRailroadTrack()

CommandCost CmdBuildRailroadTrack ( DoCommandFlag  flags,
TileIndex  end_tile,
TileIndex  start_tile,
RailType  railtype,
Track  track,
bool  auto_remove_signals,
bool  fail_on_obstacle 
)

Build rail on a stretch of track.

Stub for the unified rail builder/remover

Parameters
flagsoperation to perform
end_tileend tile of drag
start_tilestart tile of drag
railtyperailroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev), only used for building
tracktrack-orientation
auto_remove_signalsfalse = build up to an obstacle, true = fail if an obstacle is found (used for AIs).
fail_on_obstaclefalse = error on signal in the way, true = auto remove signals when in the way
See also
CmdRailTrackHelper

Definition at line 932 of file rail_cmd.cpp.

References CmdRailTrackHelper().

◆ CmdBuildSignalTrack()

CommandCost CmdBuildSignalTrack ( DoCommandFlag  flags,
TileIndex  tile,
TileIndex  end_tile,
Track  track,
SignalType  sigtype,
SignalVariant  sigvar,
bool  mode,
bool  autofill,
bool  minimise_gaps,
uint8_t  signal_density 
)

Build signals on a stretch of track.

Stub for the unified signal builder/remover

Parameters
flagsoperation to perform
tilestart tile of drag
end_tileend tile of drag
tracktrack-orientation
sigtypedefault signal type
sigvarsignal variant to build
modetrue = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
autofillfill beyond selected stretch?
minimise_gapsfalse = keep fixed distance, true = minimise gaps between signals
signal_densityuser defined signals_density
Returns
the cost of this operation or an error
See also
CmdSignalTrackHelper

Definition at line 1449 of file rail_cmd.cpp.

References CmdSignalTrackHelper().

◆ CmdBuildSingleRail()

CommandCost CmdBuildSingleRail ( DoCommandFlag  flags,
TileIndex  tile,
RailType  railtype,
Track  track,
bool  auto_remove_signals 
)

Build a single piece of rail.

Parameters
flagsoperation to perform
tiletile to build on
railtyperailtype of being built piece (normal, mono, maglev)
tracktrack-orientation
auto_remove_signalsfalse = error on signal in the way, true = auto remove signals when in the way
Returns
the cost of this operation or an error

Definition at line 426 of file rail_cmd.cpp.

References _current_company, _settings_game, CommandCost::AddCost(), AddTrackToSignalBuffer(), AXIS_X, AXIS_Y, CheckForDockingTile(), CheckOwnership(), CheckRailSlope(), CheckTileOwnership(), CheckTrackCombination(), CMD_ERROR, GameSettings::construction, CountBits(), ConstructionSettings::crossing_with_competitor, DC_EXEC, DirtyCompanyInfrastructureWindows(), DRD_NONE, EnsureNoTrainOnTrack(), EnsureNoVehicleOnGround(), EXPENSES_CONSTRUCTION, CommandCost::Failed(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), GetCrossingRailBits(), GetCrossingRoadAxis(), GetDisallowedRoadDirections(), GetRailType(), GetRoadBits(), GetRoadOwner(), GetTileOwner(), GetTileSlope(), GetTileType(), GetTownIndex(), GetTrackBits(), HasBit(), HasExactlyOneBit(), HasPowerOnRail(), HasRoadWorks(), HasSignalOnTrack(), HasSignals(), HasTrack(), INVALID_ROADTYPE, IsCompatibleRail(), IsLevelCrossing(), IsNormalRoad(), IsPlainRail(), IsSlopeWithOneCornerRaised(), IsTileType(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::IsValidID(), LEVELCROSSING_TRACKBIT_FACTOR, MakeRoadCrossing(), MarkDirtyAdjacentLevelCrossingTiles(), MarkTileDirtyByTile(), MP_RAILWAY, MP_ROAD, MP_WATER, OWNER_DEITY, RAIL_GROUND_BARREN, RAIL_GROUND_WATER, RailBuildCost(), RailNoLevelCrossings(), ROAD_NONE, ROAD_X, ROAD_Y, RoadBuildCost(), RoadNoLevelCrossing(), SetTrackBits(), CommandCost::Succeeded(), TRACK_BEGIN, TRACK_BIT_NONE, TRACK_END, TRACK_X, TRACK_Y, TracksOverlap(), TrackToTrackBits(), UpdateLevelCrossing(), VALID_LEVEL_CROSSING_SLOPES, ValParamRailType(), and YapfNotifyTrackLayoutChange().

◆ CmdBuildSingleSignal()

CommandCost CmdBuildSingleSignal ( DoCommandFlag  flags,
TileIndex  tile,
Track  track,
SignalType  sigtype,
SignalVariant  sigvar,
bool  convert_signal,
bool  skip_existing_signals,
bool  ctrl_pressed,
SignalType  cycle_start,
SignalType  cycle_stop,
uint8_t  num_dir_cycle,
uint8_t  signals_copy 
)

Build signals, alternate between double/single, signal/semaphore, pre/exit/combo-signals, and what-else not.

If the rail piece does not have any signals, signal cycling is ignored

Parameters
flagsoperation to perform
tiletile where to build the signals
tracktrack-orientation
sigtypetype of the signal
sigvarvariant of signal type (normal/semaphore)
ctrl_pressedtrue = override signal/semaphore, or pre/exit/combo signal or toggle variant (CTRL-toggle)
convert_signalconvert the present signal type and variant
cycle_startstart cycle from this signal type
cycle_stopwrap around after this signal type
num_dir_cyclecycle the signal direction this many times
skip_existing_signalstrue = don't modify an existing signal but don't fail either, false = always set new signal type
signals_copyused for CmdBuildManySignals() to copy direction of first signal
Returns
the cost of this operation or an error
Todo:
p2 should be replaced by two bits for "along" and "against" the track.

Definition at line 1052 of file rail_cmd.cpp.

References _current_company, _settings_game, AddTrackToSignalBuffer(), CheckTileOwnership(), CMD_ERROR, CountBits(), Vehicle::cur_speed, Vehicle::current_order, DC_EXEC, DirtyCompanyInfrastructureWindows(), EnsureNoVehicleOnGround(), EXPENSES_CONSTRUCTION, CommandCost::Failed(), PathfinderSettings::forbid_90_deg, FreeTrainTrackReservation(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), GetPresentSignals(), GetRailReservationTrackBits(), GetSignalStates(), GetTileOwner(), GetTrackBits(), GetTrainForReservation(), Train::GetVehicleTrackdir(), HasBit(), HasReservedTracks(), HasSignalOnTrack(), HasSignals(), HasTrack(), IsPlainRailTile(), IsSafeWaitingPosition(), Order::IsType(), KillFirstBit(), MarkTileDirtyByTile(), GameSettings::pf, SetHasSignals(), SetPresentSignals(), SetSignalStates(), SIG_ELECTRIC, SIG_SEMAPHORE, SignalOnTrack(), Vehicle::tile, TRACK_BIT_DEPOT, TracksOverlap(), TrackToTrackBits(), TryPathReserve(), Vehicle::vehstatus, VS_STOPPED, and YapfNotifyTrackLayoutChange().

◆ CmdBuildTrainDepot()

◆ CmdConvertRail()

CommandCost CmdConvertRail ( DoCommandFlag  flags,
TileIndex  tile,
TileIndex  area_start,
RailType  totype,
bool  diagonal 
)

Convert one rail type to the other.

You can convert normal rail to monorail/maglev easily or vice-versa.

Parameters
flagsoperation to perform
tileend tile of rail conversion drag
area_startstart tile of drag
totypenew railtype to convert to.
diagonalbuild diagonally or not.
Returns
the cost of this operation or an error

Definition at line 1553 of file rail_cmd.cpp.

References _settings_game, CommandCost::AddCost(), CCF_TRACK, CheckTileOwnership(), CMD_ERROR, CountBits(), TileIterator::Create(), DC_EXEC, DiagDirToDiagTrack(), DirtyCompanyInfrastructureWindows(), VehicleSettings::disable_elrails, EnsureNoTrainOnTrackBits(), EnsureNoVehicleOnGround(), EXPENSES_CONSTRUCTION, CommandCost::Failed(), FindVehicleOnPos(), FreeTrainTrackReservation(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), GetCrossingRailTrack(), GetOtherTunnelBridgeEnd(), GetRailDepotTrack(), GetRailStationTrack(), GetRailTileType(), GetRailType(), GetReservedTrackbits(), GetTileOwner(), GetTileType(), GetTrackBits(), GetTrainForReservation(), GetTunnelBridgeDirection(), GetTunnelBridgeLength(), GetTunnelBridgeTransportType(), HasPowerOnRail(), HasStationRail(), HasTunnelBridgeReservation(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Company::infrastructure, INVALID_TILE, INVALID_TRACK, InvalidateWindowData(), IsBridge(), IsCompatibleRail(), IsLevelCrossing(), IsLevelCrossingTile(), IsPlainRailTile(), IsRailStationTile(), IsStationTileBlocked(), LEVELCROSSING_TRACKBIT_FACTOR, CommandCost::MakeError(), MarkBridgeDirty(), MarkTileDirtyByTile(), MP_RAILWAY, MP_ROAD, MP_STATION, MP_TUNNELBRIDGE, CompanyInfrastructure::rail, RAIL_TILE_DEPOT, RailConvertCost(), RailNoLevelCrossings(), RAILTYPE_ELECTRIC, RAILTYPE_RAIL, RemoveFirstTrack(), SetRailType(), Map::Size(), TRACK_BIT_NONE, TracksOverlap(), TRANSPORT_RAIL, TryPathReserve(), TUNNELBRIDGE_TRACKBIT_FACTOR, TunnelBridgeIsFree(), UpdateTrainPowerProc(), ValParamRailType(), GameSettings::vehicle, WC_BUILD_VEHICLE, WC_VEHICLE_DEPOT, and YapfNotifyTrackLayoutChange().

◆ CmdRailTrackHelper()

static CommandCost CmdRailTrackHelper ( DoCommandFlag  flags,
TileIndex  tile,
TileIndex  end_tile,
RailType  railtype,
Track  track,
bool  remove,
bool  auto_remove_signals,
bool  fail_on_obstacle 
)
static

Build or remove a stretch of railroad tracks.

Parameters
flagsoperation to perform
tilestart tile of drag
end_tileend tile of drag
railtyperailroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev), only used for building
tracktrack-orientation
removeremove tracks?
auto_remove_signalsfalse = error on signal in the way, true = auto remove signals when in the way, only used for building
fail_on_obstaclefalse = build starting from and up to an obstacle, true = fail if an obstacle is found (used for AIs)
Returns
the cost of this operation or an error

Definition at line 876 of file rail_cmd.cpp.

References CommandCost::AddCost(), CMD_ERROR, EXPENSES_CONSTRUCTION, CommandCost::Failed(), CommandCost::GetErrorMessage(), IsDiagonalTrackdir(), Map::Size(), ToggleBit(), ToTileIndexDiff(), TrackdirToTrack(), TrackToTrackdir(), and ValParamRailType().

Referenced by CmdBuildRailroadTrack(), and CmdRemoveRailroadTrack().

◆ CmdRemoveRailroadTrack()

CommandCost CmdRemoveRailroadTrack ( DoCommandFlag  flags,
TileIndex  end_tile,
TileIndex  start_tile,
Track  track 
)

Build rail on a stretch of track.

Stub for the unified rail builder/remover

Parameters
flagsoperation to perform
end_tileend tile of drag
start_tilestart tile of drag
tracktrack-orientation
Returns
the cost of this operation or an error
See also
CmdRailTrackHelper

Definition at line 947 of file rail_cmd.cpp.

References CmdRailTrackHelper(), and INVALID_RAILTYPE.

◆ CmdRemoveSignalTrack()

CommandCost CmdRemoveSignalTrack ( DoCommandFlag  flags,
TileIndex  tile,
TileIndex  end_tile,
Track  track,
bool  autofill 
)

Remove signals on a stretch of track.

Stub for the unified signal builder/remover

Parameters
flagsoperation to perform
tilestart tile of drag
end_tileend tile of drag
tracktrack-orientation
autofillfill beyond selected stretch?
Returns
the cost of this operation or an error
See also
CmdSignalTrackHelper

Definition at line 1527 of file rail_cmd.cpp.

References CmdSignalTrackHelper(), SIG_ELECTRIC, and SIGTYPE_BLOCK.

◆ CmdRemoveSingleRail()

CommandCost CmdRemoveSingleRail ( DoCommandFlag  flags,
TileIndex  tile,
Track  track 
)

Remove a single piece of track.

Parameters
flagsoperation to perform
tiletile to remove track from
trackrail orientation
Returns
the cost of this operation or an error

Definition at line 615 of file rail_cmd.cpp.

References _current_company, CommandCost::AddCost(), AddTrackToSignalBuffer(), CheckTileOwnership(), CMD_ERROR, CountBits(), DC_BANKRUPT, DC_EXEC, DeleteNewGRFInspectWindow(), DirtyCompanyInfrastructureWindows(), EnsureNoTrainOnTrack(), EnsureNoVehicleOnGround(), EXPENSES_CONSTRUCTION, CommandCost::Failed(), FreeTrainTrackReservation(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Get(), GetCrossingRailBits(), GetCrossingRoadAxis(), GetCrossingRoadBits(), GetRailReservationTrackBits(), GetRailType(), GetRoadOwner(), GetTileOwner(), GetTileSlope(), GetTileType(), GetTownIndex(), GetTrackBits(), GetTrainForReservation(), HasReservedTracks(), HasSignalOnTrack(), INVALID_OWNER, IsDockingTile(), IsLevelCrossing(), IsPlainRail(), IsSlopeWithOneCornerRaised(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::IsValidID(), LEVELCROSSING_TRACKBIT_FACTOR, MakeRoadNormal(), MakeShore(), MarkTileDirtyByTile(), MP_RAILWAY, MP_ROAD, OWNER_WATER, RAIL_GROUND_WATER, RailClearCost(), SetDockingTile(), SetTrackBits(), SetTrackReservation(), TRACK_BIT_X, TRACK_BIT_Y, TRACK_X, TRACK_Y, TracksOverlap(), TrackToTrackBits(), TryPathReserve(), UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval(), and YapfNotifyTrackLayoutChange().

◆ CmdRemoveSingleSignal()

◆ CmdSignalTrackHelper()

static CommandCost CmdSignalTrackHelper ( DoCommandFlag  flags,
TileIndex  tile,
TileIndex  end_tile,
Track  track,
SignalType  sigtype,
SignalVariant  sigvar,
bool  mode,
bool  remove,
bool  autofill,
bool  minimise_gaps,
int  signal_density 
)
static

Build many signals by dragging; AutoSignals.

Parameters
flagsoperation to perform
tilestart tile of drag
end_tileend tile of drag
tracktrack-orientation
sigtypedefault signal type
sigvarsignal variant to build
modetrue = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
removeremove signals?
autofillfill beyond selected stretch?
minimise_gapsfalse = keep fixed distance, true = minimise gaps between signals
signal_densityuser defined signals_density
Returns
the cost of this operation or an error

Definition at line 1258 of file rail_cmd.cpp.

References CommandCost::AddCost(), CMD_ERROR, EXPENSES_CONSTRUCTION, CommandCost::Failed(), CommandCost::GetErrorMessage(), GetOtherTunnelBridgeEnd(), GetPresentSignals(), GetTileType(), GetTunnelBridgeLength(), HasBit(), HasSignalOnTrack(), HasTrack(), INVALID_STRING_ID, INVALID_TILE, INVALID_TRACKDIR, IsDiagonalTrackdir(), IsPlainRailTile(), MP_RAILWAY, MP_ROAD, MP_TUNNELBRIDGE, SetBit(), SIG_SEMAPHORE, SignalAgainstTrackdir(), SignalAlongTrackdir(), SignalOnTrack(), SIGTYPE_BLOCK, SIGTYPE_ENTRY, SIGTYPE_EXIT, Map::Size(), CommandCost::Succeeded(), ToggleBit(), ToTileIndexDiff(), TrackdirToTrack(), and TrackToTrackdir().

Referenced by CmdBuildSignalTrack(), and CmdRemoveSignalTrack().

◆ CompareRailTypes()

static bool CompareRailTypes ( const RailType first,
const RailType second 
)
static

Compare railtypes based on their sorting order.

Parameters
firstThe railtype to compare to.
secondThe railtype to compare.
Returns
True iff the first should be sorted before the second.

Definition at line 122 of file rail_cmd.cpp.

References GetRailTypeInfo(), and RailTypeInfo::sorting_order.

Referenced by InitRailTypes().

◆ DrawSignals()

static void DrawSignals ( TileIndex  tile,
TrackBits  rails,
const RailTypeInfo rti 
)
static

Definition at line 2388 of file rail_cmd.cpp.

◆ DrawSingleSignal()

static void DrawSingleSignal ( TileIndex  tile,
const RailTypeInfo rti,
Track  track,
SignalState  condition,
SignalOffsets  image,
uint  pos 
)
static

Definition at line 1871 of file rail_cmd.cpp.

◆ DrawTile_Track()

static void DrawTile_Track ( TileInfo ti)
static

Definition at line 2422 of file rail_cmd.cpp.

◆ DrawTrackBits()

static void DrawTrackBits ( TileInfo ti,
TrackBits  track 
)
static

◆ DrawTrackBitsOverlay()

static void DrawTrackBitsOverlay ( TileInfo ti,
TrackBits  track,
const RailTypeInfo rti 
)
static

Definition at line 2072 of file rail_cmd.cpp.

◆ DrawTrackDetails()

◆ DrawTrackFence()

static void DrawTrackFence ( const TileInfo ti,
SpriteID  base_image,
uint  num_sprites,
RailFenceOffset  rfo 
)
static

Draw a track fence.

Parameters
tiTile drawing information.
base_imageFirst fence sprite.
num_spritesNumber of fence sprites.
rfoFence to draw.

Definition at line 1951 of file rail_cmd.cpp.

References _fence_offsets, AddSortableSpriteToDraw(), GetSlopePixelZInCorner(), FenceOffset::height_ref, RemoveHalftileSlope(), TileInfo::tileh, TileInfo::x, FenceOffset::x_offs, FenceOffset::x_size, TileInfo::y, FenceOffset::y_offs, FenceOffset::y_size, and TileInfo::z.

Referenced by DrawTrackDetails(), DrawTrackFence_NE(), DrawTrackFence_NW(), DrawTrackFence_SE(), and DrawTrackFence_SW().

◆ DrawTrackFence_NE()

static void DrawTrackFence_NE ( const TileInfo ti,
SpriteID  base_image,
uint  num_sprites 
)
static

Draw fence at NE border matching the tile slope.

Definition at line 1988 of file rail_cmd.cpp.

References DrawTrackFence(), RFO_FLAT_Y_NE, RFO_SLOPE_NW_NE, RFO_SLOPE_SE_NE, SLOPE_E, SLOPE_NE, and TileInfo::tileh.

Referenced by DrawTrackDetails().

◆ DrawTrackFence_NW()

static void DrawTrackFence_NW ( const TileInfo ti,
SpriteID  base_image,
uint  num_sprites 
)
static

Draw fence at NW border matching the tile slope.

Definition at line 1968 of file rail_cmd.cpp.

References DrawTrackFence(), RFO_FLAT_X_NW, RFO_SLOPE_NE_NW, RFO_SLOPE_SW_NW, SLOPE_NW, SLOPE_W, and TileInfo::tileh.

Referenced by DrawTrackDetails().

◆ DrawTrackFence_SE()

static void DrawTrackFence_SE ( const TileInfo ti,
SpriteID  base_image,
uint  num_sprites 
)
static

Draw fence at SE border matching the tile slope.

Definition at line 1978 of file rail_cmd.cpp.

References DrawTrackFence(), RFO_FLAT_X_SE, RFO_SLOPE_NE_SE, RFO_SLOPE_SW_SE, SLOPE_S, SLOPE_SE, and TileInfo::tileh.

Referenced by DrawTrackDetails().

◆ DrawTrackFence_SW()

static void DrawTrackFence_SW ( const TileInfo ti,
SpriteID  base_image,
uint  num_sprites 
)
static

Draw fence at SW border matching the tile slope.

Definition at line 1998 of file rail_cmd.cpp.

References DrawTrackFence(), RFO_FLAT_Y_SW, RFO_SLOPE_NW_SW, RFO_SLOPE_SE_SW, SLOPE_S, SLOPE_SW, and TileInfo::tileh.

Referenced by DrawTrackDetails().

◆ DrawTrackSprite()

static void DrawTrackSprite ( SpriteID  sprite,
PaletteID  pal,
const TileInfo ti,
Slope  s 
)
inlinestatic

Definition at line 2067 of file rail_cmd.cpp.

◆ DrawTrainDepotSprite()

void DrawTrainDepotSprite ( int  x,
int  y,
int  dir,
RailType  railtype 
)

Definition at line 2543 of file rail_cmd.cpp.

◆ EnsureNoShipProc()

static Vehicle * EnsureNoShipProc ( Vehicle v,
void *   
)
static

Test-procedure for HasVehicleOnPos to check for a ship.

Definition at line 3036 of file rail_cmd.cpp.

References BaseVehicle::type, and VEH_SHIP.

◆ EnsureNoTrainOnTrack()

static CommandCost EnsureNoTrainOnTrack ( TileIndex  tile,
Track  track 
)
static

Tests if a vehicle interacts with the specified track.

All track bits interact except parallel TRACK_BIT_HORZ or TRACK_BIT_VERT.

Parameters
tileThe tile.
trackThe track.
Returns
Succeeded command (no train found), or a failed command (a train was found).

Definition at line 229 of file rail_cmd.cpp.

References EnsureNoTrainOnTrackBits(), and TrackToTrackBits().

Referenced by CmdBuildSingleRail(), and CmdRemoveSingleRail().

◆ FloodHalftile()

bool FloodHalftile ( TileIndex  t)

Called from water_cmd if a non-flat rail-tile gets flooded and should be converted to shore.

The function floods the lower halftile, if the tile has a halftile foundation.

Parameters
tThe tile to flood.
Returns
true if something was flooded.

Definition at line 762 of file rail_cmd.cpp.

References _current_company, ApplyFoundationToSlope(), CornerToTrackBits(), DC_EXEC, FindFirstTrack(), GetHighestSlopeCorner(), GetRailFoundation(), GetTileSlope(), GetTrackBits(), IsNonContinuousFoundation(), IsPlainRailTile(), IsSlopeWithOneCornerRaised(), IsSlopeWithThreeCornersRaised(), IsSteepSlope(), MakeShore(), MarkTileDirtyByTile(), OppositeCorner(), OWNER_WATER, RAIL_GROUND_WATER, and Backup< T >::Restore().

Referenced by DoFloodTile().

◆ GetFoundation_Track()

static Foundation GetFoundation_Track ( TileIndex  tile,
Slope  tileh 
)
static

Definition at line 2583 of file rail_cmd.cpp.

◆ GetRailFoundation()

◆ GetSaveSlopeZ()

static uint GetSaveSlopeZ ( uint  x,
uint  y,
Track  track 
)
static

Get surface height in point (x,y) On tiles with halftile foundations move (x,y) to a safe point wrt.

track

Definition at line 1859 of file rail_cmd.cpp.

References GetSlopePixelZ(), TRACK_LEFT, TRACK_LOWER, TRACK_RIGHT, and TRACK_UPPER.

◆ GetSlopePixelZ_Track()

static int GetSlopePixelZ_Track ( TileIndex  tile,
uint  x,
uint  y,
bool   
)
static

Definition at line 2570 of file rail_cmd.cpp.

◆ GetTileDesc_Track()

static void GetTileDesc_Track ( TileIndex  tile,
TileDesc td 
)
static

Definition at line 2781 of file rail_cmd.cpp.

◆ GetTileTrackStatus_Track()

static TrackStatus GetTileTrackStatus_Track ( TileIndex  tile,
TransportType  mode,
uint  ,
DiagDirection  side 
)
static

Definition at line 2711 of file rail_cmd.cpp.

◆ InitRailTypes()

void InitRailTypes ( )

Resolve sprites of custom rail types.

Definition at line 130 of file rail_cmd.cpp.

References CompareRailTypes(), RailTypeInfo::flags, HasBit(), RAILTYPE_BEGIN, RAILTYPE_END, RTF_HIDDEN, and SetBit().

Referenced by AfterLoadGRFs().

◆ RemoveTrainDepot()

static CommandCost RemoveTrainDepot ( TileIndex  tile,
DoCommandFlag  flags 
)
static

Definition at line 1766 of file rail_cmd.cpp.

◆ ResetRailTypes()

void ResetRailTypes ( )

Reset all rail type information to its default values.

Definition at line 65 of file rail_cmd.cpp.

References _original_railtypes, lengthof, and RAILTYPES_NONE.

Referenced by ResetNewGRFData().

◆ ResolveRailTypeGUISprites()

void ResolveRailTypeGUISprites ( RailTypeInfo rti)

Definition at line 75 of file rail_cmd.cpp.

◆ TerraformTile_Track()

static CommandCost TerraformTile_Track ( TileIndex  tile,
DoCommandFlag  flags,
int  z_new,
Slope  tileh_new 
)
static

Definition at line 3041 of file rail_cmd.cpp.

◆ TestAutoslopeOnRailTile()

static CommandCost TestAutoslopeOnRailTile ( TileIndex  tile,
uint  flags,
int  z_old,
Slope  tileh_old,
int  z_new,
Slope  tileh_new,
TrackBits  rail_bits 
)
static

Tests if autoslope is allowed.

Parameters
tileThe tile.
flagsTerraform command flags.
z_oldOld TileZ.
tileh_oldOld TileSlope.
z_newNew TileZ.
tileh_newNew TileSlope.
rail_bitsTrackbits.

Definition at line 2994 of file rail_cmd.cpp.

References _settings_game, CommandCost::AddCost(), ApplyFoundationToSlope(), AutoslopeEnabled(), ConstructionSettings::build_on_slopes, CheckRailSlope(), GameSettings::construction, DC_EXEC, EXPENSES_CONSTRUCTION, GetRailFoundation(), GetSlopeZInCorner(), IsSlopeWithOneCornerRaised(), RAIL_GROUND_BARREN, RAIL_GROUND_WATER, RemoveHalftileSlope(), TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_NONE, TRACK_BIT_RIGHT, and TRACK_BIT_UPPER.

◆ TicksToLeaveDepot()

int TicksToLeaveDepot ( const Train v)

Compute number of ticks when next wagon will leave a depot.

Negative means next wagon should have left depot n ticks before.

Parameters
vvehicle outside (leaving) the depot
Returns
number of ticks when the next wagon will leave

Definition at line 2916 of file rail_cmd.cpp.

References Train::CalcNextVehicleOffset(), DIAGDIR_NE, DIAGDIR_NW, DIAGDIR_SE, DIAGDIR_SW, GetRailDepotDirection(), Vehicle::tile, Vehicle::x_pos, and Vehicle::y_pos.

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

◆ TileLoop_Track()

static void TileLoop_Track ( TileIndex  tile)
static

Definition at line 2588 of file rail_cmd.cpp.

◆ UpdateTrainPowerProc()

static Vehicle * UpdateTrainPowerProc ( Vehicle v,
void *  data 
)
static

Update power of train under which is the railtype being converted.

Definition at line 1533 of file rail_cmd.cpp.

References SpecializedVehicle< T, Type >::From(), include(), BaseVehicle::type, and VEH_TRAIN.

Referenced by CmdConvertRail().

◆ ValidateAutoDrag()

static CommandCost ValidateAutoDrag ( Trackdir trackdir,
TileIndex  start,
TileIndex  end 
)
static

Definition at line 817 of file rail_cmd.cpp.

◆ ValParamTrackOrientation()

static bool ValParamTrackOrientation ( Track  track)
inlinestatic

Definition at line 412 of file rail_cmd.cpp.

◆ VehicleEnter_Track()

Variable Documentation

◆ _deltacoord_leaveoffset

const int8_t _deltacoord_leaveoffset[8]
static
Initial value:
= {
-1, 0, 1, 0,
0, 1, 0, -1
}

Definition at line 2904 of file rail_cmd.cpp.

◆ _drawtile_track_palette

uint32_t _drawtile_track_palette
static

Definition at line 1911 of file rail_cmd.cpp.

◆ _fence_offsets

FenceOffset _fence_offsets[]
static
Initial value:
= {
{ CORNER_INVALID, 0, 1, 16, 1 },
{ CORNER_INVALID, 1, 0, 1, 16 },
{ CORNER_W, 8, 8, 1, 1 },
{ CORNER_N, 8, 8, 1, 1 },
{ CORNER_INVALID, 0, 1, 16, 1 },
{ CORNER_INVALID, 1, 0, 1, 16 },
{ CORNER_INVALID, 0, 1, 16, 1 },
{ CORNER_INVALID, 1, 0, 1, 16 },
{ CORNER_INVALID, 0, 15, 16, 1 },
{ CORNER_INVALID, 15, 0, 1, 16 },
{ CORNER_E, 8, 8, 1, 1 },
{ CORNER_S, 8, 8, 1, 1 },
{ CORNER_INVALID, 0, 15, 16, 1 },
{ CORNER_INVALID, 15, 0, 1, 16 },
{ CORNER_INVALID, 0, 15, 16, 1 },
{ CORNER_INVALID, 15, 0, 1, 16 },
}

Offsets for drawing fences.

Definition at line 1925 of file rail_cmd.cpp.

Referenced by DrawTrackFence().

◆ _fractcoords_behind

const uint8_t _fractcoords_behind[4] = { 0x8F, 0x8, 0x80, 0xF8 }
static

Definition at line 2902 of file rail_cmd.cpp.

◆ _fractcoords_enter

const uint8_t _fractcoords_enter[4] = { 0x8A, 0x48, 0x84, 0xA8 }
static

Definition at line 2903 of file rail_cmd.cpp.

◆ _halftile_sub_sprite

const SubSprite _halftile_sub_sprite[4]
static
Initial value:
= {
{ -INF , -INF , 32 - 33, INF },
{ -INF , 0 + 7, INF , INF },
{ -31 + 33, -INF , INF , INF },
{ -INF , -INF , INF , 30 - 23 }
}

Definition at line 2060 of file rail_cmd.cpp.

◆ _railtypes

Definition at line 46 of file rail_cmd.cpp.

◆ _railtypes_hidden_mask

RailTypes _railtypes_hidden_mask

Definition at line 48 of file rail_cmd.cpp.

◆ _sorted_railtypes

std::vector<RailType> _sorted_railtypes

Definition at line 47 of file rail_cmd.cpp.

◆ _tile_type_rail_procs

const TileTypeProcs _tile_type_rail_procs
extern
Initial value:
= {
DrawTile_Track,
GetSlopePixelZ_Track,
ClearTile_Track,
nullptr,
GetTileDesc_Track,
GetTileTrackStatus_Track,
ClickTile_Track,
nullptr,
TileLoop_Track,
ChangeTileOwner_Track,
nullptr,
GetFoundation_Track,
TerraformTile_Track,
}
static VehicleEnterTileStatus VehicleEnter_Track(Vehicle *u, TileIndex tile, int x, int y)
Tile callback routine when vehicle enters tile.

Definition at line 49 of file landscape.cpp.

◆ _track_sloped_sprites

const uint8_t _track_sloped_sprites[14]
static
Initial value:
= {
14, 15, 22, 13,
0, 21, 17, 12,
23, 0, 18, 20,
19, 16
}

Definition at line 182 of file rail_cmd.cpp.

◆ _trackdelta

const TileIndexDiffC _trackdelta[]
static
Initial value:
= {
{ -1, 0 }, { 0, 1 }, { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, 1 },
{ 0, 0 },
{ 0, 0 },
{ 1, 0 }, { 0, -1 }, { 0, -1 }, { 1, 0 }, { 0, -1 }, { -1, 0 },
{ 0, 0 },
{ 0, 0 }
}

Definition at line 807 of file rail_cmd.cpp.

◆ _valid_tracks_on_leveled_foundation

const TrackBits _valid_tracks_on_leveled_foundation[15]
static
Initial value:
= {
}
@ TRACK_BIT_UPPER
Upper track.
Definition track_type.h:39
@ TRACK_BIT_LEFT
Left track.
Definition track_type.h:41
@ TRACK_BIT_Y
Y-axis track.
Definition track_type.h:38
@ TRACK_BIT_NONE
No track.
Definition track_type.h:36
@ TRACK_BIT_X
X-axis track.
Definition track_type.h:37
@ TRACK_BIT_LOWER
Lower track.
Definition track_type.h:40
@ TRACK_BIT_ALL
All possible tracks.
Definition track_type.h:50
@ TRACK_BIT_RIGHT
Right track.
Definition track_type.h:42

Valid TrackBits on a specific (non-steep)-slope with leveled foundation.

Definition at line 284 of file rail_cmd.cpp.

Referenced by CheckRailSlope().

◆ _valid_tracks_without_foundation

const TrackBits _valid_tracks_without_foundation[15]
static
Initial value:

Valid TrackBits on a specific (non-steep)-slope without foundation.

Definition at line 262 of file rail_cmd.cpp.

Referenced by GetRailFoundation().

◆ INF

const int INF = 1000
static

Definition at line 2059 of file rail_cmd.cpp.