▣
module · drop-in viewer
What it does
staging
The camera, and the three moments the camera exists for.
Everything here drives the player's own CameraRig — the entity camera.main()
resolves to. Nothing spawns a camera of its own, and adopting the rig clears its
Camera.behavior so exactly one writer owns the transform.
The gameplay camera
Procedural, and reads only Game.state:
- stands outboard of the column (the column is on the world axis, the climber is
always on its skin) and orbits with the lateral part of
Game.state.aim - tightens — closer, longer lens — while one hand carries load and the other is off the wall
- climbs above the body and sinks its look point as the altitude rises, so the sea holds the bottom of the frame and the drop is never abstract
- shakes on
Game.state.windand on a"gust" - on a fall: widens to
Game.C.camFovFalling, drops its lag tocamLagFalling, and sits below the body looking up the column, so the tower streams up out of frame
The moments
| Moment | Fires on | What it is |
|---|---|---|
opening | phase → intro | Four shots: in over the sea, a helical rise up the column, into cloud onto the crown, then a cut to the base that settles exactly onto the gameplay pose. |
beat | first "fall" above 52 m | Time dips to 0.34, the camera snaps onto the hand as it opens, holds, then falls with the body. Fires once a run. |
resolution | phase → won | The camera leaves the body, cranes up past the crown holding the lit ring in frame, then lets the crown sink away into clear air. |
The establishing shot behind the title screen is not a moment — it is a slow rising orbit that runs for as long as the title is up.
What other slices call
local Staging = require("game.staging")
Staging.isCinematic() -- CLIMB drops input while this is true
Staging.skip() -- SCREENS cuts the opening short; the phase still lands
Staging.moment() -- "opening" | "beat" | "resolution" | ""
STAGING writes no field of Game.state. It moves the phase in one place only:
entering intro starts the opening, and the opening ending sets climb.
Authoring aids
For screenshots, the trailer, and testing a frame without playing to it:
Staging.play("opening") -- run a moment on demand
Staging.seek(8.0) -- park it on second 8 and hold there
Staging.hold(false) -- let the clock run again
Staging.setTitleTime(24) -- park the establishing shot
Staging.stageAt({ 5.4, 120, 0.2 }) -- frame the gameplay camera on a point
Staging.stageAt({ 5.4, 120, 0.2 }, "fall") -- ...in the falling framing
Staging.stageAt(nil) -- back to the live body
Staging.pose() -- eye, look, fov, roll, moment, tick count
Discussion
Scoped to this part · feeds back into the world's score.
Sign in to post.sign in
No comments yet. Be the first.