Docs Referencia

Recibos y códigos de motivo

El recibo de cada comando incluye un código de estado y un código de motivo. Son la base para que Bots y agentes se corrijan solos: convierten "por qué no se hizo" en un número legible por máquina.

r = g.train(barracks, "hfoo")
bool(r)        # False
r.status       # 1              -> rejected
r.verdict      # 3              -> comida insuficiente
r.reason       # 'rejected(人口不够)'
r.exec_us      # microsegundos que tardó en ejecutarse en el hilo del juego

if r: equivale a r.status == 0 (el motor lo aceptó).

Códigos de estado status

CódigoNombreSignificadoCausas habituales
0acceptedEl motor lo aceptó— (pero aceptado ≠ hecho; ver abajo)
1rejectedEl motor lo rechazóMira verdict
2bad_unitLa unidad no existe o el handle no coincideLa unidad ya murió; usaste un objeto de unidad caducado
3not_ownerNo es tu unidadMandar unidades ajenas con el rol player
4faultExcepción durante la ejecución (el runtime la contuvo; no tumba el juego)Repórtalo con los pasos para reproducirlo
5bad_argsParámetros incorrectosCoordenadas, índice de casilla o código de cuatro caracteres mal escritos
6unsupportedNo soportadoEsta versión del runtime no tiene esa capacidad
7bad_targetObjetivo no válidoEl objetivo ya no existe; el tipo de objetivo no es el correcto
8forbiddenEl rol del carril no lo permiteDar órdenes con el rol observer
97cancelledSe lanzó una excepción dentro del bloque de lote y no se envió nada del loteEl código dentro de with g.batch(): dio error
98heldUna capa de mayor prioridad retiene la unidad y no se envióLa capa de reflejos del cerebro de referencia o las órdenes manuales de la consola tienen esa unidad
99timeoutTiempo agotadoCon el juego en pausa o atascado se superó el plazo (los comandos caducados no se ejecutan)

Códigos de motivo verdict

Cuando hay un rechazo, el runtime explica el motivo con la propia comprobación de viabilidad del motor. También puedes preguntar antes, sin dar la orden: g.can_do(unidad, código) devuelve los mismos códigos.

CódigoSignificadoQué hacer
0 / 220Se puede—
3Comida insuficienteConstruye edificios de comida; g.production(b).blocked lo detecta antes
8Oro insuficienteEspera a tener oro; antes de ordenar, usa g.can_afford(code)
9Madera insuficienteManda más trabajadores a talar
32Cola de entrenamiento llena (7 huecos)Solo 1 en la cola: pon el siguiente cuando g.queue(b) esté vacía
183Falta una tecnología / edificio previoConstruye primero el edificio necesario o sube de tier
185Edificio ocupadoEl altar está reviviendo a un héroe; el ayuntamiento no puede mejorarse con la cola ocupada
221No existe / en construcción / mejorándose / ya existeYa tienes ese héroe (si murió, usa revive); esta tienda no vende eso
89La tienda aún no tiene existenciasAl inicio de la partida, cada objeto aparece según su tiempo de reposición en la tabla de objetos; en una tienda recién construida, se cuenta desde que se termina
1001Objetivo no visibleEl objetivo está en la niebla o en la máscara negra; usa attack_move hacia su posición

Aceptado ≠ hecho

El recibo solo indica que “el motor aceptó el comando” y se lee en el mismo fotograma. No cubre lo que pueda pasar después:

ComandoPuede fallar aunque se haya aceptadoCómo confirmarlo
ConstruirUn punto dentro de un bosque también se acepta al momento; falla cuando llega el trabajadorUsa build_near (comprueba si aparecen los cimientos) o espera a production.done
HechizoLo interrumpen o falta manáEn el siguiente tick, comprueba si g.cooldown(u, habilidad) ha entrado en enfriamiento
EntrenarEntra en la cola, pero sin comida nunca empiezag.production(b).blocked
Mover / atacarOtra lógica (o una capa de mayor prioridad) lo cambiag.current_target(u), g.order_of(u)

Interfaces de consulta

Estas interfaces no dan órdenes; solo preguntan al motor. El resultado también va en el value del recibo (el SDK devuelve el valor directamente):

InterfazDevuelve
g.can_do(u, code) / g.can_do_many([(u, code), ...])Los códigos de motivo de la tabla anterior
g.tech(code, player=None) / g.tech_many([...])Nivel de investigación / número de edificios terminados (cuenta la cadena de mejoras)
g.visible(x, y)Si tu bando ve ese punto
g.gold_left(mine)Cuánto oro le queda a la mina
g.enemy_ai_plan(unidad_enemiga)Adónde va a llevar sus tropas el capitán de la IA rival (solo funciona con la IA del juego)