模组制作 · 面向地图制作者、模组作者、变异器制作者和大脑作者

模组制作

地图包是一个 .oamap 文件,模组是一个 .oamod 文件,变异器是一个 .oamut 文件,大脑是一个 .oabrain 文件:顶层带清单的 zip。游戏校验清单,按标识安装包,并按其声明的规则运行。本指南带你从一个文件夹走到目录版本,每章都链接到引擎文档中它所概述的标准。

01

地图包的构成

.oamap 压缩包、它的 oamap.yaml 清单、打包工具写入的地图索引,以及地图的尺寸和要素如何决定它是否适配某个游戏。

GitHub · docs/maps/oamap-standard.md
02

模组的构成

.oamod 压缩包和 oamod.yaml 配置文件:身份、布局、上限、数据键、脚本扩展,以及它启用的标准规则。

GitHub · docs/mods/oamod-standard.md
03

制作变异器

叠在基础游戏或任意模组上的小型 .oamut:文件夹、清单、mutate 返回的计划、选项、沙箱,以及多个变异器叠加时的生效顺序。

GitHub · docs/mutators/oamut-standard.md
04

Lua 示例

来自真实包的六份可运行脚本:一条规则、带上限的缩放、按阵营、可以拒绝本局的单位钩子、地物钩子,以及分层文件夹的文件计划。

GitHub · docs/mutators/oamut-standard.md#61-the-lua-forms
05

移植旧变异器

把 KroggyComm 1.1 从原档案做成包,以及一份 TA: Mutation 规则文件:用 sm 原样保留,或改写成 Lua。

GitHub · docs/mutators/authoring.md#15-importing-a-ta-mutation-mutator
06

检查、打包与发布

oa-tool mutator check 与 pack、一次试运行、目录页显示什么、图标,以及如何把包提交给 Core Prime。

GitHub · docs/mutators/authoring.md#1-a-first-mutator
07

制作大脑

打一个电脑席位的 .oabrain:文件夹、每一条清单键、标签、级别、全图视野、脚本在何处运行、额度,以及它停下时会怎样。

GitHub · docs/brains/oabrain-standard.md
08

大脑的 Lua

Steady Commander 的清单和脚本、钩子、大脑可以知道和做到的事、数值、随机抽取、计时器和聊天。

GitHub · docs/brains/oabrain-standard.md#7-what-a-brain-may-know
09

Classic,一个完整实例

用 Lua 写成的内置电脑玩家:它的文件、任务表、一个任务、quirk 注记、留在引擎里的部分,以及同样的命令如何被证明。

GitHub · docs/brains/authoring.md#13-classic-a-walkthrough
10

学习得来的网络

大脑为何可能随包带上一个 .oann、整数运算、各层、运行一份、oa-tool brain net、各项限制,以及资料库显示什么。

GitHub · docs/brains/oabrain-standard.md#9-neural-networks
11

检查、打包与发布大脑

oa-tool brain pack 与 check、一场无头对局和一条跟踪、资料库的检查与席位日志、目录的 oabrain 类型,以及如何把包提交给 Core Prime。

GitHub · docs/brains/authoring.md#11-testing
12

标准规则

配置文件可以启用的已记录规则,每条都有键、取值及其来源行为。模拟规则必须在玩家之间一致。

GitHub · docs/mods/standard-hacks
13

脚本扩展

配置文件可提供给模组单位脚本的值,例如单位的击杀数或其所有者的同盟关系,以及 COB 脚本如何读取每一项。

GitHub · docs/mods/script-extensions
14

版本号与版本

你的版本号是自由文本,从不排序。packaging.revision 随每次重新打包递增;目录为版本编号。切勿用不同的字节重复使用同一版本号和修订号。

GitHub · docs/mods/oamod-standard.md#47-catalogue-releases
15

发布到 Core Prime

检查包、提交给内容库、版本如何出现在目录和每位玩家的资料库中,以及如何运行自己的注册表。

GitHub · docs/registries

快速上手:地图包

# 一个文件夹,里面是你的地图,顶层放清单
my-maps/
  oamap.yaml
  Ridge.tnt  Ridge.ota
  Long Lakes.tnt  Long Lakes.ota

# oamap.yaml
oamap: 1
id: my-maps
name: My Maps
version: "1.0"
author: {name: A. Mapper}
packaging: {revision: 1, date: 2026-10-18, packager: A. Mapper}

# 校验并打包;索引会自动写入
$ oa-tool pack my-maps/ -o my-maps.oamap

快速上手:模组

# 一个提高单位上限并启用两条共享规则的模组
oamod: 1
id: small-mod
name: Small Mod
version: "1.0"
author: {name: A. Modder}
packaging: {revision: 1, date: 2026-10-04, packager: A. Modder}

limits:
  units-per-player: {default: 500, max: 1000}

hacks:
  units.id-reuse-delay: true
  economy.deterministic-wind: true

# 文件未写的一切都按 3.1c 运行
$ oa-tool pack small-mod/ -o small-mod.oamod

快速上手:变异器

# Commander Radar,作者 Drinken:一个文件夹,清单放在顶层
commander-radar/
  oamut.yaml
  mutator.lua

# mutator.lua:一条规则;选项 radar 决定范围
function mutate(ctx)
  local distance = ctx.options.radar == "none" and 0 or 2880
  return {
    rules = {
      where { commander = 1, bmcode = 1 }:change {
        radardistance = set(distance),
      },
    },
  }
end

# 在文件夹外打包,再检查 .oamut
$ oa-tool mutator pack commander-radar
$ oa-tool mutator check commander-radar-1.oamut

快速上手:大脑

# Steady Commander:一个文件夹,清单放在顶层
steady-commander/
  oabrain.yaml
  brain.lua

# oabrain.yaml
oabrain: 1
id: steady-commander
name: Steady Commander
version: "1.0"
author:
  name: Ridge Workshop
description: "Builds a little economy, then a factory, and sends a squad when it is ready."
tags:
  - economy
  - teaching
works-with:
  - "*"

# 打包这个文件夹,再对照一个游戏检查 .oabrain
$ 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"