From fe058e2ec22f630d34ccde20108850a12d88ea4a Mon Sep 17 00:00:00 2001 From: frosch Date: Sun, 3 Aug 2008 17:16:39 +0000 Subject: (svn r13976) -Fix (r13953) [YAPP]: A crashing train could sometimes free the reservation of another train. (assisted by michi_cc) --- src/train_cmd.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index dc7ff694c..42c7806be 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -3437,11 +3437,6 @@ static void SetVehicleCrashed(Vehicle *v) for (const Vehicle *u = v; u != NULL; u = u->Next()) { ClearPathReservation(u->tile, GetVehicleTrackdir(u)); } - /* Try to reserve all tiles directly under the train, but not the whole - * railway station platform or both tunnel/bridge ends. */ - for (const Vehicle *u = v; u != NULL; u = u->Next()) { - TryReserveRailTrack(u->tile, TrackdirToTrack(GetVehicleTrackdir(u))); - } } /* we may need to update crossing we were approaching */ @@ -3511,6 +3506,15 @@ static Vehicle *FindTrainCollideEnum(Vehicle *v, void *data) tcc->num += 2 + CountPassengersInTrain(coll); SetVehicleCrashed(coll); } + + /* Try to reserve all tiles directly under the crashed trains. + * As there might be more than two trains involved, we have to do that for all vehicles */ + const Vehicle *u; + FOR_ALL_VEHICLES(u) { + if (u->type == VEH_TRAIN && HASBITS(u->vehstatus, VS_CRASHED)) { + TryReserveRailTrack(u->tile, TrackBitsToTrack(u->u.rail.track)); + } + } } return NULL; -- cgit v1.2.3-70-g09d2