Docs Référence

Accusés de réception et codes de raison

Chaque accusé de réception de commande porte un code d’état et un code de raison. C’est sur eux que les Bots et les agents s’appuient pour se corriger : le « pourquoi ça n’a pas marché » devient un nombre lisible par une machine.

r = g.train(barracks, "hfoo")
bool(r)        # False
r.status       # 1              -> rejected
r.verdict      # 3              -> nourriture insuffisante
r.reason       # 'rejected(人口不够)'  (= nourriture insuffisante)
r.exec_us      # durée d'exécution de cette commande sur le thread du jeu, en microsecondes

if r: équivaut à r.status == 0 (le moteur a accepté).

Code d’état status

CodeNomSignificationCauses fréquentes
0acceptedAccepté par le moteur— (mais accepté ≠ réussi, voir plus bas)
1rejectedRefusé par le moteurVoir verdict
2bad_unitL’unité n’existe pas ou le handle ne correspond pasUnité déjà morte ; objet unité périmé
3not_ownerCe n’est pas votre unitéOrdres donnés aux unités d’un autre joueur en tant que player
4faultException à l’exécution (interceptée par le runtime, sans conséquence pour le jeu)Signalez-la avec les étapes pour la reproduire
5bad_argsParamètres invalidesCoordonnées, numéro de case ou code à quatre caractères erroné
6unsupportedNon pris en chargeCette version du runtime n’a pas cette capacité
7bad_targetCible invalideLa cible n’existe plus ; mauvais type de cible
8forbiddenInterdit par le rôle de la voieOrdre donné en tant qu’observer
97cancelledException levée dans le bloc de lot : aucune commande du lot n’a été envoyéeErreur dans le code du bloc with g.batch():
98heldUnité tenue par une couche plus prioritaire : commande non envoyéeLa couche réflexe du cerveau de référence ou un ordre manuel de la console tient cette unité
99timeoutDélai dépasséÉchéance dépassée pendant une pause ou un ralentissement du jeu (une commande expirée n’est jamais exécutée)

Code de raison verdict

En cas de refus, le runtime en donne la raison à l’aide des propres contrôles de faisabilité du moteur. Vous pouvez aussi poser la question avant de donner l’ordre : g.can_do(unité, code) renvoie les mêmes codes.

CodeSignificationQue faire
0 / 220Possible—
3Nourriture insuffisanteConstruire un bâtiment de nourriture ; repérer le blocage à l’avance avec g.production(b).blocked
8Or insuffisantAttendre l’argent ; vérifier avec g.can_afford(code) avant de donner l’ordre
9Bois insuffisantEnvoyer plus d’ouvriers au bois
32File d’entraînement pleine (7 places)Une seule unité en file : n’en ajouter une que lorsque g.queue(b) est vide
183Technologie / bâtiment prérequis manquantConstruire d’abord le bâtiment prérequis, monter de tier
185Bâtiment occupéL’autel est en train de ressusciter un héros ; impossible d’améliorer le bâtiment principal tant que sa file n’est pas vide
221Élément inexistant / en construction / en amélioration / déjà présentLe héros existe déjà (s’il est mort, utilisez revive) ; cette boutique ne vend pas cet objet
89Boutique pas encore approvisionnéeEn début de partie, les objets arrivent selon le délai de mise en vente de la table des objets ; pour une boutique qu’on vient de construire, le compte démarre à la fin de la construction
1001Cible invisibleLa cible est dans le brouillard de guerre ou le masque noir ; faites un attack_move vers sa position

Accepté ≠ réussi

L’accusé de réception indique seulement que « le moteur a accepté la commande » ; il est relu dans la même frame. Il ne couvre pas ce qui peut se produire ensuite :

CommandePeut encore échouer après acceptationComment vérifier
ConstruireUn point en pleine forêt est lui aussi accepté sur le moment ; l’échec ne survient qu’à l’arrivée de l’ouvrierUtiliser build_near (qui vérifie que les fondations apparaissent), ou attendre production.done
Lancer un sortSort interrompu, mana insuffisantAu tick suivant, vérifier que g.cooldown(u, sort) est bien en recharge
EntraînerPlacé en file, mais faute de nourriture ne démarre jamaisg.production(b).blocked
Déplacer / attaquerRemplacé par une autre logique (ou par une couche plus prioritaire)g.current_target(u), g.order_of(u)

Interfaces de requête

Ces interfaces ne donnent aucun ordre, elles ne font qu’interroger le moteur ; le résultat est placé dans le champ value de l’accusé de réception (le SDK renvoie directement la valeur) :

InterfaceRenvoie
g.can_do(u, code) / g.can_do_many([(u, code), ...])Le code de raison du tableau ci-dessus
g.tech(code, player=None) / g.tech_many([...])Niveau de recherche / nombre de bâtiments terminés (chaîne d’amélioration comprise)
g.visible(x, y)Ce point est-il visible pour votre camp
g.gold_left(mine)Quantité d’or restant dans la mine
g.enemy_ai_plan(unité_ennemie)Où le capitaine de l’IA de l’ordinateur compte emmener ses troupes (uniquement pour l’IA de l’ordinateur)