beats
local Beats = require("game.staging.beats")
The four staged moments of First Light: Sabaean Madcaps, each built as a
stage.Shot: a duration, a function that frames the camera at any point
0..1 through it, and the narrator lines cued against the same clock.
Staging.component asks for one and hands it to Stage.play; nothing here
touches the camera itself, which is what lets a beat's whole arc be sampled and
looked at without running it.
Beats.opening(runnerPos?, onDone?)— the crane from the dark altar at the summit, back and down the temple's face, settling behind the runner at the start line. Its last leg lands on the follow pose it is handed, so the hand-off into play has no step in it.Beats.firstLight(_, onDone?)— the temple in silhouette with the eastern ridge behind it and the sky above. The station is read from the temple, not the runner: anchored to the runner it stood behind the mass on the western faces, which puts the temple between the camera and the sunrise the beat exists to show.Beats.won(onDone?)— the flame catches and the camera swings round the altar to the west, so the new fire stands against the sunrise.Beats.lost(runnerPos?, onDone?)— Wahab'il's hand on the bowl, close; then back and up along the face the runner is actually climbing, until the madcap is small on the terraces below.
Beats.LINES is the narrator's script — clip name, cue second, written text
and a fallback length. Beats.DURATION is how long each moment takes.
Every geometry number is read from game.madcaps — the altar, the terraces,
the start line — so a change to the temple's proportions moves the beats with
it rather than leaving them framing air.
Scoped to this part · feeds back into the world's score.