mirror of https://github.com/OpenTTD/OpenTTD
(svn r13960) -Codechange [YAPP]: Reserve a path when exiting a depot into a PBS block. (michi_cc)
parent
4339948b1f
commit
9e91bb4b33
|
@ -541,8 +541,10 @@ static SigSegState UpdateSignalsInBuffer(Owner owner)
|
||||||
|
|
||||||
if (first) {
|
if (first) {
|
||||||
first = false;
|
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;
|
state = SIGSEG_FULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,7 @@ static inline byte SignalOnTrack(Track track)
|
||||||
enum SigSegState {
|
enum SigSegState {
|
||||||
SIGSEG_FREE, ///< Free and has no pre-signal exits or at least one green exit
|
SIGSEG_FREE, ///< Free and has no pre-signal exits or at least one green exit
|
||||||
SIGSEG_FULL, ///< Occupied by a train
|
SIGSEG_FULL, ///< Occupied by a train
|
||||||
|
SIGSEG_PBS, ///< Segment is a PBS segment
|
||||||
};
|
};
|
||||||
|
|
||||||
SigSegState UpdateSignalsOnSegment(TileIndex tile, DiagDirection side, Owner owner);
|
SigSegState UpdateSignalsOnSegment(TileIndex tile, DiagDirection side, Owner owner);
|
||||||
|
|
|
@ -2379,7 +2379,10 @@ static bool CheckTrainStayInDepot(Vehicle *v)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SigSegState seg_state;
|
||||||
|
|
||||||
if (v->u.rail.force_proceed == 0) {
|
if (v->u.rail.force_proceed == 0) {
|
||||||
|
/* force proceed was not pressed */
|
||||||
if (++v->load_unload_time_rem < 37) {
|
if (++v->load_unload_time_rem < 37) {
|
||||||
InvalidateWindowClasses(WC_TRAINS_LIST);
|
InvalidateWindowClasses(WC_TRAINS_LIST);
|
||||||
return true;
|
return true;
|
||||||
|
@ -2387,12 +2390,27 @@ static bool CheckTrainStayInDepot(Vehicle *v)
|
||||||
|
|
||||||
v->load_unload_time_rem = 0;
|
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);
|
InvalidateWindowClasses(WC_TRAINS_LIST);
|
||||||
return true;
|
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);
|
VehicleServiceInDepot(v);
|
||||||
InvalidateWindowClasses(WC_TRAINS_LIST);
|
InvalidateWindowClasses(WC_TRAINS_LIST);
|
||||||
v->PlayLeaveStationSound();
|
v->PlayLeaveStationSound();
|
||||||
|
|
Loading…
Reference in New Issue