diff --git a/src/pbs.cpp b/src/pbs.cpp index 440dd1847e..b6e65828e3 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -1262,6 +1262,7 @@ bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bo if (IsRestrictedSignal(ft.m_new_tile)) { const TraceRestrictProgram *prog = GetExistingTraceRestrictProgram(ft.m_new_tile, TrackdirToTrack(td)); if (prog && prog->actions_used_flags & TRPAUF_RESERVE_THROUGH) { + if (prog->actions_used_flags & TRPAUF_RESERVE_THROUGH_ALWAYS) return false; TraceRestrictProgramResult out; prog->Execute(v, TraceRestrictProgramInput(ft.m_new_tile, td, &VehiclePosTraceRestrictPreviousSignalCallback, nullptr), out); if (out.flags & TRPRF_RESERVE_THROUGH) { diff --git a/src/tracerestrict.cpp b/src/tracerestrict.cpp index 400188f5b9..b58ca5bd1c 100644 --- a/src/tracerestrict.cpp +++ b/src/tracerestrict.cpp @@ -931,6 +931,11 @@ CommandCost TraceRestrictProgram::Validate(const std::vector case TRIT_RESERVE_THROUGH: actions_used_flags |= TRPAUF_RESERVE_THROUGH; + if (GetTraceRestrictValue(item)) { + actions_used_flags &= ~TRPAUF_RESERVE_THROUGH_ALWAYS; + } else if (condstack.empty()) { + actions_used_flags |= TRPAUF_RESERVE_THROUGH_ALWAYS; + } break; case TRIT_LONG_RESERVE: diff --git a/src/tracerestrict.h b/src/tracerestrict.h index c874722749..e4ef9cb081 100644 --- a/src/tracerestrict.h +++ b/src/tracerestrict.h @@ -422,6 +422,7 @@ enum TraceRestrictProgramActionsUsedFlags { TRPAUF_SLOT_ACQUIRE_ON_RES = 1 << 14, ///< Slot acquire (on reserve) action is present TRPAUF_SPEED_ADAPTATION = 1 << 15, ///< Speed adaptation control TRPAUF_PBS_RES_END_SIMULATE = 1 << 16, ///< PBS reservations ending at this signal slot changes must be fully simulated in dry run mode + TRPAUF_RESERVE_THROUGH_ALWAYS = 1 << 17, ///< Reserve through action is unconditionally set }; DECLARE_ENUM_AS_BIT_SET(TraceRestrictProgramActionsUsedFlags)