Top level, meta, mods, and start The outside of the document: what identifies it, what it layers on, and where play begins.
Play has to begin somewhere start.startingDungeon beats start.startingPoi, which beats start.startingArea. Set none of them and the world is valid and unplayable, so this is one of the few things reported as an error rather than a warning.
Six fields have no default mods, start.postVictory, narrative.lore, narrative.loreThreads, items[].skillBonuses, and the lore clauses on a requirement are absent when unused, never written in as empty. Adding a default would change every world's fingerprint and stop every existing save loading.
The document
Field Type Req Default What it does formatnumber 1Version of the module format itself, so a later reader knows how to migrate. idid yes Id of the module. Saves record it and refuse to load against a different one. versionstring yes Semantic version of this module, as 1.0.0. enginestring "^1.0.0"Engine version range this module expects. extendsstring nullBase module to layer on, as id@version. Loaded first, this document merged over it. modsobject [] Mods this game expects, pinned by id and content hash. metaobject yes Title, author, and the rest of the shelf entry. rulesobject yes The system. Attributes, resources, conditions, dice, progression. contentobject {}The things. Abilities, items, monsters, NPCs, factions. worldobject {}The places. Biomes, areas, points of interest, dungeons, maps. narrativeobject {}The story. Text, dialogue, quests, lore, memory. startobject {}Party size, character creation, and where play begins.
meta, mods, start Field Type Req Default What it does idid yes Id of the mod, matching its folder under mods/. hashstring yes Content hash of the mod as pinned. A drifted mod is reported, not run silently. targetengineeditor"engine"Whether the mod attaches to the engine at play time or to the editor. requiredboolean falseTrue when the game does not run without it. False lets play continue unmodded. notestring ""What to say if the mod is missing or drifted. The author's own words.
Field Type Req Default What it does partySizenumber 4How many characters the player makes and runs. creationobject {}How those characters are built. startingAreaworld.areas Used only if no starting point of interest or dungeon is set. startingPoiworld.pointsOfInterest Place play begins at. Beats startingArea. startingDungeonworld.dungeons Dungeon play begins in. Beats both of the above. openingTextKeynarrative.textGrammar Text pool read before anything else. partyFollowobject {}How characters you are not steering keep up with you. initialFlags{ string : string | number | boolean } {}World flags set before play begins. victoryWhenpredicate Predicate that ends the run in victory once it holds. defeatWhenpredicate Predicate that ends the run in defeat once it holds. A dead party is always defeat. postVictoryendcontinueWhether reaching an ending stops play or lets it carry on.
Field Type Req Default What it does attributePointsnumber 27Points available to spend on attributes. attributeCosts{ string : number } {}Cost to reach each attribute value, keyed by the value. startingLevelnumber 1Level characters begin at. skillRanksnumber 4Skill ranks available to spend. allowedAncestriescontent.ancestries [] []Ancestries offered. Empty offers all of them. allowedClassescontent.classes [] []Classes offered. Empty offers all of them. startingItemsobject [] []Gear every character begins with, on top of their class kit. startingCurrencynumber 0Money the party begins with.
Field Type Req Default What it does itemcontent.items yes Which item. quantitynumber 1How many.
Field Type Req Default What it does catchUpDistancenumber 3Tiles behind before a follower hurries. catchUpStepsnumber 2Extra steps a hurrying follower takes.
Layering one world on another extends names a base world as id@version. The base loads first and your document merges over it. An add on can be twelve monsters instead of a copy of somebody else's game.
{ "id": "more_husks", "extends": "aurendel@1.0.0",
"content": { "monsters": [ { "id": "husk", "xp": 25 },
{ "id": "old_husk", "$delete": true } ] } }Collections merge by id, not by position. Other objects merge key by key. Other arrays are replaced whole. { "$delete": true } removes an inherited entry. Cycles are rejected. Full detail on your own JSON .