Tracerestrict: Handle slot acquire on tunnel/bridge entrance reserve
When using realistic braking Using the same context as PBS end acquire/release
This commit is contained in:
@@ -265,19 +265,10 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This must be done before calling TraceRestrictExecuteResEndSlot */
|
||||||
temporary_slot_state.ApplyTemporaryChanges(Yapf().GetVehicle()->index);
|
temporary_slot_state.ApplyTemporaryChanges(Yapf().GetVehicle()->index);
|
||||||
|
|
||||||
if (restricted_signal_state.prog != nullptr) {
|
restricted_signal_state.TraceRestrictExecuteResEndSlot(Yapf().GetVehicle());
|
||||||
const TraceRestrictProgram *prog = restricted_signal_state.prog;
|
|
||||||
if (prog != nullptr && prog->actions_used_flags & TRPAUF_PBS_RES_END_SLOT) {
|
|
||||||
extern TileIndex VehiclePosTraceRestrictPreviousSignalCallback(const Train *v, const void *, TraceRestrictPBSEntrySignalAuxField mode);
|
|
||||||
|
|
||||||
TraceRestrictProgramResult out;
|
|
||||||
TraceRestrictProgramInput input(restricted_signal_state.tile, restricted_signal_state.trackdir, &VehiclePosTraceRestrictPreviousSignalCallback, nullptr);
|
|
||||||
input.permitted_slot_operations = TRPISP_PBS_RES_END_ACQUIRE | TRPISP_PBS_RES_END_RELEASE;
|
|
||||||
prog->Execute(Yapf().GetVehicle(), input, out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target != nullptr) target->okay = true;
|
if (target != nullptr) target->okay = true;
|
||||||
|
|
||||||
|
15
src/pbs.cpp
15
src/pbs.cpp
@@ -1531,6 +1531,21 @@ bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bo
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PBSWaitingPositionRestrictedSignalState::TraceRestrictExecuteResEndSlotIntl(const Train *v)
|
||||||
|
{
|
||||||
|
TraceRestrictProgramActionsUsedFlags actions_used_flags = TRPAUF_PBS_RES_END_SLOT;
|
||||||
|
const bool tb_entrance_slots = _settings_game.vehicle.train_braking_model == TBM_REALISTIC && IsTunnelBridgeSignalSimulationEntranceTile(this->tile);
|
||||||
|
if (tb_entrance_slots) actions_used_flags |= TRPAUF_SLOT_ACQUIRE;
|
||||||
|
|
||||||
|
if (prog->actions_used_flags & actions_used_flags) {
|
||||||
|
TraceRestrictProgramResult out;
|
||||||
|
TraceRestrictProgramInput input(this->tile, this->trackdir, &VehiclePosTraceRestrictPreviousSignalCallback, nullptr);
|
||||||
|
input.permitted_slot_operations = TRPISP_PBS_RES_END_ACQUIRE | TRPISP_PBS_RES_END_RELEASE;
|
||||||
|
if (tb_entrance_slots) input.permitted_slot_operations = TRPISP_ACQUIRE;
|
||||||
|
prog->Execute(v, input, out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool IsWaitingPositionFreeTraceRestrictExecute(const TraceRestrictProgram *prog, const Train *v, TileIndex tile, Trackdir trackdir)
|
bool IsWaitingPositionFreeTraceRestrictExecute(const TraceRestrictProgram *prog, const Train *v, TileIndex tile, Trackdir trackdir)
|
||||||
{
|
{
|
||||||
if (prog != nullptr && prog->actions_used_flags & TRPAUF_PBS_RES_END_WAIT) {
|
if (prog != nullptr && prog->actions_used_flags & TRPAUF_PBS_RES_END_WAIT) {
|
||||||
|
@@ -183,6 +183,14 @@ struct PBSWaitingPositionRestrictedSignalState {
|
|||||||
Trackdir trackdir = INVALID_TRACKDIR;
|
Trackdir trackdir = INVALID_TRACKDIR;
|
||||||
bool defer_test_if_slot_conditional = false;
|
bool defer_test_if_slot_conditional = false;
|
||||||
bool deferred_test = false;
|
bool deferred_test = false;
|
||||||
|
|
||||||
|
inline void TraceRestrictExecuteResEndSlot(const Train *v)
|
||||||
|
{
|
||||||
|
if (this->prog != nullptr) this->TraceRestrictExecuteResEndSlotIntl(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void TraceRestrictExecuteResEndSlotIntl(const Train *v);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool IsWaitingPositionFree(const Train *v, TileIndex tile, Trackdir trackdir, bool forbid_90deg = false, PBSWaitingPositionRestrictedSignalState *restricted_signal_state = nullptr);
|
bool IsWaitingPositionFree(const Train *v, TileIndex tile, Trackdir trackdir, bool forbid_90deg = false, PBSWaitingPositionRestrictedSignalState *restricted_signal_state = nullptr);
|
||||||
|
@@ -3871,15 +3871,7 @@ static PBSTileInfo ExtendTrainReservation(const Train *v, const PBSTileInfo &ori
|
|||||||
bool wp_free = IsWaitingPositionFree(v, tile, cur_td, _settings_game.pf.forbid_90_deg, &restricted_signal_state);
|
bool wp_free = IsWaitingPositionFree(v, tile, cur_td, _settings_game.pf.forbid_90_deg, &restricted_signal_state);
|
||||||
if (!(wp_free && TryReserveRailTrackdir(v, tile, cur_td))) break;
|
if (!(wp_free && TryReserveRailTrackdir(v, tile, cur_td))) break;
|
||||||
/* Safe position is all good, path valid and okay. */
|
/* Safe position is all good, path valid and okay. */
|
||||||
if (restricted_signal_state.prog != nullptr) {
|
restricted_signal_state.TraceRestrictExecuteResEndSlot(v);
|
||||||
const TraceRestrictProgram *prog = restricted_signal_state.prog;
|
|
||||||
if (prog != nullptr && (prog->actions_used_flags & TRPAUF_PBS_RES_END_SLOT)) {
|
|
||||||
TraceRestrictProgramResult out;
|
|
||||||
TraceRestrictProgramInput input(restricted_signal_state.tile, restricted_signal_state.trackdir, &VehiclePosTraceRestrictPreviousSignalCallback, nullptr);
|
|
||||||
input.permitted_slot_operations = TRPISP_PBS_RES_END_ACQUIRE | TRPISP_PBS_RES_END_RELEASE;
|
|
||||||
prog->Execute(v, input, out);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return PBSTileInfo(tile, cur_td, true);
|
return PBSTileInfo(tile, cur_td, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user