Adicionar Comando do Jogo
Usando o Commands::AutoGroupSharedOrders (agrupamento automatico de veiculos) implementado neste projeto como modelo, apresenta as etapas completas para adicionar um novo comando no jrpm.
1. Declarar na Enumeracao de Comandos
src/command_type.h, insercao no meio do enum class Commands (desloca IDs subsequentes):
cpp
AddSharedVehiclesToGroup, ///< add all other shared vehicles to a group which are missing
AutoGroupSharedOrders, ///< auto-group all vehicles by their shared order lists2. Declarar Manipulador de Comando e Registro
src/group_cmd.h (DEF_CMD_TUPLE_NT declara simultaneamente a funcao manipuladora e registra CommandTraits):
cpp
DEF_CMD_TUPLE_NT(Commands::AutoGroupSharedOrders, CmdAutoGroupSharedOrders, {}, CommandType::RouteManagement, CmdDataT<VehicleType>)_NT: Sem parametro de tile (com tile useDEF_CMD_TUPLE);CmdDataT<...>: Lista de tipos de parametros, o manipulador desempacota na ordem.
3. Implementar o Manipulador
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)) {
// ... logica de negocios ...
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;
}Pontos importantes:
- Retornar
CMD_ERRORindica falha (CommandCost(INVALID_STRING_ID)); flags.Test(DoCommandFlag::Execute)controla "execucao real" vs "modo de teste";- Comandos aninhados usam
Command<Commands::X>::Do(flags, ...); - Chamadas de GUI/rede usam
Command<Commands::X>::Post(err_string, args...)(sincronizacao de rede automatica).
4. Adicionar Entrada
Botao de Janela (opcional)
src/widgets/<system>_widget.hadicionarWID_XXXna enumeracao;- Adicionar botao no layout NWidget da janela;
- Adicionar
casenoOnClick:cppcase WID_GL_AUTOGROUP_SHARED: { Command<Commands::AutoGroupSharedOrders>::Post(STR_ERROR_GROUP_CAN_T_CREATE, this->vli.vtype); break; }
Comando de Console (opcional)
src/console_cmds.cpp:
cpp
static bool ConAutoGroup(std::span<std::string_view> argv) { /* ... */ }
// Em IConsoleStdLibRegister():
IConsole::CmdRegister("autogroup", ConAutoGroup);Strings (opcional)
src/lang/english.txt adicionar (ex: STR_GROUP_AUTOGROUP_SHARED_TOOLTIP).
5. Lista de Verificacao
- [ ] Enumeracao em
command_type.h - [ ]
DEF_CMD_TUPLE*em<system>_cmd.h - [ ] Manipulador em
<system>_cmd.cpp - [ ] (Opcional) Widget/Console/Strings
- [ ] Adaptacao automatica de rede e arquivo (
CommandTraitsgerado automaticamente)