Changeset - r9818:2de1ef05f3ce
[Not reviewed]
master
0 3 0
rubidium - 16 years ago 2008-08-02 22:55:52
rubidium@openttd.org
(svn r13960) -Codechange [YAPP]: Reserve a path when exiting a depot into a PBS block. (michi_cc)
3 files changed with 24 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/signal.cpp
Show inline comments
 
@@ -541,8 +541,10 @@ static SigSegState UpdateSignalsInBuffer
 

	
 
		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;
 
			}
 
		}
src/signal_func.h
Show inline comments
 
@@ -45,6 +45,7 @@ static inline byte SignalOnTrack(Track t
 
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);
src/train_cmd.cpp
Show inline comments
 
@@ -2379,7 +2379,10 @@ static bool CheckTrainStayInDepot(Vehicl
 
		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 @@ static bool CheckTrainStayInDepot(Vehicl
 

	
 
		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();
0 comments (0 inline, 0 general)