changeset 9888:b849464ebe27 draft

(svn r14036) -Fix [FS#2197,FS#2198]: trains crashing into eachother when signals are changed (michi_cc)
author rubidium <rubidium@openttd.org>
date Sun, 10 Aug 2008 13:37:09 +0000
parents 89f53dccd325
children 2bedf7c40bee
files src/openttd.cpp src/train_cmd.cpp
diffstat 2 files changed, 20 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -2504,6 +2504,20 @@
 		}
 	}
 
+	/* Reserve all tracks trains are currently on. */
+	if (CheckSavegameVersion(101)) {
+		Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			if (v->type == VEH_TRAIN) {
+				if ((v->u.rail.track & TRACK_BIT_WORMHOLE) == TRACK_BIT_WORMHOLE) {
+					TryReserveRailTrack(v->tile, DiagDirToDiagTrack(GetTunnelBridgeDirection(v->tile)));
+				} else if ((v->u.rail.track & TRACK_BIT_MASK) != TRACK_BIT_NONE) {
+					TryReserveRailTrack(v->tile, TrackBitsToTrack(v->u.rail.track));
+				}
+			}
+		}
+	}
+
 	GamelogPrintDebug(1);
 
 	return InitializeWindowsAndCaches();
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -3695,6 +3695,8 @@
 							return;
 						}
 						goto reverse_train_direction;
+					} else {
+						TryReserveRailTrack(gp.new_tile, TrackBitsToTrack(chosen_track));
 					}
 				} else {
 					static const TrackBits _matching_tracks[8] = {
@@ -3777,7 +3779,10 @@
 
 			if (IsTileType(gp.new_tile, MP_TUNNELBRIDGE) && HasBit(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
 				/* Perform look-ahead on tunnel exit. */
-				if (IsFrontEngine(v)) CheckNextTrainTile(v);
+				if (IsFrontEngine(v)) {
+					TryReserveRailTrack(gp.new_tile, DiagDirToDiagTrack(GetTunnelBridgeDirection(gp.new_tile)));
+					CheckNextTrainTile(v);
+				}
 			} else {
 				v->x_pos = gp.x;
 				v->y_pos = gp.y;