Add conditional order which tests counter value

This commit is contained in:
Jonathan G Rennison
2020-08-31 22:52:26 +01:00
parent 817bc44a3e
commit 9ee8091ecc
7 changed files with 115 additions and 9 deletions

View File

@@ -4798,6 +4798,7 @@ STR_ORDER_CONDITIONAL_SLOT_OCCUPANCY :Slot occupancy
STR_ORDER_CONDITIONAL_TRAIN_IN_SLOT :Train in slot STR_ORDER_CONDITIONAL_TRAIN_IN_SLOT :Train in slot
STR_ORDER_CONDITIONAL_CARGO_LOAD_PERCENTAGE :Cargo load percentage STR_ORDER_CONDITIONAL_CARGO_LOAD_PERCENTAGE :Cargo load percentage
STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT :Waiting cargo amount STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT :Waiting cargo amount
STR_ORDER_CONDITIONAL_COUNTER_VALUE :Counter value
STR_ORDER_CONDITIONAL_REQUIRES_SERVICE_ORDER :Requires service {STRING} STR_ORDER_CONDITIONAL_REQUIRES_SERVICE_ORDER :Requires service {STRING}
STR_ORDER_CONDITIONAL_CARGO_WAITING_ORDER :Next station {STRING} {STRING} waiting STR_ORDER_CONDITIONAL_CARGO_WAITING_ORDER :Next station {STRING} {STRING} waiting
@@ -4820,6 +4821,7 @@ STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :is false
STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}The value to compare the vehicle data against STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}The value to compare the vehicle data against
STR_ORDER_CONDITIONAL_CARGO_TOOLTIP :{BLACK}The cargo to compare the station data against STR_ORDER_CONDITIONAL_CARGO_TOOLTIP :{BLACK}The cargo to compare the station data against
STR_ORDER_CONDITIONAL_SLOT_TOOLTIP :{BLACK}The train slot to check the occupancy of STR_ORDER_CONDITIONAL_SLOT_TOOLTIP :{BLACK}The train slot to check the occupancy of
STR_ORDER_CONDITIONAL_COUNTER_TOOLTIP :{BLACK}The counter to check the value of
STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Enter value to compare against STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Enter value to compare against
STR_ORDER_CONDITIONAL_VIA :{BLACK}Via STR_ORDER_CONDITIONAL_VIA :{BLACK}Via
@@ -4958,6 +4960,8 @@ STR_ORDER_CONDITIONAL_TRUE_FALSE :Jump to order {
STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE_DISPLAY :Jump to order {COMMA} when Load percentage of {STRING} {STRING} {COMMA} STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE_DISPLAY :Jump to order {COMMA} when Load percentage of {STRING} {STRING} {COMMA}
STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT_DISPLAY :Jump to order {COMMA} when {STRING} at next station {STRING} {CARGO_SHORT} STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT_DISPLAY :Jump to order {COMMA} when {STRING} at next station {STRING} {CARGO_SHORT}
STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT_VIA_DISPLAY :Jump to order {COMMA} when {STRING} at next station via {STATION} {STRING} {CARGO_SHORT} STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT_VIA_DISPLAY :Jump to order {COMMA} when {STRING} at next station via {STATION} {STRING} {CARGO_SHORT}
STR_ORDER_CONDITIONAL_COUNTER :Jump to order {COMMA} when value of {TRCOUNTER} {STRING} {COMMA}
STR_ORDER_CONDITIONAL_INVALID_COUNTER :Jump to order {COMMA} when value of {PUSH_COLOUR}{RED}{STRING}{POP_COLOUR} {STRING} {COMMA}
STR_INVALID_ORDER :{RED} (Invalid Order) STR_INVALID_ORDER :{RED} (Invalid Order)

View File

@@ -1679,6 +1679,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (data == OCV_FREE_PLATFORMS && v->type != VEH_TRAIN) return CMD_ERROR; if (data == OCV_FREE_PLATFORMS && v->type != VEH_TRAIN) return CMD_ERROR;
if (data == OCV_SLOT_OCCUPANCY && v->type != VEH_TRAIN) return CMD_ERROR; if (data == OCV_SLOT_OCCUPANCY && v->type != VEH_TRAIN) return CMD_ERROR;
if (data == OCV_TRAIN_IN_SLOT && v->type != VEH_TRAIN) return CMD_ERROR; if (data == OCV_TRAIN_IN_SLOT && v->type != VEH_TRAIN) return CMD_ERROR;
if (data == OCV_COUNTER_VALUE && v->type != VEH_TRAIN) return CMD_ERROR;
if (data >= OCV_END) return CMD_ERROR; if (data >= OCV_END) return CMD_ERROR;
break; break;
@@ -1730,6 +1731,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
break; break;
case OCV_CARGO_WAITING_AMOUNT: case OCV_CARGO_WAITING_AMOUNT:
case OCV_COUNTER_VALUE:
if (data >= (1 << 16)) return CMD_ERROR; if (data >= (1 << 16)) return CMD_ERROR;
break; break;
@@ -1746,6 +1748,10 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (!(data < NUM_CARGO && CargoSpec::Get(data)->IsValid())) return CMD_ERROR; if (!(data < NUM_CARGO && CargoSpec::Get(data)->IsValid())) return CMD_ERROR;
break; break;
case OCV_COUNTER_VALUE:
if (data != INVALID_TRACE_RESTRICT_COUNTER_ID && !TraceRestrictCounter::IsValidID(data)) return CMD_ERROR;
break;
default: default:
return CMD_ERROR; return CMD_ERROR;
} }
@@ -1852,6 +1858,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
bool old_var_was_cargo = (order->GetConditionVariable() == OCV_CARGO_ACCEPTANCE || order->GetConditionVariable() == OCV_CARGO_WAITING bool old_var_was_cargo = (order->GetConditionVariable() == OCV_CARGO_ACCEPTANCE || order->GetConditionVariable() == OCV_CARGO_WAITING
|| order->GetConditionVariable() == OCV_CARGO_LOAD_PERCENTAGE || order->GetConditionVariable() == OCV_CARGO_WAITING_AMOUNT); || order->GetConditionVariable() == OCV_CARGO_LOAD_PERCENTAGE || order->GetConditionVariable() == OCV_CARGO_WAITING_AMOUNT);
bool old_var_was_slot = (order->GetConditionVariable() == OCV_SLOT_OCCUPANCY || order->GetConditionVariable() == OCV_TRAIN_IN_SLOT); bool old_var_was_slot = (order->GetConditionVariable() == OCV_SLOT_OCCUPANCY || order->GetConditionVariable() == OCV_TRAIN_IN_SLOT);
bool old_var_was_counter = (order->GetConditionVariable() == OCV_COUNTER_VALUE);
order->SetConditionVariable((OrderConditionVariable)data); order->SetConditionVariable((OrderConditionVariable)data);
OrderConditionComparator occ = order->GetConditionComparator(); OrderConditionComparator occ = order->GetConditionComparator();
@@ -1867,6 +1874,11 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (occ != OCC_IS_TRUE && occ != OCC_IS_FALSE) order->SetConditionComparator(OCC_IS_TRUE); if (occ != OCC_IS_TRUE && occ != OCC_IS_FALSE) order->SetConditionComparator(OCC_IS_TRUE);
break; break;
case OCV_COUNTER_VALUE:
if (!old_var_was_counter) order->GetXDataRef() = INVALID_TRACE_RESTRICT_COUNTER_ID << 16;
if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS);
break;
case OCV_CARGO_ACCEPTANCE: case OCV_CARGO_ACCEPTANCE:
case OCV_CARGO_WAITING: case OCV_CARGO_WAITING:
if (!old_var_was_cargo) order->SetConditionValue((uint16) GetFirstValidCargo()); if (!old_var_was_cargo) order->SetConditionValue((uint16) GetFirstValidCargo());
@@ -1893,7 +1905,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
FALLTHROUGH; FALLTHROUGH;
default: default:
if (old_var_was_cargo || old_var_was_slot) order->SetConditionValue(0); if (old_var_was_cargo || old_var_was_slot || old_var_was_counter) order->SetConditionValue(0);
if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS); if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS);
break; break;
} }
@@ -1913,6 +1925,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
break; break;
case OCV_CARGO_WAITING_AMOUNT: case OCV_CARGO_WAITING_AMOUNT:
case OCV_COUNTER_VALUE:
SB(order->GetXDataRef(), 0, 16, data); SB(order->GetXDataRef(), 0, 16, data);
break; break;
@@ -1923,8 +1936,16 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
break; break;
case MOF_COND_VALUE_2: case MOF_COND_VALUE_2:
switch (order->GetConditionVariable()) {
case OCV_COUNTER_VALUE:
SB(order->GetXDataRef(), 16, 16, data);
break;
default:
order->SetConditionValue(data); order->SetConditionValue(data);
break; break;
}
break;
case MOF_COND_VALUE_3: case MOF_COND_VALUE_3:
SB(order->GetXDataRef(), 16, 16, data + 2); SB(order->GetXDataRef(), 16, 16, data + 2);
@@ -2698,6 +2719,11 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v, boo
break; break;
} }
case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, max(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1, 0) / DAYS_IN_LEAP_YEAR, value); break; case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, max(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1, 0) / DAYS_IN_LEAP_YEAR, value); break;
case OCV_COUNTER_VALUE: {
const TraceRestrictCounter* ctr = TraceRestrictCounter::GetIfValid(GB(order->GetXData(), 16, 16));
if (ctr != nullptr) skip_order = OrderConditionCompare(occ, ctr->value, GB(order->GetXData(), 0, 16));
break;
}
default: NOT_REACHED(); default: NOT_REACHED();
} }

View File

@@ -65,6 +65,7 @@ static const StringID _cargo_type_unload_order_drowdown[] = {
static const uint32 _cargo_type_unload_order_drowdown_hidden_mask = 0x8; // 01000 static const uint32 _cargo_type_unload_order_drowdown_hidden_mask = 0x8; // 01000
DropDownList GetSlotDropDownList(Owner owner, TraceRestrictSlotID slot_id, int &selected); DropDownList GetSlotDropDownList(Owner owner, TraceRestrictSlotID slot_id, int &selected);
DropDownList GetCounterDropDownList(Owner owner, TraceRestrictCounterID ctr_id, int &selected);
struct CargoTypeOrdersWindow : public Window { struct CargoTypeOrdersWindow : public Window {
private: private:
@@ -641,6 +642,7 @@ static const OrderConditionVariable _order_conditional_variable[] = {
OCV_FREE_PLATFORMS, OCV_FREE_PLATFORMS,
OCV_SLOT_OCCUPANCY, OCV_SLOT_OCCUPANCY,
OCV_TRAIN_IN_SLOT, OCV_TRAIN_IN_SLOT,
OCV_COUNTER_VALUE,
OCV_PERCENT, OCV_PERCENT,
OCV_UNCONDITIONALLY, OCV_UNCONDITIONALLY,
}; };
@@ -945,6 +947,16 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int
SetDParam(5, order->GetConditionValue()); SetDParam(5, order->GetConditionValue());
SetDParam(6, GB(order->GetXData(), 0, 16)); SetDParam(6, GB(order->GetXData(), 0, 16));
} }
} else if (ocv == OCV_COUNTER_VALUE) {
if (TraceRestrictCounter::IsValidID(GB(order->GetXData(), 16, 16))) {
SetDParam(0, STR_ORDER_CONDITIONAL_COUNTER);
SetDParam(2, GB(order->GetXData(), 16, 16));
} else {
SetDParam(0, STR_ORDER_CONDITIONAL_INVALID_COUNTER);
SetDParam(2, STR_TRACE_RESTRICT_VARIABLE_UNDEFINED);
}
SetDParam(3, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + order->GetConditionComparator());
SetDParam(4, GB(order->GetXData(), 0, 16));
} else { } else {
OrderConditionComparator occ = order->GetConditionComparator(); OrderConditionComparator occ = order->GetConditionComparator();
SetDParam(0, (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) ? STR_ORDER_CONDITIONAL_TRUE_FALSE : STR_ORDER_CONDITIONAL_NUM); SetDParam(0, (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) ? STR_ORDER_CONDITIONAL_TRUE_FALSE : STR_ORDER_CONDITIONAL_NUM);
@@ -1187,6 +1199,7 @@ private:
/* WID_O_SEL_COND_AUX */ /* WID_O_SEL_COND_AUX */
DP_COND_AUX_CARGO = 0, ///< Display dropdown widget cargo types DP_COND_AUX_CARGO = 0, ///< Display dropdown widget cargo types
DP_COND_COUNTER = 1, ///< Display dropdown widget counters
/* WID_O_SEL_COND_AUX2 */ /* WID_O_SEL_COND_AUX2 */
DP_COND_AUX2_VIA = 0, ///< Display via button DP_COND_AUX2_VIA = 0, ///< Display via button
@@ -1563,7 +1576,10 @@ public:
case WID_O_COND_VARIABLE: { case WID_O_COND_VARIABLE: {
Dimension d = {0, 0}; Dimension d = {0, 0};
for (uint i = 0; i < lengthof(_order_conditional_variable); i++) { for (uint i = 0; i < lengthof(_order_conditional_variable); i++) {
if (this->vehicle->type != VEH_TRAIN && (_order_conditional_variable[i] == OCV_TRAIN_IN_SLOT || _order_conditional_variable[i] == OCV_SLOT_OCCUPANCY || _order_conditional_variable[i] == OCV_FREE_PLATFORMS)) continue; if (this->vehicle->type != VEH_TRAIN && (_order_conditional_variable[i] == OCV_TRAIN_IN_SLOT ||
_order_conditional_variable[i] == OCV_SLOT_OCCUPANCY || _order_conditional_variable[i] == OCV_FREE_PLATFORMS)) {
continue;
}
d = maxdim(d, GetStringBoundingBox(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + _order_conditional_variable[i])); d = maxdim(d, GetStringBoundingBox(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + _order_conditional_variable[i]));
} }
d.width += padding.width; d.width += padding.width;
@@ -1827,6 +1843,7 @@ public:
bool is_cargo = (ocv == OCV_CARGO_ACCEPTANCE || ocv == OCV_CARGO_WAITING); bool is_cargo = (ocv == OCV_CARGO_ACCEPTANCE || ocv == OCV_CARGO_WAITING);
bool is_slot_occupancy = (ocv == OCV_SLOT_OCCUPANCY || ocv == OCV_TRAIN_IN_SLOT); bool is_slot_occupancy = (ocv == OCV_SLOT_OCCUPANCY || ocv == OCV_TRAIN_IN_SLOT);
bool is_auxiliary_cargo = (ocv == OCV_CARGO_LOAD_PERCENTAGE || ocv == OCV_CARGO_WAITING_AMOUNT); bool is_auxiliary_cargo = (ocv == OCV_CARGO_LOAD_PERCENTAGE || ocv == OCV_CARGO_WAITING_AMOUNT);
bool is_counter = (ocv == OCV_COUNTER_VALUE);
if (is_cargo) { if (is_cargo) {
if (order == nullptr || !CargoSpec::Get(order->GetConditionValue())->IsValid()) { if (order == nullptr || !CargoSpec::Get(order->GetConditionValue())->IsValid()) {
@@ -1851,6 +1868,11 @@ public:
this->GetWidget<NWidgetCore>(WID_O_COND_AUX_CARGO)->widget_data = CargoSpec::Get(order->GetConditionValue())->name; this->GetWidget<NWidgetCore>(WID_O_COND_AUX_CARGO)->widget_data = CargoSpec::Get(order->GetConditionValue())->name;
} }
aux_sel->SetDisplayedPlane(DP_COND_AUX_CARGO); aux_sel->SetDisplayedPlane(DP_COND_AUX_CARGO);
} else if (is_counter) {
TraceRestrictCounterID ctr_id = (order != nullptr && TraceRestrictCounter::IsValidID(GB(order->GetXData(), 16, 16)) ? GB(order->GetXData(), 16, 16) : INVALID_TRACE_RESTRICT_COUNTER_ID);
this->GetWidget<NWidgetCore>(WID_O_COND_COUNTER)->widget_data = (ctr_id != INVALID_TRACE_RESTRICT_COUNTER_ID) ? STR_TRACE_RESTRICT_COUNTER_NAME : STR_TRACE_RESTRICT_VARIABLE_UNDEFINED;
aux_sel->SetDisplayedPlane(DP_COND_COUNTER);
} else { } else {
aux_sel->SetDisplayedPlane(SZSP_NONE); aux_sel->SetDisplayedPlane(SZSP_NONE);
} }
@@ -2015,6 +2037,7 @@ public:
break; break;
case OCV_CARGO_WAITING_AMOUNT: case OCV_CARGO_WAITING_AMOUNT:
case OCV_COUNTER_VALUE:
value = GB(order->GetXData(), 0, 16); value = GB(order->GetXData(), 0, 16);
break; break;
@@ -2040,6 +2063,17 @@ public:
break; break;
} }
case WID_O_COND_COUNTER: {
VehicleOrderID sel = this->OrderGetSel();
const Order *order = this->vehicle->GetOrder(sel);
if (order != nullptr && order->IsType(OT_CONDITIONAL)) {
TraceRestrictCounterID value = GB(order->GetXData(), 16, 16);
SetDParam(0, value);
}
break;
}
case WID_O_CAPTION: case WID_O_CAPTION:
SetDParam(0, this->vehicle->index); SetDParam(0, this->vehicle->index);
break; break;
@@ -2211,6 +2245,14 @@ public:
break; break;
} }
case WID_O_COND_COUNTER: {
int selected;
TraceRestrictCounterID value = GB(this->vehicle->GetOrder(this->OrderGetSel())->GetXData(), 16, 16);
DropDownList list = GetCounterDropDownList(this->vehicle->owner, value, selected);
if (!list.empty()) ShowDropDownList(this, std::move(list), selected, WID_O_COND_COUNTER, 0, true);
break;
}
case WID_O_REVERSE: { case WID_O_REVERSE: {
VehicleOrderID sel_ord = this->OrderGetSel(); VehicleOrderID sel_ord = this->OrderGetSel();
const Order *order = this->vehicle->GetOrder(sel_ord); const Order *order = this->vehicle->GetOrder(sel_ord);
@@ -2253,9 +2295,15 @@ public:
const OrderConditionVariable ocv = this->vehicle->GetOrder(this->OrderGetSel())->GetConditionVariable(); const OrderConditionVariable ocv = this->vehicle->GetOrder(this->OrderGetSel())->GetConditionVariable();
DropDownList list; DropDownList list;
for (uint i = 0; i < lengthof(_order_conditional_variable); i++) { for (uint i = 0; i < lengthof(_order_conditional_variable); i++) {
if (this->vehicle->type != VEH_TRAIN && (_order_conditional_variable[i] == OCV_TRAIN_IN_SLOT || _order_conditional_variable[i] == OCV_SLOT_OCCUPANCY || _order_conditional_variable[i] == OCV_FREE_PLATFORMS)) continue; if (this->vehicle->type != VEH_TRAIN && (_order_conditional_variable[i] == OCV_TRAIN_IN_SLOT || _order_conditional_variable[i] == OCV_SLOT_OCCUPANCY ||
_order_conditional_variable[i] == OCV_FREE_PLATFORMS || _order_conditional_variable[i] == OCV_COUNTER_VALUE)) {
continue;
}
if (ocv != _order_conditional_variable[i]) { if (ocv != _order_conditional_variable[i]) {
if ((_order_conditional_variable[i] == OCV_TRAIN_IN_SLOT || _order_conditional_variable[i] == OCV_SLOT_OCCUPANCY) && !_settings_client.gui.show_adv_tracerestrict_features) continue; if ((_order_conditional_variable[i] == OCV_TRAIN_IN_SLOT || _order_conditional_variable[i] == OCV_SLOT_OCCUPANCY ||
_order_conditional_variable[i] == OCV_COUNTER_VALUE) && !_settings_client.gui.show_adv_tracerestrict_features) {
continue;
}
} }
list.emplace_back(new DropDownListStringItem(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + _order_conditional_variable[i], _order_conditional_variable[i], false)); list.emplace_back(new DropDownListStringItem(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + _order_conditional_variable[i], _order_conditional_variable[i], false));
} }
@@ -2295,6 +2343,7 @@ public:
break; break;
case OCV_CARGO_WAITING_AMOUNT: case OCV_CARGO_WAITING_AMOUNT:
case OCV_COUNTER_VALUE:
value = GB(order->GetXData(), 0, 16); value = GB(order->GetXData(), 0, 16);
break; break;
@@ -2336,7 +2385,7 @@ public:
switch (this->vehicle->GetOrder(sel)->GetConditionVariable()) { switch (this->vehicle->GetOrder(sel)->GetConditionVariable()) {
case OCV_MAX_SPEED: case OCV_MAX_SPEED:
value = ConvertDisplaySpeedToSpeed(value); value = Clamp(ConvertDisplaySpeedToSpeed(value), 0, 2047);
break; break;
case OCV_PERCENT: case OCV_PERCENT:
@@ -2347,13 +2396,18 @@ public:
break; break;
case OCV_CARGO_WAITING_AMOUNT: case OCV_CARGO_WAITING_AMOUNT:
value = ConvertDisplayQuantityToCargoQuantity(this->vehicle->GetOrder(sel)->GetConditionValue(), value); value = Clamp(ConvertDisplayQuantityToCargoQuantity(this->vehicle->GetOrder(sel)->GetConditionValue(), value), 0, 2047);
break;
case OCV_COUNTER_VALUE:
value = Clamp(value, 0, 0xFFFF);
break; break;
default: default:
value = Clamp(value, 0, 2047);
break; break;
} }
DoCommandP(this->vehicle->tile, this->vehicle->index + (sel << 20), MOF_COND_VALUE | Clamp(value, 0, 2047) << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER)); DoCommandP(this->vehicle->tile, this->vehicle->index + (sel << 20), MOF_COND_VALUE | value << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER));
} }
if (this->query_text_widget == WID_O_ADD_VEH_GROUP) { if (this->query_text_widget == WID_O_ADD_VEH_GROUP) {
@@ -2413,6 +2467,10 @@ public:
case WID_O_COND_SLOT: case WID_O_COND_SLOT:
DoCommandP(this->vehicle->tile, this->vehicle->index + (this->OrderGetSel() << 20), MOF_COND_VALUE | index << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER)); DoCommandP(this->vehicle->tile, this->vehicle->index + (this->OrderGetSel() << 20), MOF_COND_VALUE | index << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER));
break; break;
case WID_O_COND_COUNTER:
DoCommandP(this->vehicle->tile, this->vehicle->index + (this->OrderGetSel() << 20), MOF_COND_VALUE_2 | index << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER));
break;
} }
} }
@@ -2648,6 +2706,8 @@ static const NWidgetPart _nested_orders_train_widgets[] = {
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_COND_AUX), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_COND_AUX),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_O_COND_AUX_CARGO), SetMinimalSize(124, 12), SetFill(1, 0), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_O_COND_AUX_CARGO), SetMinimalSize(124, 12), SetFill(1, 0),
SetDataTip(STR_NULL, STR_ORDER_CONDITIONAL_CARGO_TOOLTIP), SetResize(1, 0), SetDataTip(STR_NULL, STR_ORDER_CONDITIONAL_CARGO_TOOLTIP), SetResize(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_O_COND_COUNTER), SetMinimalSize(124, 12), SetFill(1, 0),
SetDataTip(STR_NULL, STR_ORDER_CONDITIONAL_COUNTER_TOOLTIP), SetResize(1, 0),
EndContainer(), EndContainer(),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_COND_AUX2), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_COND_AUX2),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_COND_AUX_VIA), SetMinimalSize(36, 12), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_COND_AUX_VIA), SetMinimalSize(36, 12),

View File

@@ -145,6 +145,7 @@ enum OrderConditionVariable {
OCV_TRAIN_IN_SLOT, ///< Test if train is in slot OCV_TRAIN_IN_SLOT, ///< Test if train is in slot
OCV_CARGO_LOAD_PERCENTAGE, ///< Skip based on the amount of load of a specific cargo OCV_CARGO_LOAD_PERCENTAGE, ///< Skip based on the amount of load of a specific cargo
OCV_CARGO_WAITING_AMOUNT, ///< Skip based on the amount of a specific cargo waiting at next station OCV_CARGO_WAITING_AMOUNT, ///< Skip based on the amount of a specific cargo waiting at next station
OCV_COUNTER_VALUE, ///< Skip based on counter value
OCV_END OCV_END
}; };

View File

@@ -88,7 +88,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
{ XSLFI_INFRA_SHARING, XSCF_NULL, 2, 2, "infra_sharing", nullptr, nullptr, "CPDP" }, { XSLFI_INFRA_SHARING, XSCF_NULL, 2, 2, "infra_sharing", nullptr, nullptr, "CPDP" },
{ XSLFI_VARIABLE_DAY_LENGTH, XSCF_NULL, 2, 2, "variable_day_length", nullptr, nullptr, nullptr }, { XSLFI_VARIABLE_DAY_LENGTH, XSCF_NULL, 2, 2, "variable_day_length", nullptr, nullptr, nullptr },
{ XSLFI_ORDER_OCCUPANCY, XSCF_NULL, 2, 2, "order_occupancy", nullptr, nullptr, nullptr }, { XSLFI_ORDER_OCCUPANCY, XSCF_NULL, 2, 2, "order_occupancy", nullptr, nullptr, nullptr },
{ XSLFI_MORE_COND_ORDERS, XSCF_NULL, 5, 5, "more_cond_orders", nullptr, nullptr, nullptr }, { XSLFI_MORE_COND_ORDERS, XSCF_NULL, 6, 6, "more_cond_orders", nullptr, nullptr, nullptr },
{ XSLFI_EXTRA_LARGE_MAP, XSCF_NULL, 0, 1, "extra_large_map", nullptr, nullptr, nullptr }, { XSLFI_EXTRA_LARGE_MAP, XSCF_NULL, 0, 1, "extra_large_map", nullptr, nullptr, nullptr },
{ XSLFI_REVERSE_AT_WAYPOINT, XSCF_NULL, 1, 1, "reverse_at_waypoint", nullptr, nullptr, nullptr }, { XSLFI_REVERSE_AT_WAYPOINT, XSCF_NULL, 1, 1, "reverse_at_waypoint", nullptr, nullptr, nullptr },
{ XSLFI_VEH_LIFETIME_PROFIT, XSCF_NULL, 1, 1, "veh_lifetime_profit", nullptr, nullptr, nullptr }, { XSLFI_VEH_LIFETIME_PROFIT, XSCF_NULL, 1, 1, "veh_lifetime_profit", nullptr, nullptr, nullptr },

View File

@@ -2109,8 +2109,22 @@ void TraceRestrictRemoveCounterID(TraceRestrictCounterID index)
} }
} }
bool changed_order = false;
for (Order *o : Order::Iterate()) {
if (o->IsType(OT_CONDITIONAL) &&
(o->GetConditionVariable() == OCV_COUNTER_VALUE) &&
GB(o->GetXData(), 16, 16) == index) {
SB(o->GetXDataRef(), 16, 16, INVALID_TRACE_RESTRICT_COUNTER_ID);
changed_order = true;
}
}
// update windows // update windows
InvalidateWindowClassesData(WC_TRACE_RESTRICT); InvalidateWindowClassesData(WC_TRACE_RESTRICT);
if (changed_order) {
InvalidateWindowClassesData(WC_VEHICLE_ORDERS);
InvalidateWindowClassesData(WC_VEHICLE_TIMETABLE);
}
} }
/** /**

View File

@@ -36,6 +36,7 @@ enum OrderWidgets {
WID_O_COND_CARGO, ///< Choose condition cargo. WID_O_COND_CARGO, ///< Choose condition cargo.
WID_O_COND_AUX_CARGO, ///< Choose condition cargo. WID_O_COND_AUX_CARGO, ///< Choose condition cargo.
WID_O_COND_SLOT, ///< Choose condition slot. WID_O_COND_SLOT, ///< Choose condition slot.
WID_O_COND_COUNTER, ///< Choose condition counter.
WID_O_COND_AUX_VIA, ///< Condition via button. WID_O_COND_AUX_VIA, ///< Condition via button.
WID_O_SEL_COND_VALUE, ///< Widget for conditional value or conditional cargo type. WID_O_SEL_COND_VALUE, ///< Widget for conditional value or conditional cargo type.
WID_O_SEL_COND_AUX, ///< Widget for auxiliary conditional cargo type. WID_O_SEL_COND_AUX, ///< Widget for auxiliary conditional cargo type.