summaryrefslogtreecommitdiff
path: root/src/pbs.cpp
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2009-01-06 17:11:37 +0000
committermichi_cc <michi_cc@openttd.org>2009-01-06 17:11:37 +0000
commit6138f6a2bbc5c7d63c6f5b3b0138931d8d59cdb3 (patch)
treeaeb825de92e34e6b17267b5b0c7e50a4ecd0cac6 /src/pbs.cpp
parentc0efc759efe2d1d31f7b4be7a69594800e96fe93 (diff)
downloadopenttd-6138f6a2bbc5c7d63c6f5b3b0138931d8d59cdb3.tar.xz
(svn r14876) -Fix [FS#2509] (r14849): Reserved path loop detection was broken for stations.
Don't set the test tile to the tile the very first iteration handles. Update the test tile instead in the loop.
Diffstat (limited to 'src/pbs.cpp')
-rw-r--r--src/pbs.cpp23
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. */