首页 › 模组制作 › 检查、打包与发布大脑
第 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 的文件夹。它把大脑入座到一张平坦的替代地图上,并且从不推进那场对局的 tick。没有运行的阶段显示 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 选择一个级别标识,省略时用第一个级别。

pack 会拒绝什么

不加其他参数时,pack 写出标识、一个连字符和版本,以 .oabrain 结尾。--force 替换已经存在的文件。brain pack 上的 --game-dir 是用法错误。brain check 接受 --game-dir。pack 拒绝破损的清单、布局以外的文件、不是源码的 Lua、字节并非清单所点名摘要值的网络,以及不是限制之内的正方形 PNG 的图标。Lua 会被编译,不会运行。.oann 文件会被哈希,不会被解释。

一场无头对局

--brain-match 打两个电脑席位。每个席位是一个已安装的大脑标识、一个文件夹,或 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 表示 tick 数用尽时两个席位都还有单位。在那场对 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 是日志中的席位 0。own-draw 就是 brain.random。Steady Commander 从不调用 brain.record,所以它的记录文件没有样本行。

用此模组检查,以及日志

用此模组检查是资料库里已安装大脑上的一个按钮,在判定已经设置时显示。它加载那一份副本并运行 fits。它不让大脑入座。对局期间,以及检查正在运行时,它是关闭的。

应用把席位日志写在账户数据文件夹下的 logs/brains/seat- 再接上玩家索引加一。那里每入座一个大脑,文件就重新开始。第一行是清单名字、版本、标识、级别、席位和对局种子。打印出的一行按 tick 和文本追加。文件停在 1 MiB。

目录的 oabrain 类型

在 Core Prime 上,目录类型是 oabrain。包安装到 Brains/ 和标识。不认识某种目录类型的游戏会跳过那一条,因此较旧的游戏不会列出这个包。在目录开始提供这种类型之前,本站的 AI 增强一栏仍标为即将推出。

提交给 Core Prime

Core Prime 内容库由维护者的机器发布:目录用一把从不离开该机器的密钥签名。要让一个大脑被收录:

  1. 在 Open Annihilation 仓库开一个 issue,附上 .oabrain(或它的链接)、作者和许可证。
  2. 维护者对照游戏文件夹运行检查,并把它加入内容库的包记录。
  3. 下一次发布会按哈希上传文件,签署新目录并递增序号。
  4. 几分钟后,它就会出现在每位玩家的资料库里;一旦本站列出这种类型,也会出现在本站。

地图包、模组或变异器也按同样的方式提交。见 发布到 Core Prime。