FloorCam
The one camera of *First Light: Goura*, and the four moments it takes itself away from Tawpy for. It lives on the `GouraPlayer` prototype's `CameraRig` beside the `Camera` component, so every joining user sees through their own; only the peer that owns the rig runs the beats, the…
FloorCam
The one camera of First Light: Goura, and the four moments it takes itself
away from Tawpy for. It lives on the GouraPlayer prototype's CameraRig
beside the Camera component, so every joining user sees through their own;
only the peer that owns the rig runs the beats, the opening and the floor
effects.
The follow
game.staging.follow stands the camera standBack metres behind her and
standHeight above, and then solves the aim so she lands at
subjectScreenY down the frame under the live field of view. That is why the
framing holds on a 3:4 phone, a laptop and a television rather than only on the
shape it was authored at: a wider screen gets a shorter vertical fov, and a
shorter fov with a fixed aim point would slide her off the bottom, so the
solver simply tilts further down instead.
Measured, at subjectScreenY = 0.72: 3:4 puts the subject at 0.718 of the
frame height, 16:9 at 0.719.
Sideways the rig chases at lateralChase and up the lane at chase — the
difference is what makes a side-step read as movement rather than as a locked
rig. Three springs (a dolly, a lift and a lens) take the events: the gather
eases the camera in and tightens the lens, the flurry throws it back and opens
up, the boom leans in, the sighting snaps tight. A hand-held drift proportional
to her speed keeps the picture from being mechanically still.
Over the last fifth of the lane (roostFrom) the rig climbs roostLift and
closes roostClose, which keeps it out of the roost tree's buttresses. Her
place in the frame does not move — the aim is solved against the pose the rig
actually ends up in.
The beats
| Phase / event | Beat |
|---|---|
entering intro | the opening cutscene (game.staging.beats), which sets playing when it ends however it ended |
first seen of a run | a 1.7 s drop to the floor behind her, looking into the sweep, with a heartbeat |
entering won | a 7 s rise to the crown |
entering lost | a 5.4 s climb to a wide shot of the floor the light has filled |
Each fires once per run: the guards reset on entering intro, and on
entering playing from anywhere but paused. A beat outranks an override, and
an override outranks the follow.
The opening cannot hang the game. If it has not handed the run back within
Beats.DURATION.opening + 6 seconds, update starts the run anyway and says
so in the log.
Skipping the opening
staging.inputMap is activated for the length of the opening and stood down
the moment it ends. It carries one control, skip, bound on all three device
classes — Space / Enter / left mouse, pad south or start, and an
on-screen Skip button. While it is live it suppresses player and goura,
so there is no flurry button under the letterbox.
Verified: the opening is skippable from touch (inputSim tapButton "Skip"),
from a keyboard (inputSim key Space) and from a pad (inputSim padPress south); in each case cutscene.status().playing goes false and the phase lands
on playing. Escape is deliberately not bound: it is the pause control.
The surface it publishes
FL.provide("camera", …)
| Call | What it does |
|---|---|
override(pose | nil) | Hold the camera at { position = {x,y,z}, lookAt = {x,y,z} }, optionally with fov, smoothing and snap = true. nil releases it. |
position() | Where the follow's own solved rig is. |
beat() | Which beat holds the camera: none, opening, seen, won, lost. |
Fields
standHeight · standBack · aheadMetres · subjectScreenY · chase ·
lateralChase · lateralLead · subjectY · sway · roostFrom ·
roostLift · roostClose · crownHeight · crownBeyond · skipMap ·
beat (live output).
crownHeight and crownBeyond locate the roost tree's head for the opening and
the win. The component prefers FL.get("roost").crown() where the floor slice
publishes one and falls back to these fields; a published roost surface
would be the better contract, because the landmark those two shots are aimed
at belongs to the floor slice and moves when it rebuilds.
Scoped to this part · feeds back into the world's score.