sillage_staging
The camera of *Sillage*, and the three moments the game takes it away from you: the opening, the verdict, and the resolution.
sillage_staging
The camera of Sillage, and the three moments the game takes it away from you: the opening, the verdict, and the resolution.
Nothing else in the game moves the camera. Every other slice names a station and lets this one get there.
Asking for a station
Core.emit("station:request", { station = "organ", secs = 1.4, ease = "inOutSine" })
secs = 0 is a cut; anything else is an eased move on rails. A request is
ignored while a scripted sequence is running, so a stray request cannot
interrupt the opening or the resolution.
Staging also follows screen:changed on its own — brief and drydown are
watched from the bench, organ from the organ, still from the stills, and
the end screen from the window — so a slice that only changes the screen
still gets a camera that agrees with it.
The three moments
The opening plays when the slice starts, which is when the world loads.
Roughly twenty seconds, and skippable on Escape, Space or Enter: a creep in
toward the shuttered window while the frame comes up out of black, a drift
along the empty marble, a crane up the six tiers of the organ, and down to the
bench where the first commission is waiting. It emits opening:done
{ skipped } when it lets go.
The verdict is a push in on the card, and the three verdicts do not get
the same one. A masterpiece rises: barely closer, a hand's width higher, on an
open lens, held for nearly four seconds. A refusal closes in low and long and
stops dead in one and a quarter. Accepted sits between them. It fires off
verdict:given, reading the grade off whichever field the verdict carries.
The resolution is Staging.finale(), for the sixth commission. The light
in the room turns over to evening — every light in the atelier, eased across
seven seconds by what kind of light it is rather than by its name, so a flame
under a still gains while the sun goes red and flat — and the camera leaves
the bench for the window, landing on the exact frame the game opened on.
It emits finale:done.
The contract
Staging.goTo(station, secs?, ease?) | ease to one of Core.stations. |
Staging.moveTo(shot, secs?, ease?, via?) | ease to any { pos, look, fov }; via bends the path. |
Staging.playOpening() | play the opening again. |
Staging.verdict(v) | the push in for a verdict table. |
Staging.finale() | the resolution. |
Staging.caption(title?, sub?) | a line of display type over the image; nil fades it out. |
Staging.abort() | stop whatever is scripted and give the camera back. |
Two things worth knowing
Every frame of a move is written to both cameras. capture renders the
scene camera from its AUTHORED pose, so a rails move that drove only the live
camera would photograph from wherever the prototype was left. Core.cutTo
makes that promise for a cut; this slice keeps it for every frame in between,
which is why a screenshot taken in the middle of a move is the frame the
player is watching.
A station and a cinematic view of it are different pictures. A station is square on to the work, because a card has to be readable and a vial has to be clickable. The opening and the resolution use composed variants of the same stations — angled, lower, with something in the near corner — and they still report the station they belong to, so nothing else has to know.
Scoped to this part · feeds back into the world's score.