Format: RON
The content tree — the contract for the
data/ tree.
RON maps 1:1 onto serde-derived Rust structs: real enums for closed
sets, Option for the book’s ”—” cells, nested structs natively, and
// comments beside every interpreted value. The engine lock-test
parses every file into the canonical types below when the validator amendment lands.
Transcribe the sketch — don’t invent.
The typing rule — enums for semantics, string ids for content (the moddability doctrine, per the moddable-data amendment):
- Compiled enums ONLY for semantic sets the engine’s code branches
on:
Ability,Size,ArmorCategory,WeaponCategory,Skill,AlignmentConstraint,CraftTier,QualityTier,Rarity,MagicRarity,Recharge,ConditionComponent,ConditionFact(and the structural shapes inside rows —WeaponProperty,DexMod,ArmorClass,Damage,RecipeInput,Source). Damage kinds and spell schools OPENED into registry files (tables/damage_kinds.srd.ron,tables/schools.srd.ron); creature types OPENED at (tables/creature_types.srd.ron) — the engine branches only on well-known ids (types::damage/types::school/types::creature_type). These are rules vocabulary; a mod adds a row without engine code, and only a NEW code branch (a new well-known const) is a recompile — the honest boundary.CraftTierIS the engine’sTradeTier(: Apprentice / Journeyman / Master, prof bonus +0/+2/+4) — one ladder, two homes. - Open string ids for content identifiers — weapon ids, armor ids,
race ids, creature/archetype ids, CR keys — because mods add content:
a new weapon must be a data row, not a recompile. Typo-safety is
preserved by CROSS-REFERENCE RESOLUTION at parse/boot time: every id
reference (
armor: ["chain_shirt", "shield"],weapons: ["spear"],cr: "1/8") must resolve against the loaded registries, failing LOUDLY with the file and reason — the same guarantee an enum gives, delivered at load instead of at compile (in the spirit of the no-magic-strings rule: no silently-missed lookups, ever). - Open VOCABULARIES get registry files: when a set of
tags is open but referenced across files — material classes,
terrain tags — the vocabulary itself is a
tables/registry, and every use (MaterialInfo.class,Class(...)inputs, buildings’requires) resolves against it at boot. Not enums, by the same rule: the engine never branches on a family name — family-level behavior, when it arrives, lands as PROPERTIES on the registry rows.