(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.
This commit is contained in:
michi_cc 2009-01-06 17:11:37 +00:00
parent c0efc759ef
commit 6138f6a2bb
1 changed files with 13 additions and 10 deletions

View File

@ -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. */