diff --git a/src/pbs.cpp b/src/pbs.cpp index e165112da3..9ba7ad2cbb 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -423,7 +423,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra if (lookahead != nullptr) { lookahead->reservation_end_position += (DistanceManhattan(tile, end) - 1) * TILE_SIZE; } - Trackdir end_trackdir = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(end)), ReverseDiagDir(GetTunnelBridgeDirection(end))); + Trackdir end_trackdir = GetTunnelBridgeExitTrackdir(end); if (lookahead != nullptr) { if ((flags & FRF_TB_EXIT_FREE) && GetTunnelBridgeLength(tile, end) > 1) { /* middle part of bridge is in wormhole direction */ @@ -444,7 +444,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra if (HasAcrossTunnelBridgeReservation(end) && TunnelBridgeIsFree(tile, end, nullptr, true).Succeeded()) { /* skip far end */ tile = end; - trackdir = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(GetTunnelBridgeDirection(tile))); + trackdir = GetTunnelBridgeExitTrackdir(tile); return true; } } @@ -697,8 +697,7 @@ PBSTileInfo FollowTrainReservation(const Train *v, Vehicle **train_on_res, Follo TileIndex exit_tile = GetOtherTunnelBridgeEnd(tile); if (IsTunnelBridgeSignalSimulationExit(exit_tile) && GetTunnelBridgeExitSignalState(exit_tile) == SIGNAL_STATE_GREEN && HasAcrossTunnelBridgeReservation(exit_tile)) { tile = exit_tile; - DiagDirection exit_dir = ReverseDiagDir(GetTunnelBridgeDirection(exit_tile)); - trackdir = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(exit_tile)), exit_dir); + trackdir = GetTunnelBridgeExitTrackdir(exit_tile); } } } else { @@ -839,7 +838,7 @@ void TryCreateLookAheadForTrainInTunnelBridge(Train *t) /* going in the right direction, allocate a new lookahead */ t->lookahead.reset(new TrainReservationLookAhead()); t->lookahead->reservation_end_tile = t->tile; - t->lookahead->reservation_end_trackdir = TrackExitdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(t->tile)), GetTunnelBridgeDirection(t->tile)); + t->lookahead->reservation_end_trackdir = GetTunnelBridgeEntranceTrackdir(t->tile); t->lookahead->reservation_end_z = t->z_pos; t->lookahead->current_position = 0; t->lookahead->tunnel_bridge_reserved_tiles = DistanceManhattan(t->tile, TileVirtXY(t->x_pos, t->y_pos)); diff --git a/src/signal.cpp b/src/signal.cpp index f2f9eadd80..34968059de 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -445,7 +445,7 @@ static SigInfo ExploreSegment(Owner owner) info.flags |= SF_FULL; return info; } - Trackdir exit_track = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(tunnel_bridge_dir)); + Trackdir exit_track = GetTunnelBridgeExitTrackdir(tile, tunnel_bridge_dir); exitdir = TrackdirToExitdir(exit_track); enterdir = ReverseDiagDir(exitdir); tile += TileOffsByDiagDir(exitdir); // just skip to next tile diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index f0ec422853..d3532447e4 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2793,7 +2793,7 @@ void ReverseTrainDirection(Train *v) DiagDirection axial_dir = DirToDiagDirAlongAxis(v->direction, axis); TileIndex next_tile = TileVirtXY(v->x_pos, v->y_pos) + TileOffsByDiagDir(axial_dir); if ((!no_near_end_unreserve && next_tile == v->tile) || (!no_far_end_unreserve && next_tile == GetOtherTunnelBridgeEnd(v->tile))) { - Trackdir exit_td = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(next_tile)), ReverseDiagDir(GetTunnelBridgeDirection(next_tile))); + Trackdir exit_td = GetTunnelBridgeExitTrackdir(next_tile); CFollowTrackRail ft(GetTileOwner(next_tile), GetRailTypeInfo(v->railtype)->all_compatible_railtypes); if (ft.Follow(next_tile, exit_td)) { TrackdirBits reserved = ft.m_new_td_bits & TrackBitsToTrackdirBits(GetReservedTrackbits(ft.m_new_tile)); @@ -3968,8 +3968,7 @@ static void TryLongReserveChooseTrainTrack(Train *v, TileIndex tile, Trackdir td TileIndex exit_tile = long_enough ? INVALID_TILE : CheckLongReservePbsTunnelBridgeOnTrackdir(v, tile, td); if (exit_tile != INVALID_TILE) { CFollowTrackRail ft(v); - DiagDirection exit_dir = ReverseDiagDir(GetTunnelBridgeDirection(exit_tile)); - Trackdir exit_td = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(exit_tile)), exit_dir); + Trackdir exit_td = GetTunnelBridgeExitTrackdir(exit_tile); if (ft.Follow(exit_tile, exit_td)) { const TrackBits reserved_bits = GetReservedTrackbits(ft.m_new_tile); if ((ft.m_new_td_bits & TrackBitsToTrackdirBits(reserved_bits)) == TRACKDIR_BIT_NONE) { @@ -4901,7 +4900,7 @@ static bool CheckTrainStayInWormHolePathReserve(Train *t, TileIndex tile) if (mark_dirty) MarkTileDirtyByTile(tile, VMDF_NOT_MAP_MODE); }); - Trackdir td = TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(GetTunnelBridgeDirection(tile))); + Trackdir td = GetTunnelBridgeExitTrackdir(tile); CFollowTrackRail ft(GetTileOwner(tile), GetRailTypeInfo(t->railtype)->all_compatible_railtypes); if (ft.Follow(tile, td)) { @@ -4995,7 +4994,7 @@ static bool CheckTrainStayInWormHole(Train *t, TileIndex tile) SigSegState seg_state = (_settings_game.pf.reserve_paths || IsTunnelBridgeEffectivelyPBS(tile)) ? SIGSEG_PBS : UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, t->owner); if (seg_state != SIGSEG_PBS) { CFollowTrackRail ft(GetTileOwner(tile), GetRailTypeInfo(t->railtype)->all_compatible_railtypes); - if (ft.Follow(tile, TrackEnterdirToTrackdir(FindFirstTrack(GetAcrossTunnelBridgeTrackBits(tile)), ReverseDiagDir(GetTunnelBridgeDirection(tile))))) { + if (ft.Follow(tile, GetTunnelBridgeExitTrackdir(tile))) { if (ft.m_new_td_bits != TRACKDIR_BIT_NONE && KillFirstBit(ft.m_new_td_bits) == TRACKDIR_BIT_NONE) { Trackdir td = FindFirstTrackdir(ft.m_new_td_bits); if (HasPbsSignalOnTrackdir(ft.m_new_tile, td)) { diff --git a/src/tunnelbridge_map.h b/src/tunnelbridge_map.h index 3d158898a1..f6e5782e8f 100644 --- a/src/tunnelbridge_map.h +++ b/src/tunnelbridge_map.h @@ -506,6 +506,26 @@ static inline void SetTunnelBridgePBS(TileIndex t, bool is_pbs) SB(_me[t].m6, 6, 1, is_pbs ? 1 : 0); } +static inline Trackdir GetTunnelBridgeExitTrackdir(TileIndex t, DiagDirection tunnel_bridge_dir) +{ + return TrackEnterdirToTrackdir((Track)FIND_FIRST_BIT(GetAcrossTunnelBridgeTrackBits(t)), ReverseDiagDir(tunnel_bridge_dir)); +} + +static inline Trackdir GetTunnelBridgeExitTrackdir(TileIndex t) +{ + return GetTunnelBridgeExitTrackdir(t, GetTunnelBridgeDirection(t)); +} + +static inline Trackdir GetTunnelBridgeEntranceTrackdir(TileIndex t, DiagDirection tunnel_bridge_dir) +{ + return TrackExitdirToTrackdir((Track)FIND_FIRST_BIT(GetAcrossTunnelBridgeTrackBits(t)), tunnel_bridge_dir); +} + +static inline Trackdir GetTunnelBridgeEntranceTrackdir(TileIndex t) +{ + return GetTunnelBridgeEntranceTrackdir(t, GetTunnelBridgeDirection(t)); +} + void AddRailTunnelBridgeInfrastructure(Company *c, TileIndex begin, TileIndex end); void SubtractRailTunnelBridgeInfrastructure(Company *c, TileIndex begin, TileIndex end); void AddRailTunnelBridgeInfrastructure(TileIndex begin, TileIndex end);