Skip to content

v0.104.2 — Effects from powers

Shipped 2026-09-21 — built on version/0.104.2, one commit, merged to main as 58645eed, tagged v0.104.2. The first use of v0.104.0's api.timeline by code the platform generates: a System 8 power with a duration and a target places its effects on the Timeline itself. No module release — System 8's power action code is written by the platform (createWikiAction in shared's derivePowerActions.ts), which is why it went first; other systems' actions call api.timeline from their own code.

What a power does now

Cast Entangle — circle 2, concentration, Str ends — at two gnolls, and two slices appear on the strip, one per gnoll, in one colour, named Entangle and linking to the power's page. Each runs until its gnoll's own turn, when that gnoll's player is asked for 1d20+str; a total that meets the power roll (System 8: the casting roll is the save DC, ritual-casting.md) ends that gnoll's effect, and a miss or a decline leaves it for the next turn. Concentration, encounter, sustained and permanent durations run until ended; N rounds counts; ritual and instantaneous durations place nothing. A power with a personal range aimed at nobody goes on the caster.

  • planTimedEffect(duration, save) — the pure rule, from the 575 documents' vocabulary; a save that ends outranks the duration.
  • timedEffectSnippet — the action code: one createEffect per bearer, the palette's colour taken once and reused, the description naming the power and what ends it, the effects slot in the chat document telling the table. Without a map, or without the permission, the action still finishes and says no effect was placed.
  • The duration function is built at run time — the bearer's id and the roll inlined, JSON-encoded — and pinned byte for byte between apps/web's executor test and server-core's sandbox test, which runs it through the same compiler the tick does: another turn is silent, the bearer's turn asks, a total at or over the DC ends it, under or declined runs on.
  • The save: frontmatter (195 documents) is read first — before this only the prose was — and halves (24 documents) is recognised beside half. personal (121 documents) is a self range like self (7).
  • DERIVATION_VERSION is folded into the staleness stamp (derivationStamp = content commit + +g2), so a change to the code the platform writes — not only to the module's documents — re-derives every existing power on the next true-up. Verified live: adding Plant Growth to Harlowe derived seven actions with Entangle aimed as a circle 2 and stamped …+g2; a stale derive re-stamped Divine Shield.

Not in this release

  • The caster's own concentration is not a slice; ending it does not end the targets' effects. A "Concentrating: Entangle" effect on the caster linked to its targets' is the natural next step.
  • The Buffs evaluator (what an effect does to the numbers) is still the roadmap's.
  • D&D 5e's spell compiler places no effects yet; its durations are in the spell data, so the same rule can be written there when wanted.