# HG changeset patch # User michi_cc # Date 1320367139 0 # Node ID 0a32df94b00f2c76ff04b3b543d8f40fd69b281f # Parent 3d13872c47b7d1d9c4cfba876955082c67699da2 (svn r23089) -Add: Allow specifying refits for go-to station orders. diff --git a/src/lang/english.txt b/src/lang/english.txt --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3190,6 +3190,10 @@ STR_ORDER_REFIT :{BLACK}Refit STR_ORDER_REFIT_TOOLTIP :{BLACK}Select what cargo type to refit to in this order. Ctrl+Click to remove refit instruction +STR_ORDER_REFIT_AUTO :{BLACK}Auto-refit +STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Select what cargo type to auto-refit to in this order. Ctrl+Click to remove refit instruction. Auto-refitting will only be done if the vehicle allows it +STR_ORDER_DROP_REFIT_AUTO :Fixed cargo +STR_ORDER_DROP_REFIT_AUTO_ANY :Available cargo STR_ORDER_SERVICE :{BLACK}Service STR_ORDER_DROP_GO_ALWAYS_DEPOT :Always go @@ -3279,6 +3283,21 @@ STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(No unloading and wait for any full load) STR_ORDER_NO_UNLOAD_NO_LOAD :(No unloading and no loading) +STR_ORDER_AUTO_REFIT :(Auto-refit to {STRING}) +STR_ORDER_FULL_LOAD_REFIT :(Full load with auto-refit to {STRING}) +STR_ORDER_FULL_LOAD_ANY_REFIT :(Full load any cargo with auto-refit to {STRING}) +STR_ORDER_UNLOAD_REFIT :(Unload and take cargo with auto-refit to {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Unload and wait for full load with auto-refit to {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Unload and wait for any full load with auto-refit to {STRING}) +STR_ORDER_TRANSFER_REFIT :(Transfer and take cargo with auto-refit to {STRING}) +STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transfer and wait for full load with auto-refit to {STRING}) +STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transfer and wait for any full load with auto-refit to {STRING}) +STR_ORDER_NO_UNLOAD_REFIT :(No unloading and take cargo with auto-refit to {STRING}) +STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(No unloading and wait for full load with auto-refit to {STRING}) +STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(No unloading and wait for any full load with auto-refit to {STRING}) + +STR_ORDER_AUTO_REFIT_ANY :available cargo + STR_ORDER_STOP_LOCATION_NEAR_END :[near end] STR_ORDER_STOP_LOCATION_MIDDLE :[middle] STR_ORDER_STOP_LOCATION_FAR_END :[far end] diff --git a/src/order_gui.cpp b/src/order_gui.cpp --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -48,6 +48,7 @@ ORDER_WIDGET_REFIT, ORDER_WIDGET_SERVICE, ORDER_WIDGET_EMPTY, + ORDER_WIDGET_REFIT_DROPDOWN, ORDER_WIDGET_COND_VARIABLE, ORDER_WIDGET_COND_COMPARATOR, ORDER_WIDGET_COND_VALUE, @@ -61,37 +62,73 @@ }; /** Order load types that could be given to station orders. */ -static const StringID _station_load_types[][5] = { +static const StringID _station_load_types[][5][5] = { { - STR_EMPTY, - INVALID_STRING_ID, - STR_ORDER_FULL_LOAD, - STR_ORDER_FULL_LOAD_ANY, - STR_ORDER_NO_LOAD, - }, { - STR_ORDER_UNLOAD, - INVALID_STRING_ID, - STR_ORDER_UNLOAD_FULL_LOAD, - STR_ORDER_UNLOAD_FULL_LOAD_ANY, - STR_ORDER_UNLOAD_NO_LOAD, + /* No refitting. */ + { + STR_EMPTY, + INVALID_STRING_ID, + STR_ORDER_FULL_LOAD, + STR_ORDER_FULL_LOAD_ANY, + STR_ORDER_NO_LOAD, + }, { + STR_ORDER_UNLOAD, + INVALID_STRING_ID, + STR_ORDER_UNLOAD_FULL_LOAD, + STR_ORDER_UNLOAD_FULL_LOAD_ANY, + STR_ORDER_UNLOAD_NO_LOAD, + }, { + STR_ORDER_TRANSFER, + INVALID_STRING_ID, + STR_ORDER_TRANSFER_FULL_LOAD, + STR_ORDER_TRANSFER_FULL_LOAD_ANY, + STR_ORDER_TRANSFER_NO_LOAD, + }, { + /* Unload and transfer do not work together. */ + INVALID_STRING_ID, + INVALID_STRING_ID, + INVALID_STRING_ID, + INVALID_STRING_ID, + }, { + STR_ORDER_NO_UNLOAD, + INVALID_STRING_ID, + STR_ORDER_NO_UNLOAD_FULL_LOAD, + STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY, + STR_ORDER_NO_UNLOAD_NO_LOAD, + } }, { - STR_ORDER_TRANSFER, - INVALID_STRING_ID, - STR_ORDER_TRANSFER_FULL_LOAD, - STR_ORDER_TRANSFER_FULL_LOAD_ANY, - STR_ORDER_TRANSFER_NO_LOAD, - }, { - /* Unload and transfer do not work together. */ - INVALID_STRING_ID, - INVALID_STRING_ID, - INVALID_STRING_ID, - INVALID_STRING_ID, - }, { - STR_ORDER_NO_UNLOAD, - INVALID_STRING_ID, - STR_ORDER_NO_UNLOAD_FULL_LOAD, - STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY, - STR_ORDER_NO_UNLOAD_NO_LOAD, + /* With auto-refitting. No loading and auto-refitting do not work together. */ + { + STR_ORDER_AUTO_REFIT, + INVALID_STRING_ID, + STR_ORDER_FULL_LOAD_REFIT, + STR_ORDER_FULL_LOAD_ANY_REFIT, + INVALID_STRING_ID, + }, { + STR_ORDER_UNLOAD_REFIT, + INVALID_STRING_ID, + STR_ORDER_UNLOAD_FULL_LOAD_REFIT, + STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT, + INVALID_STRING_ID, + }, { + STR_ORDER_TRANSFER_REFIT, + INVALID_STRING_ID, + STR_ORDER_TRANSFER_FULL_LOAD_REFIT, + STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT, + INVALID_STRING_ID, + }, { + /* Unload and transfer do not work together. */ + INVALID_STRING_ID, + INVALID_STRING_ID, + INVALID_STRING_ID, + INVALID_STRING_ID, + }, { + STR_ORDER_NO_UNLOAD_REFIT, + INVALID_STRING_ID, + STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT, + STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT, + INVALID_STRING_ID, + } } }; @@ -181,6 +218,12 @@ } } +static const StringID _order_refit_action_dropdown[] = { + STR_ORDER_DROP_REFIT_AUTO, + STR_ORDER_DROP_REFIT_AUTO_ANY, + INVALID_STRING_ID +}; + /** * Draws an order in order or timetable GUI * @param v Vehicle the order belongs to @@ -247,7 +290,10 @@ SetTimetableParams(6, 7, order->wait_time); } } else { - SetDParam(3, (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) ? STR_EMPTY : _station_load_types[unload][load]); + SetDParam(3, (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) ? STR_EMPTY : _station_load_types[order->IsRefit()][unload][load]); + if (order->IsRefit()) { + 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(5, order->GetStopLocation() + STR_ORDER_STOP_LOCATION_NEAR_END); } @@ -423,7 +469,7 @@ * The top-row buttons of one of your trains or road vehicles is one of the following three cases: * \verbatim * +-----------------+-----------------+-----------------+-----------------+ - * | NON-STOP | FULL_LOAD | UNLOAD | (empty) | (normal) + * | NON-STOP | FULL_LOAD | UNLOAD | REFIT | (normal) * +-----------------+-----+-----------+-----------+-----+-----------------+ * | COND_VAR | COND_COMPARATOR | COND_VALUE | (for conditional orders) * +-----------------+-----+-----------+-----------+-----+-----------------+ @@ -433,9 +479,9 @@ * * Airplanes and ships have one of the following three top-row button rows: * \verbatim - * +--------------------------+--------------------------+ - * | FULL_LOAD | UNLOAD | (normal) - * +-----------------+--------+--------+-----------------+ + * +-----------------+-----------------+-----------------+ + * | FULL_LOAD | UNLOAD | REFIT | (normal) + * +-----------------+-----------------+-----------------+ * | COND_VAR | COND_COMPARATOR | COND_VALUE | (for conditional orders) * +-----------------+--------+--------+-----------------+ * | REFIT | SERVICE | (for depot order) @@ -477,9 +523,10 @@ /* ORDER_WIDGET_SEL_TOP_RIGHT */ DP_RIGHT_EMPTY = 0, ///< Display an empty panel in the right button of the top row of the train/rv order window. + DP_RIGHT_REFIT = 1, ///< Display 'refit' in the right button of the top row of the train/rv order window. /* ORDER_WIDGET_SEL_TOP_ROW */ - DP_ROW_LOAD = 0, ///< Display 'load' / 'unload' buttons in the top row of the ship/airplane order window. + DP_ROW_LOAD = 0, ///< Display 'load' / 'unload' / 'refit' buttons in the top row of the ship/airplane order window. DP_ROW_DEPOT = 1, ///< Display 'refit' / 'service' buttons in the top row of the ship/airplane order window. DP_ROW_CONDITIONAL = 2, ///< Display the conditional order buttons in the top row of the ship/airplane order window. @@ -493,6 +540,7 @@ OrderPlaceObjectState goto_type; const Vehicle *vehicle; ///< Vehicle owning the orders being displayed and manipulated. Scrollbar *vscroll; + bool can_do_autorefit; ///< Vehicle chain can be auto-refitted. /** * Return the memorised selected order. @@ -740,15 +788,29 @@ /** * Handle the click on the refit button. * If ctrl is pressed, cancel refitting, else show the refit window. - * @param i Dummy parameter. + * @param i Selected refit command. + * @param auto_refit Select refit for auto-refitting. */ - void OrderClick_Refit(int i) + void OrderClick_Refit(int i, bool auto_refit) { if (_ctrl_pressed) { /* Cancel refitting */ DoCommandP(this->vehicle->tile, this->vehicle->index, (this->OrderGetSel() << 16) | (CT_NO_REFIT << 8) | CT_NO_REFIT, CMD_ORDER_REFIT); } else { - ShowVehicleRefitWindow(this->vehicle, this->OrderGetSel(), this); + if (i == 1) { // Auto-refit to available cargo type. + DoCommandP(this->vehicle->tile, this->vehicle->index, (this->OrderGetSel() << 16) | CT_AUTO_REFIT, CMD_ORDER_REFIT); + } else { + ShowVehicleRefitWindow(this->vehicle, this->OrderGetSel(), this, auto_refit); + } + } + } + + /** Cache auto-refittability of the vehicle chain. */ + void UpdateAutoRefitState() + { + this->can_do_autorefit = false; + for (const Vehicle *w = this->vehicle; w != NULL; w = w->Next()) { + if (HasBit(Engine::Get(w->engine_type)->info.misc_flags, EF_AUTO_REFIT)) this->can_do_autorefit = true; } } @@ -766,6 +828,8 @@ this->order_over = INVALID_VEH_ORDER_ID; this->owner = v->owner; + this->UpdateAutoRefitState(); + if (_settings_client.gui.quick_goto && v->owner == _local_company) { /* If there are less than 2 station, make Go To active. */ int station_orders = 0; @@ -825,6 +889,7 @@ case -666: /* Autoreplace replaced the vehicle */ this->vehicle = Vehicle::Get(this->window_number); + this->UpdateAutoRefitState(); break; case -1: @@ -945,6 +1010,7 @@ } this->DisableWidget(ORDER_WIDGET_FULL_LOAD); this->DisableWidget(ORDER_WIDGET_UNLOAD); + this->DisableWidget(ORDER_WIDGET_REFIT_DROPDOWN); } else { this->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0); // full load this->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD, (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0); // unload @@ -957,12 +1023,16 @@ train_row_sel->SetDisplayedPlane(DP_GROUNDVEHICLE_ROW_NORMAL); left_sel->SetDisplayedPlane(DP_LEFT_LOAD); middle_sel->SetDisplayedPlane(DP_MIDDLE_UNLOAD); - right_sel->SetDisplayedPlane(DP_RIGHT_EMPTY); + right_sel->SetDisplayedPlane(DP_RIGHT_REFIT); this->EnableWidget(ORDER_WIDGET_NON_STOP); this->SetWidgetLoweredState(ORDER_WIDGET_NON_STOP, order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); } this->SetWidgetLoweredState(ORDER_WIDGET_FULL_LOAD, order->GetLoadType() == OLF_FULL_LOAD_ANY); this->SetWidgetLoweredState(ORDER_WIDGET_UNLOAD, order->GetUnloadType() == OUFB_UNLOAD); + + /* Can only do refitting when stopping at the destination and loading cargo. */ + this->SetWidgetDisabledState(ORDER_WIDGET_REFIT_DROPDOWN, !this->can_do_autorefit || order->GetLoadType() == OLFB_NO_LOAD || order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION); + break; case OT_GOTO_WAYPOINT: @@ -978,6 +1048,7 @@ } this->DisableWidget(ORDER_WIDGET_FULL_LOAD); this->DisableWidget(ORDER_WIDGET_UNLOAD); + this->DisableWidget(ORDER_WIDGET_REFIT_DROPDOWN); break; case OT_GOTO_DEPOT: @@ -1024,6 +1095,7 @@ } this->DisableWidget(ORDER_WIDGET_FULL_LOAD); this->DisableWidget(ORDER_WIDGET_UNLOAD); + this->DisableWidget(ORDER_WIDGET_REFIT_DROPDOWN); break; } } @@ -1220,7 +1292,7 @@ break; case ORDER_WIDGET_REFIT: - this->OrderClick_Refit(0); + this->OrderClick_Refit(0, false); break; case ORDER_WIDGET_SERVICE: @@ -1231,6 +1303,14 @@ } break; + case ORDER_WIDGET_REFIT_DROPDOWN: + if (this->GetWidget(widget)->ButtonHit(pt)) { + this->OrderClick_Refit(0, true); + } else { + ShowDropDownMenu(this, _order_refit_action_dropdown, 0, ORDER_WIDGET_REFIT_DROPDOWN, 0, 0); + } + break; + case ORDER_WIDGET_TIMETABLE_VIEW: ShowTimetableWindow(this->vehicle); break; @@ -1317,6 +1397,10 @@ this->OrderClick_Service(index); break; + case ORDER_WIDGET_REFIT_DROPDOWN: + this->OrderClick_Refit(index, true); + break; + case ORDER_WIDGET_COND_VARIABLE: DoCommandP(this->vehicle->tile, this->vehicle->index + (this->OrderGetSel() << 20), MOF_COND_VARIABLE | index << 4, CMD_MODIFY_ORDER | CMD_MSG(STR_ERROR_CAN_T_MODIFY_THIS_ORDER)); break; @@ -1505,6 +1589,8 @@ NWidget(NWID_SELECTION, INVALID_COLOUR, ORDER_WIDGET_SEL_TOP_RIGHT), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, ORDER_WIDGET_EMPTY), SetMinimalSize(93, 12), SetFill(1, 0), SetDataTip(STR_ORDER_REFIT, STR_ORDER_REFIT_TOOLTIP), SetResize(1, 0), + NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_REFIT_DROPDOWN), SetMinimalSize(93, 12), SetFill(1, 0), + SetDataTip(STR_ORDER_REFIT_AUTO, STR_ORDER_REFIT_AUTO_TOOLTIP), SetResize(1, 0), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), @@ -1561,12 +1647,14 @@ /* First button row. */ NWidget(NWID_HORIZONTAL), NWidget(NWID_SELECTION, INVALID_COLOUR, ORDER_WIDGET_SEL_TOP_ROW), - /* load + unload buttons. */ - NWidget(NWID_HORIZONTAL), - NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_FULL_LOAD), SetMinimalSize(186, 12), SetFill(1, 0), + /* Load + unload + refit buttons. */ + NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), + NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_FULL_LOAD), SetMinimalSize(124, 12), SetFill(1, 0), SetDataTip(STR_ORDER_TOGGLE_FULL_LOAD, STR_ORDER_TOOLTIP_FULL_LOAD), SetResize(1, 0), - NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_UNLOAD), SetMinimalSize(186, 12), SetFill(1, 0), + NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_UNLOAD), SetMinimalSize(124, 12), SetFill(1, 0), SetDataTip(STR_ORDER_TOGGLE_UNLOAD, STR_ORDER_TOOLTIP_UNLOAD), SetResize(1, 0), + NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, ORDER_WIDGET_REFIT_DROPDOWN), SetMinimalSize(124, 12), SetFill(1, 0), + SetDataTip(STR_ORDER_REFIT_AUTO, STR_ORDER_REFIT_AUTO_TOOLTIP), SetResize(1, 0), EndContainer(), /* Refit + service buttons. */ NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -371,6 +371,7 @@ int click_x; ///< Position of the first click while dragging. VehicleID selected_vehicle; ///< First vehicle in the current selection. uint8 num_vehicles; ///< Number of selected vehicles. + bool auto_refit; ///< Select cargo for auto-refitting. /** * Collects all (cargo, subcargo) refit options of a vehicle chain. @@ -392,6 +393,8 @@ /* Skip this engine if it does not carry anything */ if (!e->CanCarryCargo()) continue; + /* Skip this engine if we build the list for auto-refitting and engine doesn't allow it. */ + if (this->auto_refit && !HasBit(e->info.misc_flags, EF_AUTO_REFIT)) continue; /* Loop through all cargos in the refit mask */ int current_index = 0; @@ -479,9 +482,10 @@ return NULL; } - RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order) : Window() + RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order, bool auto_refit) : Window() { this->sel = -1; + this->auto_refit = auto_refit; this->CreateNestedTree(desc); this->vscroll = this->GetScrollbar(VRW_SCROLLBAR); @@ -587,7 +591,7 @@ { assert(_current_company == _local_company); Vehicle *v = Vehicle::Get(this->window_number); - CommandCost cost = DoCommand(v->tile, this->selected_vehicle, option->cargo | option->subtype << 8 | + CommandCost cost = DoCommand(v->tile, this->selected_vehicle, option->cargo | (int)this->auto_refit << 6 | option->subtype << 8 | this->num_vehicles << 16, DC_QUERY_COST, GetCmdRefitVeh(v->type)); if (cost.Failed()) return INVALID_STRING_ID; @@ -910,11 +914,12 @@ * @param *v The vehicle to show the refit window for * @param order of the vehicle ( ? ) * @param parent the parent window of the refit window + * @param auto_refit Choose cargo for auto-refitting */ -void ShowVehicleRefitWindow(const Vehicle *v, VehicleOrderID order, Window *parent) +void ShowVehicleRefitWindow(const Vehicle *v, VehicleOrderID order, Window *parent, bool auto_refit) { DeleteWindowById(WC_VEHICLE_REFIT, v->index); - RefitWindow *w = new RefitWindow(&_vehicle_refit_desc, v, order); + RefitWindow *w = new RefitWindow(&_vehicle_refit_desc, v, order, auto_refit); w->parent = parent; } diff --git a/src/vehicle_gui.h b/src/vehicle_gui.h --- a/src/vehicle_gui.h +++ b/src/vehicle_gui.h @@ -19,7 +19,7 @@ #include "engine_type.h" #include "company_type.h" -void ShowVehicleRefitWindow(const Vehicle *v, VehicleOrderID order, Window *parent); +void ShowVehicleRefitWindow(const Vehicle *v, VehicleOrderID order, Window *parent, bool auto_refit = false); /** Constants of vehicle view widget indices */ enum VehicleViewWindowWidgets {