summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/train_cmd.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index b0cb85ff4..4505c6abd 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -3150,6 +3150,15 @@ bool TryPathReserve(Train *v, bool mark_as_stuck, bool first_tile_okay)
bool other_train = false;
PBSTileInfo origin = FollowTrainReservation(v, &other_train);
+ /* The path we are driving on is alread blocked by some other train.
+ * This can only happen in certain situations when mixing path and
+ * block signals or when changing tracks and/or signals.
+ * Exit here as doing any further reservations will probably just
+ * make matters worse. */
+ if (other_train && v->tile != origin.tile) {
+ if (mark_as_stuck) MarkTrainAsStuck(v);
+ return false;
+ }
/* If we have a reserved path and the path ends at a safe tile, we are finished already. */
if (origin.okay && (v->tile != origin.tile || first_tile_okay)) {
/* Can't be stuck then. */
@@ -3157,14 +3166,6 @@ bool TryPathReserve(Train *v, bool mark_as_stuck, bool first_tile_okay)
ClrBit(v->flags, VRF_TRAIN_STUCK);
return true;
}
- /* The path we are driving on is alread blocked by some other train.
- * This can only happen when tracks and signals are changed. A crash
- * is probably imminent, don't do any further reservation because
- * it might cause stale reservations. */
- if (other_train && v->tile != origin.tile) {
- if (mark_as_stuck) MarkTrainAsStuck(v);
- return false;
- }
/* If we are in a depot, tentativly reserve the depot. */
if (v->track == TRACK_BIT_DEPOT) {