Главная › Моддинг › Проверка, упаковка и публикация мозга
Глава 11

Проверка, упаковка и публикация мозга

oa-tool brain pack и check, матч без графики и трассировка, проверка в Библиотеке и журнал места, тип oabrain в каталоге и как предложить пакет Core Prime.

Эта глава кратко пересказывает docs/brains/oabrain-standard.md, docs/brains/authoring.md и docs/playing-with-brains.md. Нормативный текст — в этих документах.

Упаковка и проверка

Мозг упаковывается и проверяется командами oa-tool brain pack и oa-tool brain check. oa-tool pack и oa-tool check — команды для .oamap и .oamod. Справка из руководства перечисляет три команды для мозгов:

oa-tool brain pack FOLDER [--out FILE] [--force]
    Pack a brain folder as a .oabrain.
oa-tool brain check FILE --game-dir DIR [--mod FOLDER] [--level LEVEL] [--side N] [--json]
    Load a brain against a game and report how it started.
oa-tool brain net MODEL.onnx --calibrate DATA [--out FILE] [--weights int8|int16] [--max-difference X] [--force] [--json]
    Convert an ONNX model to a .oann.

Упаковывайте снаружи папки. check загружает .oabrain или папку, в корне которой лежит oabrain.yaml, вместе с игрой. Он сажает мозг на плоскую временную карту и ни разу не продвигает этот матч на тик. Фаза, которая не выполнялась, отмечается как not run. Вот две команды из руководства для Steady Commander и отчёт, который за ними последовал:

build/oa-tool brain pack brains/examples/steady-commander --out /tmp/brain-scratch/steady-commander.oabrain
build/oa-tool brain check /tmp/brain-scratch/steady-commander.oabrain --game-dir "$OA_GAME_DIR"
brain: steady-commander 1.0 level easy
game: totala
mod: none
load: ok, 0 instructions
fits: ok, 0 instructions
start: ok, 15 instructions
lua: 1231655 bytes
networks: 0 bytes
result: ok

Проверка завершается с кодом 0. result: ok — это тот прогон. fits: ok — это fits скрипта, вернувший true. --json печатает один объект. --mod называет папку мода. --level выбирает id уровня, а если его не указать — первый уровень.

Что отклоняет pack

Без других параметров pack пишет id, дефис и версию с окончанием .oabrain. --force заменяет уже существующий файл. --game-dir в brain pack — ошибка использования. brain check принимает --game-dir. pack отклоняет сломанный манифест, файл вне структуры, Lua, который не является исходным кодом, сеть, байты которой не соответствуют дайджесту из манифеста, и значок, который не является квадратным PNG в пределах лимитов. Lua компилируется, но не запускается. Файл .oann хешируется, но не интерпретируется.

Матч без графики

--brain-match играет за два места компьютера. Каждое место — id установленного мозга, папка или builtin. Нужны --headless-check, --match-ticks и --brain-map. Матч Steady Commander против Classic из руководства выглядит так:

open-annihilation --skip-intro --mute --headless-check --game-dir "$OA_GAME_DIR" \
  --user-folder /tmp/brain-user --data-dir /tmp/brain-scratch/data \
  --brain-match brains/examples/steady-commander,brains/classic \
  --brain-levels medium,medium \
  --brain-map "Painted Desert" --seed 4242 --match-ticks 1800 \
  --brain-record /tmp/brain-scratch/record.txt

Он завершается с кодом 0. Каждая строка начинается с brain match. winner none и reason time означают, что у обоих мест ещё оставались юниты, когда тики закончились. В этом матче против Classic счётчик построенного у Steady Commander равен 6. status playing означает, что мозг всё ещё вызывался. Та же папка против встроенного игрока, где счётчик построенного у Steady Commander равен 7, — это прогон, трассировка которого показывает собственные приказы скрипта:

open-annihilation --skip-intro --mute --headless-check --game-dir "$OA_GAME_DIR" \
  --user-folder /tmp/brain-user --data-dir /tmp/brain-scratch/data \
  --brain-match brains/examples/steady-commander,builtin \
  --brain-levels medium,hard \
  --brain-map "Painted Desert" --seed 4242 --match-ticks 2400 \
  --brain-trace /tmp/brain-scratch/trace-play.txt \
  --brain-record /tmp/brain-scratch/record-play.txt

Трассировка

--brain-trace и --brain-record работают поверх матча. Обоим нужны --headless-check и --match-ticks. Трассировка матча со встроенным игроком начинается так:

brain log 1
tick 0 seat 0 brain
call fits
tick 0 seat 0 brain
call start

Таймер — это строка call timer. Место 1 в отчёте — это seat 0 в журнале. own-draw — это brain.random. Steady Commander никогда не вызывает brain.record, поэтому в его файле записи нет строк с образцами.

ПРОВЕРИТЬ С ЭТИМ МОДОМ и журнал

ПРОВЕРИТЬ С ЭТИМ МОДОМ — кнопка у установленного мозга в Библиотеке, которая появляется, когда задан вердикт. Она загружает эту копию и выполняет fits. Мозг на место она не сажает. Во время игры и пока идёт проверка кнопка недоступна.

Приложение пишет журнал места в logs/brains/seat- плюс индекс игрока, увеличенный на единицу, в папке данных учётной записи. Для каждого мозга, который садится на это место, файл начинается заново. Первая строка — название из манифеста, версия, id, уровень, место и зерно матча. Каждая напечатанная строка дописывается как тик и текст. Файл ограничен 1 МиБ.

Тип oabrain в каталоге

В каталоге Core Prime тип пакета — oabrain. Пакет устанавливается в Brains/, в папку с его id. Игра, которая не знает тип из каталога, пропускает эту запись, поэтому старая игра такой пакет не показывает. Раздел AI Enhancements на этом сайте остаётся с пометкой «скоро», пока каталог не начнёт отдавать этот тип.

Предложите его Core Prime

Библиотека контента Core Prime публикуется с машины сопровождающего: каталог подписывается ключом, который никогда её не покидает. Чтобы мозг попал в список:

  1. Откройте issue в репозитории Open Annihilation, приложите .oabrain (или ссылку на него) и укажите автора и лицензию.
  2. Сопровождающий запускает проверки на папке игры и добавляет пакет в записи библиотеки.
  3. Следующая публикация загружает файл по его хешу, подписывает новый каталог и увеличивает его порядковый номер.
  4. Через несколько минут он появится в Библиотеке у каждого игрока, а когда этот сайт начнёт показывать этот тип, — и здесь.

Набор карт, мод или мутатор предлагаются так же. Подробнее — в главе Публикация в Core Prime.