changeset 9833:80c1295b64df draft

(svn r13976) -Fix (r13953) [YAPP]: A crashing train could sometimes free the reservation of another train. (assisted by michi_cc)
author frosch <frosch@openttd.org>
date Sun, 03 Aug 2008 17:16:39 +0000
parents 167c020030a8
children efa04139a798
files src/train_cmd.cpp
diffstat 1 files changed, 9 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -3437,11 +3437,6 @@
 		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 @@
 			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;