diff options
author | michi_cc <michi_cc@openttd.org> | 2009-12-27 14:37:50 +0000 |
---|---|---|
committer | michi_cc <michi_cc@openttd.org> | 2009-12-27 14:37:50 +0000 |
commit | f7025612e1bfb10619a216a92960b701ede1b643 (patch) | |
tree | 50390c4078e56b3cd5dce3afd6b0f9c855be532f /src/pbs.cpp | |
parent | 182b0b5c141da2afb1d686c08ea786b28d3e0689 (diff) | |
download | openttd-f7025612e1bfb10619a216a92960b701ede1b643.tar.xz |
(svn r18647) -Fix: [YAPP] A train inside a station was not always found when checking for trains on a reserved path.
Diffstat (limited to 'src/pbs.cpp')
-rw-r--r-- | src/pbs.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/pbs.cpp b/src/pbs.cpp index adae29e5b..9619b201b 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -262,7 +262,7 @@ static Vehicle *FindTrainOnTrackEnum(Vehicle *v, void *data) * @param train_on_res Is set to a train we might encounter * @returns The last tile of the reservation or the current train tile if no reservation present. */ -PBSTileInfo FollowTrainReservation(const Train *v, bool *train_on_res) +PBSTileInfo FollowTrainReservation(const Train *v, Vehicle **train_on_res) { assert(v->type == VEH_TRAIN); @@ -274,7 +274,21 @@ PBSTileInfo FollowTrainReservation(const Train *v, bool *train_on_res) FindTrainOnTrackInfo ftoti; ftoti.res = FollowReservation(v->owner, GetRailTypeInfo(v->railtype)->compatible_railtypes, tile, trackdir); ftoti.res.okay = IsSafeWaitingPosition(v, ftoti.res.tile, ftoti.res.trackdir, true, _settings_game.pf.forbid_90_deg); - if (train_on_res != NULL) *train_on_res = HasVehicleOnPos(ftoti.res.tile, &ftoti, FindTrainOnTrackEnum); + if (train_on_res != NULL) { + FindVehicleOnPos(ftoti.res.tile, &ftoti, FindTrainOnTrackEnum); + if (ftoti.best != NULL) *train_on_res = ftoti.best->First(); + if (*train_on_res == NULL && IsRailStationTile(ftoti.res.tile)) { + /* The target tile is a rail station. The track follower + * has stopped on the last platform tile where we haven't + * found a train. Also check all previous platform tiles + * for a possible train. */ + TileIndexDiff diff = TileOffsByDiagDir(TrackdirToExitdir(ReverseTrackdir(ftoti.res.trackdir))); + for (TileIndex st_tile = ftoti.res.tile + diff; *train_on_res == NULL && IsCompatibleTrainStationTile(st_tile, ftoti.res.tile); st_tile += diff) { + FindVehicleOnPos(st_tile, &ftoti, FindTrainOnTrackEnum); + if (ftoti.best != NULL) *train_on_res = ftoti.best->First(); + } + } + } return ftoti.res; } |