diff --git a/src/command.cpp b/src/command.cpp index 3bf3f31503..f1c4ea7924 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -296,6 +296,7 @@ CommandProc CmdScheduledDispatchClear; CommandProcEx CmdScheduledDispatchAddNewSchedule; CommandProc CmdScheduledDispatchRemoveSchedule; CommandProc CmdScheduledDispatchRenameSchedule; +CommandProc CmdScheduledDispatchDuplicateSchedule; CommandProc CmdAddPlan; CommandProcEx CmdAddPlanLine; @@ -553,6 +554,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdScheduledDispatchAddNewSchedule, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_ADD_NEW_SCHEDULE DEF_CMD(CmdScheduledDispatchRemoveSchedule, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_REMOVE_SCHEDULE DEF_CMD(CmdScheduledDispatchRenameSchedule, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_RENAME_SCHEDULE + DEF_CMD(CmdScheduledDispatchDuplicateSchedule, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_DUPLICATE_SCHEDULE DEF_CMD(CmdAddPlan, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_ADD_PLAN DEF_CMD(CmdAddPlanLine, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_ADD_PLAN_LINE diff --git a/src/command_type.h b/src/command_type.h index 307350e227..0f908962f6 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -518,6 +518,7 @@ enum Commands { CMD_SCHEDULED_DISPATCH_ADD_NEW_SCHEDULE, ///< scheduled dispatch add new schedule CMD_SCHEDULED_DISPATCH_REMOVE_SCHEDULE, ///< scheduled dispatch remove schedule CMD_SCHEDULED_DISPATCH_RENAME_SCHEDULE, ///< scheduled dispatch rename schedule + CMD_SCHEDULED_DISPATCH_DUPLICATE_SCHEDULE, ///< scheduled dispatch duplicate schedule CMD_ADD_PLAN, CMD_ADD_PLAN_LINE, diff --git a/src/lang/extra/english.txt b/src/lang/extra/english.txt index 2791537979..6adc77e65f 100644 --- a/src/lang/extra/english.txt +++ b/src/lang/extra/english.txt @@ -2010,7 +2010,7 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}Reset wh STR_SCHDISPATCH_CLEAR :{BLACK}Clear Departure Slots STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}Clear all departure slots from the schedule. STR_SCHDISPATCH_MANAGE :{BLACK}Manage Schedule -STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING} +STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING} STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Previous STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Go to previous dispatch schedule STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Next @@ -2019,6 +2019,8 @@ STR_SCHDISPATCH_ADD_SCHEDULE :{BLACK}Add STR_SCHDISPATCH_ADD_SCHEDULE_TOOLTIP :{BLACK}Add a new dispatch schedule STR_SCHDISPATCH_REMOVE_SCHEDULE :{BLACK}Remove Current Schedule STR_SCHDISPATCH_REMOVE_SCHEDULE_TOOLTIP :{BLACK}Remove this dispatch schedule entirely. +STR_SCHDISPATCH_DUPLICATE_SCHEDULE :{BLACK}Duplicate Current Schedule +STR_SCHDISPATCH_DUPLICATE_SCHEDULE_TOOLTIP :{BLACK}Create a copy of this dispatch schedule. STR_SCHDISPATCH_NO_SCHEDULES :{BLACK}No Schedules STR_SCHDISPATCH_SCHEDULE_ID :{BLACK}Schedule {NUM} of {NUM} STR_SCHDISPATCH_NAMED_SCHEDULE_ID :{BLACK}{RAW_STRING} ({NUM} of {NUM}) diff --git a/src/lang/extra/galician.txt b/src/lang/extra/galician.txt index 6b022a07ed..a5fad7a9d1 100644 --- a/src/lang/extra/galician.txt +++ b/src/lang/extra/galician.txt @@ -1951,7 +1951,7 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}Restable STR_SCHDISPATCH_CLEAR :{BLACK}Limpar slots de saídas STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}Limpar todos os slots de saídas do programa STR_SCHDISPATCH_MANAGE :{BLACK}Xestionar programa -STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING} +STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING} STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Anterior STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Ir a saída programada anterior STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Seguinte diff --git a/src/lang/extra/german.txt b/src/lang/extra/german.txt index 31ee2d9f77..9aab8b0ecc 100644 --- a/src/lang/extra/german.txt +++ b/src/lang/extra/german.txt @@ -1762,7 +1762,7 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}Setzt di STR_SCHDISPATCH_CLEAR :{BLACK}Lösche Abfahrtszeiten STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}Lösche alle Abfahrtszeiten aus dem Zeitplan. STR_SCHDISPATCH_MANAGE :{BLACK}Bearbeite Zeitplan -STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING} +STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING} STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Vorheriger STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Gehe zum vorherigen Zeitplan STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Nächster diff --git a/src/lang/extra/korean.txt b/src/lang/extra/korean.txt index b7adca8f88..76eb08571e 100644 --- a/src/lang/extra/korean.txt +++ b/src/lang/extra/korean.txt @@ -1958,7 +1958,7 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}최근 STR_SCHDISPATCH_CLEAR :{BLACK}출발 슬롯 초기화 STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}일정에서 모든 출발 슬롯을 제거합니다. STR_SCHDISPATCH_MANAGE :{BLACK}일정 관리 -STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING} +STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING} STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}이전 STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}이전 배차 일정으로 이동합니다 STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}다음 diff --git a/src/lang/extra/simplified_chinese.txt b/src/lang/extra/simplified_chinese.txt index baffa2e0e7..98b12ef7cc 100644 --- a/src/lang/extra/simplified_chinese.txt +++ b/src/lang/extra/simplified_chinese.txt @@ -1918,7 +1918,7 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}当车 STR_SCHDISPATCH_CLEAR :{BLACK}清除出发条目 STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}从计划调度中清除全部的出发条目 STR_SCHDISPATCH_MANAGE :{BLACK}管理计划调度 -STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING} +STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING} STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}上个 STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}跳转到前一个出发条目 STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}下个 diff --git a/src/schdispatch_cmd.cpp b/src/schdispatch_cmd.cpp index 210497bb12..08baf69b1d 100644 --- a/src/schdispatch_cmd.cpp +++ b/src/schdispatch_cmd.cpp @@ -454,6 +454,41 @@ CommandCost CmdScheduledDispatchRenameSchedule(TileIndex tile, DoCommandFlag fla return CommandCost(); } +/** + * Duplicate scheduled dispatch schedule + * + * @param tile Not used. + * @param flags Operation to perform. + * @param p1 Vehicle index + * @param p2 Not used + * @param text name + * @return the cost of this operation or an error + */ +CommandCost CmdScheduledDispatchDuplicateSchedule(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + VehicleID veh = GB(p1, 0, 20); + uint schedule_index = GB(p1, 20, 12); + + Vehicle *v = Vehicle::GetIfValid(veh); + if (v == nullptr || !v->IsPrimaryVehicle()) return CMD_ERROR; + + CommandCost ret = CheckOwnership(v->owner); + if (ret.Failed()) return ret; + + if (v->orders == nullptr) return CMD_ERROR; + + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + + if (flags & DC_EXEC) { + DispatchSchedule &ds = v->orders->GetScheduledDispatchScheduleSet().emplace_back(v->orders->GetDispatchScheduleByIndex(schedule_index)); + ds.SetScheduledDispatchLastDispatch(0); + ds.UpdateScheduledDispatch(nullptr); + SetTimetableWindowsDirty(v, true); + } + + return CommandCost(); +} + /** * Set scheduled dispatch slot list. * @param dispatch_list The offset time list, must be correctly sorted. diff --git a/src/schdispatch_gui.cpp b/src/schdispatch_gui.cpp index 997afbc876..da42bb5d98 100644 --- a/src/schdispatch_gui.cpp +++ b/src/schdispatch_gui.cpp @@ -224,6 +224,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { SCH_MD_RESET_LAST_DISPATCHED, SCH_MD_CLEAR_SCHEDULE, SCH_MD_REMOVE_SCHEDULE, + SCH_MD_DUPLICATE_SCHEDULE, }; bool IsScheduleSelected() const @@ -383,11 +384,12 @@ struct SchdispatchWindow : GeneralVehicleWindow { } case WID_SCHDISPATCH_MANAGEMENT: { - uint64 params[3]; + uint64 params[4]; params[0] = STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP; params[1] = STR_SCHDISPATCH_CLEAR_TOOLTIP; params[2] = STR_SCHDISPATCH_REMOVE_SCHEDULE_TOOLTIP; - GuiShowTooltips(this, STR_SCHDISPATCH_MANAGE_TOOLTIP, 3, params, close_cond); + params[3] = STR_SCHDISPATCH_DUPLICATE_SCHEDULE_TOOLTIP; + GuiShowTooltips(this, STR_SCHDISPATCH_MANAGE_TOOLTIP, lengthof(params), params, close_cond); return true; } @@ -728,6 +730,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { add_item(STR_SCHDISPATCH_RESET_LAST_DISPATCH, SCH_MD_RESET_LAST_DISPATCHED); add_item(STR_SCHDISPATCH_CLEAR, SCH_MD_CLEAR_SCHEDULE); add_item(STR_SCHDISPATCH_REMOVE_SCHEDULE, SCH_MD_REMOVE_SCHEDULE); + add_item(STR_SCHDISPATCH_DUPLICATE_SCHEDULE, SCH_MD_DUPLICATE_SCHEDULE); ShowDropDownList(this, std::move(list), -1, WID_SCHDISPATCH_MANAGEMENT); break; } @@ -800,6 +803,10 @@ struct SchdispatchWindow : GeneralVehicleWindow { SetDParam(0, (uint)this->GetSelectedSchedule().GetScheduledDispatch().size()); ShowQuery(STR_SCHDISPATCH_QUERY_REMOVE_SCHEDULE_CAPTION, STR_SCHDISPATCH_QUERY_REMOVE_SCHEDULE_TEXT, this, RemoveScheduleCallback); break; + + case SCH_MD_DUPLICATE_SCHEDULE: + DoCommandP(0, this->vehicle->index | (this->schedule_index << 20), 0, CMD_SCHEDULED_DISPATCH_DUPLICATE_SCHEDULE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); + break; } }