diff options
-rw-r--r-- | src/pbs.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/pbs.cpp b/src/pbs.cpp index 3b85d16e7..b07bbecd6 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -181,6 +181,7 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra { TileIndex start_tile = tile; Trackdir start_trackdir = trackdir; + bool first_loop = true; /* Start track not reserved? This can happen if two trains * are on the same tile. The reservation on the next tile @@ -189,14 +190,6 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra /* Do not disallow 90 deg turns as the setting might have changed between reserving and now. */ CFollowTrackRail ft(o, rts); - - /* If the start tile is in a station, we need to skip to the platform - * end and use that as the tile for the loop test because the track - * follower will skip to there in the actual loop as well. */ - if (IsRailwayStationTile(start_tile) && ft.Follow(start_tile, start_trackdir) && ft.m_tiles_skipped > 0) { - start_tile = ft.m_new_tile; - } - while (ft.Follow(tile, trackdir)) { TrackdirBits reserved = ft.m_new_td_bits & TrackBitsToTrackdirBits(GetReservedTrackbits(ft.m_new_tile)); @@ -213,8 +206,18 @@ static PBSTileInfo FollowReservation(Owner o, RailTypes rts, TileIndex tile, Tra tile = ft.m_new_tile; trackdir = new_trackdir; - /* Loop encountered? */ - if (tile == start_tile && trackdir == start_trackdir) break; + if (first_loop) { + /* Update the start tile after we followed the track the first + * time. This is neccessary because the track follower can skip + * tiles (in stations for example) which means that we might + * never visit our original starting tile again. */ + start_tile = tile; + start_trackdir = trackdir; + first_loop = false; + } else { + /* Loop encountered? */ + if (tile == start_tile && trackdir == start_trackdir) break; + } /* Depot tile? Can't continue. */ if (IsRailDepotTile(tile)) break; /* Non-pbs signal? Reservation can't continue. */ |