diff options
author | michi_cc <michi_cc@openttd.org> | 2009-01-06 17:11:37 +0000 |
---|---|---|
committer | michi_cc <michi_cc@openttd.org> | 2009-01-06 17:11:37 +0000 |
commit | 8f5354f2df238108566466b45dd3c56e4c290fa2 (patch) | |
tree | aeb825de92e34e6b17267b5b0c7e50a4ecd0cac6 | |
parent | bd803696b3fafb44e3539510a7473cbc93b9e093 (diff) | |
download | openttd-8f5354f2df238108566466b45dd3c56e4c290fa2.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.
-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. */ |