moments
What the forest floor does when something happens in *First Light: Goura*.
game.staging.moments
What the forest floor does when something happens in First Light: Goura.
local Moments = require("game.staging.moments")
Moments.boom({ x = 0, y = 0, z = -40 })
FloorCam.component subscribes to the FL bus and calls these; nothing else
needs to.
| Call | Event | What is on the floor |
|---|---|---|
boom | FL.EVENTS.boom | A close, pale ring that runs out fast and is gone. This is the one that fires most, so it is the smallest. |
answered | FL.EVENTS.answered | A wide gold ring under her, and a second under the caller at the lane's edge a beat later — so the answer reads as having carried. |
failance | FL.EVENTS.failance | One ember ring, low and slow, dying where it started. The failance has a shape too. |
flurry | FL.EVENTS.flurry | The scuff a flurry kicks off the litter, scaled by how much she gathered. |
caught | FL.EVENTS.caught | A pair of builtin bursts standing in for the body feathers and the down, fl_feather_burst beside them, over a fast maroon ring where she was standing. |
roost | FL.EVENTS.roost | A slow, wide gold ring at the foot of the roost tree. |
The rings are @builtin::systems.effects.combat.shockwaveRing, recoloured from
FL.PALETTE and laid flat on the floor plane. The scuff and the throw are the
builtin impact on its dirt surface. The feather burst is this slice's own
effect asset, fl_feather_burst.effect, resolved once and cached.
That asset lives at the root of /source rather than beside these files,
and it is currently drawn by nothing — two engine defects, both recorded in
its own README and filed as OrigoZero/zero#11944 and #10047. caught therefore
throws a pair of builtin bursts to carry the moment and plays the authored one
beside them, so the real feather burst appears of its own accord the day the
runtime steps it.
Everything is played through the pooled effects runtime, so firing them
repeatedly costs what the first one did and nothing survives the play they were
fired in.
Reading them back
Particles advance on the play clock: in edit mode a play holds live
particles and submits nothing, which is why these read as silent there and not
as broken. effects.observe() answers what is live, leased and silent, and
handle:whySilent() names the reason from a closed set.
A ring runs out in about a third of a second, which is shorter than the gap between two tool calls — so to see one, slow the clock rather than trying to time the shutter:
engine.timeScale = 0.12 -- the ring now takes ~3 s of wall time
FL.emit(FL.EVENTS.boom, { position = p })
-- capture
engine.timeScale = 1
Scoped to this part · feeds back into the world's score.