diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index 188d33805a..af5e1a0c77 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -946,6 +946,15 @@ uint StationCargoList::ShiftCargo(Taction action, StationIDStack next, bool incl return max_move - action.MaxMove(); } +uint StationCargoList::AvailableViaCount(StationID next) const +{ + uint count = 0; + for (ConstIterator it = this->packets.lower_bound(next); it != this->packets.end() && it.GetKey() == next; ++it) { + count += (*it)->count; + } + return count; +} + /** * Truncates where each destination loses roughly the same percentage of its * cargo. This is done by randomizing the selection of packets to be removed. diff --git a/src/cargopacket.h b/src/cargopacket.h index 57ba53c7f1..d4eee39b93 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -546,6 +546,8 @@ public: return this->count; } + uint AvailableViaCount(StationID next) const; + /** * Returns sum of cargo reserved for loading onto vehicles. * @return Cargo reserved for loading. diff --git a/src/lang/english.txt b/src/lang/english.txt index 6bafa01f52..e1ff8716b2 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4654,7 +4654,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Switch t STR_ORDERS_LIST_TOOLTIP :{BLACK}Order list - click on an order to highlight it. Ctrl+Click scrolls to the order's destination STR_ORDER_INDEX :{COMMA}:{NBSP} -STR_ORDER_TEXT :{STRING5} {STRING4} {STRING} +STR_ORDER_TEXT :{STRING6} {STRING4} {STRING} STR_ORDERS_END_OF_ORDERS :- - End of Orders - - STR_ORDERS_END_OF_SHARED_ORDERS :- - End of Shared Orders - - @@ -4743,6 +4743,9 @@ STR_ORDER_CONDITIONAL_CARGO_TOOLTIP :{BLACK}The carg STR_ORDER_CONDITIONAL_SLOT_TOOLTIP :{BLACK}The train slot to check the occupancy of STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Enter value to compare against +STR_ORDER_CONDITIONAL_VIA :{BLACK}Via +STR_ORDER_CONDITIONAL_VIA_TOOLTIP :{BLACK}The via station to check the waiting cargo amount for + STR_ORDER_CONDITIONAL_COMPARATOR_ACCEPTS :accepts STR_ORDER_CONDITIONAL_COMPARATOR_DOES_NOT_ACCEPT :does not accept STR_ORDER_CONDITIONAL_COMPARATOR_HAS :has @@ -4872,6 +4875,7 @@ STR_ORDER_CONDITIONAL_IN_INVALID_SLOT :Jump to order { STR_ORDER_CONDITIONAL_TRUE_FALSE :Jump to order {COMMA} when {STRING} {STRING} 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_VIA_DISPLAY :Jump to order {COMMA} when {STRING} at next station via {STATION} {STRING} {CARGO_SHORT} STR_INVALID_ORDER :{RED} (Invalid Order) diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 8ca0888fe9..f2eda18a30 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1609,7 +1609,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 break; case OT_CONDITIONAL: - if (mof != MOF_COND_VARIABLE && mof != MOF_COND_COMPARATOR && mof != MOF_COND_VALUE && mof != MOF_COND_VALUE_2 && mof != MOF_COND_DESTINATION) return CMD_ERROR; + if (mof != MOF_COND_VARIABLE && mof != MOF_COND_COMPARATOR && mof != MOF_COND_VALUE && mof != MOF_COND_VALUE_2 && mof != MOF_COND_VALUE_3 && mof != MOF_COND_DESTINATION) return CMD_ERROR; break; default: @@ -1711,6 +1711,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 break; case OCV_CARGO_WAITING_AMOUNT: + if (data >= (1 << 16)) return CMD_ERROR; break; default: @@ -1731,6 +1732,17 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 } break; + case MOF_COND_VALUE_3: + switch (order->GetConditionVariable()) { + case OCV_CARGO_WAITING_AMOUNT: + if (!(data == NEW_STATION || Station::GetIfValid(data) != nullptr)) return CMD_ERROR; + break; + + default: + return CMD_ERROR; + } + break; + case MOF_COND_DESTINATION: if (data >= v->GetNumOrders()) return CMD_ERROR; break; @@ -1866,10 +1878,13 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 case OCV_SLOT_OCCUPANCY: case OCV_TRAIN_IN_SLOT: case OCV_CARGO_LOAD_PERCENTAGE: - case OCV_CARGO_WAITING_AMOUNT: order->GetXDataRef() = data; break; + case OCV_CARGO_WAITING_AMOUNT: + SB(order->GetXDataRef(), 0, 16, data); + break; + default: order->SetConditionValue(data); break; @@ -1880,6 +1895,10 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 order->SetConditionValue(data); break; + case MOF_COND_VALUE_3: + SB(order->GetXDataRef(), 16, 16, data + 2); + break; + case MOF_COND_DESTINATION: order->SetConditionSkipToOrder(data); break; @@ -2592,7 +2611,13 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v) } case OCV_CARGO_WAITING_AMOUNT: { StationID next_station = GetNextRealStation(v, order); - if (Station::IsValidID(next_station)) skip_order = OrderConditionCompare(occ, Station::Get(next_station)->goods[value].cargo.AvailableCount(), order->GetXData()); + if (Station::IsValidID(next_station)) { + if (GB(order->GetXData(), 16, 16) == 0) { + skip_order = OrderConditionCompare(occ, Station::Get(next_station)->goods[value].cargo.AvailableCount(), GB(order->GetXData(), 0, 16)); + } else { + skip_order = OrderConditionCompare(occ, Station::Get(next_station)->goods[value].cargo.AvailableViaCount(GB(order->GetXData(), 16, 16) - 2), GB(order->GetXData(), 0, 16)); + } + } break; } case OCV_CARGO_ACCEPTANCE: { diff --git a/src/order_gui.cpp b/src/order_gui.cpp index cfbb348f9d..b208d50bfb 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -739,8 +739,8 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int SetDParam(0, order_index + 1); DrawString(left, rtl ? right - 2 * sprite_size.width - 3 : middle, y, STR_ORDER_INDEX, colour, SA_RIGHT | SA_FORCE); - SetDParam(6, STR_EMPTY); - SetDParam(11, STR_EMPTY); + SetDParam(7, STR_EMPTY); + SetDParam(12, STR_EMPTY); /* Check range for aircraft. */ if (v->type == VEH_AIRCRAFT && Aircraft::From(v)->GetRange() > 0 && order->IsGotoOrder()) { @@ -775,8 +775,8 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int SetDParam(3, STR_EMPTY); if (order->GetWaitTime() > 0) { - SetDParam(6, order->IsWaitTimetabled() ? STR_TIMETABLE_STAY_FOR : STR_TIMETABLE_STAY_FOR_ESTIMATED); - SetTimetableParams(7, order->GetWaitTime()); + SetDParam(7, order->IsWaitTimetabled() ? STR_TIMETABLE_STAY_FOR : STR_TIMETABLE_STAY_FOR_ESTIMATED); + SetTimetableParams(8, order->GetWaitTime()); } timetable_wait_time_valid = true; } else { @@ -785,7 +785,7 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int SetDParam(4, order->IsAutoRefit() ? STR_ORDER_AUTO_REFIT_ANY : CargoSpec::Get(order->GetRefitCargo())->name); } if (v->type == VEH_TRAIN && (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) { - SetDParam(6, order->GetStopLocation() + STR_ORDER_STOP_LOCATION_NEAR_END); + SetDParam(7, order->GetStopLocation() + STR_ORDER_STOP_LOCATION_NEAR_END); } } break; @@ -814,22 +814,22 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int } if (!timetable && (order->GetDepotActionType() & ODATFB_SELL)) { - SetDParam(6, STR_ORDER_SELL_ORDER); + SetDParam(7, STR_ORDER_SELL_ORDER); } else { if (!timetable && (order->GetDepotActionType() & ODATFB_HALT)) { - SetDParam(6, STR_ORDER_STOP_ORDER); + SetDParam(7, STR_ORDER_STOP_ORDER); } if (!timetable && order->IsRefit()) { - SetDParam(6, (order->GetDepotActionType() & ODATFB_HALT) ? STR_ORDER_REFIT_STOP_ORDER : STR_ORDER_REFIT_ORDER); - SetDParam(7, CargoSpec::Get(order->GetRefitCargo())->name); + SetDParam(7, (order->GetDepotActionType() & ODATFB_HALT) ? STR_ORDER_REFIT_STOP_ORDER : STR_ORDER_REFIT_ORDER); + SetDParam(8, CargoSpec::Get(order->GetRefitCargo())->name); } } if (timetable) { if (order->GetWaitTime() > 0) { - SetDParam(6, order->IsWaitTimetabled() ? STR_TIMETABLE_STAY_FOR : STR_TIMETABLE_STAY_FOR_ESTIMATED); - SetTimetableParams(7, order->GetWaitTime()); + SetDParam(7, order->IsWaitTimetabled() ? STR_TIMETABLE_STAY_FOR : STR_TIMETABLE_STAY_FOR_ESTIMATED); + SetTimetableParams(8, order->GetWaitTime()); } timetable_wait_time_valid = !(order->GetDepotActionType() & ODATFB_HALT); } @@ -841,8 +841,8 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int SetDParam(0, str); SetDParam(1, order->GetDestination()); if (timetable && order->IsWaitTimetabled()) { - SetDParam(6, STR_TIMETABLE_STAY_FOR); - SetTimetableParams(7, order->GetWaitTime()); + SetDParam(7, STR_TIMETABLE_STAY_FOR); + SetTimetableParams(8, order->GetWaitTime()); timetable_wait_time_valid = true; } break; @@ -885,11 +885,20 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int SetDParam(3, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + order->GetConditionComparator()); SetDParam(4, order->GetXData()); } else if (ocv == OCV_CARGO_WAITING_AMOUNT) { - SetDParam(0, STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT_DISPLAY); - SetDParam(2, CargoSpec::Get(order->GetConditionValue())->name); - SetDParam(3, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + order->GetConditionComparator()); - SetDParam(4, order->GetConditionValue()); - SetDParam(5, order->GetXData()); + if (GB(order->GetXData(), 16, 16) == 0) { + SetDParam(0, STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT_DISPLAY); + SetDParam(2, CargoSpec::Get(order->GetConditionValue())->name); + SetDParam(3, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + order->GetConditionComparator()); + SetDParam(4, order->GetConditionValue()); + SetDParam(5, GB(order->GetXData(), 0, 16)); + } else { + SetDParam(0, STR_ORDER_CONDITIONAL_CARGO_WAITING_AMOUNT_VIA_DISPLAY); + SetDParam(2, CargoSpec::Get(order->GetConditionValue())->name); + SetDParam(3, GB(order->GetXData(), 16, 16) - 2); + SetDParam(4, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + order->GetConditionComparator()); + SetDParam(5, order->GetConditionValue()); + SetDParam(6, GB(order->GetXData(), 0, 16)); + } } else { OrderConditionComparator occ = order->GetConditionComparator(); bool is_cargo = ocv == OCV_CARGO_ACCEPTANCE || ocv == OCV_CARGO_WAITING; @@ -920,10 +929,10 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int } if (timetable && order->GetWaitTime() > 0) { - SetDParam(6, order->IsWaitTimetabled() ? STR_TIMETABLE_AND_TRAVEL_FOR : STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED); - SetTimetableParams(7, order->GetWaitTime()); + SetDParam(7, order->IsWaitTimetabled() ? STR_TIMETABLE_AND_TRAVEL_FOR : STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED); + SetTimetableParams(8, order->GetWaitTime()); } else { - SetDParam(6, STR_EMPTY); + SetDParam(7, STR_EMPTY); } break; @@ -1097,6 +1106,7 @@ private: OPOS_GOTO, OPOS_CONDITIONAL, OPOS_SHARE, + OPOS_COND_VIA, OPOS_END, }; @@ -1131,6 +1141,9 @@ private: /* WID_O_SEL_COND_AUX */ DP_COND_AUX_CARGO = 0, ///< Display dropdown widget cargo types + /* WID_O_SEL_COND_AUX2 */ + DP_COND_AUX2_VIA = 0, ///< Display via button + DP_ROW_CONDITIONAL = 2, ///< Display the conditional order buttons in the top row of the ship/airplane order window. /* WID_O_SEL_BOTTOM_MIDDLE */ @@ -1151,6 +1164,7 @@ private: bool can_do_autorefit; ///< Vehicle chain can be auto-refitted. int query_text_widget; ///< widget which most recently called ShowQueryString int current_aux_plane; + int current_aux2_plane; /** * Return the memorised selected order. @@ -1222,10 +1236,12 @@ private: HT_RECT | HT_VEHICLE, // OPOS_GOTO HT_NONE, // OPOS_CONDITIONAL HT_VEHICLE, // OPOS_SHARE + HT_RECT, // OPOS_COND_VIA }; SetObjectToPlaceWnd(ANIMCURSOR_PICKSTATION, PAL_NONE, goto_place_style[type - 1], this); this->goto_type = type; this->SetWidgetDirty(WID_O_GOTO); + this->SetWidgetDirty(WID_O_COND_AUX_VIA); } /** @@ -1445,8 +1461,10 @@ public: if (v->owner == _local_company) { this->GetWidget(WID_O_SEL_OCCUPANCY)->SetDisplayedPlane(SZSP_NONE); this->GetWidget(WID_O_SEL_COND_AUX)->SetDisplayedPlane(SZSP_NONE); + this->GetWidget(WID_O_SEL_COND_AUX2)->SetDisplayedPlane(SZSP_NONE); } this->current_aux_plane = SZSP_NONE; + this->current_aux2_plane = SZSP_NONE; this->FinishInitNested(v->index); if (v->owner == _local_company) { this->DisableWidget(WID_O_EMPTY); @@ -1661,12 +1679,17 @@ public: assert(row_sel != nullptr || (train_row_sel != nullptr && left_sel != nullptr && middle_sel != nullptr && right_sel != nullptr)); NWidgetStacked *aux_sel = this->GetWidget(WID_O_SEL_COND_AUX); + NWidgetStacked *aux2_sel = this->GetWidget(WID_O_SEL_COND_AUX2); auto aux_plane_guard = scope_guard([&]() { if (this->current_aux_plane != aux_sel->shown_plane) { this->current_aux_plane = aux_sel->shown_plane; this->ReInit(); } + if (this->current_aux2_plane != aux2_sel->shown_plane) { + this->current_aux2_plane = aux2_sel->shown_plane; + this->ReInit(); + } }); if (order == nullptr) { @@ -1785,6 +1808,12 @@ public: aux_sel->SetDisplayedPlane(SZSP_NONE); } + if (ocv == OCV_CARGO_WAITING_AMOUNT) { + aux2_sel->SetDisplayedPlane(DP_COND_AUX2_VIA); + } else { + aux2_sel->SetDisplayedPlane(SZSP_NONE); + } + /* Set the strings for the dropdown boxes. */ this->GetWidget(WID_O_COND_VARIABLE)->widget_data = STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + ocv; this->GetWidget(WID_O_COND_COMPARATOR)->widget_data = GetComparatorStrings(order)[order->GetConditionComparator()]; @@ -1825,7 +1854,8 @@ public: if (this->vehicle->owner != _local_company) { this->selected_order = -1; // Disable selection any selected row at a competitor order window. } else { - this->SetWidgetLoweredState(WID_O_GOTO, this->goto_type != OPOS_NONE); + this->SetWidgetLoweredState(WID_O_GOTO, this->goto_type != OPOS_NONE && this->goto_type != OPOS_COND_VIA); + this->SetWidgetLoweredState(WID_O_COND_AUX_VIA, this->goto_type == OPOS_COND_VIA); } this->DrawWidgets(); } @@ -1931,8 +1961,20 @@ public: const Order *order = this->vehicle->GetOrder(sel); if (order != nullptr && order->IsType(OT_CONDITIONAL)) { - OrderConditionVariable ocv = order->GetConditionVariable(); - uint value = (ocv == OCV_CARGO_LOAD_PERCENTAGE || ocv == OCV_CARGO_WAITING_AMOUNT) ? order->GetXData() : order->GetConditionValue(); + uint value; + switch (order->GetConditionVariable()) { + case OCV_CARGO_LOAD_PERCENTAGE: + value = order->GetXData(); + break; + + case OCV_CARGO_WAITING_AMOUNT: + value = GB(order->GetXData(), 0, 16); + break; + + default: + value = order->GetConditionValue(); + break; + } if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value); if (order->GetConditionVariable() == OCV_CARGO_WAITING_AMOUNT) value = ConvertCargoQuantityToDisplayQuantity(order->GetConditionValue(), value); SetDParam(0, value); @@ -2064,6 +2106,7 @@ public: this->OrderClick_Goto(OPOS_GOTO); } } else { + if (this->goto_type == OPOS_COND_VIA) ResetObjectToPlace(); int sel; switch (this->goto_type) { case OPOS_NONE: sel = -1; break; @@ -2144,6 +2187,17 @@ public: break; } + case WID_O_COND_AUX_VIA: { + if (this->goto_type != OPOS_NONE) { + ResetObjectToPlace(); + } else if (GB(this->vehicle->GetOrder(this->OrderGetSel())->GetXData(), 16, 16) != 0) { + DoCommandP(this->vehicle->tile, this->vehicle->index + (this->OrderGetSel() << 20), MOF_COND_VALUE_3 | NEW_STATION << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER)); + } else { + this->OrderClick_Goto(OPOS_COND_VIA); + } + break; + } + case WID_O_TIMETABLE_VIEW: ShowTimetableWindow(this->vehicle); break; @@ -2176,8 +2230,20 @@ public: case WID_O_COND_VALUE: { const Order *order = this->vehicle->GetOrder(this->OrderGetSel()); - OrderConditionVariable ocv = order->GetConditionVariable(); - uint value = (ocv == OCV_CARGO_LOAD_PERCENTAGE || ocv == OCV_CARGO_WAITING_AMOUNT) ? order->GetXData() : order->GetConditionValue(); + uint value; + switch (order->GetConditionVariable()) { + case OCV_CARGO_LOAD_PERCENTAGE: + value = order->GetXData(); + break; + + case OCV_CARGO_WAITING_AMOUNT: + value = GB(order->GetXData(), 0, 16); + break; + + default: + value = order->GetConditionValue(); + break; + } if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value); if (order->GetConditionVariable() == OCV_CARGO_WAITING_AMOUNT) value = ConvertCargoQuantityToDisplayQuantity(order->GetConditionValue(), value); this->query_text_widget = widget; @@ -2356,6 +2422,22 @@ public: /* With quick goto the Go To button stays active */ if (!_settings_client.gui.quick_goto) ResetObjectToPlace(); } + } else if (this->goto_type == OPOS_COND_VIA) { + if (IsTileType(tile, MP_STATION) || IsTileType(tile, MP_INDUSTRY)) { + const Station *st = nullptr; + + if (IsTileType(tile, MP_STATION)) { + st = Station::GetByTile(tile); + } else { + const Industry *in = Industry::GetByTile(tile); + st = in->neutral_station; + } + if (st != nullptr && IsInfraUsageAllowed(this->vehicle->type, this->vehicle->owner, st->owner)) { + if (DoCommandP(this->vehicle->tile, this->vehicle->index + (this->OrderGetSel() << 20), MOF_COND_VALUE_3 | st->index << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER))) { + ResetObjectToPlace(); + } + } + } } } @@ -2381,6 +2463,7 @@ public: { this->goto_type = OPOS_NONE; this->SetWidgetDirty(WID_O_GOTO); + this->SetWidgetDirty(WID_O_COND_AUX_VIA); /* Remove drag highlighting if it exists. */ if (this->order_over != INVALID_VEH_ORDER_ID) { @@ -2508,6 +2591,10 @@ static const NWidgetPart _nested_orders_train_widgets[] = { 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), EndContainer(), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_COND_AUX2), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_COND_AUX_VIA), SetMinimalSize(36, 12), + SetDataTip(STR_ORDER_CONDITIONAL_VIA, STR_ORDER_CONDITIONAL_VIA_TOOLTIP), + EndContainer(), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_O_COND_COMPARATOR), SetMinimalSize(124, 12), SetFill(1, 0), SetDataTip(STR_NULL, STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP), SetResize(1, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_COND_VALUE), @@ -2600,6 +2687,10 @@ static const NWidgetPart _nested_orders_widgets[] = { 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), EndContainer(), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_COND_AUX2), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_O_COND_AUX_VIA), SetMinimalSize(36, 12), + SetDataTip(STR_ORDER_CONDITIONAL_VIA, STR_ORDER_CONDITIONAL_VIA_TOOLTIP), + EndContainer(), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_O_COND_COMPARATOR), SetMinimalSize(124, 12), SetFill(1, 0), SetDataTip(STR_NULL, STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP), SetResize(1, 0), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_COND_VALUE), diff --git a/src/order_type.h b/src/order_type.h index 61ff8a8888..33ad984d86 100644 --- a/src/order_type.h +++ b/src/order_type.h @@ -177,6 +177,7 @@ enum ModifyOrderFlags { MOF_COND_COMPARATOR, ///< A comparator changes. MOF_COND_VALUE, ///< The value to set the condition to. MOF_COND_VALUE_2, ///< The secondary value to set the condition to. + MOF_COND_VALUE_3, ///< The tertiary value to set the condition to. MOF_COND_DESTINATION,///< Change the destination of a conditional order. MOF_WAYPOINT_FLAGS, ///< Change the waypoint flags MOF_CARGO_TYPE_UNLOAD, ///< Passes an OrderUnloadType and a CargoID. diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 97491f9e18..67d0902d9b 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -77,7 +77,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { 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_ORDER_OCCUPANCY, XSCF_NULL, 2, 2, "order_occupancy", nullptr, nullptr, nullptr }, - { XSLFI_MORE_COND_ORDERS, XSCF_NULL, 3, 3, "more_cond_orders", nullptr, nullptr, nullptr }, + { XSLFI_MORE_COND_ORDERS, XSCF_NULL, 4, 4, "more_cond_orders", 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_VEH_LIFETIME_PROFIT, XSCF_NULL, 1, 1, "veh_lifetime_profit", nullptr, nullptr, nullptr }, diff --git a/src/widgets/order_widget.h b/src/widgets/order_widget.h index d5a6936fd6..6e0e76ca56 100644 --- a/src/widgets/order_widget.h +++ b/src/widgets/order_widget.h @@ -36,8 +36,10 @@ enum OrderWidgets { WID_O_COND_CARGO, ///< Choose condition cargo. WID_O_COND_AUX_CARGO, ///< Choose condition cargo. WID_O_COND_SLOT, ///< Choose condition slot. + 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_AUX, ///< Widget for auxiliary conditional cargo type. + WID_O_SEL_COND_AUX2, ///< Widget for auxiliary conditional via button. WID_O_SEL_TOP_LEFT, ///< #NWID_SELECTION widget for left part of the top row of the 'your train' order window. WID_O_SEL_TOP_MIDDLE, ///< #NWID_SELECTION widget for middle part of the top row of the 'your train' order window. WID_O_SEL_TOP_RIGHT, ///< #NWID_SELECTION widget for right part of the top row of the 'your train' order window.