changeset 15449:f6ee1b7fde96 draft

(svn r20098) -Fix [FS#3898]: A train reversing in a station would sometimes fail to release its reserved path.
author michi_cc <michi_cc@openttd.org>
date Fri, 09 Jul 2010 14:14:17 +0000
parents aefc3e7ea77d
children fc2209307764
files src/train.h src/train_cmd.cpp src/vehicle.cpp
diffstat 3 files changed, 13 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/train.h
+++ b/src/train.h
@@ -41,6 +41,9 @@
 
 	/* used to mark a train that can't get a path reservation */
 	VRF_TRAIN_STUCK    = 8,
+
+	/* used to mark a train that is just leaving a station */
+	VRF_LEAVING_STATION = 9,
 };
 
 /** Modes for ignoring signals. */
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -3808,8 +3808,17 @@
 		v->wait_counter = 0;
 		v->cur_speed = 0;
 		v->subspeed = 0;
+		ClrBit(v->flags, VRF_LEAVING_STATION);
 		ReverseTrainDirection(v);
 		return true;
+	} else if (HasBit(v->flags, VRF_LEAVING_STATION)) {
+		/* Try to reserve a path when leaving the station as we
+		 * might not be marked as wanting a reservation, e.g.
+		 * when an overlength train gets turned around in a station. */
+		if (UpdateSignalsOnSegment(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), v->owner) == SIGSEG_PBS || _settings_game.pf.reserve_paths) {
+			TryPathReserve(v, true, true);
+		}
+		ClrBit(v->flags, VRF_LEAVING_STATION);
 	}
 
 	v->HandleLoading(mode);
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -1635,12 +1635,7 @@
 		/* Trigger station animation (trains only) */
 		if (IsTileType(this->tile, MP_STATION)) StationAnimationTrigger(st, this->tile, STAT_ANIM_TRAIN_DEPARTS);
 
-		/* Try to reserve a path when leaving the station as we
-		 * might not be marked as wanting a reservation, e.g.
-		 * when an overlength train gets turned around in a station. */
-		if (UpdateSignalsOnSegment(this->tile, TrackdirToExitdir(this->GetVehicleTrackdir()), this->owner) == SIGSEG_PBS || _settings_game.pf.reserve_paths) {
-			TryPathReserve(Train::From(this), true, true);
-		}
+		SetBit(Train::From(this)->flags, VRF_LEAVING_STATION);
 	}
 }