diff --git a/src/command.cpp b/src/command.cpp index 97961cd4e3..5ce6b7984e 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -216,6 +216,7 @@ CommandProc CmdSetGroupReplaceProtection; CommandProc CmdMoveOrder; CommandProc CmdChangeTimetable; +CommandProc CmdBulkChangeTimetable; CommandProc CmdSetVehicleOnTime; CommandProc CmdAutofillTimetable; CommandProc CmdAutomateTimetable; @@ -411,6 +412,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdSetGroupReplaceProtection, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SET_GROUP_REPLACE_PROTECTION DEF_CMD(CmdMoveOrder, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_MOVE_ORDER DEF_CMD(CmdChangeTimetable, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_CHANGE_TIMETABLE + DEF_CMD(CmdBulkChangeTimetable, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_BULK_CHANGE_TIMETABLE DEF_CMD(CmdSetVehicleOnTime, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SET_VEHICLE_ON_TIME DEF_CMD(CmdAutofillTimetable, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_AUTOFILL_TIMETABLE DEF_CMD(CmdAutomateTimetable, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_AUTOMATE_TIMETABLE diff --git a/src/command_type.h b/src/command_type.h index 842248f4b5..dd626cd49d 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -359,6 +359,7 @@ enum Commands { CMD_MOVE_ORDER, ///< move an order CMD_CHANGE_TIMETABLE, ///< change the timetable for a vehicle + CMD_BULK_CHANGE_TIMETABLE, ///< change the timetable for all orders of a vehicle CMD_SET_VEHICLE_ON_TIME, ///< set the vehicle on time feature (timetable) CMD_AUTOFILL_TIMETABLE, ///< autofill the timetable CMD_AUTOMATE_TIMETABLE, ///< automate the timetable diff --git a/src/lang/english.txt b/src/lang/english.txt index ec6e8629f4..b7623b9d93 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4451,7 +4451,7 @@ STR_TIMETABLE_STARTING_DATE :{BLACK}Start da STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Select a date as starting point of this timetable. Ctrl+Click sets the starting point of this timetable and distributes all vehicles sharing this order evenly based on their relative order, if the order is completely timetabled STR_TIMETABLE_CHANGE_TIME :{BLACK}Change Time -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Change the amount of time that the highlighted order should take (Ctrl+Click sets waiting time for all orders) STR_TIMETABLE_CLEAR_TIME :{BLACK}Clear Time STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Clear the amount of time for the highlighted order diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index c20407a3e1..d70a7a55b9 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -195,6 +195,50 @@ CommandCost CmdChangeTimetable(TileIndex tile, DoCommandFlag flags, uint32 p1, u return CommandCost(); } +/** + * Change timetable data of all orders of a vehicle. + * @param tile Not used. + * @param flags Operation to perform. + * @param p1 Various bitstuffed elements + * - p1 = (bit 0-19) - Vehicle with the orders to change. + * - p1 = (bit 20-27) - unused + * - p1 = (bit 28-29) - Timetable data to change (@see ModifyTimetableFlags) + * - p1 = (bit 30) - 0 to set timetable wait/travel time, 1 to clear it + * @param p2 The amount of time to wait. + * - p2 = (bit 0-15) - The data to modify as specified by p1 bits 28-29. + * 0 to clear times, UINT16_MAX to clear speed limit. + * @param text unused + * @return the cost of this operation or an error + */ +CommandCost CmdBulkChangeTimetable(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + VehicleID veh = GB(p1, 0, 20); + + Vehicle *v = Vehicle::GetIfValid(veh); + if (v == NULL || !v->IsPrimaryVehicle()) return CMD_ERROR; + + CommandCost ret = CheckOwnership(v->owner); + if (ret.Failed()) return ret; + + ModifyTimetableFlags mtf = Extract(p1); + if (mtf >= MTF_END) return CMD_ERROR; + + if (v->GetNumOrders() == 0) return CMD_ERROR; + + if (flags & DC_EXEC) { + for (VehicleOrderID order_number = 0; order_number < v->GetNumOrders(); order_number++) { + Order *order = v->GetOrder(order_number); + if (order == NULL || order->IsType(OT_IMPLICIT)) continue; + + uint32 new_p1 = p1; + SB(new_p1, 20, 8, order_number); + DoCommand(tile, new_p1, p2, flags, CMD_CHANGE_TIMETABLE); + } + } + + return CommandCost(); +} + /** * Clear the lateness counter to make the vehicle on time. * @param tile Not used. diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index c9b05f2b05..cb33c47aee 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -170,6 +170,7 @@ struct TimetableWindow : Window { Scrollbar *vscroll; bool query_is_speed_query; ///< The currently open query window is a speed query and not a time query. bool set_start_date_all; ///< Set start date using minutes text entry: this is a set all vehicle (ctrl-click) action + bool set_wait_time_all; ///< Set wait time for all timetable entries (ctrl-click) action TimetableWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc), @@ -601,6 +602,7 @@ struct TimetableWindow : Window { } this->query_is_speed_query = false; + this->set_wait_time_all = (order != NULL) && (selected % 2 == 0) && _ctrl_pressed; ShowQueryString(current, STR_TIMETABLE_CHANGE_TIME, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED); break; } @@ -691,7 +693,7 @@ struct TimetableWindow : Window { uint32 p2 = minu(val, UINT16_MAX); - DoCommandP(0, p1, p2, CMD_CHANGE_TIMETABLE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); + DoCommandP(0, p1, p2, (this->set_wait_time_all ? CMD_BULK_CHANGE_TIMETABLE : CMD_CHANGE_TIMETABLE) | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); break; }