changeset 14099:e17e6bd1ffd0 draft

(svn r18646) -Fix [FS#3418]: [YAPP] Don't extend the reserved path through a newly built path signal directly in front of a stopped or loading train. Also restore the reserved path in more cases after removing a signal.
author michi_cc <michi_cc@openttd.org>
date Sun, 27 Dec 2009 14:37:46 +0000
parents 6d35a3f22ae1
children e4f2ba58a34f
files src/rail_cmd.cpp
diffstat 1 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -973,7 +973,13 @@
 		MarkTileDirtyByTile(tile);
 		AddTrackToSignalBuffer(tile, track, _current_company);
 		YapfNotifyTrackLayoutChange(tile, track);
-		if (v != NULL) TryPathReserve(v, true);
+		if (v != NULL) {
+			/* Extend the train's path if it's not stopped or loading, or not at a safe position. */
+			if (!(((v->vehstatus & VS_STOPPED) && v->cur_speed == 0) || v->current_order.IsType(OT_LOADING)) ||
+					!IsSafeWaitingPosition(v, v->tile, v->GetVehicleTrackdir(), true, _settings_game.pf.forbid_90_deg)) {
+				TryPathReserve(v, true);
+			}
+		}
 	}
 
 	return cost;
@@ -1214,6 +1220,18 @@
 		Train *v = NULL;
 		if (HasReservedTracks(tile, TrackToTrackBits(track))) {
 			v = GetTrainForReservation(tile, track);
+		} else if (IsPbsSignal(GetSignalType(tile, track))) {
+			/* PBS signal, might be the end of a path reservation. */
+			Trackdir td = TrackToTrackdir(track);
+			for (int i = 0; v == NULL && i < 2; i++, td = ReverseTrackdir(td)) {
+				/* Only test the active signal side. */
+				if (!HasSignalOnTrackdir(tile, ReverseTrackdir(td))) continue;
+				TileIndex next = TileAddByDiagDir(tile, TrackdirToExitdir(td));
+				TrackBits tracks = TrackdirBitsToTrackBits(TrackdirReachesTrackdirs(td));
+				if (HasReservedTracks(next, tracks)) {
+					v = GetTrainForReservation(next, TrackBitsToTrack(GetReservedTrackbits(next) & tracks));
+				}
+			}
 		}
 		SetPresentSignals(tile, GetPresentSignals(tile) & ~SignalOnTrack(track));