content

The things. Abilities, skills, ancestries, classes, items, loot, monsters, traps, factions, and people.

Nothing here is required. A world can be a ruleset and nothing else, or content with nowhere to put it yet. Most of the surface below is rarely used: the reference campaign touches perhaps a third of what an item, a monster, or a person can carry.

Requirements
Every requires field here is the same object, documented under requirements. It appears in sixteen places and behaves identically in all of them.
Reactions
reactions on a monster or a person are things they do off their own turn, gated on what they remember, their faction standing, and their own condition. A hound goes berserk when its packmate dies. A miller stops trading having heard about a theft. Aurendel uses this on two monsters out of 127 and no people.
Two ways to place a person
npc.home or poi.residents. Both work. See linking.

contentcontent

FieldTypeReqDefaultWhat it does
abilitiesobject[][]Anything a creature can actively do. Attacks, spells, shouts, tricks.
skillsobject[][]Trained proficiencies, each governed by an attribute.
ancestriesobject[][]What a character is born as, and what that gives them.
classesobject[][]What a character trained as, and what each level of it grants.
itemsobject[][]Everything carryable, wearable, usable, or sellable.
lootTablesobject[][]Weighted tables drawn for spoils, containers, and shop stock.
monstersobject[][]Statblocks. NPCs point at one when they can fight.
trapsobject[][]Hazards placed in rooms, with how they are spotted and defused.
factionsobject[][]Groups that hold an opinion of the party.
npcsobject[][]People. Who they are, where they live, and what they will talk about.

abilitiescontent.abilities

FieldTypeReqDefaultWhat it does
ididyesId of the ability.
namestringyesDisplay name.
descriptionstring""What using it looks like.
tagsid[][]Free labels for grouping and gating.
actionTyperules.actionTypesAction type it spends. Without one it costs nothing from the turn.
costs{ rules.resources: expression }{}Resources spent per use, each as an expression.
rangenumber0Distance units it reaches. 0 means touch.
cooldownnumber0Rounds before the same creature may use it again.
requiresobjectWho may use it at all. The gating vocabulary.
whenpredicatePredicate checked at the moment of use, on top of requires.
targetingselfsingleallEnemiesallAlliesallnone"single"How many and which side it picks.
attackobjectMakes it an attack roll, and says what it rolls against.
swingadvantagedisadvantageWhich way this ability's own attack roll always leans, before circumstance.
savingThrowobjectMakes it a save instead, and says what a success is worth.
spellLevelnumberSlot level it is cast at. Absent means it is not a spell.
concentrationbooleanfalseWhether holding it occupies the caster's concentration.
ritualbooleanfalseWhether it can be cast slowly without spending a slot.
castingTimestring""Free text for the sheet. Timing in play comes from actionType.
durationstring""Free text for the sheet. Timing in play comes from the conditions it applies.
componentsverbalsomaticmaterialfocus[][]What casting it needs. Verbal, somatic, material, or a focus.
materialComponentcontent.itemsItem consumed or held as the material component.
areaOfEffectobjectShape and size when it covers ground rather than a target.
upcasteffect[][]Extra effects per slot level above its own.
onUseeffect[][]Effects run on a hit, a failed save, or unconditionally.
onMisseffect[][]Effects run when the attack roll misses.
onCriticaleffect[][]Effects run on a critical, in addition to the multiplied damage.
extra{ string: any }{}Open bag of your own data on this ability.

abilities → attackcontent.abilities.attack

FieldTypeReqDefaultWhat it does
statrules.attributesyesAttribute whose modifier is added to the attack roll.
againstrules.derivedStatsyesDerived stat on the target the roll must meet or beat.

abilities → savingThrowcontent.abilities.savingThrow

FieldTypeReqDefaultWhat it does
saverules.savingThrowsyesWhich save the target rolls.
difficultyexpressionDifficulty of that save. Falls back to the save's own default.
onSuccessnonehalfnegatespartial"negates"What a success is worth. Nothing, half damage, negated, or partial.
onSuccessEffectseffect[][]Effects run on a successful save, used with partial.
swingadvantagedisadvantageWhich way the target's save against this ability always leans.

abilities → areaOfEffectcontent.abilities.areaOfEffect

FieldTypeReqDefaultWhat it does
shapespherecubeconelinecylinderaurayesThe volume it covers.
sizenumberyesDistance units across, measured by shape.
affectsallenemiesalliesothers"all"Who inside it is caught. Everyone, one side, or everyone but the caster.
anglenumber45Spread in degrees, for a cone.

skillscontent.skills

FieldTypeReqDefaultWhat it does
ididyesId of the skill, used as actor.skills.<id>.
namestringyesDisplay name.
descriptionstring""What the skill covers.
attributerules.attributesyesAttribute whose modifier is added to checks with it.
tagsid[][]Free labels for grouping and gating.
extra{ string: any }{}Open bag of your own data on this skill.

ancestriescontent.ancestries

FieldTypeReqDefaultWhat it does
ididyesId of the ancestry.
namestringyesDisplay name.
descriptionstring""Who these people are.
tagsid[][]Free labels for grouping and gating.
attributeBonuses{ rules.attributes: number }{}Attribute adjustments applied at creation.
grantedAbilitiescontent.abilities[][]Abilities every member knows from the start.
skillBonuses{ content.skills: number }{}Skill rank adjustments applied at creation.
traitsrule[][]Conditional rules that run for members. A predicate and the effects it gates.
sizerules.sizesSize members are, overriding the ruleset default.
creatureTyperules.creatureTypesCreature type members count as.
speeds{ rules.movementModes: number }{}Speed per movement mode, overriding each mode's default.
senses{ rules.senses: number }{}Range per sense, overriding each sense's default.
languagesrules.languages[][]Languages members speak from the start.
damageInteractionsobject[][]Resistance, vulnerability, and immunity members are born with.
extra{ string: any }{}Open bag of your own data on this ancestry.

ancestries → damageInteractionscontent.ancestries.damageInteractions

FieldTypeReqDefaultWhat it does
damageTyperules.damageTypesyesWhich damage type this changes.
multipliernumber1What incoming damage is multiplied by. 0 is immunity.
unlessid[][]Damage tags that cancel it, so immunity can have an exception.
extra{ string: any }{}Open bag of your own data on this interaction.

classescontent.classes

FieldTypeReqDefaultWhat it does
ididyesId of the class.
namestringyesDisplay name.
descriptionstring""What this training is.
tagsid[][]Free labels for grouping and gating.
hitDiediceyesDie rolled for vitality per level, when levelVitality takes its die from class.
attributeBonuses{ rules.attributes: number }{}Attribute adjustments applied at creation.
primaryAttributerules.attributesyesThe attribute the class runs on. Read as actor.primaryAttribute.
skillProficienciescontent.skills | object[][]Skills it trains. A bare skill id, or an object naming a rank.
startingItemsobject[][]Gear a new member of the class begins with.
abilitiesByLevel{ string: content.abilities[] }{}Abilities granted, keyed by the level string they arrive at.
saveProficienciesrules.savingThrows[][]Saves the class is proficient in.
spellcastingobjectHow this class casts, when it casts at all.
extra{ string: any }{}Open bag of your own data on this class.

classes → skillProficienciescontent.classes.skillProficiencies

FieldTypeReqDefaultWhat it does
skillcontent.skillsyesWhich skill is trained.
ranknumberyesThe rank it is trained to.

classes → startingItemscontent.classes.startingItems

FieldTypeReqDefaultWhat it does
itemcontent.itemsyesWhich item.
quantitynumber1How many.

classes → spellcastingcontent.classes.spellcasting

FieldTypeReqDefaultWhat it does
castingAttributerules.attributesyesAttribute that sets save difficulty and attack bonus.
spellListcontent.abilities[][]Abilities this class may ever learn as spells.
progressionnumber1Multiplier on caster level, for half casters and third casters.
knownByLevel{ string: number }{}How many spells are known, keyed by the level string.

itemscontent.items

FieldTypeReqDefaultWhat it does
ididyesId of the item, used as actor.inventory.<id>.
namestringyesDisplay name.
descriptionstring""What it looks like and what it is for.
kindweaponarmorshieldconsumabletrinkettoolkeytreasurematerialyesWhat sort of thing it is. Decides how the interface treats it.
tagsid[][]Free labels. Shops buy by these.
valuenumber0Base price in currency. Shops scale it.
weightnumber0Weight carried, summed into actor.carried.
stackablebooleanfalseNot read by the engine. Inventory merges by item id regardless.
slotrules.equipmentSlotsEquipment slot it occupies when worn or wielded.
damageobjectWhat it deals when used as a weapon.
modifiers{ rules.derivedStats: expression }{}Derived stat adjustments while it is equipped.
skillBonuses{ content.skills: number }Skill rank added while equipped. Counts for rolls and for minRank gates.
onUseeffect[][]Effects run when it is used.
consumedOnUsebooleanfalseWhether using it destroys one.
procsrule[][]Conditional rules that fire while it is carried. A predicate and its effects.
grantedAbilitiescontent.abilities[][]Abilities the holder can use while carrying it.
raritycommonuncommonrarevery_rarelegendaryartifactNot read by the engine. For display and filtering.
requiresAttunementbooleanfalseNot read by the engine yet, and neither is attunementRequires.
attunementRequiresid[][]Ids of what attunement needs. Bare ids, not checked references.
chargesobjectLimited uses, how they come back, and what happens when they run out.
propertiesrules.itemProperties[][]Item properties it carries, each bringing its own modifiers.
damageInteractionsobject[][]Resistance or vulnerability granted while it is equipped.
usableBycontent.classes[][]Classes allowed to use it.
extra{ string: any }{}Open bag of your own data on this item.

items → damagecontent.items.damage

FieldTypeReqDefaultWhat it does
dicediceyesDamage notation.
damageTyperules.damageTypesyesWhat kind of damage it deals.
statrules.attributesAttribute whose modifier is added to the damage.

items → chargescontent.items.charges

FieldTypeReqDefaultWhat it does
maxnumberyesHow many charges it holds when full.
rechargeOnrules.restsWhich rest refills it.
rechargeAmountdiceHow many come back per recharge. Absent means all of them.
destroyOnEmptybooleanfalseWhether spending the last charge destroys the item.

lootTablescontent.lootTables

FieldTypeReqDefaultWhat it does
ididyesId of the table.
namestringDisplay name.
descriptionstring""What this table is for.
rollsdice"1"How many times the table is drawn.
entriesobject[]yesThe weighted rows. At least one is required.
emptyChancenumber0Chance a draw yields nothing, 0 to 1.
requiresobjectGate on the whole table. Failing it means no draw at all.
bonusRollSkillcontent.skillsSkill checked on searching, to earn extra draws.
bonusRollsobject{}Extra draws earned by that check.

lootTables → entriescontent.lootTables.entries

FieldTypeReqDefaultWhat it does
weightnumber1Relative likelihood against the other rows.
valueobjectyesWhat this row yields.

lootTables → entries → valuecontent.lootTables.entries.value

FieldTypeReqDefaultWhat it does
itemcontent.itemsyesWhich item is found.
quantitydice"1"How many, as dice notation.
requiresobjectGate on this row. Failing removes it before the draw, not after.
requirementScopefinderpartyanyMember"anyMember"Who the gate is measured against. The searcher, the whole party, or any member.
uniquebooleanfalseWhether the row is removed once it has been found.

lootTables → bonusRollscontent.lootTables.bonusRolls

FieldTypeReqDefaultWhat it does
onSuccessnumber1Extra draws for passing the bonus roll skill check.
onCriticalnumber2Extra draws for a critical on that check.

monsterscontent.monsters

FieldTypeReqDefaultWhat it does
ididyesId of the statblock. Kill objectives match on it.
namestringyesDisplay name.
descriptionstring""What it looks like.
tagsid[][]Free labels for grouping and gating.
levelnumber1Its level, used for scaling and for encounter budgeting.
xpnumber0Experience the party gains for killing it. Awarded to everyone.
attributes{ rules.attributes: number }yesIts attribute values. Required. Everything else derives from them.
resourceOverrides{ rules.resources: expression }{}Formulas replacing the ruleset maximum for named resources.
derivedOverrides{ rules.derivedStats: expression }{}Formulas replacing the ruleset formula for named derived stats.
abilitiescontent.abilities[][]What it can do.
behaviourobject[][]What it chooses to do, in priority order. Its combat brain.
reactionsobject[][]What it does off its own turn, gated on what it sees and remembers.
lootcontent.lootTablesTable drawn on its death.
conditionalLootcontent.lootTables[][]Tables drawn as well as loot, and only when the finder qualifies.
factioncontent.factionsWhose side it is on. Decides who it treats as an enemy.
descriptorsstring[][]Adjectives the narrator may reach for.
sizerules.sizesIts size, overriding the ruleset default.
creatureTyperules.creatureTypesWhat kind of creature it is.
alignmentrules.alignmentsIts alignment.
damageInteractionsobject[][]Resistance, vulnerability, and immunity.
conditionImmunitiesrules.conditions[][]Conditions that never land on it.
saveBonuses{ rules.savingThrows: number }{}Flat bonus per saving throw.
skillBonuses{ content.skills: number }{}Skill rank per skill.
senses{ rules.senses: number }{}Range per sense, overriding each sense's default.
speeds{ rules.movementModes: number }{}Speed per movement mode, overriding each mode's default.
temperamentobjectWhat it does unprompted. Anything left out falls back to the ruleset.
languagesrules.languages[][]Languages it speaks.
challengenumberNot read by the engine. A budgeting number for the editor.
specialTurnsobject[][]Extra turns it takes outside the order. Legendary and lair actions.
extra{ string: any }{}Open bag of your own data on this monster.

monsters → behaviourcontent.monsters.behaviour

FieldTypeReqDefaultWhat it does
prioritynumber0Higher is considered first. Ties keep declaration order.
whenpredicatePredicate that must hold for this line to be chosen.
requiresobjectGate on this line, in the requirement vocabulary.
usecontent.abilitiesyesAbility used when this line is chosen.

monsters → reactionscontent.monsters.reactions

FieldTypeReqDefaultWhat it does
ididyesId of the reaction.
descriptionstring""What it does and why.
onseePlayerallyHurtallyKilledselfHurtlowHealthcombatStartcombatEndturnStartwitnessDeedquestCompleteitemShowncustom"turnStart"What sets it off.
eventstringEvent name to watch, when on is custom.
prioritynumber0Higher is considered first among reactions to the same thing.
requiresobjectGate measured against the reacting creature, not the party.
whenpredicatePredicate checked on top of requires.
chancenumber1Chance it fires once everything else passes, 0 to 1.
rollobjectA check that decides between onSuccess and onFailure.
onSuccesseffect[][]Effects run when the roll succeeds.
onFailureeffect[][]Effects run when the roll fails.
effectseffect[][]Effects run either way, or when there is no roll.
usecontent.abilitiesAbility the creature uses as its reaction.
textKeynarrative.textGrammarText pool narrating it.
oncePerEncounterbooleanfalseWhether it may fire only once per fight.

monsters → reactions → rollcontent.monsters.reactions.roll

FieldTypeReqDefaultWhat it does
skillcontent.skillsSkill rolled.
attributerules.attributesAttribute rolled, when no skill fits.
difficultyexpression12Difficulty of the roll.
opposedBycontent.skillsSkill the other side rolls instead of a fixed difficulty.

monsters → temperamentcontent.monsters.temperament

FieldTypeReqDefaultWhat it does
roamRadiusnumberHow far from where it was placed it will wander. Zero stands still.
investigateRadiusnumberHow far from that spot a lead may pull it. Absent is no limit.
leashRadiusnumberHow far it chases before turning for home. Absent is no limit.
wanderChancenumberOdds it moves at all on a given idle step, 0 to 1.
disengageTurnsnumberRounds it stays in a fight after nobody can perceive anybody.
speedsobjectHow fast it moves for each reason it moves, as multipliers.
investigatesrules.senses[]Senses it acts on, best first. Absent means all of them.
followsTrailsbooleanWhether a trace on the ground is worth following at all.
noticeshostileneutralally[]Whose presence it registers: hostile, neutral, ally.
extra{ string: any }{}Open bag of your own data on temperament.

monsters → temperament → speedscontent.monsters.temperament.speeds

FieldTypeReqDefaultWhat it does
wandernumberPace while wandering its own ground. Zero never wanders.
investigatenumberPace while walking toward something it noticed.
engagenumberPace while closing on something it means to fight.
returningnumberPace while heading back to where it was placed.

monsters → specialTurnscontent.monsters.specialTurns

FieldTypeReqDefaultWhat it does
ididyesId of the special turn.
namestringyesDisplay name.
usecontent.abilitiesyesAbility used when it comes round.
usesnumber1How many times per round it is available.
whenpredicatePredicate that must hold for it to be taken.

trapscontent.traps

FieldTypeReqDefaultWhat it does
ididyesId of the trap.
namestringyesDisplay name.
descriptionstring""What it is once seen.
tagsid[][]Free labels for grouping and gating.
detectobjectyesThe check that spots it before it fires.
disarmobjectyesThe check that defuses it.
onTriggereffect[][]Effects run on whoever set it off.
onDisarmeffect[][]Effects run on a successful disarm.
reusablebooleanfalseWhether it arms itself again after firing.

traps → detectcontent.traps.detect

FieldTypeReqDefaultWhat it does
skillcontent.skillsyesSkill rolled to spot it.
difficultyexpressionyesDifficulty of that roll.

traps → disarmcontent.traps.disarm

FieldTypeReqDefaultWhat it does
skillcontent.skillsyesSkill rolled to defuse it.
difficultyexpressionyesDifficulty of that roll.

factionscontent.factions

FieldTypeReqDefaultWhat it does
ididyesId of the faction, used as reputation.<id>.
namestringyesDisplay name.
descriptionstring""Who they are and what they want.
tagsid[][]Free labels for grouping and gating.
initialStandingnumber0Standing the party begins with.
relations{ content.factions: number }{}How this faction feels about others, from minus one to one.
ranksobject[][]Named standing bands, so a gate can ask for a rank rather than a number.
decayPerDaynumber0Standing pulled back toward zero each day.

factions → rankscontent.factions.ranks

FieldTypeReqDefaultWhat it does
ididyesId of the rank, asked for by a requirement as minRank.
namestringyesDisplay name.
atLeastnumberyesStanding at which the rank is held.

npcscontent.npcs

FieldTypeReqDefaultWhat it does
ididyesId of the person.
namestringyesDisplay name.
descriptionstring""Who they are.
tagsid[][]Free labels for grouping and gating.
factioncontent.factionsWho they belong to. Deeds against others can reach them through it.
statblockcontent.monstersMonster used if they ever have to fight. Without one they cannot.
dialoguenarrative.dialoguesWhat they say. Without one, talking to them does nothing.
homeworld.pointsOfInterestWhere they stand. The engine gathers everyone whose home is here on arrival.
gullibilitynumber0.5How readily they believe a rumour they did not witness, 0 to 1.
memorySpannumber90Days a deed stays in their memory.
dispositionnumber0How they feel about the party, from minus one hundred to one hundred.
temperamentobjectWhat they do unprompted. Anything left out falls back to the ruleset.
reactionsobject[][]What they do off their own turn, gated on what they know.
offersQuestsnarrative.quests[][]The quests they actually put in front of a player. This is what offers work.
shopobjectWhat they will trade, and on what terms.
caresAboutnarrative.deedKinds[][]Deed kinds they take personally. Weighted heavier in their memory.

npcs → shopcontent.npcs.shop

FieldTypeReqDefaultWhat it does
lootTablecontent.lootTablesTable their stock is drawn from, refreshed daily.
buysTagsid[][]Item tags they will buy. Anything else they refuse.
priceMultipliernumber1What they scale the base value by.
requiresobjectGate on trading with them at all.