Docs Referenz

Quittungen & Reason-Codes

Jede Befehlsquittung enthält einen Statuscode und einen Reason-Code. Daran korrigieren sich Bots und Agents selbst: Aus „Warum hat es nicht geklappt?“ wird eine maschinenlesbare Zahl.

r = g.train(barracks, "hfoo")
bool(r)        # False
r.status       # 1              -> rejected
r.verdict      # 3              -> nicht genug Nahrung
r.reason       # 'rejected(人口不够)'   (= nicht genug Nahrung)
r.exec_us      # wie viele Mikrosekunden dieser Befehl auf dem Spiel-Thread lief

if r: entspricht r.status == 0 (von der Engine angenommen).

Statuscode status

CodeNameBedeutungHäufige Ursache
0acceptedVon der Engine angenommen— (aber angenommen ≠ erledigt, siehe unten)
1rejectedVon der Engine abgelehntsiehe verdict
2bad_unitEinheit existiert nicht oder Handle passt nichtEinheit ist schon tot; veraltetes Einheitenobjekt verwendet
3not_ownerNicht deine EinheitAls player fremde Einheiten befehligt
4faultAusnahme bei der Ausführung (von der Runtime abgefangen, das Spiel läuft weiter)Bitte mit Reproduktionsschritten melden
5bad_argsFalsche ArgumenteKoordinaten, Slot-Nummer oder Rawcode falsch
6unsupportedNicht unterstütztDiese Runtime-Version hat die Fähigkeit nicht
7bad_targetUngültiges ZielZiel existiert nicht mehr; falscher Zieltyp
8forbiddenRolle der Spur erlaubt das nichtBefehl als observer erteilt
97cancelledIm Batch-Block wurde eine Ausnahme geworfen, der ganze Batch wurde nicht gesendetFehler im Code innerhalb von with g.batch():
98heldEinheit wird von einer höher priorisierten Schicht gehalten, Befehl nicht gesendetDie Reflex-Schicht des Referenz-Brains oder ein manueller Befehl aus der Konsole hält die Einheit gerade
99timeoutZeitüberschreitungSpiel pausiert / hängt, Deadline überschritten (abgelaufene Befehle werden nicht mehr ausgeführt)

Reason-Code verdict

Bei einer Ablehnung nennt die Runtime den Grund anhand der engine-eigenen Machbarkeitsprüfung. Du kannst auch vorher fragen, statt direkt zu befehlen: g.can_do(unit, code) liefert dieselben Codes.

CodeBedeutungWas tun
0 / 220Möglich—
3Nicht genug NahrungNahrungsgebäude bauen; mit g.production(b).blocked früh erkennen
8Nicht genug GoldWarten; vor dem Befehl g.can_afford(code) prüfen
9Nicht genug HolzMehr Arbeiter ins Holz schicken
32Ausbildungswarteschlange voll (7 Plätze)Nur 1 Einheit einreihen: nachlegen, wenn g.queue(b) leer ist
183Voraussetzung (Technologie / Gebäude) fehltErst das vorausgesetzte Gebäude bauen, Tier-Up
185Gebäude beschäftigtDer Altar belebt gerade einen Helden wieder; das Hauptgebäude kann nicht aufwerten, solange seine Warteschlange nicht leer ist
221Nicht verfügbar / im Bau / in Aufwertung / existiert bereitsHeld existiert schon (ist er tot: revive); dieser Laden verkauft das nicht
89Laden hat die Ware noch nichtZu Spielbeginn gibt es Waren erst nach der Lagerzeit aus der Gegenstandstabelle; bei einem neu gebauten Laden zählt die Zeit ab Fertigstellung
1001Ziel nicht sichtbarZiel steht im Nebel oder in unerforschtem Gebiet; attack_move auf seine Position

Angenommen ≠ erledigt

Die Quittung sagt nur, dass die Engine den Befehl angenommen hat – sie wird im selben Frame zurückgelesen. Was danach passiert, erfasst sie nicht:

BefehlKann nach „angenommen“ noch scheiternSo prüfst du es
BauenEin Punkt im Wald wird sofort angenommen, scheitert aber erst, wenn der Arbeiter ankommtbuild_near verwenden (verfolgt, ob das Fundament erscheint), oder auf production.done warten
ZaubernUnterbrochen, kein ManaIm nächsten Tick prüfen, ob g.cooldown(u, ability) läuft
AusbildenIn der Warteschlange, aber zu wenig Nahrung – startet nieg.production(b).blocked
Bewegen / AngreifenVon anderer Logik (oder einer höher priorisierten Schicht) überschriebeng.current_target(u), g.order_of(u)

Abfrage-APIs

Diese APIs erteilen keine Befehle, sondern fragen nur die Engine; das Ergebnis steckt im value der Quittung (das SDK gibt den Wert direkt zurück):

APIRückgabe
g.can_do(u, code) / g.can_do_many([(u, code), ...])Reason-Code aus der Tabelle oben
g.tech(code, player=None) / g.tech_many([...])Forschungsstufe / Anzahl fertiger Gebäude (Aufwertungskette eingerechnet)
g.visible(x, y)Ob dieser Punkt für uns sichtbar ist
g.gold_left(mine)Restgold der Goldmine
g.enemy_ai_plan(enemy_unit)Wohin der Anführer des Computergegners seine Truppen führen will (nur bei Computer-KI)