37#include "table/strings.h"
72 _railtypes_hidden_mask = {};
78 if (cursors_base != 0) {
98 const SpriteID _signal_lookup[2][SIGTYPE_END] = {
99 {SPR_IMG_SIGNAL_ELECTRIC_NORM, SPR_IMG_SIGNAL_ELECTRIC_ENTRY, SPR_IMG_SIGNAL_ELECTRIC_EXIT,
100 SPR_IMG_SIGNAL_ELECTRIC_COMBO, SPR_IMG_SIGNAL_ELECTRIC_PBS, SPR_IMG_SIGNAL_ELECTRIC_PBS_OWAY},
102 {SPR_IMG_SIGNAL_SEMAPHORE_NORM, SPR_IMG_SIGNAL_SEMAPHORE_ENTRY, SPR_IMG_SIGNAL_SEMAPHORE_EXIT,
103 SPR_IMG_SIGNAL_SEMAPHORE_COMBO, SPR_IMG_SIGNAL_SEMAPHORE_PBS, SPR_IMG_SIGNAL_SEMAPHORE_PBS_OWAY},
110 rti->
gui_sprites.
signals[type][var][0] = (red != 0) ? red + SIGNAL_TO_SOUTH : _signal_lookup[var][type];
111 rti->
gui_sprites.
signals[type][var][1] = (green != 0) ? green + SIGNAL_TO_SOUTH : _signal_lookup[var][type] + 1;
136 ResolveRailTypeGUISprites(&rti);
139 if (rti.
label == 0)
continue;
179static const uint8_t _track_sloped_sprites[14] = {
248 if (current == future) {
333 bool valid_on_leveled = ((~_valid_tracks_on_leveled_foundation[tileh] & bits) == 0);
401 return CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION);
409static inline bool ValParamTrackOrientation(
Track track)
435 if (ret.
Failed())
return ret;
443 if (ret.
Failed())
return ret;
446 if (ret.
Failed())
return ret;
451 if (!auto_remove_signals)
return CommandCost(STR_ERROR_MUST_REMOVE_SIGNALS_FIRST);
456 if (ret_remove_signals.
Failed())
return ret_remove_signals;
468 if (ret.
Failed())
return ret;
498 if (ret.
Failed())
return ret;
502 if (ret.
Failed())
return ret;
511 RoadType roadtype_road = GetRoadTypeRoad(tile);
512 RoadType roadtype_tram = GetRoadTypeTram(tile);
527 if (ret.
Failed())
return ret;
531 if (num_new_road_pieces > 0) {
536 if (num_new_tram_pieces > 0) {
547 Company::Get(road_owner)->infrastructure.road[roadtype_road] += num_new_road_pieces;
551 Company::Get(tram_owner)->infrastructure.road[roadtype_tram] += num_new_tram_pieces;
570 if (ret.
Failed())
return ret;
574 if (ret.
Failed())
return ret;
578 cost.
AddCost(-_price[PR_CLEAR_WATER]);
579 cost.
AddCost(_price[PR_CLEAR_ROUGH]);
615 bool crossing =
false;
617 if (!ValParamTrackOrientation(track))
return CMD_ERROR;
634 if (ret.
Failed())
return ret;
639 if (ret.
Failed())
return ret;
668 if (ret.
Failed())
return ret;
672 if (ret.
Failed())
return ret;
675 if ((present & trackbit) == 0)
return CommandCost(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
723 default:
return CommandCost(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
763 bool flooded =
false;
772 TrackBits to_remove = lower_track & rail_bits;
777 if (!flooded)
return flooded;
778 rail_bits = rail_bits & ~to_remove;
805 { -1, 0 }, { 0, 1 }, { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, 1 },
808 { 1, 0 }, { 0, -1 }, { 0, -1 }, { 1, 0 }, { 0, -1 }, { -1, 0 },
816 int x =
TileX(start);
817 int y =
TileY(start);
828 int trdx = _trackdelta[*trackdir].
x;
829 int trdy = _trackdelta[*trackdir].
y;
832 trdx += _trackdelta[*trackdir ^ 1].
x;
833 trdy += _trackdelta[*trackdir ^ 1].
y;
837 while ((trdx <= 0 && dx > 0) ||
838 (trdx >= 0 && dx < 0) ||
839 (trdy <= 0 && dy > 0) ||
840 (trdy >= 0 && dy < 0)) {
841 if (!
HasBit(*trackdir, 3)) {
853 trdx = _trackdelta[*trackdir].
x;
854 trdy = _trackdelta[*trackdir].
y;
882 CommandCost ret = ValidateAutoDrag(&trackdir, tile, end_tile);
883 if (ret.
Failed())
return ret;
885 bool had_success =
false;
889 if (!remove && !fail_on_obstacle && last_error.
GetErrorMessage() == STR_ERROR_ALREADY_BUILT) had_success =
true;
892 last_error = std::move(ret);
893 if (last_error.
GetErrorMessage() != STR_ERROR_ALREADY_BUILT && !remove) {
894 if (fail_on_obstacle)
return last_error;
895 if (had_success)
break;
899 if (last_error.
GetErrorMessage() == STR_ERROR_OWNED_BY && remove)
break;
905 if (tile == end_tile)
break;
913 if (had_success)
return total_cost;
932 return CmdRailTrackHelper(flags, start_tile, end_tile, railtype, track,
false, auto_remove_signals, fail_on_obstacle);
981 cost.
AddCost(_price[PR_BUILD_FOUNDATION]);
985 bool rotate_existing_depot =
false;
988 if (ret.
Failed())
return ret;
993 if (ret.
Failed())
return ret;
995 rotate_existing_depot =
true;
998 if (!rotate_existing_depot) {
1000 if (cost.
Failed())
return cost;
1008 if (rotate_existing_depot) {
1025 cost.
AddCost(_price[PR_BUILD_DEPOT_TRAIN]);
1049CommandCost CmdBuildSingleSignal(
DoCommandFlags 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)
1052 if (cycle_start > cycle_stop || cycle_stop > SIGTYPE_LAST)
return CMD_ERROR;
1059 return CommandCost(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
1065 if (ret.
Failed())
return ret;
1081 if (signals_copy != 0 && sigvar != GetSignalVariant(tile, track)) {
1085 }
else if (convert_signal) {
1087 if (ctrl_pressed || GetSignalVariant(tile, track) != sigvar) {
1116 SetSignalType(tile, track, sigtype);
1117 SetSignalVariant(tile, track, sigvar);
1123 if (signals_copy == 0) {
1127 SetSignalType(tile, track, sigtype);
1128 SetSignalVariant(tile, track, sigvar);
1129 while (num_dir_cycle-- > 0) CycleSignalSide(tile, track);
1131 if (convert_signal) {
1137 sigtype = GetSignalType(tile, track);
1140 SetSignalType(tile, track, sigtype);
1141 SetSignalVariant(tile, track, sigvar);
1147 }
else if (ctrl_pressed) {
1149 sigtype = (
SignalType)(GetSignalType(tile, track) + 1);
1151 if (sigtype < cycle_start || sigtype > cycle_stop) sigtype = cycle_start;
1153 SetSignalType(tile, track, sigtype);
1159 CycleSignalSide(tile, track);
1161 sigtype = GetSignalType(tile, track);
1168 SetSignalVariant(tile, track, sigvar);
1169 SetSignalType(tile, track, sigtype);
1176 if (IsPbsSignal(sigtype)) {
1196static bool AdvanceSignalAutoFill(
TileIndex &tile,
Trackdir &trackdir,
bool remove)
1235 default:
return false;
1255static CommandCost CmdSignalTrackHelper(
DoCommandFlags flags,
TileIndex tile,
TileIndex end_tile,
Track track,
SignalType sigtype,
SignalVariant sigvar,
bool mode,
bool remove,
bool autofill,
bool minimise_gaps,
int signal_density)
1260 if (signal_density == 0 || signal_density > 20)
return CMD_ERROR;
1267 signal_density *= TILE_AXIAL_DISTANCE;
1270 CommandCost ret = ValidateAutoDrag(&trackdir, tile, end_tile);
1271 if (ret.
Failed())
return ret;
1274 Trackdir start_trackdir = trackdir;
1283 assert(signals != 0);
1286 sigvar = GetSignalVariant(tile, track);
1288 sigtype = GetSignalType(tile, track);
1295 uint8_t signal_dir = 0;
1312 int last_used_ctr = -signal_density;
1313 int last_suitable_ctr = 0;
1317 bool had_success =
false;
1320 uint8_t signals = 0;
1325 CommandCost ret = remove ?
Command<CMD_REMOVE_SINGLE_SIGNAL>::Do(do_flags, tile,
TrackdirToTrack(trackdir)) :
Command<CMD_BUILD_SINGLE_SIGNAL>::Do(do_flags, tile,
TrackdirToTrack(trackdir), sigtype, sigvar,
false, signal_ctr == 0, mode,
SIGTYPE_BLOCK,
SIGTYPE_BLOCK, 0, signals);
1345 build_signal(tile, trackdir,
false);
1346 }
else if (minimise_gaps) {
1350 if (signal_ctr > last_used_ctr + signal_density && last_suitable_tile !=
INVALID_TILE) {
1352 if (build_signal(last_suitable_tile, last_suitable_trackdir,
false)) {
1354 last_used_ctr = last_suitable_ctr;
1358 if (signal_ctr == last_used_ctr + signal_density) {
1360 if (build_signal(tile, trackdir,
false)) {
1361 last_used_ctr = signal_ctr;
1366 if (build_signal(tile, trackdir,
true)) {
1367 last_suitable_tile = tile;
1368 last_suitable_ctr = signal_ctr;
1369 last_suitable_trackdir = trackdir;
1372 }
else if (signal_ctr >= last_used_ctr + signal_density) {
1374 build_signal(tile, trackdir,
false);
1375 last_used_ctr = signal_ctr;
1381 signal_ctr += (
IsDiagonalTrackdir(trackdir) ? TILE_AXIAL_DISTANCE : TILE_CORNER_DISTANCE);
1385 signal_ctr += TILE_AXIAL_DISTANCE;
1390 if (remove || minimise_gaps) {
1395 signal_ctr += TILE_AXIAL_DISTANCE;
1396 for (uint i = TILE_AXIAL_DISTANCE; i < len; i += TILE_AXIAL_DISTANCE) {
1397 if (signal_ctr >= last_used_ctr + signal_density) last_used_ctr = signal_ctr;
1398 signal_ctr += TILE_AXIAL_DISTANCE;
1407 if (!AdvanceSignalAutoFill(tile, trackdir, remove))
break;
1410 if (tile == start_tile && trackdir == start_trackdir)
break;
1412 if (tile == end_tile)
break;
1414 signal_ctr += (
IsDiagonalTrackdir(trackdir) ? TILE_AXIAL_DISTANCE : TILE_CORNER_DISTANCE);
1423 if (!remove && minimise_gaps && signal_ctr > last_used_ctr + signal_density && last_suitable_tile !=
INVALID_TILE) {
1424 build_signal(last_suitable_tile, last_suitable_trackdir,
false);
1427 return had_success ? total_cost : last_error;
1448 return CmdSignalTrackHelper(flags, tile, end_tile, track, sigtype, sigvar, mode,
false, autofill, minimise_gaps, signal_density);
1461 return CommandCost(STR_ERROR_THERE_IS_NO_RAILROAD_TRACK);
1464 return CommandCost(STR_ERROR_THERE_ARE_NO_SIGNALS);
1470 if (ret.
Failed())
return ret;
1478 }
else if (IsPbsSignal(GetSignalType(tile, track))) {
1481 for (
int i = 0; v ==
nullptr && i < 2; i++, td =
ReverseTrackdir(td)) {
1526 return CmdSignalTrackHelper(flags, tile, end_tile, track,
SIGTYPE_BLOCK,
SIG_ELECTRIC,
false,
true, autofill,
false, 1);
1550 bool found_convertible_track =
false;
1566 error.
MakeError(STR_ERROR_CROSSING_DISALLOWED_RAIL);
1585 error = std::move(ret);
1589 std::vector<Train *> vehicles_affected;
1597 error = std::move(ret);
1609 vehicles_affected.push_back(v);
1648 found_convertible_track =
true;
1660 found_convertible_track =
true;
1671 if (endtile < tile) {
1683 error = std::move(ret);
1695 vehicles_affected.push_back(v);
1727 found_convertible_track =
true;
1738 found_convertible_track =
true;
1743 for (uint i = 0; i < vehicles_affected.size(); ++i) {
1750 for (
Train *v : affected_trains) {
1755 return found_convertible_track ? cost : error;
1762 if (ret.
Failed())
return ret;
1766 if (ret.
Failed())
return ret;
1782 delete Depot::GetByTile(tile);
1783 DoClearSquare(tile);
1798 return CommandCost(STR_ERROR_AREA_IS_OWNED_BY_ANOTHER);
1802 return CommandCost(STR_ERROR_MUST_REMOVE_RAILROAD_TRACK);
1804 return CommandCost(STR_ERROR_BUILDING_MUST_BE_DEMOLISHED);
1819 if (ret.
Failed())
return ret;
1827 if (ret.
Failed())
return ret;
1831 DoClearSquare(tile);
1833 cost.AddCost(_price[PR_CLEAR_WATER]);
1840 return RemoveTrainDepot(tile, flags);
1867 case 0: side =
false;
break;
1868 case 2: side =
true;
break;
1871 static const Point SignalPositions[2][12] = {
1874 { 8, 5}, {14, 1}, { 1, 14}, { 9, 11}, { 1, 0}, { 3, 10},
1876 {11, 4}, {14, 14}, {11, 3}, { 4, 13}, { 3, 4}, {11, 13}
1879 {14, 1}, {12, 10}, { 4, 6}, { 1, 14}, {10, 4}, { 0, 1},
1881 {14, 14}, { 5, 12}, {11, 13}, { 4, 3}, {13, 4}, { 3, 11}
1888 SignalType type = GetSignalType(tile, track);
1897 sprite += type * 16 + variant * 64 + image * 2 + condition + (type > SIGTYPE_LAST_NOPBS ? 64 : 0);
1900 AddSortableSpriteToDraw(sprite, PAL_NONE, x, y,
GetSaveSlopeZ(x, y, track), {{}, {1, 1,
BB_HEIGHT_UNDER_BRIDGE}, {}});
1913 { CORNER_INVALID, 0, 1, 16, 1 },
1914 { CORNER_INVALID, 1, 0, 1, 16 },
1915 { CORNER_W, 8, 8, 1, 1 },
1916 { CORNER_N, 8, 8, 1, 1 },
1917 { CORNER_INVALID, 0, 1, 16, 1 },
1918 { CORNER_INVALID, 1, 0, 1, 16 },
1919 { CORNER_INVALID, 0, 1, 16, 1 },
1920 { CORNER_INVALID, 1, 0, 1, 16 },
1921 { CORNER_INVALID, 0, 15, 16, 1 },
1922 { CORNER_INVALID, 15, 0, 1, 16 },
1923 { CORNER_E, 8, 8, 1, 1 },
1924 { CORNER_S, 8, 8, 1, 1 },
1925 { CORNER_INVALID, 0, 15, 16, 1 },
1926 { CORNER_INVALID, 15, 0, 1, 16 },
1927 { CORNER_INVALID, 0, 15, 16, 1 },
1928 { CORNER_INVALID, 15, 0, 1, 16 },
1996 uint num_sprites = 0;
2001 if (psid.sprite == 0) {
2002 psid.sprite = SPR_TRACK_FENCE_FLAT_X;
2006 assert(num_sprites > 0);
2008 switch (GetRailGroundType(ti->
tile)) {
2030 switch (track_corner) {
2035 default: NOT_REACHED();
2044static const int INF = 1000;
2045static const SubSprite _halftile_sub_sprite[4] = {
2046 { -INF , -INF , 32 - 33, INF },
2047 { -INF , 0 + 7, INF , INF },
2048 { -31 + 33, -INF , INF , INF },
2049 { -INF , -INF , INF , 30 - 23 }
2061 Corner halftile_corner = CORNER_INVALID;
2067 track &= ~CornerToTrackBits(halftile_corner);
2078 DrawShoreTile(ti->
tileh);
2089 default: image = SPR_FLAT_GRASS_TILE;
break;
2104 }
else if (no_combine) {
2140 DrawTrackSprite(ground +
RTO_S, PAL_NONE, ti,
SLOPE_S);
break;
2142 DrawTrackSprite(ground +
RTO_W, PAL_NONE, ti,
SLOPE_W);
break;
2192 default: image = SPR_FLAT_GRASS_TILE;
break;
2197 DrawGroundSprite(image, PAL_NONE, &(_halftile_sub_sprite[halftile_corner]));
2203 default: NOT_REACHED();
2210 DrawTrackSprite(ground + offset, PAL_NONE, ti, fake_slope);
2212 DrawTrackSprite(overlay + offset,
PALETTE_CRASH, ti, fake_slope);
2226 if (rti->UsesOverlay()) {
2227 DrawTrackBitsOverlay(ti, track, rti);
2233 Corner halftile_corner = CORNER_INVALID;
2239 track &= ~CornerToTrackBits(halftile_corner);
2249 bool junction =
false;
2256 DrawShoreTile(ti->
tileh);
2259 image = SPR_FLAT_WATER_TILE;
2265 default: image = SPR_FLAT_GRASS_TILE;
break;
2306 DrawShoreTile(ti->
tileh);
2308 sub = &(_halftile_sub_sprite[track_corner]);
2367 static const uint8_t _corner_to_track_sprite[] = {3, 1, 2, 0};
2375 auto MAYBE_DRAW_SIGNAL = [&](uint8_t signalbit,
SignalOffsets image, uint pos,
Track track) {
2382 MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTH, 0,
TRACK_LEFT);
2383 MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTH, 1,
TRACK_LEFT);
2386 MAYBE_DRAW_SIGNAL(0, SIGNAL_TO_NORTH, 2,
TRACK_RIGHT);
2387 MAYBE_DRAW_SIGNAL(1, SIGNAL_TO_SOUTH, 3,
TRACK_RIGHT);
2390 MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_WEST, 4,
TRACK_UPPER);
2391 MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_EAST, 5,
TRACK_UPPER);
2394 MAYBE_DRAW_SIGNAL(1, SIGNAL_TO_WEST, 6,
TRACK_LOWER);
2395 MAYBE_DRAW_SIGNAL(0, SIGNAL_TO_EAST, 7,
TRACK_LOWER);
2398 MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTHWEST, 8,
TRACK_X);
2399 MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTHEAST, 9,
TRACK_X);
2402 MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTHEAST, 10,
TRACK_Y);
2403 MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTHWEST, 11,
TRACK_Y);
2407static void DrawTile_Track(
TileInfo *ti)
2425 if ((rails &
TRACK_BIT_3WAY_NE) != 0) blocked_pillars.Set(BridgePillarFlag::EdgeNE);
2426 if ((rails &
TRACK_BIT_3WAY_SE) != 0) blocked_pillars.Set(BridgePillarFlag::EdgeSE);
2427 if ((rails &
TRACK_BIT_3WAY_SW) != 0) blocked_pillars.Set(BridgePillarFlag::EdgeSW);
2428 if ((rails &
TRACK_BIT_3WAY_NW) != 0) blocked_pillars.Set(BridgePillarFlag::EdgeNW);
2439 dts = &_depot_invisible_gfx_table[dir];
2441 dts = &_depot_gfx_table[dir];
2445 if (rti->UsesOverlay()) {
2446 image = SPR_FLAT_GRASS_TILE;
2453 if (IsSnowRailGround(ti->
tile)) {
2454 if (image != SPR_FLAT_GRASS_TILE) {
2457 image = SPR_FLAT_SNOW_DESERT_TILE;
2463 if (rti->UsesOverlay()) {
2535void DrawTrainDepotSprite(
int x,
int y,
int dir,
RailType railtype)
2542 if (image != SPR_FLAT_GRASS_TILE) image += offset;
2547 if (rti->UsesOverlay()) {
2557 if (depot_sprite != 0) offset = depot_sprite - SPR_RAIL_DEPOT_SE_1;
2562static int GetSlopePixelZ_Track(
TileIndex tile, uint x, uint y,
bool)
2580static void TileLoop_Track(
TileIndex tile)
2591 case LandscapeType::Arctic: {
2647 case LandscapeType::Tropic:
2682 switch (fences.base()) {
2694 default: NOT_REACHED();
2699 if (old_ground != new_ground) {
2700 SetRailGroundType(tile, new_ground);
2712 default: NOT_REACHED();
2727 default: NOT_REACHED();
2768static bool ClickTile_Track(
TileIndex tile)
2784 td.
str = STR_LAI_RAIL_DESCRIPTION_TRACK;
2788 static const StringID signal_type[6][6] = {
2790 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS,
2791 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS,
2792 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS,
2793 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS,
2794 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS,
2795 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS
2798 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS,
2799 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS,
2800 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS,
2801 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS,
2802 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS,
2803 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS
2806 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS,
2807 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS,
2808 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS,
2809 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS,
2810 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS,
2811 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS
2814 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS,
2815 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS,
2816 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS,
2817 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS,
2818 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS,
2819 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS
2822 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS,
2823 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS,
2824 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS,
2825 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS,
2826 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS,
2827 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS
2830 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS,
2831 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS,
2832 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS,
2833 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS,
2834 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS,
2835 STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS
2842 primary_signal = GetSignalType(tile,
TRACK_UPPER);
2845 secondary_signal = primary_signal = GetSignalType(tile,
TRACK_LOWER);
2848 td.
str = signal_type[secondary_signal][primary_signal];
2853 td.
str = STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT;
2875 uint num_pieces = 1;
2882 Company::Get(old_owner)->infrastructure.rail[rt] -= num_pieces;
2883 Company::Get(new_owner)->infrastructure.rail[rt] += num_pieces;
2887 Company::Get(old_owner)->infrastructure.signal -= num_sigs;
2888 Company::Get(new_owner)->infrastructure.signal += num_sigs;
2897static const uint8_t _fractcoords_behind[4] = { 0x8F, 0x8, 0x80, 0xF8 };
2898static const uint8_t _fractcoords_enter[4] = { 0x8A, 0x48, 0x84, 0xA8 };
2899static const int8_t _deltacoord_leaveoffset[8] = {
2917 case DIAGDIR_NE:
return ((
int)(v->
x_pos & 0x0F) - ((_fractcoords_enter[dir] & 0x0F) - (length + 1)));
2918 case DIAGDIR_SE:
return -((int)(v->
y_pos & 0x0F) - ((_fractcoords_enter[dir] >> 4) + (length + 1)));
2919 case DIAGDIR_SW:
return -((int)(v->
x_pos & 0x0F) - ((_fractcoords_enter[dir] & 0x0F) + (length + 1)));
2920 case DIAGDIR_NW:
return ((
int)(v->
y_pos & 0x0F) - ((_fractcoords_enter[dir] >> 4) - (length + 1)));
2921 default: NOT_REACHED();
2937 uint8_t fract_coord = (x & 0xF) + ((y & 0xF) << 4);
2949 uint8_t fract_coord_leave =
2950 ((_fractcoords_enter[dir] & 0x0F) +
2951 (length + 1) * _deltacoord_leaveoffset[dir]) +
2952 (((_fractcoords_enter[dir] >> 4) +
2953 ((length + 1) * _deltacoord_leaveoffset[dir + 4])) << 4);
2955 if (fract_coord_leave == fract_coord) {
2957 if ((v = v->
Next()) !=
nullptr) {
2962 }
else if (_fractcoords_enter[dir] == fract_coord) {
3001 switch (rail_bits) {
3009 if (z_old != z_new || tileh_old != tileh_new)
return CommandCost(STR_ERROR_MUST_REMOVE_RAILROAD_TRACK);
3016 if (z_old != z_new)
return CommandCost(STR_ERROR_MUST_REMOVE_RAILROAD_TRACK);
3020 if (tileh_old != tileh_new) {
3039 }))
return CommandCost(STR_ERROR_SHIP_IN_THE_WAY);
3046 switch (rail_bits) {
3051 default:
return autoslope_result;
3060 for (
Corner corner = (
Corner)0; corner < CORNER_END; corner = (
Corner)(corner + 1)) {
3061 if (allowed_corner == corner)
continue;
3085 GetSlopePixelZ_Track,
3089 GetTileTrackStatus_Track,
3093 ChangeTileOwner_Track,
3096 GetFoundation_Track,
3097 TerraformTile_Track,
3098 CheckBuildAbove_Track,
Functions related to autoslope.
bool AutoslopeCheckForEntranceEdge(TileIndex tile, int z_new, Slope tileh_new, DiagDirection entrance)
Autoslope check for tiles with an entrance on an edge.
bool AutoslopeEnabled()
Tests if autoslope is enabled for _current_company.
Class for backupping variables and making sure they are restored later.
debug_inline constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr bool HasExactlyOneBit(T value)
Test whether value has exactly 1 bit set.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr uint CountBits(T value)
Counts the number of set bits in a variable.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
constexpr T KillFirstBit(T value)
Clear the first bit in an integer.
void DrawBridgeMiddle(const TileInfo *ti, BridgePillarFlags blocked_pillars)
Draw the middle bits of a bridge.
bool IsBridgeAbove(Tile t)
checks if a bridge is set above the ground of this tile
bool IsBridge(Tile t)
Checks if this is a bridge, instead of a tunnel.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Tstorage base() const noexcept
Retrieve the raw value behind this bit set.
constexpr Timpl & Reset()
Reset all bits.
constexpr Timpl & Set()
Set all bits.
Common return value for all commands.
bool Succeeded() const
Did this command succeed?
void AddCost(const Money &cost)
Adds the given cost to the cost of the command.
void MakeError(StringID message)
Makes this CommandCost behave like an error command.
Money GetCost() const
The costs as made up to this moment.
bool Failed() const
Did this command fail?
StringID GetErrorMessage() const
Returns the error message of a command.
This struct contains all the info that is needed to draw and construct tracks.
RailType Index() const
Get the RailType for this RailTypeInfo.
SpriteID single_x
single piece of rail in X direction, without ground
uint16_t max_speed
Maximum speed for vehicles travelling on this rail type.
SpriteID build_tunnel
button for building a tunnel
CursorID rail_swne
Cursor for building rail in X direction.
SpriteID convert_rail
button for converting rail
CursorID convert
Cursor for converting track.
CursorID depot
Cursor for building a depot.
RailTypes powered_railtypes
bitmask to the OTHER railtypes on which an engine of THIS railtype generates power
RailTypes introduces_railtypes
Bitmask of which other railtypes are introduced when this railtype is introduced.
SpriteID ground
ground sprite for a 3-way switch
CursorID rail_nwse
Cursor for building rail in Y direction.
SpriteID build_x_rail
button for building single rail in X direction
uint8_t sorting_order
The sorting order of this railtype for the toolbar dropdown.
RailTypeLabel label
Unique 32 bit rail type identifier.
SpriteID single_n
single piece of rail in the northern corner
CursorID rail_ew
Cursor for building rail in E-W direction.
SpriteID auto_rail
button for the autorail construction
CursorID autorail
Cursor for autorail tool.
SpriteID single_y
single piece of rail in Y direction, without ground
StringID name
Name of this rail type.
RailTypes compatible_railtypes
bitmask to the OTHER railtypes on which an engine of THIS railtype can physically travel
uint GetRailtypeSpriteOffset() const
Offset between the current railtype and normal rail.
SpriteID single_s
single piece of rail in the southern corner
RailTypeFlags flags
Bit mask of rail type flags.
SpriteID signals[SIGTYPE_END][2][2]
signal GUI sprites (type, variant, state)
SpriteID build_ew_rail
button for building single rail in E-W direction
SpriteID build_y_rail
button for building single rail in Y direction
FlatSet< RailTypeLabel > alternate_labels
Rail type labels this type provides in addition to the main label.
struct RailTypeInfo::@22 strings
Strings associated with the rail type.
struct RailTypeInfo::@19 base_sprites
Struct containing the main sprites.
SpriteID track_ns
two pieces of rail in North and South corner (East-West direction)
struct RailTypeInfo::@21 cursor
Cursors associated with the rail type.
SpriteID snow_offset
sprite number difference between a piece of track on a snowy ground and the corresponding one on norm...
SpriteID track_y
single piece of rail in Y direction, with ground
struct RailTypeInfo::@20 gui_sprites
struct containing the sprites for the rail GUI.
SpriteID build_depot
button for building depots
SpriteID single_w
single piece of rail in the western corner
SpriteID single_e
single piece of rail in the eastern corner
SpriteID build_ns_rail
button for building single rail in N-S direction
CursorID rail_ns
Cursor for building rail in N-S direction.
SpriteID tunnel
tunnel sprites base
SpriteID single_sloped
single piece of rail for slopes
static std::unique_ptr< TileIterator > Create(TileIndex corner1, TileIndex corner2, bool diagonal)
Create either an OrthogonalTileIterator or DiagonalTileIterator given the diagonal parameter.
Iterate over all vehicles on a tile.
Functions related to commands.
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
@ Execute
execute the given command
@ Bankrupt
company bankrupts, skip money check, skip vehicle on tile check in some cases
@ Auto
don't allow building on structures
Definition of stuff that is very close to a company, like the company struct itself.
CommandCost CheckTileOwnership(TileIndex tile)
Check whether the current owner owns the stuff on the given tile.
PaletteID GetCompanyPalette(CompanyID company)
Get the palette for recolouring with a company colour.
CommandCost CheckOwnership(Owner owner, TileIndex tile)
Check whether the current owner owns something.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
CompanyID _current_company
Company currently doing an action.
void DirtyCompanyInfrastructureWindows(CompanyID company)
Redraw all windows with company infrastructure counts.
GUI Functions related to companies.
static constexpr Owner OWNER_DEITY
The object is owned by a superuser / goal script.
static constexpr Owner INVALID_OWNER
An invalid owner.
static constexpr Owner OWNER_WATER
The tile/execution is done by "water".
Some simple functions to help with accessing containers.
bool include(Container &container, typename Container::const_reference &item)
Helper function to append an item to a container if it is not already contained.
Base for all depots (except hangars)
bool CanBuildDepotByTileh(DiagDirection direction, Slope tileh)
Find out if the slope of the tile is suitable to build a depot of given direction.
void ShowDepotWindow(TileIndex tile, VehicleType type)
Opens a depot window.
Direction DiagDirToDir(DiagDirection dir)
Convert a DiagDirection to a Direction.
DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
Direction ReverseDir(Direction d)
Return the reverse of a direction.
bool IsValidDiagDirection(DiagDirection d)
Checks if an integer value is a valid DiagDirection.
Axis DiagDirToAxis(DiagDirection d)
Convert a DiagDirection to the axis.
Axis
Allow incrementing of DiagDirDiff variables.
DiagDirection
Enumeration for diagonal directions.
@ DIAGDIR_NE
Northeast, upper right on your monitor.
@ DIAGDIR_END
Used for iterations.
@ DIAGDIR_BEGIN
Used for iterations.
@ INVALID_DIAGDIR
Flag for an invalid DiagDirection.
static const uint LEVELCROSSING_TRACKBIT_FACTOR
Multiplier for how many regular track bits a level crossing counts.
@ EXPENSES_CONSTRUCTION
Construction costs.
static const uint TUNNELBRIDGE_TRACKBIT_FACTOR
Multiplier for how many regular track bits a tunnel/bridge counts.
void DrawRailCatenary(const TileInfo *ti)
Draws overhead wires and pylons for electric railways.
header file for electrified rail specific functions
bool HasRailCatenaryDrawn(RailType rt)
Test if we should draw rail catenary.
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
uint32_t PaletteID
The number of the palette.
uint8_t GetSnowLine()
Get the current snow line, either variable or static.
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
uint GetPartialPixelZ(int x, int y, Slope corners)
Determines height at given coordinate of a slope.
TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
Returns information about trackdirs and signal states.
void DrawFoundation(TileInfo *ti, Foundation f)
Draw foundation f at tile ti.
int GetSlopeZInCorner(Slope tileh, Corner corner)
Determine the Z height of a corner relative to TileZ.
uint ApplyFoundationToSlope(Foundation f, Slope &s)
Applies a foundation to a slope.
int GetSlopePixelZ(int x, int y, bool ground_vehicle)
Return world Z coordinate of a given point of a tile.
uint ApplyPixelFoundationToSlope(Foundation f, Slope &s)
Applies a foundation to a slope.
int GetSlopePixelZInCorner(Slope tileh, Corner corner)
Determine the Z height of a corner relative to TileZ.
Command definitions related to landscape (slopes etc.).
TileIndex AddTileIndexDiffCWrap(TileIndex tile, TileIndexDiffC diff)
Add a TileIndexDiffC to a TileIndex and returns the new one.
TileIndexDiff ToTileIndexDiff(TileIndexDiffC tidc)
Return the offset between two tiles from a TileIndexDiffC struct.
TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
Adds a DiagDir to a tile.
static debug_inline uint TileY(TileIndex tile)
Get the Y component of a tile.
static debug_inline uint TileX(TileIndex tile)
Get the X component of a tile.
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
constexpr T abs(const T a)
Returns the absolute value of (scalar) variable.
@ TCX_UPPER_HALFTILE
Querying information about the upper part of a tile with halftile foundation.
@ TCX_NORMAL
Nothing special.
Functions/types related to NewGRF debugging.
void DeleteNewGRFInspectWindow(GrfSpecFeature feature, uint index)
Delete inspect window for a given feature and index.
SpriteID GetCustomSignalSprite(const RailTypeInfo *rti, TileIndex tile, SignalType type, SignalVariant var, SignalState state, bool gui)
Get the sprite to draw for a given signal.
SpriteID GetCustomRailSprite(const RailTypeInfo *rti, TileIndex tile, RailTypeSpriteGroup rtsg, TileContext context, uint *num_results)
Get the sprite to draw for the given tile.
NewGRF handling of rail types.
Map accessors for object tiles.
bool IsObjectType(Tile t, ObjectType type)
Check whether the object on a tile is of a specific type.
static const ObjectType OBJECT_OWNED_LAND
Owned land 'flag'.
@ DO_FULL_DETAIL
Also draw details of track and roads.
Train * GetTrainForReservation(TileIndex tile, Track track)
Find the train which has reserved a specific path.
TrackBits GetReservedTrackbits(TileIndex t)
Get the reserved trackbits for any tile, regardless of type.
bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bool include_line_end, bool forbid_90deg)
Determine whether a certain track on a tile is a safe position to end a path.
bool HasReservedTracks(TileIndex tile, TrackBits tracks)
Check whether some of tracks is reserved on a tile.
bool ValParamRailType(const RailType rail)
Validate functions for rail building.
Money RailConvertCost(RailType from, RailType to)
Calculates the cost of rail conversion.
Money RailClearCost(RailType railtype)
Returns the 'cost' of clearing the specified railtype.
Money RailBuildCost(RailType railtype)
Returns the cost of building the specified railtype.
RailFenceOffset
Offsets from base sprite for fence sprites.
@ RFO_FLAT_RIGHT
Slope FLAT, Track RIGHT, Fence W.
@ RFO_FLAT_Y_NE
Slope FLAT, Track Y, Fence NE.
@ RFO_SLOPE_NW_SW
Slope NW, Track Y, Fence SW.
@ RFO_FLAT_X_SE
Slope FLAT, Track X, Fence SE.
@ RFO_SLOPE_NW_NE
Slope NW, Track Y, Fence NE.
@ RFO_SLOPE_SE_SW
Slope SE, Track Y, Fence SW.
@ RFO_SLOPE_NE_SE
Slope NE, Track X, Fence SE.
@ RFO_FLAT_LOWER
Slope FLAT, Track LOWER, Fence N.
@ RFO_SLOPE_SW_SE
Slope SW, Track X, Fence SE.
@ RFO_FLAT_UPPER
Slope FLAT, Track UPPER, Fence S.
@ RFO_SLOPE_SE_NE
Slope SE, Track Y, Fence NE.
@ RFO_FLAT_Y_SW
Slope FLAT, Track Y, Fence SW.
@ RFO_FLAT_LEFT
Slope FLAT, Track LEFT, Fence E.
@ RFO_SLOPE_NE_NW
Slope NE, Track X, Fence NW.
@ RFO_FLAT_X_NW
Slope FLAT, Track X, Fence NW.
@ RFO_SLOPE_SW_NW
Slope SW, Track X, Fence NW.
bool IsCompatibleRail(RailType enginetype, RailType tiletype)
Checks if an engine of the given RailType can drive on a tile with a given RailType.
bool HasPowerOnRail(RailType enginetype, RailType tiletype)
Checks if an engine of the given RailType got power on a tile with a given RailType.
const RailTypeInfo * GetRailTypeInfo(RailType railtype)
Returns a pointer to the Railtype information for a given railtype.
@ Hidden
Bit number for hiding from selection.
@ NoSpriteCombine
Bit number for using non-combined junctions.
@ RTSG_GROUND
Main group of ground images.
@ RTSG_CURSORS
Cursor and toolbar icon images.
@ RTSG_GROUND_COMPLETE
Complete ground images.
@ RTSG_OVERLAY
Images for overlaying track.
@ RTSG_DEPOT
Depot images.
@ RTSG_FENCES
Fence images.
@ RTO_Y
Piece of rail in Y direction.
@ RTO_S
Piece of rail in southern corner.
@ RTO_JUNCTION_NE
Ballast for junction 'pointing' NE.
@ RTO_JUNCTION_NSEW
Ballast for full junction.
@ RTO_JUNCTION_SW
Ballast for junction 'pointing' SW.
@ RTO_SLOPE_SE
Piece of rail on slope with south-east raised.
@ RTO_E
Piece of rail in eastern corner.
@ RTO_W
Piece of rail in western corner.
@ RTO_CROSSING_XY
Crossing of X and Y rail, with ballast.
@ RTO_SLOPE_SW
Piece of rail on slope with south-west raised.
@ RTO_SLOPE_NW
Piece of rail on slope with north-west raised.
@ RTO_JUNCTION_NW
Ballast for junction 'pointing' NW.
@ RTO_JUNCTION_SE
Ballast for junction 'pointing' SE.
@ RTO_SLOPE_NE
Piece of rail on slope with north-east raised.
@ RTO_X
Piece of rail in X direction.
@ RTO_N
Piece of rail in northern corner.
bool RailNoLevelCrossings(RailType rt)
Test if a RailType disallows build of level crossings.
CommandCost CmdRemoveSignalTrack(DoCommandFlags flags, TileIndex tile, TileIndex end_tile, Track track, bool autofill)
Remove signals on a stretch of track.
int TicksToLeaveDepot(const Train *v)
Compute number of ticks when next wagon will leave a depot.
static CommandCost CheckTrackCombination(TileIndex tile, TrackBits to_build)
Check that the new track bits may be built.
static CommandCost CmdRailTrackHelper(DoCommandFlags 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 CmdBuildTrainDepot(DoCommandFlags flags, TileIndex tile, RailType railtype, DiagDirection dir)
Build a train depot.
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.
CommandCost CmdBuildSingleSignal(DoCommandFlags 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,...
CommandCost CmdBuildRailroadTrack(DoCommandFlags 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 CmdBuildSignalTrack(DoCommandFlags 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.
bool FloodHalftile(TileIndex t)
Called from water_cmd if a non-flat rail-tile gets flooded and should be converted to shore.
RailType AllocateRailType(RailTypeLabel label)
Allocate a new rail type label.
static CommandCost CheckRailSlope(Slope tileh, TrackBits rail_bits, TrackBits existing, TileIndex tile)
Tests if a track can be build on a tile.
CommandCost CmdRemoveSingleRail(DoCommandFlags flags, TileIndex tile, Track track)
Remove a single piece of track.
std::vector< RailType > _sorted_railtypes
Sorted list of rail types.
CommandCost CmdRemoveSingleSignal(DoCommandFlags flags, TileIndex tile, Track track)
Remove signals.
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 CommandCost EnsureNoTrainOnTrack(TileIndex tile, Track track)
Tests if a vehicle interacts with the specified track.
static CommandCost CmdSignalTrackHelper(DoCommandFlags 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.
static void DrawTrackBits(TileInfo *ti, TrackBits track)
Draw ground sprite and track bits.
static void DrawTrackDetails(const TileInfo *ti, const RailTypeInfo *rti, PaletteID pal)
Draw track fences.
SignalOffsets
Enum holding the signal offset in the sprite sheet according to the side it is representing.
CommandCost CmdRemoveRailroadTrack(DoCommandFlags flags, TileIndex end_tile, TileIndex start_tile, Track track)
Build rail on a stretch of track.
CommandCost CmdBuildSingleRail(DoCommandFlags flags, TileIndex tile, RailType railtype, Track track, bool auto_remove_signals)
Build a single piece of rail.
CommandCost CmdConvertRail(DoCommandFlags flags, TileIndex tile, TileIndex area_start, RailType totype, bool diagonal)
Convert one rail type to the other.
void InitRailTypes()
Resolve sprites of custom rail types.
static void DrawTrackFence_SW(const TileInfo *ti, const PalSpriteID &psid, uint num_sprites)
Draw fence at SW border matching the tile slope.
static VehicleEnterTileStates VehicleEnter_Track(Vehicle *u, TileIndex tile, int x, int y)
Tile callback routine when vehicle enters tile.
void ResetRailTypes()
Reset all rail type information to its default values.
static CommandCost TestAutoslopeOnRailTile(TileIndex tile, DoCommandFlags flags, int z_old, Slope tileh_old, int z_new, Slope tileh_new, TrackBits rail_bits)
Tests if autoslope is allowed.
static const FenceOffset _fence_offsets[]
Offsets for drawing fences.
static bool CompareRailTypes(const RailType &first, const RailType &second)
Compare railtypes based on their sorting order.
static void DrawTrackFence_NW(const TileInfo *ti, const PalSpriteID &psid, uint num_sprites)
Draw fence at NW border matching the tile slope.
Foundation GetRailFoundation(Slope tileh, TrackBits bits)
Checks if a track combination is valid on a specific slope and returns the needed foundation.
static void DrawTrackFence_NE(const TileInfo *ti, const PalSpriteID &psid, uint num_sprites)
Draw fence at NE border matching the tile slope.
static void DrawTrackFence_SE(const TileInfo *ti, const PalSpriteID &psid, uint num_sprites)
Draw fence at SE border matching the tile slope.
std::vector< Train * > TrainList
Helper type for lists/vectors of trains.
static void DrawTrackFence(const TileInfo *ti, const PalSpriteID &psid, uint num_sprites, RailFenceOffset rfo)
Draw a track fence.
Command definitions for rail.
uint GetSignalStates(Tile tile)
Set the states of the signals (Along/AgainstTrackDir)
void MakeRailDepot(Tile tile, Owner owner, DepotID depot_id, DiagDirection dir, RailType rail_type)
Make a rail depot.
RailType GetRailType(Tile t)
Gets the rail type of the given tile.
bool HasSignalOnTrackdir(Tile tile, Trackdir trackdir)
Checks for the presence of signals along the given trackdir on the given rail tile.
static debug_inline RailTileType GetRailTileType(Tile t)
Returns the RailTileType (normal with or without signals, waypoint or depot).
TrackBits GetTrackBits(Tile tile)
Gets the track bits of the given tile.
@ RAIL_TILE_DEPOT
Depot (one entrance)
@ RAIL_TILE_NORMAL
Normal rail tile without signals.
@ RAIL_TILE_SIGNALS
Normal rail tile with signals.
static debug_inline bool IsRailDepotTile(Tile t)
Is this tile rail tile and a rail depot?
Track GetRailDepotTrack(Tile t)
Returns the track of a depot, ignoring direction.
void SetTrackReservation(Tile t, TrackBits b)
Sets the reserved track bits of the tile.
bool IsSignalPresent(Tile t, uint8_t signalbit)
Checks whether the given signals is present.
DiagDirection GetRailDepotDirection(Tile t)
Returns the direction the depot is facing to.
void SetTrackBits(Tile t, TrackBits b)
Sets the track bits of the given tile.
RailGroundType
The ground 'under' the rail.
@ RAIL_GROUND_FENCE_HORIZ1
Grass with a fence at the southern side.
@ RAIL_GROUND_FENCE_VERT1
Grass with a fence at the eastern side.
@ RAIL_GROUND_ICE_DESERT
Icy or sandy.
@ RAIL_GROUND_FENCE_NE
Grass with a fence at the NE edge.
@ RAIL_GROUND_FENCE_NESW
Grass with a fence at the NE and SW edges.
@ RAIL_GROUND_FENCE_HORIZ2
Grass with a fence at the northern side.
@ RAIL_GROUND_FENCE_SW
Grass with a fence at the SW edge.
@ RAIL_GROUND_FENCE_NW
Grass with a fence at the NW edge.
@ RAIL_GROUND_WATER
Grass with a fence and shore or water on the free halftile.
@ RAIL_GROUND_BARREN
Nothing (dirt)
@ RAIL_GROUND_FENCE_VERT2
Grass with a fence at the western side.
@ RAIL_GROUND_GRASS
Grassy.
@ RAIL_GROUND_HALF_SNOW
Snow only on higher part of slope (steep or one corner raised)
@ RAIL_GROUND_FENCE_SENW
Grass with a fence at the NW and SE edges.
@ RAIL_GROUND_FENCE_SE
Grass with a fence at the SE edge.
uint GetPresentSignals(Tile tile)
Get whether the given signals are present (Along/AgainstTrackDir)
bool HasSignalOnTrack(Tile tile, Track track)
Checks for the presence of signals (either way) on the given track on the given rail tile.
bool IsOnewaySignal(Tile t, Track track)
One-way signals can't be passed the 'wrong' way.
void SetPresentSignals(Tile tile, uint signals)
Set whether the given signals are present (Along/AgainstTrackDir)
static debug_inline bool IsRailDepot(Tile t)
Is this rail tile a rail depot?
void SetRailDepotExitDirection(Tile tile, DiagDirection dir)
Sets the exit direction of a rail depot.
static debug_inline bool IsPlainRail(Tile t)
Returns whether this is plain rails, with or without signals.
TrackBits GetRailReservationTrackBits(Tile t)
Returns the reserved track bits of the tile.
bool HasDepotReservation(Tile t)
Get the reservation state of the depot.
void SetHasSignals(Tile tile, bool signals)
Add/remove the 'has signal' bit from the RailTileType.
bool HasSignals(Tile t)
Checks if a rail tile has signals.
static debug_inline bool IsPlainRailTile(Tile t)
Checks whether the tile is a rail tile or rail tile with signals.
bool HasTrack(Tile tile, Track track)
Returns whether the given track is present on the given tile.
SignalState GetSingleSignalState(Tile t, uint8_t signalbit)
Get the state of a single signal.
void SetSignalStates(Tile tile, uint state)
Set the states of the signals (Along/AgainstTrackDir)
void SetRailType(Tile t, RailType r)
Sets the rail type of the given tile.
RailType
Enumeration for all possible railtypes.
@ RAILTYPE_END
Used for iterations.
@ INVALID_RAILTYPE
Flag for invalid railtype.
@ RAILTYPE_ELECTRIC
Electric rails.
@ RAILTYPE_RAIL
Standard non-electric rails.
All the railtype-specific information is stored here.
static const RailTypeInfo _original_railtypes[]
Global Railtype definition.
bool RoadNoLevelCrossing(RoadType roadtype)
Test if road disallows level crossings.
Money RoadBuildCost(RoadType roadtype)
Returns the cost of building the specified roadtype.
void UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval(TileIndex tile, Axis road_axis)
Update adjacent level crossing tiles in this multi-track crossing, due to removal of a level crossing...
void MarkDirtyAdjacentLevelCrossingTiles(TileIndex tile, Axis road_axis)
Find adjacent level crossing tiles in this multi-track crossing and mark them dirty.
void UpdateLevelCrossing(TileIndex tile, bool sound=true, bool force_bar=false)
Update a level crossing to barred or open (crossing may include multiple adjacent tiles).
bool IsLevelCrossingTile(Tile t)
Return whether a tile is a level crossing tile.
RoadBits GetRoadBits(Tile t, RoadTramType rtt)
Get the present road bits for a specific road type.
Axis GetCrossingRoadAxis(Tile t)
Get the road axis of a level crossing.
TrackBits GetCrossingRailBits(Tile tile)
Get the rail track bits of a level crossing.
Track GetCrossingRailTrack(Tile tile)
Get the rail track of a level crossing.
DisallowedRoadDirections GetDisallowedRoadDirections(Tile t)
Gets the disallowed directions.
void MakeRoadNormal(Tile t, RoadBits bits, RoadType road_rt, RoadType tram_rt, TownID town, Owner road, Owner tram)
Make a normal road tile.
void MakeRoadCrossing(Tile t, Owner road, Owner tram, Owner rail, Axis roaddir, RailType rat, RoadType road_rt, RoadType tram_rt, TownID town)
Make a level crossing.
RoadBits GetCrossingRoadBits(Tile tile)
Get the road bits of a level crossing.
Owner GetRoadOwner(Tile t, RoadTramType rtt)
Get the owner of a specific road type.
bool IsLevelCrossing(Tile t)
Return whether a tile is a level crossing.
bool HasRoadWorks(Tile t)
Check if a tile has road works.
static debug_inline bool IsNormalRoad(Tile t)
Return whether a tile is a normal road.
RoadBits
Enumeration for the road parts on a tile.
@ ROAD_NONE
No road-part is build.
@ ROAD_Y
Full road along the y-axis (north-west + south-east)
@ ROAD_X
Full road along the x-axis (south-west + north-east)
RoadType
The different roadtypes we support.
@ INVALID_ROADTYPE
flag for invalid roadtype
@ DRD_NONE
None of the directions are disallowed.
A number of safeguards to prevent using unsafe methods.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
ClientSettings _settings_client
The current settings for this game.
void AddTrackToSignalBuffer(TileIndex tile, Track track, Owner owner)
Add track to signal update buffer.
void AddSideToSignalBuffer(TileIndex tile, DiagDirection side, Owner owner)
Add side of tile to signal update buffer.
uint8_t SignalAgainstTrackdir(Trackdir trackdir)
Maps a trackdir to the bit that stores its status in the map arrays, in the direction against the tra...
uint8_t SignalAlongTrackdir(Trackdir trackdir)
Maps a trackdir to the bit that stores its status in the map arrays, in the direction along with the ...
uint8_t SignalOnTrack(Track track)
Maps a Track to the bits that store the status of the two signals that can be present on the given tr...
SignalType
Type of signal, i.e.
@ SIGTYPE_ENTRY
presignal block entry
@ SIGTYPE_EXIT
presignal block exit
@ SIGTYPE_BLOCK
block signal
SignalState
These are states in which a signal can be.
@ SIGNAL_STATE_RED
The signal is red.
@ SIGNAL_STATE_GREEN
The signal is green.
SignalVariant
Variant of the signal, i.e.
@ SIG_SEMAPHORE
Old-fashioned semaphore signal.
@ SIG_ELECTRIC
Light signal.
bool IsSpecialRailFoundation(Foundation f)
Tests if a foundation is a special rail foundation for single horizontal/vertical track.
Slope SlopeWithThreeCornersRaised(Corner corner)
Returns the slope with all except one corner raised.
Corner OppositeCorner(Corner corner)
Returns the opposite corner.
static constexpr Corner GetHalftileSlopeCorner(Slope s)
Returns the leveled halftile of a halftile slope.
static constexpr Slope RemoveHalftileSlope(Slope s)
Removes a halftile slope from a slope.
bool IsSlopeWithOneCornerRaised(Slope s)
Tests if a specific slope has exactly one corner raised.
uint SlopeToSpriteOffset(Slope s)
Returns the Sprite offset for a given Slope.
bool IsNonContinuousFoundation(Foundation f)
Tests if a foundation is a non-continuous foundation, i.e.
Corner GetHighestSlopeCorner(Slope s)
Returns the highest corner of a slope (one corner raised or a steep slope).
Corner GetHalftileFoundationCorner(Foundation f)
Returns the halftile corner of a halftile-foundation.
static constexpr bool IsValidCorner(Corner corner)
Rangecheck for Corner enumeration.
static constexpr bool IsSteepSlope(Slope s)
Checks if a slope is steep.
bool IsSlopeWithThreeCornersRaised(Slope s)
Tests if a specific slope has exactly three corners raised.
Foundation FlatteningFoundation(Slope s)
Returns the foundation needed to flatten a slope.
static constexpr bool IsHalftileSlope(Slope s)
Checks for non-continuous slope on halftile foundations.
Foundation HalftileFoundation(Corner corner)
Returns the halftile foundation for single horizontal/vertical track.
Foundation SpecialRailFoundation(Corner corner)
Returns the special rail foundation for single horizontal/vertical track.
Slope ComplementSlope(Slope s)
Return the complement of a slope.
Slope SlopeWithOneCornerRaised(Corner corner)
Returns the slope with a specific corner raised.
Corner
Enumeration of tile corners.
Slope
Enumeration for the slope-type.
@ SLOPE_W
the west corner of the tile is raised
@ SLOPE_ELEVATED
bit mask containing all 'simple' slopes
@ SLOPE_NS
north and south corner are raised
@ SLOPE_E
the east corner of the tile is raised
@ SLOPE_S
the south corner of the tile is raised
@ SLOPE_N
the north corner of the tile is raised
@ SLOPE_SW
south and west corner are raised
@ SLOPE_NE
north and east corner are raised
@ SLOPE_SE
south and east corner are raised
@ SLOPE_NW
north and west corner are raised
@ SLOPE_EW
east and west corner are raised
Foundation
Enumeration for Foundations.
@ FOUNDATION_LEVELED
The tile is leveled up to a flat slope.
@ FOUNDATION_NONE
The tile has no foundation, the slope remains unchanged.
@ FOUNDATION_INCLINED_X
The tile has an along X-axis inclined foundation.
@ FOUNDATION_STEEP_BOTH
The tile has a steep slope. The lowest corner is raised by a foundation and the upper halftile is lev...
@ FOUNDATION_INCLINED_Y
The tile has an along Y-axis inclined foundation.
@ FOUNDATION_STEEP_LOWER
The tile has a steep slope. The lowest corner is raised by a foundation to allow building railroad on...
@ FOUNDATION_HALFTILE_N
Level north halftile non-continuously.
@ FOUNDATION_INVALID
Used inside "rail_cmd.cpp" to indicate invalid slope/track combination.
static const uint32_t VALID_LEVEL_CROSSING_SLOPES
Constant bitset with safe slopes for building a level crossing.
Functions related to sound.
void DrawRailTileSeqInGUI(int x, int y, const DrawTileSprites *dts, int32_t total_offset, uint32_t newgrf_offset, PaletteID default_palette)
Draw tile sprite sequence in GUI with railroad specifics.
void DrawRailTileSeq(const struct TileInfo *ti, const DrawTileSprites *dts, TransparencyOption to, int32_t total_offset, uint32_t newgrf_offset, PaletteID default_palette)
Draw tile sprite sequence on tile with railroad specifics.
PaletteID GroundSpritePaletteTransform(SpriteID image, PaletteID pal, PaletteID default_pal)
Applies PALETTE_MODIFIER_COLOUR to a palette entry of a ground sprite.
static const PaletteID PALETTE_CRASH
Recolour sprite greying of crashed vehicles.
static const PaletteID PALETTE_TO_BARE_LAND
sets colour to bare land stuff for rail, road and crossings
bool IsRailStationTile(Tile t)
Is this tile a station tile and a rail station?
Track GetRailStationTrack(Tile t)
Get the rail track of a rail station tile.
bool IsStationTileBlocked(Tile t)
Is tile t a blocked tile?
bool HasStationRail(Tile t)
Has this station tile a rail? In other words, is this station tile a rail station or rail waypoint?
Definition of base types and functions in a cross-platform compatible way.
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
Class to backup a specific variable and restore it later.
void Restore()
Restore the variable.
VehicleType type
Type of vehicle.
GUISettings gui
settings related to the GUI
std::array< uint32_t, RAILTYPE_END > rail
Count of company owned track bits for each rail type.
CompanyInfrastructure infrastructure
NOSAVE: Counts of company owned infrastructure.
bool build_on_slopes
allow building on slopes
bool crossing_with_competitor
allow building of level crossings with competitor roads or rails
uint8_t train_signal_side
show signals on left / driving / right side
TimerGameCalendar::Date build_date
Date of construction.
Represents a diagonal tile area.
Ground palette sprite of a tile, together with its sprite layout.
PalSpriteID ground
Palette and sprite for the ground.
Offsets for drawing fences.
Corner height_ref
Corner to use height offset from.
bool show_track_reservation
highlight reserved tracks.
LandscapeType landscape
the landscape we're currently in
PathfinderSettings pf
settings for all pathfinders
ConstructionSettings construction
construction of things in-game
GameCreationSettings game_creation
settings used during the creation of a game (map)
VehicleSettings vehicle
options for vehicles
static debug_inline uint Size()
Get the size of the map.
bool IsType(OrderType type) const
Check whether this order is of the given type.
Represents the covered area of e.g.
Combination of a palette sprite and a 'real' sprite.
SpriteID sprite
The 'real' sprite.
PaletteID pal
The palette (use PAL_NONE) if not needed)
bool forbid_90_deg
forbid trains to make 90 deg turns
static Titem * Get(auto index)
Returns Titem with given index.
Tindex index
Index of this pool item.
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function()
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
T * Next() const
Get next vehicle in the chain.
static T * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
T * First() const
Get the first vehicle in the chain.
Used to only draw a part of the sprite.
Tile description for the 'land area information' tool.
uint16_t rail_speed
Speed limit of rail (bridges and track)
StringID str
Description of the tile.
TimerGameCalendar::Date build_date
Date of construction of tile contents.
std::array< Owner, 4 > owner
Name of the owner(s)
StringID railtype
Type of rail on the tile.
A pair-construct of a TileIndexDiff.
int16_t x
The x value of the coordinate.
int16_t y
The y value of the coordinate.
Tile information, used while rendering the tile.
Slope tileh
Slope of the tile.
TileIndex tile
Tile index.
Set of callback functions for performing tile operations of a given tile type.
'Train' is either a loco or a wagon.
Trackdir GetVehicleTrackdir() const override
Get the tracks of the train vehicle.
int CalcNextVehicleOffset() const
Calculate the offset from this vehicle's center to the following center taking the vehicle lengths in...
uint8_t train_acceleration_model
realistic acceleration for trains
uint8_t road_side
the side of the road vehicles drive on
bool disable_elrails
when true, the elrails are disabled
Direction direction
facing
VehStates vehstatus
Status.
Order current_order
The current order (+ status, like: loading)
int32_t y_pos
y coordinate.
int32_t x_pos
x coordinate.
uint16_t cur_speed
current speed
TileIndex tile
Current tile index.
@ CannotEnter
The vehicle cannot enter the tile.
@ EnteredWormhole
The vehicle either entered a bridge, tunnel or depot tile (this includes the last tile of the bridge/...
std::tuple< Slope, int > GetTileSlopeZ(TileIndex tile)
Return the slope of a given tile inside the map.
bool IsTileOwner(Tile tile, Owner owner)
Checks if a tile belongs to the given owner.
Owner GetTileOwner(Tile tile)
Returns the owner of a tile.
void SetTileOwner(Tile tile, Owner owner)
Sets the owner of a tile.
int GetTileMaxPixelZ(TileIndex tile)
Get top height of the tile.
static debug_inline TileType GetTileType(Tile tile)
Get the tiletype of a given tile.
std::tuple< Slope, int > GetTilePixelSlope(TileIndex tile)
Return the slope of a given tile.
bool IsValidTile(Tile tile)
Checks if a tile is valid.
TropicZone GetTropicZone(Tile tile)
Get the tropic zone.
static debug_inline bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Slope GetTileSlope(TileIndex tile)
Return the slope of a given tile inside the map.
@ TROPICZONE_DESERT
Tile is desert.
constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
static constexpr uint TILE_SIZE
Tile size in world coordinates.
static constexpr uint TILE_HEIGHT
Height of a height level in world coordinate AND in pixels in ZOOM_BASE.
TileType
The different types of tiles.
@ MP_ROAD
A tile with road (or tram tracks)
@ MP_STATION
A tile of a station.
@ MP_TUNNELBRIDGE
Tunnel entry/exit and bridge heads.
@ MP_HOUSE
A house by a town.
@ MP_INDUSTRY
Part of an industry.
@ MP_OBJECT
Contains objects such as transmitters and owned land.
Definition of the game-calendar-timer.
void MakeDefaultName(T *obj)
Set the default name for a depot/waypoint.
TownID GetTownIndex(Tile t)
Get the index of which town this house/street is attached to.
Trackdir TrackToTrackdir(Track track)
Returns a Trackdir for the given Track.
Trackdir RemoveFirstTrackdir(TrackdirBits *trackdirs)
Removes first Trackdir from TrackdirBits and returns it.
Track TrackdirToTrack(Trackdir trackdir)
Returns the Track that a given Trackdir represents.
TrackBits CornerToTrackBits(Corner corner)
Returns a single horizontal/vertical trackbit that is in a specific tile corner.
TrackBits TrackToTrackBits(Track track)
Maps a Track to the corresponding TrackBits value.
TrackdirBits TrackBitsToTrackdirBits(TrackBits bits)
Converts TrackBits to TrackdirBits while allowing both directions.
TrackdirBits TrackStatusToTrackdirBits(TrackStatus ts)
Returns the present-trackdir-information of a TrackStatus.
Track TrackBitsToTrack(TrackBits tracks)
Converts TrackBits to Track.
Trackdir ReverseTrackdir(Trackdir trackdir)
Maps a trackdir to the reverse trackdir.
TrackStatus CombineTrackStatus(TrackdirBits trackdirbits, TrackdirBits red_signals)
Builds a TrackStatus.
bool TracksOverlap(TrackBits bits)
Checks if the given tracks overlap, ie form a crossing.
TrackdirBits TrackdirReachesTrackdirs(Trackdir trackdir)
Maps a trackdir to the trackdirs that can be reached from it (ie, when entering the next tile.
bool IsValidTrack(Track track)
Checks if a Track is valid.
Track FindFirstTrack(TrackBits tracks)
Returns first Track from TrackBits or INVALID_TRACK.
bool IsDiagonalTrackdir(Trackdir trackdir)
Checks if a given Trackdir is diagonal.
TrackBits DiagDirToDiagTrackBits(DiagDirection diagdir)
Maps a (4-way) direction to the diagonal track bits incidating with that diagdir.
Track RemoveFirstTrack(TrackBits *tracks)
Removes first Track from TrackBits and returns it.
DiagDirection TrackdirToExitdir(Trackdir trackdir)
Maps a trackdir to the (4-way) direction the tile is exited when following that trackdir.
Track DiagDirToDiagTrack(DiagDirection diagdir)
Maps a (4-way) direction to the diagonal track incidating with that diagdir.
TrackBits TrackdirBitsToTrackBits(TrackdirBits bits)
Discards all directional information from a TrackdirBits value.
Sprites to use and how to display them for train depot tiles.
TrackBits
Allow incrementing of Track variables.
@ TRACK_BIT_UPPER
Upper track.
@ TRACK_BIT_DEPOT
Bitflag for a depot.
@ TRACK_BIT_LEFT
Left track.
@ TRACK_BIT_Y
Y-axis track.
@ TRACK_BIT_CROSS
X-Y-axis cross.
@ TRACK_BIT_HORZ
Upper and lower track.
@ TRACK_BIT_NONE
No track.
@ TRACK_BIT_3WAY_NW
"Arrow" to the north-west
@ TRACK_BIT_X
X-axis track.
@ TRACK_BIT_LOWER
Lower track.
@ TRACK_BIT_ALL
All possible tracks.
@ TRACK_BIT_3WAY_NE
"Arrow" to the north-east
@ TRACK_BIT_RIGHT
Right track.
@ TRACK_BIT_3WAY_SW
"Arrow" to the south-west
@ TRACK_BIT_VERT
Left and right track.
@ TRACK_BIT_3WAY_SE
"Arrow" to the south-east
Trackdir
Enumeration for tracks and directions.
@ INVALID_TRACKDIR
Flag for an invalid trackdir.
TrackdirBits
Allow incrementing of Trackdir variables.
@ TRACKDIR_BIT_LEFT_S
Track left, direction south.
@ TRACKDIR_BIT_Y_NW
Track y-axis, direction north-west.
@ TRACKDIR_BIT_UPPER_E
Track upper, direction east.
@ TRACKDIR_BIT_X_NE
Track x-axis, direction north-east.
@ TRACKDIR_BIT_LOWER_E
Track lower, direction east.
@ TRACKDIR_BIT_LEFT_N
Track left, direction north.
@ TRACKDIR_BIT_RIGHT_S
Track right, direction south.
@ TRACKDIR_BIT_Y_SE
Track y-axis, direction south-east.
@ TRACKDIR_BIT_NONE
No track build.
@ TRACKDIR_BIT_RIGHT_N
Track right, direction north.
@ TRACKDIR_BIT_UPPER_W
Track upper, direction west.
@ TRACKDIR_BIT_LOWER_W
Track lower, direction west.
@ TRACKDIR_BIT_X_SW
Track x-axis, direction south-west.
Track
These are used to specify a single track.
@ INVALID_TRACK
Flag for an invalid track.
@ TRACK_Y
Track along the y-axis (north-west to south-east)
@ TRACK_LOWER
Track in the lower corner of the tile (south)
@ TRACK_END
Used for iterations.
@ TRACK_LEFT
Track in the left corner of the tile (west)
@ TRACK_RIGHT
Track in the right corner of the tile (east)
@ TRACK_BEGIN
Used for iterations.
@ TRACK_X
Track along the x-axis (north-east to south-west)
@ TRACK_UPPER
Track in the upper corner of the tile (north)
Base for the train class.
static constexpr ConsistChangeFlags CCF_TRACK
Valid changes while vehicle is driving, and possibly changing tracks.
bool TryPathReserve(Train *v, bool mark_as_stuck=false, bool first_tile_okay=false)
Try to reserve a path to a safe position.
void FreeTrainTrackReservation(const Train *v)
Free the reserved path in front of a vehicle.
uint8_t _display_opt
What do we want to draw/do?
bool IsInvisibilitySet(TransparencyOption to)
Check if the invisibility option bit is set and if we aren't in the game menu (there's never transpar...
@ TO_BUILDINGS
company buildings - depots, stations, HQ, ...
TransportType
Available types of transport.
@ TRANSPORT_RAIL
Transport by train.
@ TRANSPORT_WATER
Transport over water.
Header file for things common for tunnels and bridges.
void MarkBridgeDirty(TileIndex begin, TileIndex end, DiagDirection direction, uint bridge_height)
Mark bridge tiles dirty.
uint GetTunnelBridgeLength(TileIndex begin, TileIndex end)
Calculates the length of a tunnel or a bridge (without end tiles)
Functions that have tunnels and bridges in common.
DiagDirection GetTunnelBridgeDirection(Tile t)
Get the direction pointing to the other end.
bool HasTunnelBridgeReservation(Tile t)
Get the reservation state of the rail tunnel/bridge.
TransportType GetTunnelBridgeTransportType(Tile t)
Tunnel: Get the transport type of the tunnel (road or rail) Bridge: Get the transport type of the bri...
TileIndex GetOtherTunnelBridgeEnd(Tile t)
Determines type of the wormhole and returns its other end.
CommandCost EnsureNoVehicleOnGround(TileIndex tile)
Ensure there is no vehicle at the ground at the given position.
void VehicleEnterDepot(Vehicle *v)
Vehicle entirely entered the depot, update its status, orders, vehicle windows, service it,...
CommandCost EnsureNoTrainOnTrackBits(TileIndex tile, TrackBits track_bits)
Tests if a vehicle interacts with the specified track bits.
CommandCost TunnelBridgeIsFree(TileIndex tile, TileIndex endtile, const Vehicle *ignore)
Finds vehicle in tunnel / bridge.
@ Hidden
Vehicle is not visible.
@ Stopped
Vehicle is stopped by the player.
Functions related to vehicles.
bool HasVehicleOnTile(TileIndex tile, UnaryPred &&predicate)
Loop over vehicles on a tile, and check whether a predicate is true for any of them.
@ VEH_SHIP
Ship vehicle type.
@ VEH_TRAIN
Train vehicle type.
void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int z, const SpriteBounds &bounds, bool transparent, const SubSprite *sub)
Draw a (transparent) sprite at given coordinates with a given bounding box.
void DrawGroundSprite(SpriteID image, PaletteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
Draws a ground sprite for the current tile.
Functions related to (drawing on) viewports.
static constexpr int BB_HEIGHT_UNDER_BRIDGE
Some values for constructing bounding boxes (BB).
Functions related to water (management)
void TileLoop_Water(TileIndex tile)
Let a water tile floods its diagonal adjoining tiles called from tunnelbridge_cmd,...
@ FLOOD_NONE
The tile does not flood neighboured tiles.
FloodingBehaviour GetFloodingBehaviour(TileIndex tile)
Returns the behaviour of a tile during flooding.
void CheckForDockingTile(TileIndex t)
Mark the supplied tile as a docking tile if it is suitable for docking.
void MakeShore(Tile t)
Helper function to make a coast tile.
bool IsDockingTile(Tile t)
Checks whether the tile is marked as a dockling tile.
void SetDockingTile(Tile t, bool b)
Set the docking tile state of a tile.
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
@ WC_VEHICLE_DEPOT
Depot view; Window numbers:
@ WC_BUILD_VEHICLE
Build vehicle; Window numbers:
Entry point for OpenTTD to YAPF's cache.
void YapfNotifyTrackLayoutChange(TileIndex tile, Track track)
Use this function to notify YAPF that track layout (or signal configuration) has change.