Ajouter une commande de jeu
En utilisant Commands::AutoGroupSharedOrders (groupement automatique de vehicules) implemente dans ce projet comme modele, voici les etapes completes pour ajouter une nouvelle commande dans jrpm.
1. Declarer dans l'enumeration des commandes
src/command_type.h, enum class Commands insertion au milieu (decalera les IDs suivants) :
cpp
AddSharedVehiclesToGroup, ///< add all other shared vehicles to a group which are missing
AutoGroupSharedOrders, ///< auto-group all vehicles by their shared order lists2. Declarer le processeur de commande et l'enregistrement
src/group_cmd.h (DEF_CMD_TUPLE_NT declare simultanement la fonction processeur et enregistre CommandTraits) :
cpp
DEF_CMD_TUPLE_NT(Commands::AutoGroupSharedOrders, CmdAutoGroupSharedOrders, {}, CommandType::RouteManagement, CmdDataT<VehicleType>)_NT: pas de parametre de tuile (avec tuile utiliserDEF_CMD_TUPLE) ;CmdDataT<...>: liste des types de parametres, le processeur les decompose dans l'ordre.
3. Implementer le processeur
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)) {
// ... logique metier ...
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;
}Points cles :
- Retourner
CMD_ERRORindique un echec (CommandCost(INVALID_STRING_ID)) ; flags.Test(DoCommandFlag::Execute)controle l'« execution reelle » vs « mode test » ;- Les commandes imbriquees utilisent
Command<Commands::X>::Do(flags, ...); - Les appels GUI/reseau utilisent
Command<Commands::X>::Post(err_string, args...)(synchronisation reseau automatique).
4. Ajouter des points d'entree
Bouton de fenetre (optionnel)
- Ajouter
WID_XXXdans l'enumerationsrc/widgets/<system>_widget.h; - Ajouter le bouton dans la disposition NWidget de la fenetre ;
- Ajouter un
casedansOnClick:cppcase WID_GL_AUTOGROUP_SHARED: { Command<Commands::AutoGroupSharedOrders>::Post(STR_ERROR_GROUP_CAN_T_CREATE, this->vli.vtype); break; }
Commande console (optionnel)
src/console_cmds.cpp :
cpp
static bool ConAutoGroup(std::span<std::string_view> argv) { /* ... */ }
// Dans IConsoleStdLibRegister() :
IConsole::CmdRegister("autogroup", ConAutoGroup);Chaine (optionnel)
Ajouter dans src/lang/english.txt (ex. STR_GROUP_AUTOGROUP_SHARED_TOOLTIP).
5. Liste de verification
- [ ] Enumeration dans
command_type.h - [ ]
DEF_CMD_TUPLE*dans<system>_cmd.h - [ ] Processeur dans
<system>_cmd.cpp - [ ] (Optionnel) Widget/console/chaine
- [ ] Adaptation reseau et archive automatique (
CommandTraitsgenere automatiquement)