summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2008-08-10 13:37:09 +0000
committerrubidium <rubidium@openttd.org>2008-08-10 13:37:09 +0000
commitb1ed3bad58d892b38e9a99f6ae7df2df5d1a034d (patch)
tree63878773a61a968be24af5becbc0b17b5e83efe0
parent1c04049f1cff8690b8ea54c62a2674821cc12aa2 (diff)
downloadopenttd-b1ed3bad58d892b38e9a99f6ae7df2df5d1a034d.tar.xz
(svn r14036) -Fix [FS#2197,FS#2198]: trains crashing into eachother when signals are changed (michi_cc)
-rw-r--r--src/openttd.cpp14
-rw-r--r--src/train_cmd.cpp7
2 files changed, 20 insertions, 1 deletions
diff --git a/src/openttd.cpp b/src/openttd.cpp
index e09a8501b..31f175fcb 100644
--- a/src/openttd.cpp
+++ b/src/openttd.cpp
@@ -2504,6 +2504,20 @@ bool AfterLoadGame()
}
}
+ /* 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();
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 37334c0eb..1ecdff208 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -3695,6 +3695,8 @@ static void TrainController(Vehicle *v, Vehicle *nomove, bool update_image)
return;
}
goto reverse_train_direction;
+ } else {
+ TryReserveRailTrack(gp.new_tile, TrackBitsToTrack(chosen_track));
}
} else {
static const TrackBits _matching_tracks[8] = {
@@ -3777,7 +3779,10 @@ static void TrainController(Vehicle *v, Vehicle *nomove, bool update_image)
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;