Manual · Content and homebrew
The `_sheetling` block
Where it goes, its seven keys, one worked entry, the rules about ids and pools, and the same block inside a Fight Club 5 file.
A _sheetling object beside an entry's own text, a sibling of entries. 5eTools ignores keys it does not know, so the file stays valid there.
Where it goes
- On a class feature, subclass feature, optional feature, feat, background, item or condition.
- On a named block inside a species'
entries(a trait), never on the race entry itself. - On the
class,subclass,raceorsubraceentry itself onlyfeatureChoiceslands, plusspellcastingfor a caster class or subclass. Any other key there is reported and dropped; the entry still imports.
The keys
| Key | Lands on | What you see on the sheet |
|---|---|---|
effects | any entry the block may sit on | a tracker, a toggle, a bonus labelled on the number it changes, a rider offered on an attack, a button that rolls or heals |
replaceEffects | the same | true swaps the format's own effects for yours instead of adding to them |
onUse | items only | a button on the item's row: heal rolls once, effects starts a running effect the player dismisses by hand |
prerequisite | feats and optional features | a real gate: minLevel, abilityAtLeast, spellcasting, feature, spell, knownCantrip |
featureChoices | the class, subclass, race or subrace entry | a pick in the wizard, or on level-up at the level the group names |
spellcasting | a caster class or subclass | spellListOf: whose spell list a third caster borrows |
text | any entry except a background and the four entry-level ones | replaces the card's rendered sentence |
One entry, four effects
{
"name": "Ashwing Surge",
"entries": ["Once between Long Rests, you gain a Fly Speed equal to your Speed while you hold the stance. If the surge would reduce you to 0 Hit Points, you drop to 1 instead. Either spends the charge."],
"_sheetling": {
"effects": [
{ "kind": "grants_resource", "id": "show_ashwing_charge", "name": "Ashwing Charge", "max": 1,
"reset": [{ "on": "long_rest", "amount": "all" }], "display": "counter" },
{ "kind": "grants_toggle", "id": "show_ashwing_on", "name": "Ashwing Surge", "costTrackerId": "show_ashwing_charge" },
{ "kind": "grants_movement", "mode": "fly", "distance": { "equalToWalk": true },
"condition": { "toggleActive": "show_ashwing_on" } },
{ "kind": "hp_trigger", "id": "show_ashwing_trigger", "name": "Ashwing Surge", "on": "reduced_to_zero",
"then": { "kind": "stay_at", "hp": 1 }, "uses": { "trackerId": "show_ashwing_charge" } }
]
}
}
A pool, a toggle that spends it, a fly speed gated on the toggle, and a trigger that spends the same pool. Effect kinds lists every kind with its fields.
A pick group
{
"_sheetling": {
"featureChoices": [
{ "id": "show_emberkin_ancestry", "level": 1, "name": "Ancestral Line", "count": 1,
"options": ["Ashborn Line", "Frostborn Line", "Stormborn Line"] }
]
}
}
Each option resolves in order: a same-file class or subclass feature by name, a same-file optional feature, one of this species' own traits, then a shipped id written verbatim (fighter_style_defense). One unresolved option drops the whole group with a row; the entry still imports.
Validation rules
- Prefix your ids (
show_above). The block does no namespacing. Two files minting the same tracker id merge into one pool without a word. - Every spend must name a declared pool. A
costTrackerId,uses.trackerIdorcost.trackerIdthat names nogrants_resourcein the same ruleset drops the whole entry, card and all. Nothing ships free and unlimited. "condition": { "toggleActive": "<id>" }gates an effect on a toggle. A toggle the engine cannot find drops the entry.toggleInactiveis the mirror.- A toggle is a stance, and every rest switches it off. A state the story sets, a curse's stage say, needs
"persists": true, or the next rest drops everything gated on it. - Two entries carrying the same named effect (a cursed item and the condition it inflicts) get the same
stackKeyon theirmodifies, and only the more potent applies. @selfin an item'sweaponsmatcher is that item's own minted id.@counter:<Name>inside a Fight Club<sheetling>element is the tracker of the<counter>of that name.- A wrong key is a row, and only that field is dropped. A dangling id inside an effect that landed refuses the entry. Two entries with one id fail the import.
- The format's own
prerequisitearray gates a pick on level and ability only; the rest stays a sentence. The block'sprerequisiteis a real gate for all of it.
Inside a Fight Club 5 file
The same JSON, as CDATA in a <sheetling> element, last child of the <feature>, <trait>, <feat> or <item>. Let the format say what it can: a flat bonus is a <modifier>, and a pool the file already has is spent with @counter:.
<autolevel level="1">
<feature>
<name>Ashwing Surge</name>
<text>Your wings flare with banked fire. …</text>
<sheetling><![CDATA[{
"effects": [
{ "kind": "grants_toggle", "id": "show_ashwing_on", "name": "Ashwing Surge",
"costTrackerId": "@counter:Ashwing Surge" }
]
}]]></sheetling>
</feature>
<counter><name>Ashwing Surge</name><value>1</value><reset>L</reset></counter>
</autolevel>
A counter's formula may use %N tokens: %1 to %6 are the ability modifiers, Strength to Charisma, and %0 the class's own casting modifier.
Download the showcase file: a species, a subclass, two feats, a background, a spell and an item, every key used once, run by the test suite on every release.