diff --git a/src/lang/english.txt b/src/lang/english.txt index 05541fca3b..7355bb0f2d 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2666,6 +2666,7 @@ STR_TRACE_RESTRICT_VARIABLE_CURRENT_ORDER :current order STR_TRACE_RESTRICT_VARIABLE_NEXT_ORDER :next order STR_TRACE_RESTRICT_VARIABLE_LAST_VISITED_STATION :last visited station STR_TRACE_RESTRICT_VARIABLE_CARGO :cargo +STR_TRACE_RESTRICT_VARIABLE_LOAD_PERCENT :load percentage STR_TRACE_RESTRICT_VARIABLE_ENTRY_DIRECTION :entry direction STR_TRACE_RESTRICT_VARIABLE_PBS_ENTRY_SIGNAL :PBS entry signal STR_TRACE_RESTRICT_VARIABLE_PBS_ENTRY_SIGNAL_LONG :entered signal of PBS block diff --git a/src/tracerestrict.cpp b/src/tracerestrict.cpp index f7ccf5ccd5..40680fe72c 100644 --- a/src/tracerestrict.cpp +++ b/src/tracerestrict.cpp @@ -22,6 +22,7 @@ #include "string_func.h" #include "pathfinder/yapf/yapf_cache.h" #include "scope_info.h" +#include "vehicle_func.h" #include #include @@ -493,6 +494,11 @@ void TraceRestrictProgram::Execute(const Train* v, const TraceRestrictProgramInp break; } + case TRIT_COND_LOAD_PERCENT: { + result = TestCondition(CalcPercentVehicleFilled(v, nullptr), condop, condvalue); + break; + } + default: NOT_REACHED(); } @@ -722,6 +728,7 @@ CommandCost TraceRestrictProgram::Validate(const std::vector case TRIT_COND_PHYS_RATIO: case TRIT_COND_TRAIN_OWNER: case TRIT_COND_TRAIN_STATUS: + case TRIT_COND_LOAD_PERCENT: break; default: @@ -858,6 +865,7 @@ void SetTraceRestrictValueDefault(TraceRestrictItem &item, TraceRestrictValueTyp case TRVT_WAIT_AT_PBS: case TRVT_TRAIN_STATUS: case TRVT_REVERSE: + case TRVT_PERCENT: SetTraceRestrictValue(item, 0); if (!IsTraceRestrictTypeAuxSubtype(GetTraceRestrictType(item))) { SetTraceRestrictAuxField(item, 0); diff --git a/src/tracerestrict.h b/src/tracerestrict.h index e232e8e76a..2a2d7122f7 100644 --- a/src/tracerestrict.h +++ b/src/tracerestrict.h @@ -138,6 +138,7 @@ enum TraceRestrictItemType { TRIT_COND_SLOT_OCCUPANCY = 22, ///< Test train slot occupancy state TRIT_COND_TRAIN_OWNER = 24, ///< Test train owner TRIT_COND_TRAIN_STATUS = 25, ///< Test train status + TRIT_COND_LOAD_PERCENT = 26, ///< Test train load percentage TRIT_COND_END = 48, ///< End (exclusive) of conditional item types, note that this has the same value as TRIT_REVERSE TRIT_REVERSE = 48, ///< Reverse behind signal @@ -553,6 +554,7 @@ enum TraceRestrictValueType { TRVT_WAIT_AT_PBS = 18,///< takes a TraceRestrictWaitAtPbsValueField value TRVT_SLOT_INDEX = 19,///< takes a TraceRestrictSlotID TRVT_SLOT_INDEX_INT = 20,///< takes a TraceRestrictSlotID, and an integer in the next item slot + TRVT_PERCENT = 21,///> takes a unsigned integer percentage value between 0 and 100 TRVT_OWNER = 40,///< takes a CompanyID TRVT_TRAIN_STATUS = 41,///< takes a TraceRestrictTrainStatusValueField TRVT_REVERSE = 42,///< takes a TraceRestrictReverseValueField @@ -677,6 +679,10 @@ static inline TraceRestrictTypePropertySet GetTraceRestrictTypeProperties(TraceR out.cond_type = TRCOT_BINARY; break; + case TRIT_COND_LOAD_PERCENT: + out.value_type = TRVT_PERCENT; + break; + default: NOT_REACHED(); break; diff --git a/src/tracerestrict_gui.cpp b/src/tracerestrict_gui.cpp index 591cc8ed50..03c3e2fcc0 100644 --- a/src/tracerestrict_gui.cpp +++ b/src/tracerestrict_gui.cpp @@ -394,6 +394,7 @@ static const TraceRestrictDropDownListSet *GetTypeDropDownListSet(TraceRestrictG STR_TRACE_RESTRICT_VARIABLE_NEXT_ORDER, STR_TRACE_RESTRICT_VARIABLE_LAST_VISITED_STATION, STR_TRACE_RESTRICT_VARIABLE_CARGO, + STR_TRACE_RESTRICT_VARIABLE_LOAD_PERCENT, STR_TRACE_RESTRICT_VARIABLE_ENTRY_DIRECTION, STR_TRACE_RESTRICT_VARIABLE_PBS_ENTRY_SIGNAL, STR_TRACE_RESTRICT_VARIABLE_TRAIN_GROUP, @@ -417,6 +418,7 @@ static const TraceRestrictDropDownListSet *GetTypeDropDownListSet(TraceRestrictG TRIT_COND_NEXT_ORDER, TRIT_COND_LAST_STATION, TRIT_COND_CARGO, + TRIT_COND_LOAD_PERCENT, TRIT_COND_ENTRY_DIRECTION, TRIT_COND_PBS_ENTRY_SIGNAL, TRIT_COND_TRAIN_GROUP, @@ -441,7 +443,7 @@ static const TraceRestrictDropDownListSet *GetTypeDropDownListSet(TraceRestrictG if (_settings_client.gui.show_adv_tracerestrict_features) { *hide_mask = 0; } else { - *hide_mask = is_conditional ? 0x70000 : 0x70; + *hide_mask = is_conditional ? 0xE0000 : 0x70; } } return is_conditional ? &set_cond : &set_action; @@ -683,6 +685,7 @@ static bool IsIntegerValueType(TraceRestrictValueType type) case TRVT_WEIGHT: case TRVT_POWER: case TRVT_FORCE: + case TRVT_PERCENT: return true; default: @@ -740,6 +743,10 @@ static uint ConvertIntegerValue(TraceRestrictValueType type, uint in, bool to_di case TRVT_PF_PENALTY: return in; + case TRVT_PERCENT: + if (!to_display && in > 100) return 100; + return in; + default: NOT_REACHED(); return 0; @@ -908,6 +915,7 @@ static void DrawInstructionString(const TraceRestrictProgram *prog, TraceRestric } else { switch (properties.value_type) { case TRVT_INT: + case TRVT_PERCENT: instruction_string = STR_TRACE_RESTRICT_CONDITIONAL_COMPARE_INTEGER; DrawInstructionStringConditionalIntegerCommon(item, properties); break;