KINBARROW modding reference
v0.2.0+main.e011511f4 dataset 4a103dcdb658a75a

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. CraftTier IS the engine’s TradeTier (: 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.