diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index 0e6ebd423b..20020a6f35 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -265,19 +265,10 @@ public: } } + /* This must be done before calling TraceRestrictExecuteResEndSlot */ temporary_slot_state.ApplyTemporaryChanges(Yapf().GetVehicle()->index); - if (restricted_signal_state.prog != nullptr) { - 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); - } - } + restricted_signal_state.TraceRestrictExecuteResEndSlot(Yapf().GetVehicle()); if (target != nullptr) target->okay = true; diff --git a/src/pbs.cpp b/src/pbs.cpp index e01c6985af..3e834d4c4b 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -1531,6 +1531,21 @@ bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bo 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) { if (prog != nullptr && prog->actions_used_flags & TRPAUF_PBS_RES_END_WAIT) { diff --git a/src/pbs.h b/src/pbs.h index 361df02c9e..7edb101db0 100644 --- a/src/pbs.h +++ b/src/pbs.h @@ -183,6 +183,14 @@ struct PBSWaitingPositionRestrictedSignalState { Trackdir trackdir = INVALID_TRACKDIR; bool defer_test_if_slot_conditional = 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); diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index e008ba8cf7..acdd9f052c 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -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); if (!(wp_free && TryReserveRailTrackdir(v, tile, cur_td))) break; /* Safe position is all good, path valid and okay. */ - if (restricted_signal_state.prog != nullptr) { - 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); - } - } + restricted_signal_state.TraceRestrictExecuteResEndSlot(v); return PBSTileInfo(tile, cur_td, true); }