Scheduled dispatch: Add menu item to append schedules from another vehicle

This commit is contained in:
Jonathan G Rennison
2023-05-07 20:06:47 +01:00
parent d93a1a5804
commit 8f92668e22
9 changed files with 79 additions and 12 deletions

View File

@@ -297,6 +297,7 @@ CommandProcEx CmdScheduledDispatchAddNewSchedule;
CommandProc CmdScheduledDispatchRemoveSchedule; CommandProc CmdScheduledDispatchRemoveSchedule;
CommandProc CmdScheduledDispatchRenameSchedule; CommandProc CmdScheduledDispatchRenameSchedule;
CommandProc CmdScheduledDispatchDuplicateSchedule; CommandProc CmdScheduledDispatchDuplicateSchedule;
CommandProc CmdScheduledDispatchAppendVehicleSchedules;
CommandProc CmdAddPlan; CommandProc CmdAddPlan;
CommandProcEx CmdAddPlanLine; CommandProcEx CmdAddPlanLine;
@@ -555,6 +556,7 @@ static const Command _command_proc_table[] = {
DEF_CMD(CmdScheduledDispatchRemoveSchedule, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_REMOVE_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(CmdScheduledDispatchRenameSchedule, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_RENAME_SCHEDULE
DEF_CMD(CmdScheduledDispatchDuplicateSchedule, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_DUPLICATE_SCHEDULE DEF_CMD(CmdScheduledDispatchDuplicateSchedule, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_DUPLICATE_SCHEDULE
DEF_CMD(CmdScheduledDispatchAppendVehicleSchedules, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SCHEDULED_DISPATCH_APPEND_VEHICLE_SCHEDULE
DEF_CMD(CmdAddPlan, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_ADD_PLAN 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 DEF_CMD(CmdAddPlanLine, CMD_NO_TEST, CMDT_OTHER_MANAGEMENT ), // CMD_ADD_PLAN_LINE

View File

@@ -519,6 +519,7 @@ enum Commands {
CMD_SCHEDULED_DISPATCH_REMOVE_SCHEDULE, ///< scheduled dispatch remove schedule CMD_SCHEDULED_DISPATCH_REMOVE_SCHEDULE, ///< scheduled dispatch remove schedule
CMD_SCHEDULED_DISPATCH_RENAME_SCHEDULE, ///< scheduled dispatch rename schedule CMD_SCHEDULED_DISPATCH_RENAME_SCHEDULE, ///< scheduled dispatch rename schedule
CMD_SCHEDULED_DISPATCH_DUPLICATE_SCHEDULE, ///< scheduled dispatch duplicate schedule CMD_SCHEDULED_DISPATCH_DUPLICATE_SCHEDULE, ///< scheduled dispatch duplicate schedule
CMD_SCHEDULED_DISPATCH_APPEND_VEHICLE_SCHEDULE, ///< scheduled dispatch append schedules from another vehicle
CMD_ADD_PLAN, CMD_ADD_PLAN,
CMD_ADD_PLAN_LINE, CMD_ADD_PLAN_LINE,

View File

@@ -2010,7 +2010,7 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}Reset wh
STR_SCHDISPATCH_CLEAR :{BLACK}Clear Departure Slots STR_SCHDISPATCH_CLEAR :{BLACK}Clear Departure Slots
STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}Clear all departure slots from the schedule. STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}Clear all departure slots from the schedule.
STR_SCHDISPATCH_MANAGE :{BLACK}Manage Schedule STR_SCHDISPATCH_MANAGE :{BLACK}Manage Schedule
STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING} STR_SCHDISPATCH_MANAGE_TOOLTIP_SUFFIX :{}{}{STRING}
STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Previous STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Previous
STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Go to previous dispatch schedule STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Go to previous dispatch schedule
STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Next STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Next
@@ -2021,6 +2021,8 @@ STR_SCHDISPATCH_REMOVE_SCHEDULE :{BLACK}Remove C
STR_SCHDISPATCH_REMOVE_SCHEDULE_TOOLTIP :{BLACK}Remove this dispatch schedule entirely. STR_SCHDISPATCH_REMOVE_SCHEDULE_TOOLTIP :{BLACK}Remove this dispatch schedule entirely.
STR_SCHDISPATCH_DUPLICATE_SCHEDULE :{BLACK}Duplicate Current Schedule STR_SCHDISPATCH_DUPLICATE_SCHEDULE :{BLACK}Duplicate Current Schedule
STR_SCHDISPATCH_DUPLICATE_SCHEDULE_TOOLTIP :{BLACK}Create a copy of this dispatch schedule. STR_SCHDISPATCH_DUPLICATE_SCHEDULE_TOOLTIP :{BLACK}Create a copy of this dispatch schedule.
STR_SCHDISPATCH_APPEND_VEHICLE_SCHEDULES :{BLACK}Append Schedules From Vehicle
STR_SCHDISPATCH_APPEND_VEHICLE_SCHEDULES_TOOLTIP :{BLACK}Append the dispatch schedules from another vehicle.
STR_SCHDISPATCH_NO_SCHEDULES :{BLACK}No Schedules STR_SCHDISPATCH_NO_SCHEDULES :{BLACK}No Schedules
STR_SCHDISPATCH_SCHEDULE_ID :{BLACK}Schedule {NUM} of {NUM} STR_SCHDISPATCH_SCHEDULE_ID :{BLACK}Schedule {NUM} of {NUM}
STR_SCHDISPATCH_NAMED_SCHEDULE_ID :{BLACK}{RAW_STRING} ({NUM} of {NUM}) STR_SCHDISPATCH_NAMED_SCHEDULE_ID :{BLACK}{RAW_STRING} ({NUM} of {NUM})

View File

@@ -1951,7 +1951,6 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}Restable
STR_SCHDISPATCH_CLEAR :{BLACK}Limpar slots de saídas 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_CLEAR_TOOLTIP :{BLACK}Limpar todos os slots de saídas do programa
STR_SCHDISPATCH_MANAGE :{BLACK}Xestionar programa STR_SCHDISPATCH_MANAGE :{BLACK}Xestionar programa
STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING}
STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Anterior STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Anterior
STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Ir a saída programada anterior STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Ir a saída programada anterior
STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Seguinte STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Seguinte

View File

@@ -1762,7 +1762,6 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}Setzt di
STR_SCHDISPATCH_CLEAR :{BLACK}Lösche Abfahrtszeiten STR_SCHDISPATCH_CLEAR :{BLACK}Lösche Abfahrtszeiten
STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}Lösche alle Abfahrtszeiten aus dem Zeitplan. STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}Lösche alle Abfahrtszeiten aus dem Zeitplan.
STR_SCHDISPATCH_MANAGE :{BLACK}Bearbeite Zeitplan STR_SCHDISPATCH_MANAGE :{BLACK}Bearbeite Zeitplan
STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING}
STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Vorheriger STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}Vorheriger
STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Gehe zum vorherigen Zeitplan STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}Gehe zum vorherigen Zeitplan
STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Nächster STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}Nächster

View File

@@ -1958,7 +1958,6 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}최근
STR_SCHDISPATCH_CLEAR :{BLACK}출발 슬롯 초기화 STR_SCHDISPATCH_CLEAR :{BLACK}출발 슬롯 초기화
STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}일정에서 모든 출발 슬롯을 제거합니다. STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}일정에서 모든 출발 슬롯을 제거합니다.
STR_SCHDISPATCH_MANAGE :{BLACK}일정 관리 STR_SCHDISPATCH_MANAGE :{BLACK}일정 관리
STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING}
STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}이전 STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}이전
STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}이전 배차 일정으로 이동합니다 STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}이전 배차 일정으로 이동합니다
STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}다음 STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}다음

View File

@@ -1918,7 +1918,6 @@ STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP :{BLACK}当车
STR_SCHDISPATCH_CLEAR :{BLACK}清除出发条目 STR_SCHDISPATCH_CLEAR :{BLACK}清除出发条目
STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}从计划调度中清除全部的出发条目 STR_SCHDISPATCH_CLEAR_TOOLTIP :{BLACK}从计划调度中清除全部的出发条目
STR_SCHDISPATCH_MANAGE :{BLACK}管理计划调度 STR_SCHDISPATCH_MANAGE :{BLACK}管理计划调度
STR_SCHDISPATCH_MANAGE_TOOLTIP :{STRING}{}{}{STRING}{}{}{STRING}{}{}{STRING}
STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}上个 STR_SCHDISPATCH_PREV_SCHEDULE :{BLACK}上个
STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}跳转到前一个出发条目 STR_SCHDISPATCH_PREV_SCHEDULE_TOOLTIP :{BLACK}跳转到前一个出发条目
STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}下个 STR_SCHDISPATCH_NEXT_SCHEDULE :{BLACK}下个

View File

@@ -476,6 +476,7 @@ CommandCost CmdScheduledDispatchDuplicateSchedule(TileIndex tile, DoCommandFlag
if (ret.Failed()) return ret; if (ret.Failed()) return ret;
if (v->orders == nullptr) return CMD_ERROR; if (v->orders == nullptr) return CMD_ERROR;
if (v->orders->GetScheduledDispatchScheduleCount() >= 4096) return CMD_ERROR;
if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR;
@@ -489,6 +490,46 @@ CommandCost CmdScheduledDispatchDuplicateSchedule(TileIndex tile, DoCommandFlag
return CommandCost(); return CommandCost();
} }
/**
* Append scheduled dispatch schedules from another vehicle
*
* @param tile Not used.
* @param flags Operation to perform.
* @param p1 Vehicle index to append to
* @param p2 Vehicle index to copy from
* @param text name
* @return the cost of this operation or an error
*/
CommandCost CmdScheduledDispatchAppendVehicleSchedules(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
{
VehicleID veh1 = GB(p1, 0, 20);
VehicleID veh2 = GB(p2, 0, 20);
Vehicle *v1 = Vehicle::GetIfValid(veh1);
if (v1 == nullptr || !v1->IsPrimaryVehicle()) return CMD_ERROR;
const Vehicle *v2 = Vehicle::GetIfValid(veh2);
if (v2 == nullptr || !v2->IsPrimaryVehicle()) return CMD_ERROR;
CommandCost ret = CheckOwnership(v1->owner);
if (ret.Failed()) return ret;
if (v1->orders == nullptr || v2->orders == nullptr || v1->orders == v2->orders) return CMD_ERROR;
if (v1->orders->GetScheduledDispatchScheduleCount() + v2->orders->GetScheduledDispatchScheduleCount() > 4096) return CMD_ERROR;
if (flags & DC_EXEC) {
for (uint i = 0; i < v2->orders->GetScheduledDispatchScheduleCount(); i++) {
DispatchSchedule &ds = v1->orders->GetScheduledDispatchScheduleSet().emplace_back(v2->orders->GetDispatchScheduleByIndex(i));
ds.SetScheduledDispatchLastDispatch(0);
ds.UpdateScheduledDispatch(nullptr);
}
SetTimetableWindowsDirty(v1, true);
}
return CommandCost();
}
/** /**
* Set scheduled dispatch slot list. * Set scheduled dispatch slot list.
* @param dispatch_list The offset time list, must be correctly sorted. * @param dispatch_list The offset time list, must be correctly sorted.

View File

@@ -26,6 +26,7 @@
#include "viewport_func.h" #include "viewport_func.h"
#include "zoom_func.h" #include "zoom_func.h"
#include "core/geometry_func.hpp" #include "core/geometry_func.hpp"
#include "tilehighlight_func.h"
#include <vector> #include <vector>
#include <algorithm> #include <algorithm>
@@ -225,6 +226,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
SCH_MD_CLEAR_SCHEDULE, SCH_MD_CLEAR_SCHEDULE,
SCH_MD_REMOVE_SCHEDULE, SCH_MD_REMOVE_SCHEDULE,
SCH_MD_DUPLICATE_SCHEDULE, SCH_MD_DUPLICATE_SCHEDULE,
SCH_MD_APPEND_VEHICLE_SCHEDULES,
}; };
bool IsScheduleSelected() const bool IsScheduleSelected() const
@@ -384,12 +386,16 @@ struct SchdispatchWindow : GeneralVehicleWindow {
} }
case WID_SCHDISPATCH_MANAGEMENT: { case WID_SCHDISPATCH_MANAGEMENT: {
uint64 params[4]; _temp_special_strings[0] = GetString(STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP);
params[0] = STR_SCHDISPATCH_RESET_LAST_DISPATCH_TOOLTIP; auto add_suffix = [&](StringID str) {
params[1] = STR_SCHDISPATCH_CLEAR_TOOLTIP; SetDParam(0, str);
params[2] = STR_SCHDISPATCH_REMOVE_SCHEDULE_TOOLTIP; _temp_special_strings[0] += GetString(STR_SCHDISPATCH_MANAGE_TOOLTIP_SUFFIX);
params[3] = STR_SCHDISPATCH_DUPLICATE_SCHEDULE_TOOLTIP; };
GuiShowTooltips(this, STR_SCHDISPATCH_MANAGE_TOOLTIP, lengthof(params), params, close_cond); add_suffix(STR_SCHDISPATCH_CLEAR_TOOLTIP);
add_suffix(STR_SCHDISPATCH_REMOVE_SCHEDULE_TOOLTIP);
add_suffix(STR_SCHDISPATCH_DUPLICATE_SCHEDULE_TOOLTIP);
add_suffix(STR_SCHDISPATCH_APPEND_VEHICLE_SCHEDULES_TOOLTIP);
GuiShowTooltips(this, SPECSTR_TEMP_START, 0, nullptr, close_cond);
return true; return true;
} }
@@ -731,6 +737,7 @@ struct SchdispatchWindow : GeneralVehicleWindow {
add_item(STR_SCHDISPATCH_CLEAR, SCH_MD_CLEAR_SCHEDULE); add_item(STR_SCHDISPATCH_CLEAR, SCH_MD_CLEAR_SCHEDULE);
add_item(STR_SCHDISPATCH_REMOVE_SCHEDULE, SCH_MD_REMOVE_SCHEDULE); add_item(STR_SCHDISPATCH_REMOVE_SCHEDULE, SCH_MD_REMOVE_SCHEDULE);
add_item(STR_SCHDISPATCH_DUPLICATE_SCHEDULE, SCH_MD_DUPLICATE_SCHEDULE); add_item(STR_SCHDISPATCH_DUPLICATE_SCHEDULE, SCH_MD_DUPLICATE_SCHEDULE);
add_item(STR_SCHDISPATCH_APPEND_VEHICLE_SCHEDULES, SCH_MD_APPEND_VEHICLE_SCHEDULES);
ShowDropDownList(this, std::move(list), -1, WID_SCHDISPATCH_MANAGEMENT); ShowDropDownList(this, std::move(list), -1, WID_SCHDISPATCH_MANAGEMENT);
break; break;
} }
@@ -807,6 +814,15 @@ struct SchdispatchWindow : GeneralVehicleWindow {
case SCH_MD_DUPLICATE_SCHEDULE: 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)); DoCommandP(0, this->vehicle->index | (this->schedule_index << 20), 0, CMD_SCHEDULED_DISPATCH_DUPLICATE_SCHEDULE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE));
break; break;
case SCH_MD_APPEND_VEHICLE_SCHEDULES: {
static const CursorID clone_icons[] = {
SPR_CURSOR_CLONE_TRAIN, SPR_CURSOR_CLONE_ROADVEH,
SPR_CURSOR_CLONE_SHIP, SPR_CURSOR_CLONE_AIRPLANE
};
SetObjectToPlaceWnd(clone_icons[this->vehicle->type], PAL_NONE, HT_VEHICLE, this);
break;
}
} }
} }
@@ -911,6 +927,15 @@ struct SchdispatchWindow : GeneralVehicleWindow {
} }
} }
bool OnVehicleSelect(const Vehicle *v) override
{
if (v->orders == nullptr || v->orders->GetScheduledDispatchScheduleCount() == 0) return false;
DoCommandP(0, this->vehicle->index, v->index, CMD_SCHEDULED_DISPATCH_APPEND_VEHICLE_SCHEDULE | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE));
ResetObjectToPlace();
return true;
}
const Vehicle *GetVehicle() const Vehicle *GetVehicle()
{ {
return this->vehicle; return this->vehicle;
@@ -981,7 +1006,7 @@ static const NWidgetPart _nested_schdispatch_widgets[] = {
EndContainer(), EndContainer(),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), NWidget(NWID_VERTICAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCHDISPATCH_SET_DELAY), SetDataTip(STR_SCHDISPATCH_DELAY, STR_SCHDISPATCH_DELAY_TOOLTIP), SetFill(1, 1), SetResize(1, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SCHDISPATCH_SET_DELAY), SetDataTip(STR_SCHDISPATCH_DELAY, STR_SCHDISPATCH_DELAY_TOOLTIP), SetFill(1, 1), SetResize(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCHDISPATCH_MANAGEMENT), SetDataTip(STR_SCHDISPATCH_MANAGE, STR_SCHDISPATCH_MANAGE_TOOLTIP), SetFill(1, 1), SetResize(1, 0), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCHDISPATCH_MANAGEMENT), SetDataTip(STR_SCHDISPATCH_MANAGE, STR_NULL), SetFill(1, 1), SetResize(1, 0),
EndContainer(), EndContainer(),
NWidget(WWT_RESIZEBOX, COLOUR_GREY), NWidget(WWT_RESIZEBOX, COLOUR_GREY),
EndContainer(), EndContainer(),