summaryrefslogtreecommitdiff
path: root/src
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
commit8f5354f2df238108566466b45dd3c56e4c290fa2 (patch)
treeaeb825de92e34e6b17267b5b0c7e50a4ecd0cac6 /src
parentbd803696b3fafb44e3539510a7473cbc93b9e093 (diff)
downloadopenttd-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.
Diffstat (limited to 'src')
-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. */