现状(调研结论)
- 分组数据结构:
src/group.hGroup(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.henum class Commands+DEF_CMD_TUPLE_NT(宏同时声明处理器与注册CommandTraits); - 车辆↔分组:
vehicle_base.hVehicle::group_id;共享订单链FirstShared()/NextShared();OrderList *orders。
结论:缺一个「遍历全公司车辆、按共享订单自动建组并归组」的整体命令。
本功能实现
新命令 Commands::AutoGroupSharedOrders(CmdAutoGroupSharedOrders)
流程(src/group_cmd.cpp):
- 遍历该公司指定类型的所有主车辆(
Vehicle::IterateTypeFrontOnly(type)),跳过非本公司/无订单/已在自定义组的车; - 对每个共享订单链计数;≥2 辆共享同一订单列表时:
- 用
GenerateAutoNameForVehicleGroup(v)生成组名(如「A镇 ↔ B镇」); - 构造
VehicleListIdentifier(VL_SHARED_ORDERS, ...),嵌套调用Command<Commands::CreateGroupFromList>::Do(flags, ...)建组并把全部共享车辆移入; - 完成后该组内车辆
group_id已非默认组,循环自动跳过(同一订单列表只建一个组);
- 用
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:新控件 IDsrc/group_gui.cpp:工具栏按钮(NWidget + OnPaint 精灵 + OnClick)src/console_cmds.cpp:控制台命令src/lang/english.txt:STR_GROUP_AUTOGROUP_SHARED_TOOLTIP
验证要点
- 两条以上车辆共享同一订单列表 → 点按钮/
autogroup后生成「线路名」组且全部车辆归组; - 已分组的车辆不被再次移动;不同订单列表各自成组;
- 组内车辆统计(数量/利润)正确刷新(依赖
GroupChangeDeferredUpdateScope)。