AshForge Mod Kit · Definitions · the whole lane, one course
Sixteen categories, one form,
and four that go nowhere.
The half of the Mod Kit that reaches the game without a single mesh. Sixteen categories share one editor, a typed reference that does not resolve fails the whole definition, and four of the categories you can author are never read by the exporter at all.
What it is
Data-driven editors for a mod's content — factions, weapons, items, biomes, terrain and eleven more — all writing JSON into your mod's definitions/ folder.
Modules 1–4 are the workspace, 5–10 are typed references, 11–16 are what actually ships.
The two that cost you
⛔ An unresolved name fails the whole dec, not the field. And a recipe's skill defaults to a value the game does not have.
Modules 5 onward. The untouched default is the broken case, which is the opposite of the usual arrangement.
This lane is 16 things worth knowing, not three escalating tiers. The old split implied the later material needed the earlier and it does not — read straight through, or jump to the module that matches your problem. The Mod Kit's other lanes are separate courses.
The shape of it
Sixteen categories, one machine
Left is the category list and the entries in the one you picked. Centre is that
entry's form. Every category writes its own JSON file into the mod's definitions/
folder.
| Category | File | Category | File |
|---|---|---|---|
| Mod | about.json | Research | research.json |
| Factions | factions.json | Recipes | recipes.json |
| Weapons | weapons.json | Resources | resources.json |
| Items | items.json | Status Effects | status_effects.json |
| Quests | quests.json | Events | events.json |
| Vehicles | vehicles.json | Terrain | terrain.json |
| Equipment | equipment.json | Biomes | biomes.json |
| Buildings | buildings.json | Characters | characters.json |
Verified: sixteen categories, sixteen distinct files, no two sharing one. That matters more than it sounds, because each category is described by a small record — its file, how to count its entries, how to name one, how to create, duplicate, delete and load — and the list, selection and auto-save machinery around that record is shared.
So the workspace is not sixteen editors that happen to look alike. It is one editor being handed sixteen descriptions. Learn the interaction once and the only thing that changes between factions and biomes is which fields are on the form.
The exception
The one that is different
Fifteen categories are lists — many factions, many weapons. One is not.
Mod is a singleton: your mod has exactly one identity, so the category shows a form with no entry list beside it. There is nothing to create, duplicate or delete, and the workspace's whole left-hand column simply does not apply to it.
It is also the one category the workspace marks not editable here. Your mod's name, id and version are set where the mod is created rather than typed into this form — the workspace shows them so you can confirm which mod you are editing, not so you can rename it mid-session.
The one trap
Open the mod first
The workspace does not refuse to work when no mod is open. It works, and it saves somewhere else.
| Header says | Where your work goes |
|---|---|
Editing mod: MyMod | Into the mod, at MyMod/definitions/. Correct. |
No active mod — saving to user://definitions |
Into a folder outside any mod, which no exporter reads. |
Verified against the running workspace: a freshly opened Definitions workspace has no active mod and reports exactly that string. Nothing is lost — the JSON is written and it is still there next time — but it is not in your mod, so it will not be exported, packaged or seen by any other tool in the suite.
This is the same shape of problem the other tools have with user:// destinations,
and it has the same one-line fix: open the mod before you author anything. The header at
the top of the workspace tells you which case you are in, always, in plain words.
definitions/. Copy them into your
mod's own definitions/ folder — the format is identical, because it is the
same writer. Nothing needs converting.Persistence
Saving, and what it saves
There is no Save button to hunt for. Editing a field starts a timer; when the timer fires, the active category is written.
| Behaviour | Verified |
|---|---|
| Delay | 0.6 seconds after the last edit. |
| Repeated typing | One-shot — each keystroke restarts the timer, so a burst costs one write. |
| Before any edit | The timer is idle; nothing is pending. |
| An edit | Starts the timer. Does not write yet. |
| A flush with nothing pending | Does nothing at all. |
| What a write covers | The active category only. |
The debounce is the right design — without it, typing a description would rewrite the file on every character — but be clear about what it means: the form is not the file until the timer fires. If the application dies inside that 0.6-second window, the last edit was never written.
The workspace protects you at the obvious seams: switching category flushes anything pending first, so moving from Weapons to Items does not strand a half-second of typing. What it cannot protect you from is closing the lid mid-sentence.
The rule
What a typed reference costs
The game's definitions refer to each other by name, and it resolves those names when it loads. There is no fallback and no partial load.
The adapter states the consequence plainly in its own report: an unresolved name fails the whole dec. Not the field — the definition. A biome whose animal list contains one typo does not load with three of its four animals; it does not load.
This is why the adapter would rather remap or drop a reference it cannot vouch for, and
write down that it did, than pass your text through and let the game reject the result. Every
line in UNMAPPED.txt is a place it made that choice for you.
The trap
The default that doesn't exist
A recipe has a required crafting skill. It is a reference to one of the game's skill definitions, and its default value is not one of them.
The field defaults to "Crafting", which reads like exactly the right answer and
is the one word the game does not use. Its twelve skills include Mechanics, Cooking, Tailoring,
Melee and Research — but nothing named Crafting.
So a recipe you created and never thought about carries a dangling reference from birth. The adapter does not ship it: it remaps to Mechanics so a colonist will actually pick up the bill, and records the substitution. But it is worth knowing that the untouched default is the broken case, which is the opposite of the usual arrangement.
Recipes
Three skills do the work
Twelve skills exist. Three of them have a task worker that will pick up a crafting bill.
| Skill | Speed stat | Will a colonist work the bill? |
|---|---|---|
| Mechanics | CraftingSpeed | Yes |
| Cooking | CookingSpeed | Yes |
| Tailoring | TailoringSpeed | Yes |
| Any of the other nine | — | No. The bill is listed at the station and never crafted. |
This is the nastiest failure on the page because it is not an error anywhere. The dec loads. The recipe appears. The workbench shows the bill. Nobody ever works it, because the three task workers each dispatch on one exact skill and no other — so a recipe attached to Construction or Medicine is a permanently pending job.
The adapter's remap exists precisely to stop this reaching a player, and it says so in the report: mapped to Mechanics so a colonist will actually work the bill.
Terrain
Atlases and costs
Terrain is the most data-only category there is — a label, a fertility, a couple of texture paths — and it carries two typed references.
| Field | What it must name |
|---|---|
| Atlas | One of three: Natural, Artificial, Roofing. Blank defaults to Natural. |
| Build category | One of the game's eleven. |
And one behaviour that is not a reference at all but catches people the same way:
IsBuildable is derived from the build costs alone. Terrain with build
settings but no costs is treated as natural ground that nobody can build — so the
category, work and icon you filled in are left out rather than emitted as a build that could
never start.
Two more things the adapter will substitute silently unless you look: a terrain with no texture of its own draws with the base game's soil, and one with no edge mask meets the world on borrowed edges. Both load and render perfectly. Both look like ordinary dirt.
Collisions
One namespace for every dec
The workspace keeps names unique within a category. The game's namespace is wider than that.
An item called Hammer and a weapon called Hammer are two obviously different
things to you, and the bundle is right not to complain — it only refuses duplicates
inside one category. But a weapon definition is a kind of item definition to the game,
both reduce to the dec name Hammer, and the game ends up with two definitions
answering to one name.
★ The other half of this is slugging. Names become dec names by being reduced to a safe
form, so "Iron Bar" and "Iron-Bar" are two entries you can happily
create in two rows of the same list — and one dec. The collision is created by the
conversion, which is why the adapter checks for it by reading back what it wrote rather
than by inspecting what you authored.
Biomes
Biomes name everything
A biome is almost entirely references: which ground it uses, which plants and rocks grow on it, which animals live there, and in what proportions.
The probe biome exported for this page names three terrain, three plant, two rock and two
animal definitions. Every one must already exist — in the game, or in your mod
— and a single unresolved key fails the entire BiomeDec at load. A biome is
therefore the category where a typo costs the most, because it is the category with the most
names in it.
⚠ And one hard limit worth knowing before you plan around it: a mod cannot practically ship its own animal. A concrete agent needs a rigged model, a named animation tree and a per-bone collider skeleton — so the animals in your biome should be base-game names. The plants, rocks and terrain are yours to make; the wildlife is borrowed.
The map
The ledger
Every category you can author meets one of three fates.
| Fate | Categories |
|---|---|
Becomes its own Decs/ file |
Factions, Weapons, Items, Buildings, Characters, Research, Resources, Terrain, Biomes, Sounds |
| Folded into another | Recipes → the crafting on items · Equipment → character loadouts |
| Never read | Quests · Vehicles · Status Effects · Events |
⚠ The export does not land in your mod. It is written under the application's own user
data, at export/aoa/<ModId>/ — on the machine this page was written on that
resolved to ~/.local/share/godot/app_userdata/AshForge/export/aoa/ExportProbe. That
is where UNMAPPED.txt is too, so "read the report after every export" means going
there and not into your mod folder.
The probe export written for this page produced eleven XML files — the ten
categories above plus a Tags.xml the adapter derives rather than takes from you
— alongside mod.json, an Assets/ folder and
UNMAPPED.txt.
The Mod category is the sixteenth and does not appear in that table because it is not
content: it becomes mod.json, the identity block the loader reads.
The gap
The four that go nowhere
Quests, Vehicles, Status Effects and Events are authorable, saveable, previewable — and never consumed.
This is not an oversight in the adapter so much as a fact about the game: there is no counterpart among its definition types for a quest, a status effect or a scripted event. Those are behaviour, and behaviour arrives in a mod as compiled code, not as data. The suite reached the same conclusion independently when it triaged which tools could reach the game at all.
Vehicles sit slightly differently — there is nothing conceptually impossible about them — but the adapter has no mapping today, and a category with no mapping and no warning is indistinguishable from one that will never work. Treat all four the same way until told otherwise.
Indirection
Folded, not lost
Two categories produce no file of their own and still reach the game, because the game models them as part of something else.
| Category | Where it ends up | What you lose |
|---|---|---|
| Recipes | The crafting attached to the output item. | Its description — the game builds a bill's label from the output item, and an item's recipe has no description field. |
| Equipment | An index of character loadouts. | Only equipment your mod actually emits can be tagged; anything else is a base-game reference. |
Both are correct modelling rather than compromise. A recipe in this game is not a free-standing object — it is a property of the thing produced — so emitting a separate recipe definition would be inventing a concept the game does not have.
The practical consequence is small but real: time spent writing recipe descriptions is time wasted, and equipment that exists only in your head rather than in your Items list cannot be handed to a character.
Weapons
What a weapon loses
The weapon form has a Damage field and a firing rate. For a ranged weapon, neither reaches the game.
★★ A ranged weapon's damage lives in its ammunition's projectile, not on the weapon. The probe sidearm is chambered for the base game's handgun ammunition, and that is where its damage comes from — so the bundle's damage of 12 has, in the adapter's own words, nowhere to go.
Firing rate is the same story told differently: the game models a burst count and a cycle time, not a rate, so a single rate number cannot be translated into it without inventing one of the two.
This is worth internalising because the form does not hint at it. You can tune a ranged weapon's damage all afternoon in the Mod Kit and change nothing in the game. What you can change is which ammunition it is chambered for.
Characters
What a character loses
A character definition becomes an archetype and a group. An archetype decides what a spawned human wears and carries — and nothing else.
| You authored | What happens |
|---|---|
| Loadout, faction | Carried. This is what an archetype is for. |
| Health, move speed | Cannot be carried. Those belong to the human agent the game already ships, not to an archetype. |
| Party size | Invented. A character definition has no field for it, so the adapter takes numbers from the two groups the game ships. |
| Anything spawning them | Nothing does, yet. The game reaches a group through a world-event worker or a map spawn table. |
That last row is the one to plan around. Your raiders exist, they are correctly equipped, they belong to a faction — and no code path brings them into a game. The game ships one event to copy, which is an assembly, not a definition. So a character in the Mod Kit is content waiting for behaviour, exactly like the four categories in lesson 02.
Shipping
What blocks a release
The export always succeeds. That is not the same as the mod being releasable.
The probe export ends with a line that is not a warning but a refusal: one shipped asset had no origin record and cannot be cleared for release. Signing will not accept a mod it cannot account for, so every asset needs a small origin file in the folder it was downloaded into. An export with unaccounted assets is a mod that will package and never sign.
Alongside that sit the placeholders — substitutions made so your definitions load and render at all. Items and buildings with no model of their own get the base game's wood mesh; research nodes and items with no icon get a stock one, and an item with no icon loads but never draws. ⚠ And one that is a limitation rather than a placeholder: a modded mesh cannot be textured yet, because the material is applied as an override and the loader answers a mod-owned material with a flat colour.
UNMAPPED.txt top to bottom. It is generated from the
adapter's own tables, it names each definition and what it lost, and it is the only place the
gap between what you authored and what ships is written down.Course complete
What you now know
Check yourself
- Sixteen categories, each writing its own JSON file into the mod's
definitions/folder, with no two sharing a file. - They share one list/selection/save machine — learn the workspace once and every category behaves the same.
- Mod /
about.jsonis the singleton: one identity, no entry list, and not editable here. - With no mod open the workspace still saves, to
user://definitions, where nothing else in the suite will look. Open the mod first. - Saving is a 0.6-second one-shot debounce, not a button — and a write covers the active category only.
- Switching category flushes what is pending, so the seams are safe.
- A typed reference is a name the game resolves at load, and an unresolved one fails the whole dec — not the field.
- A recipe's skill defaults to "Crafting", which the game does not have. The untouched default is the broken case.
- Only Mechanics, Cooking and Tailoring have a task worker. Any other skill leaves the bill listed and never worked — with no error anywhere.
- Terrain names one of three atlases and one of eleven build categories, and
IsBuildablecomes from the costs alone. - Missing terrain textures and edge masks are silently replaced with base-game ones — it loads, and it looks like dirt.
- Dec names are one namespace across every category, and slugging can collide two names that looked different in the form.
- A biome is mostly references; one bad key fails all of it. And animals must be base-game names.
- Read
UNMAPPED.txtafter every export. - Ten categories become their own
Decs/file; the export also derives aTags.xml, and Mod becomesmod.json. - Recipes fold into items and Equipment folds into character loadouts — correct modelling, not compromise. Recipe descriptions are discarded.
- Quests, Vehicles, Status Effects and Events are never read. Those are behaviour, and behaviour ships as an assembly.
- A ranged weapon's damage lives in its ammunition, and firing rate is a burst count plus a cycle time. Tuning those fields changes nothing.
- A character becomes an archetype: loadout yes, health and move speed no, party size invented, and nothing spawns the group yet.
- An asset with no origin record cannot be signed, and placeholders are substituted silently so things load.
- The harness proves the adapter runs and writes well-formed XML. Conformance against the installed game is a separate check, and it skips where the game is absent.
That is the definitions lane. ⛔ Ten categories become their own Decs/ file, two fold into others, and Quests, Vehicles, Status Effects and Events are never read — those are behaviour, and behaviour ships as an assembly.
