diff --git a/src/lang/english.txt b/src/lang/english.txt index 65ec673cd3..cca349b9d8 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2385,6 +2385,7 @@ STR_TRACE_RESTRICT_CONDITIONAL_ENDIF :End if STR_TRACE_RESTRICT_VARIABLE_TRAIN_LENGTH :train length STR_TRACE_RESTRICT_VARIABLE_MAX_SPEED :max speed STR_TRACE_RESTRICT_VARIABLE_CURRENT_ORDER :current order +STR_TRACE_RESTRICT_VARIABLE_NEXT_ORDER :next order STR_TRACE_RESTRICT_VARIABLE_UNDEFINED :undefined STR_TRACE_RESTRICT_CONDITIONAL_COMPARE_INTEGER :{STRING} {STRING} {STRING} {COMMA} then STR_TRACE_RESTRICT_CONDITIONAL_COMPARE_SPEED :{STRING} {STRING} {STRING} {VELOCITY} then diff --git a/src/tracerestrict.cpp b/src/tracerestrict.cpp index 737c57fddc..046e35d99b 100644 --- a/src/tracerestrict.cpp +++ b/src/tracerestrict.cpp @@ -218,6 +218,20 @@ void TraceRestrictProgram::Execute(const Train* v, TraceRestrictProgramResult& o result = TestOrderCondition(&(v->current_order), item); break; + case TRIT_COND_NEXT_ORDER: { + if (v->orders.list == NULL) break; + if (v->orders.list->GetNumOrders() == 0) break; + + const Order *current_order = v->GetOrder(v->cur_real_order_index); + for (const Order *order = v->orders.list->GetNext(current_order); order != current_order; order = v->orders.list->GetNext(order)) { + if (order->IsGotoOrder()) { + result = TestOrderCondition(order, item); + break; + } + } + break; + } + default: NOT_REACHED(); } @@ -737,7 +751,8 @@ void TraceRestrictRemoveDestinationID(TraceRestrictOrderCondAuxField type, uint1 FOR_ALL_TRACE_RESTRICT_PROGRAMS(prog) { for (size_t i = 0; i < prog->items.size(); i++) { TraceRestrictItem &item = prog->items[i]; // note this is a reference, - if (GetTraceRestrictType(item) == TRIT_COND_CURRENT_ORDER) { + if (GetTraceRestrictType(item) == TRIT_COND_CURRENT_ORDER || + GetTraceRestrictType(item) == TRIT_COND_NEXT_ORDER) { if (GetTraceRestrictAuxField(item) == type && GetTraceRestrictValue(item) == index) { SetTraceRestrictValueDefault(item, TRVT_ORDER); // this updates the instruction in-place } diff --git a/src/tracerestrict.h b/src/tracerestrict.h index 2106d1060c..9a2dc25e78 100644 --- a/src/tracerestrict.h +++ b/src/tracerestrict.h @@ -83,6 +83,7 @@ enum TraceRestrictItemType { TRIT_COND_TRAIN_LENGTH = 10, ///< Test train length TRIT_COND_MAX_SPEED = 11, ///< Test train max speed TRIT_COND_CURRENT_ORDER = 12, ///< Test train current order (station, waypoint or depot) + TRIT_COND_NEXT_ORDER = 13, ///< Test train next order (station, waypoint or depot) /* space up to 31 */ }; @@ -251,6 +252,7 @@ static inline TraceRestrictTypePropertySet GetTraceRestrictTypeProperties(TraceR break; case TRIT_COND_CURRENT_ORDER: + case TRIT_COND_NEXT_ORDER: out.value_type = TRVT_ORDER; out.cond_type = TRCOT_BINARY; break; diff --git a/src/tracerestrict_gui.cpp b/src/tracerestrict_gui.cpp index 8f04d0203b..0f13f66099 100644 --- a/src/tracerestrict_gui.cpp +++ b/src/tracerestrict_gui.cpp @@ -159,6 +159,7 @@ static const TraceRestrictDropDownListSet *GetTypeDropDownListSet(TraceRestrictI STR_TRACE_RESTRICT_VARIABLE_TRAIN_LENGTH, STR_TRACE_RESTRICT_VARIABLE_MAX_SPEED, STR_TRACE_RESTRICT_VARIABLE_CURRENT_ORDER, + STR_TRACE_RESTRICT_VARIABLE_NEXT_ORDER, STR_TRACE_RESTRICT_VARIABLE_UNDEFINED, INVALID_STRING_ID, }; @@ -166,6 +167,7 @@ static const TraceRestrictDropDownListSet *GetTypeDropDownListSet(TraceRestrictI TRIT_COND_TRAIN_LENGTH, TRIT_COND_MAX_SPEED, TRIT_COND_CURRENT_ORDER, + TRIT_COND_NEXT_ORDER, TRIT_COND_UNDEFINED, }; static const TraceRestrictDropDownListSet set_cond = {