Добавление игровой команды
На примере реализованной в этом проекте команды Commands::AutoGroupSharedOrders (автоматическая группировка ТС) показаны полные шаги добавления новой команды в jrpm.
1. Объявление в перечислении команд
src/command_type.h, enum class Commands вставка в середину (смещает ID последующих):
cpp
AddSharedVehiclesToGroup, ///< add all other shared vehicles to a group which are missing
AutoGroupSharedOrders, ///< auto-group all vehicles by their shared order lists2. Объявление обработчика команды и регистрация
src/group_cmd.h (DEF_CMD_TUPLE_NT одновременно объявляет функцию-обработчик и регистрирует CommandTraits):
cpp
DEF_CMD_TUPLE_NT(Commands::AutoGroupSharedOrders, CmdAutoGroupSharedOrders, {}, CommandType::RouteManagement, CmdDataT<VehicleType>)_NT: без параметра тайла (с тайлом используйтеDEF_CMD_TUPLE);CmdDataT<...>: список типов параметров, обработчик распаковывает по порядку.
3. Реализация обработчика
src/group_cmd.cpp:
cpp
CommandCost CmdAutoGroupSharedOrders(DoCommandFlags flags, VehicleType type)
{
if (!IsCompanyBuildableVehicleType(type)) return CMD_ERROR;
CommandCost total_cost;
for (const Vehicle *v : Vehicle::IterateTypeFrontOnly(type)) {
// ... бизнес-логика ...
CommandCost ret = Command<Commands::CreateGroupFromList>::Do(flags, vli, CargoFilterCriteria::CF_ANY, name);
if (ret.Failed()) return ret;
total_cost.AddCost(ret.GetCost());
}
return total_cost;
}Ключевые моменты:
- Возврат
CMD_ERRORозначает ошибку (CommandCost(INVALID_STRING_ID)); flags.Test(DoCommandFlag::Execute)управляет разделением «реального выполнения» и «тестового режима»;- Вложенные команды через
Command<Commands::X>::Do(flags, ...); - Вызов из GUI/сети через
Command<Commands::X>::Post(err_string, args...)(автоматическая сетевая синхронизация).
4. Добавление точки входа
Кнопка в окне (опционально)
src/widgets/<system>_widget.hдобавитьWID_XXXв перечисление;- Добавить кнопку в NWidget раскладку окна;
- В
OnClickдобавитьcase:cppcase WID_GL_AUTOGROUP_SHARED: { Command<Commands::AutoGroupSharedOrders>::Post(STR_ERROR_GROUP_CAN_T_CREATE, this->vli.vtype); break; }
Консольная команда (опционально)
src/console_cmds.cpp:
cpp
static bool ConAutoGroup(std::span<std::string_view> argv) { /* ... */ }
// В IConsoleStdLibRegister():
IConsole::CmdRegister("autogroup", ConAutoGroup);Строки (опционально)
src/lang/english.txt добавить (например, STR_GROUP_AUTOGROUP_SHARED_TOOLTIP).
5. Контрольный список
- [ ] Перечисление в
command_type.h - [ ]
DEF_CMD_TUPLE*в<system>_cmd.h - [ ] Обработчик в
<system>_cmd.cpp - [ ] (Опционально) Элементы управления / консоль / строки
- [ ] Сеть и сохранение адаптируются автоматически (
CommandTraitsгенерируется автоматически)