Skip to content

现状(调研结论) ​

  • 分组数据结构:src/group.h Group(name/owner/vehicle_type/flags/livery/statistics/parent/number)、GroupID、DEFAULT_GROUP;
  • 现有命令(src/group_cmd.h / group_cmd.cpp):
    • CmdCreateGroup、CmdDeleteGroup、CmdAlterGroup(改名/设父组)
    • CmdAddVehicleGroup(单辆入组)
    • CmdAddSharedVehicleGroup(把某一辆车的共享订单车辆加入已有组)
    • CmdCreateGroupFromList(从车辆列表建组,支持 VL_SHARED_ORDERS 列表类型;自动命名)
  • 自动命名助手:GenerateAutoNameForVehicleGroup()(group_cmd.cpp:899,按线路起止城镇 STR_VEHICLE_AUTO_GROUP_ROUTE / _LOCAL_ROUTE)——jgrpp 已有「按线路命名」基建;
  • 命令注册机制:command_type.h enum class Commands + DEF_CMD_TUPLE_NT(宏同时声明处理器与注册 CommandTraits);
  • 车辆↔分组:vehicle_base.h Vehicle::group_id;共享订单链 FirstShared()/NextShared();OrderList *orders。

结论:缺一个「遍历全公司车辆、按共享订单自动建组并归组」的整体命令。

本功能实现 ​

新命令 Commands::AutoGroupSharedOrders(CmdAutoGroupSharedOrders) ​

流程(src/group_cmd.cpp):

  1. 遍历该公司指定类型的所有主车辆(Vehicle::IterateTypeFrontOnly(type)),跳过非本公司/无订单/已在自定义组的车;
  2. 对每个共享订单链计数;≥2 辆共享同一订单列表时:
    • 用 GenerateAutoNameForVehicleGroup(v) 生成组名(如「A镇 ↔ B镇」);
    • 构造 VehicleListIdentifier(VL_SHARED_ORDERS, ...),嵌套调用 Command<Commands::CreateGroupFromList>::Do(flags, ...) 建组并把全部共享车辆移入;
    • 完成后该组内车辆 group_id 已非默认组,循环自动跳过(同一订单列表只建一个组);
  3. GroupChangeDeferredUpdateScope 统一延迟更新分组统计。

三个入口 ​

入口位置说明
分组窗口按钮src/group_gui.cpp 新增 WID_GL_AUTOGROUP_SHARED(工具栏 LIVERY 旁),OnClick 发命令精灵复用 SPR_GROUP_CREATE_TRAIN + vtype
控制台命令src/console_cmds.cpp autogroup [train|road|ship|aircraft](不带参数 = 四种类型都执行)IConsole::CmdRegister
脚本/其他任意代码可 Command<Commands::AutoGroupSharedOrders>::Post(...)命令走网络同步,多人服务器安全

涉及文件 ​

  • src/command_type.h:Commands 枚举新增 AutoGroupSharedOrders(注意:枚举中段插入会使后续命令 ID 顺移,新旧版本联机会不一致,属 fork 内正常现象)
  • src/group_cmd.h / group_cmd.cpp:命令声明与实现
  • src/widgets/group_widget.h:新控件 ID
  • src/group_gui.cpp:工具栏按钮(NWidget + OnPaint 精灵 + OnClick)
  • src/console_cmds.cpp:控制台命令
  • src/lang/english.txt:STR_GROUP_AUTOGROUP_SHARED_TOOLTIP

验证要点 ​

  1. 两条以上车辆共享同一订单列表 → 点按钮/autogroup 后生成「线路名」组且全部车辆归组;
  2. 已分组的车辆不被再次移动;不同订单列表各自成组;
  3. 组内车辆统计(数量/利润)正确刷新(依赖 GroupChangeDeferredUpdateScope)。