(svn r13960) -Codechange [YAPP]: Reserve a path when exiting a depot into a PBS block. (michi_cc)
authorrubidium
Sat, 02 Aug 2008 22:55:52 +0000
changeset 9818 bec6961fb6b6
parent 9817 b1da06062664
child 9819 e5c938adf4f3
(svn r13960) -Codechange [YAPP]: Reserve a path when exiting a depot into a PBS block. (michi_cc)
src/signal.cpp
src/signal_func.h
src/train_cmd.cpp
--- a/src/signal.cpp	Sat Aug 02 22:55:38 2008 +0000
+++ b/src/signal.cpp	Sat Aug 02 22:55:52 2008 +0000
@@ -541,8 +541,10 @@
 
 		if (first) {
 			first = false;
-			if ((flags & SF_TRAIN) || (flags & SF_EXIT && !(flags & SF_GREEN)) || (flags & SF_FULL)) {
-				/* SIGSEG_FREE is set by default */
+			/* SIGSEG_FREE is set by default */
+			if (flags & SF_PBS) {
+				state = SIGSEG_PBS;
+			} else if (flags & SF_TRAIN || (flags & SF_EXIT && !(flags & SF_GREEN)) || flags & SF_FULL) {
 				state = SIGSEG_FULL;
 			}
 		}
--- a/src/signal_func.h	Sat Aug 02 22:55:38 2008 +0000
+++ b/src/signal_func.h	Sat Aug 02 22:55:52 2008 +0000
@@ -45,6 +45,7 @@
 enum SigSegState {
 	SIGSEG_FREE,    ///< Free and has no pre-signal exits or at least one green exit
 	SIGSEG_FULL,    ///< Occupied by a train
+	SIGSEG_PBS,     ///< Segment is a PBS segment
 };
 
 SigSegState UpdateSignalsOnSegment(TileIndex tile, DiagDirection side, Owner owner);
--- a/src/train_cmd.cpp	Sat Aug 02 22:55:38 2008 +0000
+++ b/src/train_cmd.cpp	Sat Aug 02 22:55:52 2008 +0000
@@ -2379,7 +2379,10 @@
 		return true;
 	}
 
+	SigSegState seg_state;
+
 	if (v->u.rail.force_proceed == 0) {
+		/* force proceed was not pressed */
 		if (++v->load_unload_time_rem < 37) {
 			InvalidateWindowClasses(WC_TRAINS_LIST);
 			return true;
@@ -2387,12 +2390,27 @@
 
 		v->load_unload_time_rem = 0;
 
-		if (UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR, v->owner) == SIGSEG_FULL) {
+		seg_state = _settings_game.pf.reserve_paths ? SIGSEG_PBS : UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR, v->owner);
+		if (seg_state == SIGSEG_FULL || GetDepotWaypointReservation(v->tile)) {
+			/* Full and no PBS signal in block or depot reserved, can't exit. */
 			InvalidateWindowClasses(WC_TRAINS_LIST);
 			return true;
 		}
+	} else {
+		seg_state = _settings_game.pf.reserve_paths ? SIGSEG_PBS : UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR, v->owner);
 	}
 
+	/* Only leave when we can reserve a path to our destination. */
+	if (seg_state == SIGSEG_PBS && !TryPathReserve(v) && v->u.rail.force_proceed == 0) {
+		/* No path and no force proceed. */
+		InvalidateWindowClasses(WC_TRAINS_LIST);
+		MarkTrainAsStuck(v);
+		return true;
+	}
+
+	SetDepotWaypointReservation(v->tile, true);
+	if (_settings_client.gui.show_track_reservation) MarkTileDirtyByTile(v->tile);
+
 	VehicleServiceInDepot(v);
 	InvalidateWindowClasses(WC_TRAINS_LIST);
 	v->PlayLeaveStationSound();