Docs Referência

Recibos e códigos de motivo

O recibo de cada comando traz um código de status e um código de motivo. Eles são a base para Bots e agentes se corrigirem sozinhos: transformam “por que não deu certo” em um número legível por máquina.

r = g.train(barracks, "hfoo")
bool(r)        # False
r.status       # 1              -> rejected
r.verdict      # 3              -> comida insuficiente
r.reason       # 'rejected(人口不够)'  (= comida insuficiente)
r.exec_us      # quantos microssegundos este comando levou na thread do jogo

if r: equivale a r.status == 0 (o motor aceitou).

Código de status status

CódigoNomeSignificadoCausas comuns
0acceptedO motor aceitou— (mas aceito ≠ concluído; veja abaixo)
1rejectedRejeitado pelo motorVeja verdict
2bad_unitA unidade não existe ou o handle não confereA unidade já morreu; objeto de unidade desatualizado
3not_ownerNão é sua unidadeComandar unidades de outro jogador com a identidade player
4faultExceção durante a execução (o runtime contém o erro; o jogo não cai)Relate com os passos para reproduzir
5bad_argsParâmetro erradoCoordenada, índice de slot ou código de quatro caracteres errado
6unsupportedNão suportadoEsta versão do runtime não tem essa capacidade
7bad_targetAlvo inválidoO alvo já sumiu; tipo de alvo errado
8forbiddenO papel da via não permiteDar ordens com a identidade observer
97cancelledExceção dentro do bloco de lote; o lote inteiro não foi enviadoErro no código dentro do bloco with g.batch():
98heldA unidade está presa por uma camada de prioridade maior; o comando não foi enviadoA camada reflexa do cérebro de referência ou uma ordem manual do console está segurando a unidade
99timeoutTempo esgotadoCom o jogo pausado / travando, o prazo passou (comandos vencidos não são executados depois)

Código de motivo verdict

Quando um comando é rejeitado, o runtime usa a própria verificação de viabilidade do motor para explicar o motivo. Você também pode perguntar antes, sem dar a ordem: g.can_do(unidade, código) retorna o mesmo código.

CódigoSignificadoO que fazer
0 / 220Pode—
3Comida insuficienteErga construções de comida; use g.production(b).blocked para perceber antes
8Ouro insuficienteEspere o dinheiro; antes de dar a ordem, use g.can_afford(code)
9Madeira insuficienteMande mais gente cortar madeira
32Fila de treino cheia (7 vagas)Deixe só 1 na fila: coloque o próximo quando g.queue(b) esvaziar
183Falta tecnologia / construção pré-requisitoConstrua o pré-requisito primeiro, suba de tier
185Construção ocupadaO altar está revivendo um herói; o edifício principal não pode ser melhorado enquanto a fila estiver ocupada
221Item inexistente / em construção / em melhoria / já existeO herói já existe (se morreu, use revive); esta loja não vende isso
89A loja ainda não tem estoqueNo início, o item só aparece após o tempo de estoque da tabela de itens; numa loja recém-construída, a contagem começa quando ela fica pronta
1001Alvo não visívelO alvo está na névoa de guerra ou na máscara preta; use attack_move na posição dele

Aceito ≠ concluído

O recibo só diz que “o motor aceitou o comando”, lido de volta no mesmo frame. O que acontece depois está fora do alcance dele:

ComandoPode falhar mesmo depois de aceitoComo confirmar
ConstruirUm ponto numa floresta também é aceito na hora; a falha só vem quando o trabalhador chegaUse build_near (acompanha se a fundação aparece) ou espere production.done
Lançar feitiçoInterrompido, sem manaNo tick seguinte, veja se g.cooldown(u, habilidade) entrou em recarga
TreinarEntra na fila, mas falta comida e nunca começag.production(b).blocked
Mover / atacarAlterado por outra lógica (ou por uma camada de prioridade maior)g.current_target(u), g.order_of(u)

APIs de consulta

As APIs abaixo não dão ordens, só consultam o motor; o resultado também vai no value do recibo (o SDK retorna o valor direto):

APIRetorna
g.can_do(u, code) / g.can_do_many([(u, code), ...])O código de motivo da tabela acima
g.tech(code, player=None) / g.tech_many([...])Nível de pesquisa / número de construções prontas (incluindo a cadeia de melhorias)
g.visible(x, y)Se este ponto está visível para o seu lado
g.gold_left(mine)Quanto ouro resta na mina
g.enemy_ai_plan(tropa_inimiga)Para onde o capitão do computador vai levar as tropas (só vale para a IA do computador)