Текущее состояние (выводы исследования)
- Структура данных групп:
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 последующих команд, что нормально для форка, но несовместимо между разными версиями)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
Ключевые моменты проверки
- Два или более ТС с одинаковым списком приказов → после нажатия кнопки/
autogroupсоздаётся группа с «именем маршрута» и все ТС помещаются в неё; - Уже сгруппированные ТС не перемещаются повторно; разные списки приказов образуют отдельные группы;
- Статистика группы (количество/прибыль) обновляется корректно (зависит от
GroupChangeDeferredUpdateScope).