Modding Info
A map pack is one .oamap file, a mod is one .oamod file, a mutator is one .oamut file, and a brain is one .oabrain file: a zip with a manifest at the top. The game validates the manifest, installs the package by its id, and plays it by its declared rules. This guide takes you from a folder to a catalogue release, and every chapter links to the standard it summarises in the engine's own docs.
From a folder to a player's gameinteractive flow map
Anatomy of a map pack
The .oamap zip, its oamap.yaml manifest, the map index the packer writes, and how a map's size and features decide whether it fits a game.
GitHub ·docs/maps/oamap-standard.md02Anatomy of a mod
The .oamod zip and the profile oamod.yaml: identity, layout, limits, data keys, script extensions and the standard hacks it turns on.
GitHub ·docs/mods/oamod-standard.md03Make a mutator
A small .oamut layered over the base game or any mod: the folder, the manifest, the plan mutate returns, options, the sandbox and the order a stack applies.
GitHub ·docs/mutators/oamut-standard.md04Lua examples
Six working scripts from real packages: one rule, scaling with caps, a side, a units hook that can refuse the game, a features hook, and a files plan with layered folders.
GitHub ·docs/mutators/oamut-standard.md#61-the-lua-forms05Port a legacy mutator
KroggyComm 1.1 from its archives to a package, and a TA: Mutation rule file kept with sm or rewritten as Lua.
GitHub ·docs/mutators/authoring.md#15-importing-a-ta-mutation-mutator06Check, pack and publish
oa-tool mutator check and pack, a dry run, what the catalogue page shows, the icon, and how to offer the package to Core Prime.
GitHub ·docs/mutators/authoring.md#1-a-first-mutator07Make a brain
A .oabrain that plays one computer seat: the folder, every manifest key, the tags, levels, full awareness, where the script runs, the budgets, and what happens when it stops.
GitHub ·docs/brains/oabrain-standard.md08The brain's Lua
Steady Commander's manifest and script, the hooks, what a brain may know and do, numbers, random draws, timers and chat.
GitHub ·docs/brains/oabrain-standard.md#7-what-a-brain-may-know09Classic, a worked example
The built-in computer player written in Lua: its files, the task table, one task, the quirk notes, what stays in the engine, and how the same orders are proven.
GitHub ·docs/brains/authoring.md#13-classic-a-walkthrough10Learned networks
Why a brain might ship a .oann, integer arithmetic, the layers, running one, oa-tool brain net, the limits, and what the Library shows.
GitHub ·docs/brains/oabrain-standard.md#9-neural-networks11Check, pack and publish a brain
oa-tool brain pack and check, a headless match and a trace, the Library's check and the seat log, the catalogue's oabrain kind, and how to offer the package to Core Prime.
GitHub ·docs/brains/authoring.md#11-testing12Standard hacks
The documented rules a profile may switch on, each with its key, values and the behaviour it came from. Simulation hacks must agree between players.
GitHub ·docs/mods/standard-hacks13Script extensions
The values a profile can give a mod's unit scripts, such as a unit's kill count or its owner's alliances, with how a COB script reads each.
GitHub ·docs/mods/script-extensions14Versions and releases
Your version is free text and never ordered. packaging.revision rises with each repack; the catalogue numbers releases. Never reuse a version and revision with different bytes.
GitHub ·docs/mods/oamod-standard.md#47-catalogue-releases15Publishing to Core Prime
Checking a package, offering it to the content library, how a release appears in the catalogue and in every player's Library, and how to run a registry of your own.
GitHub ·docs/registriesQuick start: a map pack
# one folder, your maps inside, a manifest at the top 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} # validate and pack; the index is written for you $ oa-tool pack my-maps/ -o my-maps.oamap
Quick start: a mod
# a mod that raises the unit limit and turns on two shared rules 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 # everything the file leaves out plays as 3.1c $ oa-tool pack small-mod/ -o small-mod.oamod
Quick start: a mutator
# Commander Radar, by Drinken: one folder, the manifest at the top commander-radar/ oamut.yaml mutator.lua # mutator.lua: one rule; the radar option picks the distance 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 # pack from outside the folder, then check the .oamut $ oa-tool mutator pack commander-radar $ oa-tool mutator check commander-radar-1.oamut
Quick start: a brain
# Steady Commander: one folder, the manifest at the top 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: - "*" # pack the folder, then check the .oabrain against a game $ 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"