pub enum EffectRootKind {
ObjectiveComplete,
QuestComplete,
Trigger,
TrapPayload,
DialogueRespawn,
ShortcutUnlock,
OnDeath,
ShopOffer,
OnKill,
AssemblyLand,
LoopCross,
}Expand description
Which of the campaign’s effect roots a bundle is.
ALL is the closed set. Adding a variant is a rustc error in
EffectRootOwner::kind and in every consumer that matches on an owner, and
makes ALL’s length wrong until it is listed — so a new root cannot be added
without visiting the walk.
Variants§
ObjectiveComplete
A quest’s on_objective_complete[<objective>] bundle.
QuestComplete
A quest’s on_complete bundle.
Trigger
An environment trigger’s effects bundle.
TrapPayload
A trap’s spec-0022 payload bundle.
DialogueRespawn
A dialogue option’s set-checkpoint on_respawn bundle — a plain
Vec<QuestEffect> hanging off the dialogue stage. DialogueEffect
carries no gate, movement or actor verb of its own, which is the reasoning
that made every older walk stop at the quests stage; the bundle nested
inside one is quest-effect vocabulary all the same, and it is lowered
(into cp_on_respawn_<i>).
ShortcutUnlock
A shortcuts[].on_unlock bundle (spec-0016 §2) — the beat that plays as
the bar lifts. Lowered by emit::emit_shortcut_functions into
shortcut_open_<id>, and unenumerated until spec-0031: the sixth blind
spot, structurally the same shape as R4.
OnDeath
The campaign’s on_death bundle (DSL v0.10, spec-0031) — the effects that
run at the moment a player dies, for that player. One per campaign, and
visited only when non-empty, so unbound_roots tells the truth about a
campaign that declares no death beat.
ShopOffer
A shops[].offers[].effects bundle (DSL v0.10, spec-0032) — what choosing
a shop button does, for the player who chose it.
It is a root rather than sugar for the reason spec-0031 states: add a root
when the bundle hangs off an object that has runtime machinery of its own.
An offer’s machinery is a player-interaction advancement, a
minecraft:multi_action dialog, a /trigger objective and a tick
dispatch — the same hardware a bonfire rest runs on. Desugaring it into a
use trigger would put two independent detectors on one right-click.
OnKill
A wave’s or an actor’s on_kill bundle (spec-0074) — what happens each
time a player is credited with killing one of the fight’s bodies, run as
that player. A root rather than sugar for the reason R8 is: it hangs off an
object with runtime machinery of its own (the player_killed_entity
advancement over the fight’s tag). Visited only where declared, so
unbound_roots tells the truth about a campaign with none.
AssemblyLand
An assembly’s strikes.pattern[].on_land bundle (spec-0082) — what a
blow does, run on the tick the strike clip’s last frame is applied. A
root rather than sugar because it hangs off an object with runtime
machinery of its own (the per-assembly strike state machine). Polled on
the tick with no executor, like a trigger’s bundle. Visited only where a
step declares one, so unbound_roots tells the truth about a campaign
with none.
LoopCross
A loops[].on_cross bundle (spec-0086) — the dungeon’s answer to a body
the loop just moved, run from the server source after the move and the
count. A root rather than sugar because it hangs off an object with
runtime machinery of its own (the loop’s tick poll and its move
function). Visited only where declared.
Implementations§
Source§impl EffectRootKind
impl EffectRootKind
Sourcepub const ALL: [EffectRootKind; 11]
pub const ALL: [EffectRootKind; 11]
Every root, in enumeration order. Not the visit order — see
for_each_effect_root, which interleaves R1/R2 per quest.
Sourcepub const COUNT: usize
pub const COUNT: usize
How many roots there are. The binding ledger reports coverage against this.
Sourcepub fn runs_with_acting_player(self) -> bool
pub fn runs_with_acting_player(self) -> bool
Whether emission runs this root’s bundle with an acting player
(@s), or from the server command source.
This is a fact about the ROOT, not about any verb inside it, and it is
stated here — on the object class — rather than in the one diagnostic that
first needed it. Four roots have a player: on_objective_complete and
on_complete are dispatched as @a from the tick
(Audience::Party), and on_death and a dialogue on_respawn are the
dying/respawning player’s own (Audience::Solo). Three do not: a
trigger’s effects, a trap’s payload and a shortcut’s on_unlock are all
polled on the tick with no executor (Audience::Scheduled) — their own
doc comments in emit say so.
This is the class default, and one root now overrides it per
declaration. A trigger declaring audience: presser (DSL v0.11) is
dispatched by a player_interacted_with_entity advancement and DOES run
as the clicking player; every other trigger is polled with no executor.
A consumer that must be right about a particular bundle therefore asks
EffectRootSite::runs_with_acting_player, which answers per site;
this stays the answer for the kind.
It is exhaustive, so an eighth root cannot be added without answering it,
and emit::root_audience is bound to it in both directions by
emit’s own test — the emitter and this answer cannot drift.
The consumer that needs it today is DW0503: a player-scoped runtime
datum (spec-0031) read or written inside a bundle with no acting player
would emit @s into a sourceless function, which fails silently at
runtime.