Beats
The staged moments of *First Light: Crowfeet*, written down as shots.
Beats
The staged moments of First Light: Crowfeet, written down as shots.
Nothing here plays anything. A builder takes the context the moment happens in
— where the crow is standing, the flock, and a function to speak a line with —
and returns { name, duration, skippable, cues }, which game.Stage runs.
Keeping the shots as data is what lets one be rehearsed on its own:
require("game.CF").stage.rehearse("won") plays the ending without winning it.
local Beats = require("game.stage.Beats")
Beats.byName.opening(ctx) -- opening · firstLight · won · lost_sea · lost_starved · lost_late
Beats.LINES.won_1 -- the Old Crow's nine lines, by key
Framing, at any shape
No eye position here is a number chosen for one screen. Two solvers, and they answer opposite questions:
fit(fov, wantHalfH, maxHalfW)— a shot of the FACE. As much height as it asks for, but never so far back that the frame opens out past the edge of the cliff and shows the slab floating in the sky. The width term is a CAP, so the NEARER of the two distances wins — which on a wide screen is the width one.cover(fov, halfW, halfH)— a shot of a SUBJECT. The distance a thing of those extents is wholly inside the frame at. Both terms must be satisfied, so the FARTHER wins — the width one binds a portrait frame and the height one binds a television. That is what puts the whole murder in shot at 3:4 and at 21:9 without two versions of the shot.
aspect() reads the live screen every time it is asked, and roostSpan() is
the murder's own extents, so the shots that are about the roost are framed from
where the birds actually stand.
The cues
A cue is { t, fn } — a time in seconds from the start of the beat and what
happens then. Stage fires them in order and, on a skip, fires whatever is
left, so a skipped shot still says its line and still leaves the game where the
shot was going to leave it. That is why ctx.resolved(...) is a cue rather
than something the runner does at the end: the ending card goes up when the
shot says it does.
Owned by the staging slice. Design: /zero/source/design/spec.md.
Scoped to this part · feeds back into the world's score.