From 6138f6a2bbc5c7d63c6f5b3b0138931d8d59cdb3 Mon Sep 17 00:00:00 2001 From: michi_cc Date: Tue, 6 Jan 2009 17:11:37 +0000 Subject: [PATCH] (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. --- src/pbs.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/pbs.cpp b/src/pbs.cpp index 3b85d16e7e..b07bbecd6f 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. */