Fields
Declaring values on things: ranges, tiers, and the prose the narrator reads.
A field is a value your plugin puts on things: satiety, infection, mana. Declaring one
is usually the first thing a plugin does.
What a declaration gives you
- a range (min and max). Every write is clamped to it.
- tiers: what the narrator says at each band, and what the HUD badge shows.
- visibility: a row on the sheet by default, or a HUD bar.
- optionally, a creation question asked when a player builds their character.
Tiers are what the narrator sees
The narrator never sees the number. It sees the tier prose:
| Band | Narrator reads |
|---|---|
| 0-3 | nothing |
| 4-9 | "a fever rides him" |
| 10-14 | "veins darkening at the wrist" |
| 15+ | "barely lucid, burning to the touch" |
Write tiers as something a narrator would say in the scene. "infection: 12" isn't a tier.
Leave the resting tier silent. Otherwise every turn carries a status report.
Bands: absolute or ratio
- No max: bands are absolute values.
- With a max: bands are a fraction of the max.
If your tiers look wrong, check whether you meant to set a max.
Who carries it
| Trait | Lands on |
|---|---|
entity |
everything that moves: players, NPCs, creatures, items |
living |
players, NPCs, creatures |
carryable |
items |
player / npc / creature |
one kind only |
location |
the place itself |
entity does not include locations. A location field is how a place tracks its own state:
how corrupted this crypt is, how much game is left in the forest. Read it with
$.location.fields.corruption or $.field('corruption', 'location').
Reading
$.field('infection') // the subject
$.field('infection', 'target') // whoever was aimed at
$.field('corruption', 'location') // the place
Missing reads as null, not 0. See Missing values.
Derived fields
A field with a valueExpr is computed when read, not stored, like a carry limit worked out from
might. You don't write to it. Because nothing is stored, $.hasField() says false for it, so
branch on its inputs instead.