diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index a8d5db9e38..c34a4729dc 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -700,7 +700,7 @@ static bool DisasterTick_Submarine(DisasterVehicle *v) TileIndex tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction)); if (IsValidTile(tile)) { - TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0)); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_WATER, 0)); if (trackbits == TRACK_BIT_ALL && !Chance16(1, 90)) { GetNewVehiclePosResult gp = GetNewVehiclePos(v); v->UpdatePosition(gp.x, gp.y, v->z_pos); diff --git a/src/elrail.cpp b/src/elrail.cpp index 1c788d9a5e..e079fb30b4 100644 --- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -169,7 +169,7 @@ static TrackBits MaskWireBits(TileIndex t, TrackBits tracks) TileIndex next_tile = TileAddByDiagDir(t, d); RailType rt = GetTileRailTypeByEntryDir(next_tile, d); if (rt == INVALID_RAILTYPE || !HasRailCatenary(rt) || - ((TrackStatusToTrackBits(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(d)) == TRACK_BIT_NONE && + ((TrackdirBitsToTrackBits(GetTileTrackdirBits(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(d)) == TRACK_BIT_NONE && (!HasStationTileRail(next_tile) || GetRailStationAxis(next_tile) != DiagDirToAxis(d) || !CanStationTileHaveWires(next_tile)))) { neighbour_tdb |= DiagdirReachesTrackdirs(ReverseDiagDir(d)); } diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index a9842f833a..d9493a3b69 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -200,7 +200,7 @@ static uint32 GetRailContinuationInfo(TileIndex tile) for (i = 0; i < lengthof(x_dir); i++, dir++, diagdir++) { TileIndex neighbour_tile = tile + TileOffsByDir(*dir); - TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(neighbour_tile, TRANSPORT_RAIL, 0)); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(neighbour_tile, TRANSPORT_RAIL, 0)); if (trackbits != TRACK_BIT_NONE) { /* If there is any track on the tile, set the bit in the second byte */ SetBit(res, i + 8); diff --git a/src/pathfinder/follow_track.hpp b/src/pathfinder/follow_track.hpp index 06f28c32d7..941a5230ec 100644 --- a/src/pathfinder/follow_track.hpp +++ b/src/pathfinder/follow_track.hpp @@ -124,9 +124,8 @@ struct CFollowTrackT m_old_td = old_td; m_err = EC_NONE; dbg_assert_tile( - ((TrackStatusToTrackdirBits( - GetTileTrackStatus(m_old_tile, TT(), (IsRoadTT() && m_veh != nullptr) ? (this->IsTram() ? RTT_TRAM : RTT_ROAD) : 0) - ) & TrackdirToTrackdirBits(m_old_td)) != 0) || + ((GetTileTrackdirBits(m_old_tile, TT(), (IsRoadTT() && m_veh != nullptr) ? (this->IsTram() ? RTT_TRAM : RTT_ROAD) : 0) + & TrackdirToTrackdirBits(m_old_td)) != 0) || (IsTram() && GetSingleTramBit(m_old_tile) != INVALID_DIAGDIR), // Disable the assertion for single tram bits m_old_tile ); @@ -243,7 +242,7 @@ protected: } else if (IsRoadTT()) { m_new_td_bits = GetTrackdirBitsForRoad(m_new_tile, this->IsTram() ? RTT_TRAM : RTT_ROAD); } else { - m_new_td_bits = TrackStatusToTrackdirBits(GetTileTrackStatus(m_new_tile, TT(), 0)); + m_new_td_bits = GetTileTrackdirBits(m_new_tile, TT(), 0); } return (m_new_td_bits != TRACKDIR_BIT_NONE); } diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp index 00272184db..d4b82b1f09 100644 --- a/src/pathfinder/npf/npf.cpp +++ b/src/pathfinder/npf/npf.cpp @@ -834,7 +834,7 @@ static bool CanEnterTile(TileIndex tile, DiagDirection dir, AyStarUserData *user */ static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, TileIndex src_tile, Trackdir src_trackdir, TransportType type, uint subtype) { - TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(dst_tile, type, subtype)); + TrackdirBits trackdirbits = GetTileTrackdirBits(dst_tile, type, subtype); if (trackdirbits == TRACKDIR_BIT_NONE && type == TRANSPORT_ROAD && (RoadTramType)subtype == RTT_TRAM) { /* GetTileTrackStatus() returns 0 for single tram bits. @@ -1222,7 +1222,7 @@ bool NPFShipCheckReverse(const Ship *v, Trackdir *best_td) AyStarUserData user = { v->owner, TRANSPORT_WATER, RAILTYPES_NONE, ROADTYPES_NONE, 0 }; if (best_td != nullptr) { DiagDirection entry = ReverseDiagDir(VehicleExitDir(v->direction, v->state)); - TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & TrackStatusToTrackdirBits(GetTileTrackStatus(v->tile, TRANSPORT_WATER, 0, entry)); + TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & GetTileTrackdirBits(v->tile, TRANSPORT_WATER, 0, entry); Trackdir best = (Trackdir)FindFirstBit2x64(rtds); rtds = KillFirstBit(rtds); if (rtds == TRACKDIR_BIT_NONE) return false; /* At most one choice. */ diff --git a/src/pathfinder/pathfinder_func.h b/src/pathfinder/pathfinder_func.h index f11b8088a6..83f3ac577a 100644 --- a/src/pathfinder/pathfinder_func.h +++ b/src/pathfinder/pathfinder_func.h @@ -59,7 +59,7 @@ static inline TileIndex CalcClosestStationTile(StationID station, TileIndex tile */ static inline TrackdirBits GetTrackdirBitsForRoad(TileIndex tile, RoadTramType rtt) { - TrackdirBits bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, rtt)); + TrackdirBits bits = GetTileTrackdirBits(tile, TRANSPORT_ROAD, rtt); if (rtt == RTT_TRAM && bits == TRACKDIR_BIT_NONE) { if (IsNormalRoadTile(tile)) { diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp index 68c813c31b..9fa9697663 100644 --- a/src/pathfinder/yapf/yapf_destrail.hpp +++ b/src/pathfinder/yapf/yapf_destrail.hpp @@ -167,7 +167,7 @@ public: default: m_destTile = v->dest_tile; m_dest_station_id = INVALID_STATION; - m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_RAIL, 0)); + m_destTrackdirs = GetTileTrackdirBits(v->dest_tile, TRANSPORT_RAIL, 0); break; } CYapfDestinationRailBase::SetDestination(v); diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index fb3ee0c25a..df33fcbedb 100644 --- a/src/pathfinder/yapf/yapf_road.cpp +++ b/src/pathfinder/yapf/yapf_road.cpp @@ -297,7 +297,7 @@ public: } else { m_dest_station = INVALID_STATION; m_destTile = v->dest_tile; - m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_ROAD, GetRoadTramType(v->roadtype))); + m_destTrackdirs = GetTileTrackdirBits(v->dest_tile, TRANSPORT_ROAD, GetRoadTramType(v->roadtype)); } } diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index 9bbb47aae3..24eed596d2 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -41,7 +41,7 @@ public: } else { m_destStation = INVALID_STATION; m_destTile = v->dest_tile; - m_destTrackdirs = TrackStatusToTrackdirBits(GetTileTrackStatus(v->dest_tile, TRANSPORT_WATER, 0)); + m_destTrackdirs = GetTileTrackdirBits(v->dest_tile, TRANSPORT_WATER, 0); } } @@ -216,7 +216,7 @@ public: pf.SetOrigin(tile, TrackdirToTrackdirBits(td1) | TrackdirToTrackdirBits(td2)); } else { DiagDirection entry = ReverseDiagDir(VehicleExitDir(v->direction, v->state)); - TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0, entry)); + TrackdirBits rtds = DiagdirReachesTrackdirs(entry) & GetTileTrackdirBits(tile, TRANSPORT_WATER, 0, entry); pf.SetOrigin(tile, rtds); } pf.SetDestination(v); diff --git a/src/pbs.cpp b/src/pbs.cpp index 7c48cb8cda..3c0a034d49 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -105,8 +105,8 @@ bool TryReserveRailTrackdir(const Train *v, TileIndex tile, Trackdir td, bool tr */ bool TryReserveRailTrack(TileIndex tile, Track track, bool trigger_stations) { - assert_msg_tile((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & TrackToTrackBits(track)) != 0, tile, - "%X, %X, %X", TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)), track, TrackToTrackBits(track)); + assert_msg_tile((TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)) & TrackToTrackBits(track)) != 0, tile, + "%X, %X, %X", TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)), track, TrackToTrackBits(track)); if (_settings_client.gui.show_track_reservation) { /* show the reserved rail if needed */ @@ -202,7 +202,7 @@ void UnreserveRailTrackdir(TileIndex tile, Trackdir td) */ void UnreserveRailTrack(TileIndex tile, Track t) { - assert_msg_tile(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & TrackToTrackBits(t), tile, "track: %u", t); + assert_msg_tile(TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)) & TrackToTrackBits(t), tile, "track: %u", t); if (_settings_client.gui.show_track_reservation) { if (IsTileType(tile, MP_TUNNELBRIDGE)) { @@ -871,7 +871,7 @@ bool ValidateLookAhead(const Train *v) } if (HasBit(v->lookahead->flags, TRLF_DEPOT_END) && !IsRailDepotTile(tile)) return false; - TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); + TrackdirBits trackdirbits = GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0); if (!HasTrackdir(trackdirbits, trackdir)) return false; return true; diff --git a/src/programmable_signals_gui.cpp b/src/programmable_signals_gui.cpp index a7f1026e7d..26f7ec3491 100644 --- a/src/programmable_signals_gui.cpp +++ b/src/programmable_signals_gui.cpp @@ -419,7 +419,7 @@ public: { if (this->IsWidgetLowered(PROGRAM_WIDGET_COPY_PROGRAM)) { //Copy program from another progsignal - TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile1, TRANSPORT_RAIL, 0)); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile1, TRANSPORT_RAIL, 0)); if (trackbits & TRACK_BIT_VERT) { // N-S direction trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; } @@ -466,7 +466,7 @@ public: return; } - TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile1, TRANSPORT_RAIL, 0)); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile1, TRANSPORT_RAIL, 0)); if (trackbits & TRACK_BIT_VERT) { // N-S direction trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; } diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index e9ebadf6af..4db2bc9a8b 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1876,7 +1876,7 @@ static bool CheckSignalAutoFill(TileIndex &tile, Trackdir &trackdir, int &signal if (tile == INVALID_TILE) return false; /* Check for track bits on the new tile */ - TrackdirBits trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); + TrackdirBits trackdirbits = GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0); if (TracksOverlap(TrackdirBitsToTrackBits(trackdirbits))) return false; trackdirbits &= TrackdirReachesTrackdirs(trackdir); @@ -1920,7 +1920,7 @@ static bool CheckSignalAutoFill(TileIndex &tile, Trackdir &trackdir, int &signal signal_ctr += GetTunnelBridgeLength(orig_tile, tile) * 2; /* Check for track bits on the new tile */ - trackdirbits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); + trackdirbits = GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0); if (TracksOverlap(TrackdirBitsToTrackBits(trackdirbits))) return false; trackdirbits &= TrackdirReachesTrackdirs(trackdir); @@ -3916,6 +3916,7 @@ static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode, case RAIL_TILE_SIGNALS: { trackbits = GetTrackBits(tile); + if (sub_mode & TTSSM_NO_RED_SIGNALS) break; byte a = GetPresentSignals(tile); uint b = GetSignalStates(tile); @@ -3953,7 +3954,7 @@ static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode, static bool ClickTile_Track(TileIndex tile) { if (_ctrl_pressed && IsPlainRailTile(tile)) { - TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)); if (trackbits & TRACK_BIT_VERT) { // N-S direction trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 7b14541325..91a31281f0 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -239,7 +239,7 @@ static SignalType GetDefaultSignalType() */ static void GenericPlaceSignals(TileIndex tile) { - TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)); if (trackbits & TRACK_BIT_VERT) { // N-S direction trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 305fcce3cb..4381973987 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -2721,7 +2721,7 @@ static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, u RoadType rt = (RoadType)(rtfield - 1); return HasBit(_roadtypes_non_train_colliding, rt); }; - if (IsCrossingBarred(tile) && !is_non_colliding()) { + if (!(sub_mode & TTSSM_NO_RED_SIGNALS) && IsCrossingBarred(tile) && !is_non_colliding()) { red_signals = trackdirbits; if (TrainOnCrossing(tile)) break; diff --git a/src/roadveh.h b/src/roadveh.h index 64920d9fc0..c3bae4bf33 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -339,8 +339,7 @@ protected: // These functions should not be called outside acceleration code. */ inline bool TileMayHaveSlopedTrack() const { - TrackStatus ts = GetTileTrackStatus(this->tile, TRANSPORT_ROAD, GetRoadTramType(this->roadtype)); - TrackBits trackbits = TrackStatusToTrackBits(ts); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(this->tile, TRANSPORT_ROAD, GetRoadTramType(this->roadtype))); return trackbits == TRACK_BIT_X || trackbits == TRACK_BIT_Y; } diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index d591f334cb..acf07a2136 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -383,7 +383,7 @@ inline bool IsOneWaySideJunctionRoadTile(TileIndex tile) static bool MayReverseOnOneWayRoadTile(TileIndex tile, DiagDirection dir) { - TrackdirBits bits = TrackStatusToTrackdirBits(GetTileTrackStatus(tile, TRANSPORT_ROAD, RTT_ROAD)); + TrackdirBits bits = GetTileTrackdirBits(tile, TRANSPORT_ROAD, RTT_ROAD); return bits & DiagdirReachesTrackdirs(ReverseDiagDir(dir)); } diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index b55f8c7145..86a8bea6b1 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3011,8 +3011,7 @@ bool AfterLoadGame() if (rv->state == RVSB_IN_DEPOT || rv->state == RVSB_WORMHOLE) break; - TrackStatus ts = GetTileTrackStatus(rv->tile, TRANSPORT_ROAD, GetRoadTramType(rv->roadtype)); - TrackBits trackbits = TrackStatusToTrackBits(ts); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(rv->tile, TRANSPORT_ROAD, GetRoadTramType(rv->roadtype))); /* Only X/Y tracks can be sloped. */ if (trackbits != TRACK_BIT_X && trackbits != TRACK_BIT_Y) break; diff --git a/src/script/api/script_marine.cpp b/src/script/api/script_marine.cpp index c5992745ea..6e34cd1fe0 100644 --- a/src/script/api/script_marine.cpp +++ b/src/script/api/script_marine.cpp @@ -62,11 +62,11 @@ DiagDirection to_other_tile = ::DiagdirBetweenTiles(t2, t1); /* Determine the reachable tracks from the shared edge */ - TrackBits gtts1 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t1, TRANSPORT_WATER, 0, ReverseDiagDir(to_other_tile))) & ::DiagdirReachesTracks(to_other_tile); + TrackBits gtts1 = ::TrackdirBitsToTrackBits(::GetTileTrackdirBits(t1, TRANSPORT_WATER, 0, ReverseDiagDir(to_other_tile))) & ::DiagdirReachesTracks(to_other_tile); if (gtts1 == TRACK_BIT_NONE) return false; to_other_tile = ReverseDiagDir(to_other_tile); - TrackBits gtts2 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t2, TRANSPORT_WATER, 0, ReverseDiagDir(to_other_tile))) & ::DiagdirReachesTracks(to_other_tile); + TrackBits gtts2 = ::TrackdirBitsToTrackBits(::GetTileTrackdirBits(t2, TRANSPORT_WATER, 0, ReverseDiagDir(to_other_tile))) & ::DiagdirReachesTracks(to_other_tile); return gtts2 != TRACK_BIT_NONE; } diff --git a/src/script/api/script_tile.cpp b/src/script/api/script_tile.cpp index c633665ea6..80a90639ed 100644 --- a/src/script/api/script_tile.cpp +++ b/src/script/api/script_tile.cpp @@ -214,10 +214,10 @@ if (!::IsValidTile(tile)) return false; if (transport_type == TRANSPORT_ROAD) { - return ::TrackStatusToTrackdirBits(::GetTileTrackStatus(tile, (::TransportType)transport_type, 0)) != TRACKDIR_BIT_NONE || - ::TrackStatusToTrackdirBits(::GetTileTrackStatus(tile, (::TransportType)transport_type, 1)) != TRACKDIR_BIT_NONE; + return ::GetTileTrackdirBits(tile, (::TransportType)transport_type, 0) != TRACKDIR_BIT_NONE || + ::GetTileTrackdirBits(tile, (::TransportType)transport_type, 1) != TRACKDIR_BIT_NONE; } else { - return ::TrackStatusToTrackdirBits(::GetTileTrackStatus(tile, (::TransportType)transport_type, 0)) != TRACKDIR_BIT_NONE; + return ::GetTileTrackdirBits(tile, (::TransportType)transport_type, 0) != TRACKDIR_BIT_NONE; } } diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index fcd2a7e633..7eb30f4893 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -81,7 +81,7 @@ bool IsValidImageIndex(uint8 image_index) static inline TrackBits GetTileShipTrackStatus(TileIndex tile) { - return TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0)); + return TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_WATER, 0)); } static void GetShipIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) @@ -933,7 +933,7 @@ static void ShipController(Ship *v) /* Test if continuing forward would lead to a dead-end, moving into the dock. */ DiagDirection exitdir = VehicleExitDir(v->direction, v->state); TileIndex tile = TileAddByDiagDir(v->tile, exitdir); - if (TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0, exitdir)) == TRACK_BIT_NONE) goto reverse_direction; + if (TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_WATER, 0, exitdir)) == TRACK_BIT_NONE) goto reverse_direction; } else if (v->dest_tile != 0) { /* We have a target, let's see if we reached it... */ if (v->current_order.IsType(OT_GOTO_WAYPOINT) && diff --git a/src/signal.cpp b/src/signal.cpp index c1c94cf279..ee0253b8d6 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -969,7 +969,7 @@ static SigSegState UpdateSignalsInBuffer(Owner owner) case MP_STATION: case MP_ROAD: - if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { + if ((TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { /* only add to set when there is some 'interesting' track */ _tbdset.Add(tile, dir); _tbdset.Add(tile + TileOffsByDiagDir(dir), ReverseDiagDir(dir)); @@ -981,7 +981,7 @@ static SigSegState UpdateSignalsInBuffer(Owner owner) /* jump to next tile */ tile = tile + TileOffsByDiagDir(dir); dir = ReverseDiagDir(dir); - if ((TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { + if ((TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)) & _enterdir_to_trackbits[dir]) != TRACK_BIT_NONE) { _tbdset.Add(tile, dir); break; } diff --git a/src/tile_cmd.h b/src/tile_cmd.h index 219d0d38c3..f764f726de 100644 --- a/src/tile_cmd.h +++ b/src/tile_cmd.h @@ -14,6 +14,7 @@ #include "vehicle_type.h" #include "cargo_type.h" #include "track_type.h" +#include "track_func.h" #include "tile_map.h" /** The returned bits of VehicleEnterTile. */ @@ -168,7 +169,19 @@ struct TileTypeProcs { extern const TileTypeProcs * const _tile_type_procs[16]; +enum TileTrackStatusSubMode { + TTSSM_ROAD_RTT_MASK = 0xFF, + TTSSM_ROAD_ROADTYPE_MASK = 0xFF00, + TTSSM_NO_RED_SIGNALS = 0x10000, +}; + TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR); + +inline TrackdirBits GetTileTrackdirBits(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side = INVALID_DIAGDIR) +{ + return TrackStatusToTrackdirBits(GetTileTrackStatus(tile, mode, sub_mode | TTSSM_NO_RED_SIGNALS, side)); +} + VehicleEnterTileStatus VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y); void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner); void GetTileDesc(TileIndex tile, TileDesc *td); diff --git a/src/tracerestrict_gui.cpp b/src/tracerestrict_gui.cpp index eec34c3e1b..90ca0b3128 100644 --- a/src/tracerestrict_gui.cpp +++ b/src/tracerestrict_gui.cpp @@ -2401,7 +2401,7 @@ public: return; } - TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(source_tile, TRANSPORT_RAIL, 0)); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(source_tile, TRANSPORT_RAIL, 0)); if (trackbits & TRACK_BIT_VERT) { // N-S direction trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 9804626fc4..2835db54b0 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -584,8 +584,7 @@ int GetTrainStopLocation(StationID station_id, TileIndex tile, Train *v, bool up TileIndex tile = front->tile + TileOffsByDiagDir(dir); /* Determine the track status on the next tile */ - TrackStatus ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir)); - TrackdirBits trackdirbits = TrackStatusToTrackdirBits(ts) & DiagdirReachesTrackdirs(dir); + TrackdirBits trackdirbits = GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0, ReverseDiagDir(dir)) & DiagdirReachesTrackdirs(dir); /* mask unreachable track bits if we are forbidden to do 90deg turns */ TrackBits bits = TrackdirBitsToTrackBits(trackdirbits); @@ -4446,7 +4445,7 @@ static Track ChooseTrainTrack(Train *v, TileIndex tile, DiagDirection enterdir, /* Extend reservation until we have found a safe position. */ DiagDirection exitdir = TrackdirToExitdir(res_dest.trackdir); TileIndex next_tile = TileAddByDiagDir(res_dest.tile, exitdir); - TrackBits reachable = TrackdirBitsToTrackBits((TrackdirBits)(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0))) & DiagdirReachesTracks(exitdir); + TrackBits reachable = TrackdirBitsToTrackBits(GetTileTrackdirBits(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(exitdir); if (Rail90DegTurnDisallowedTilesFromDiagDir(res_dest.tile, next_tile, exitdir)) { reachable &= ~TrackCrossesTracks(TrackdirToTrack(res_dest.trackdir)); } @@ -4610,7 +4609,7 @@ bool TryPathReserve(Train *v, bool mark_as_stuck, bool first_tile_okay) } else { new_tile = TileAddByDiagDir(origin.tile, exitdir); } - TrackBits reachable = TrackdirBitsToTrackBits(TrackStatusToTrackdirBits(GetTileTrackStatus(new_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTrackdirs(exitdir)); + TrackBits reachable = TrackdirBitsToTrackBits(GetTileTrackdirBits(new_tile, TRANSPORT_RAIL, 0) & DiagdirReachesTrackdirs(exitdir)); if (Rail90DegTurnDisallowedTilesFromDiagDir(origin.tile, new_tile, exitdir)) reachable &= ~TrackCrossesTracks(TrackdirToTrack(origin.trackdir)); diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 400fe8969b..4b78e2a521 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -2818,7 +2818,7 @@ static void TileLoop_TunnelBridge(TileIndex tile) static bool ClickTile_TunnelBridge(TileIndex tile) { if (_ctrl_pressed && IsTunnelBridgeWithSignalSimulation(tile)) { - TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_RAIL, 0)); + TrackBits trackbits = TrackdirBitsToTrackBits(GetTileTrackdirBits(tile, TRANSPORT_RAIL, 0)); if (trackbits & TRACK_BIT_VERT) { // N-S direction trackbits = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT; diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 56a2249686..36f8a19918 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -180,7 +180,7 @@ bool IsPossibleDockingTile(TileIndex t) case MP_RAILWAY: case MP_STATION: case MP_TUNNELBRIDGE: - return TrackStatusToTrackBits(GetTileTrackStatus(t, TRANSPORT_WATER, 0)) != TRACK_BIT_NONE; + return TrackdirBitsToTrackBits(GetTileTrackdirBits(t, TRANSPORT_WATER, 0)) != TRACK_BIT_NONE; default: return false;