На этой странице
Документация Справочник

Квитанции и коды причин

Квитанция каждой команды содержит код статуса и код причины. На них опирается самокоррекция ботов и агентов: «почему не получилось» превращается в машиночитаемое число.

r = g.train(barracks, "hfoo")
bool(r)        # False
r.status       # 1              -> rejected
r.verdict      # 3              -> не хватает пищи
r.reason       # 'rejected(人口不够)'   (= «не хватает пищи»)
r.exec_us      # сколько микросекунд команда выполнялась в игровом потоке

if r: эквивалентно r.status == 0 (движок принял команду).

Код статуса status

КодИмяЗначениеТипичная причина
0acceptedДвижок принял команду— (но «принята» ≠ «выполнена», см. ниже)
1rejectedДвижок отклонил командуСмотрите verdict
2bad_unitЮнита нет или дескриптор не совпадаетЮнит уже погиб; использован устаревший объект юнита
3not_ownerЭто не ваш юнитКомандуете чужим юнитом от имени player
4faultИсключение при выполнении (рантайм его перехватил, игра не упадёт)Сообщите нам, приложив шаги воспроизведения
5bad_argsНеверные аргументыОшибка в координатах, номере ячейки или четырёхсимвольном коде
6unsupportedНе поддерживаетсяВ этой версии рантайма нет такой возможности
7bad_targetНедопустимая цельЦели уже нет; неподходящий тип цели
8forbiddenРоль полосы этого не позволяетПриказ от имени observer
97cancelledВ блоке пачки возникло исключение, вся пачка не отправленаОшибка в коде внутри блока with g.batch():
98heldЮнита удерживает слой с более высоким приоритетом, команда не отправленаЭтого юнита держит рефлекторный слой эталонного мозга или ручной приказ из консоли
99timeoutТайм-аутИгра на паузе или подвисла, и дедлайн истёк (просроченные команды уже не выполняются)

Код причины verdict

При отклонении рантайм объясняет причину с помощью собственной проверки выполнимости движка. Можно и не отдавать приказ, а сначала спросить: g.can_do(юнит, код) возвращает те же коды.

КодЗначениеЧто делать
0 / 220Можно—
3Не хватает пищиПостройте здание для пищи; g.production(b).blocked покажет проблему заранее
8Не хватает золотаПодождите; перед приказом проверяйте g.can_afford(code)
9Не хватает древесиныОтправьте больше рабочих на лес
32Очередь тренировки заполнена (7 мест)Держите в очереди 1 юнит: ставьте следующего, когда g.queue(b) опустеет
183Нет требуемой технологии / зданияСначала постройте требуемое здание или перейдите на следующий тир
185Здание занятоАлтарь воскрешает героя; главное здание нельзя улучшить, пока его очередь не пуста
221Такого пункта нет / строится / улучшается / уже существуетГерой уже есть (погибшего нужно revive); этот магазин такое не продаёт
89Товар ещё не поступил в магазинВ начале матча товары появляются по времени из таблицы предметов; у только что построенного магазина отсчёт идёт с момента завершения постройки
1001Цель не виднаЦель в тумане войны или под чёрной маской; сделайте attack_move в её позицию

«Принята» ≠ «выполнена»

Квитанция лишь сообщает, что «движок принял команду», и считывается в том же кадре. Что произойдёт потом, она не отражает:

КомандаЧто может сорваться уже после принятияКак проверить
СтроительствоТочку в лесу движок тоже сразу принимает, а срывается всё, когда рабочий дойдёт до местаИспользуйте build_near (он следит, появился ли фундамент) или ждите production.done
Применение способностиПрервали, не хватило маныНа следующем тике проверьте, ушла ли способность на перезарядку: g.cooldown(u, способность)
ТренировкаВстала в очередь, но пищи не хватает, и она не начинаетсяg.production(b).blocked
Движение / атакаПеребита другой логикой (или слоем с более высоким приоритетом)g.current_target(u), g.order_of(u)

Методы-запросы

Эти методы не отдают приказов, а только спрашивают движок; результат тоже кладётся в поле value квитанции (SDK возвращает само значение):

МетодВозвращает
g.can_do(u, code) / g.can_do_many([(u, code), ...])Код причины из таблицы выше
g.tech(code, player=None) / g.tech_many([...])Уровень исследования / число построенных зданий (с учётом цепочки улучшений)
g.visible(x, y)Видна ли эта точка нашей стороне
g.gold_left(mine)Сколько золота осталось в руднике
g.enemy_ai_plan(вражеский_юнит)Куда капитан компьютерного противника поведёт армию (работает только для компьютерного ИИ)