changeset 19201:a934b903e21e draft

(svn r24078) -Fix [FS#5093,FS#5130] (r24071): A fix that breaks all other cases isn't really a fix. Redo it to make sure that reservations of trains entering or exiting depots are properly made and freed.
author michi_cc <michi_cc@openttd.org>
date Thu, 29 Mar 2012 12:27:34 +0000
parents 4bfab24cb93c
children 70e91df04f56
files src/pbs.cpp src/train_cmd.cpp
diffstat 2 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/pbs.cpp
+++ b/src/pbs.cpp
@@ -369,8 +369,7 @@
  */
 bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bool include_line_end, bool forbid_90deg)
 {
-	/* A depot is safe if we enter it, but not when we exit. */
-	if (IsRailDepotTile(tile) && TrackdirToExitdir(trackdir) != GetRailDepotDirection(tile)) return true;
+	if (IsRailDepotTile(tile)) return true;
 
 	if (IsTileType(tile, MP_RAILWAY)) {
 		/* For non-pbs signals, stop on the signal tile. */
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -1827,6 +1827,9 @@
 			HasSignalOnTrackdir(v->tile, v->GetVehicleTrackdir()) &&
 			!IsPbsSignal(GetSignalType(v->tile, FindFirstTrack(v->track))));
 
+		/* If we are on a depot tile facing outwards, do not treat the current tile as safe. */
+		if (IsRailDepotTile(v->tile) && TrackdirToExitdir(v->GetVehicleTrackdir()) == GetRailDepotDirection(v->tile)) first_tile_okay = false;
+
 		if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
 		if (TryPathReserve(v, false, first_tile_okay)) {
 			/* Do a look-ahead now in case our current tile was already a safe tile. */
@@ -2200,8 +2203,14 @@
 	bool      free_tile = tile != v->tile || !(IsRailStationTile(v->tile) || IsTileType(v->tile, MP_TUNNELBRIDGE));
 	StationID station_id = IsRailStationTile(v->tile) ? GetStationIndex(v->tile) : INVALID_STATION;
 
-	/* A train inside a depot can't have a reservation. */
-	if (v->track == TRACK_BIT_DEPOT) return;
+	/* Can't be holding a reservation if we enter a depot. */
+	if (IsRailDepotTile(tile) && TrackdirToExitdir(td) != GetRailDepotDirection(tile)) return;
+	if (v->track == TRACK_BIT_DEPOT) {
+		/* Front engine is in a depot. We enter if some part is not in the depot. */
+		for (const Train *u = v; u != NULL; u = u->Next()) {
+			if (u->track != TRACK_BIT_DEPOT || u->tile != v->tile) return;
+		}
+	}
 	/* Don't free reservation if it's not ours. */
 	if (TracksOverlap(GetReservedTrackbits(tile) | TrackToTrackBits(TrackdirToTrack(td)))) return;