FolioTier 2
@camera
Move the camera to a full shot framing - pan, zoom, and focal point glide together on one clock with a chosen motion curve. Duration 0 cuts straight to the framing.
@camera pushes or pulls the whole framing to a new position, zoom level, and focal point in one move. Reach for it whenever you want to punch in on a face, pull back to reveal a room, or drift the frame to follow the emotional weight of a line - x and y reposition the frame, scale controls how tight or wide it reads, and focus_x/focus_y let you bias where the eye settles within that framing.
Because pan, zoom, and focal point all ride the same clock and curve, the move reads as one continuous gesture rather than three separate adjustments fighting each other. Set duration to 0 when you need an instant hard cut to a new framing, such as snapping into a flashback or reacting to a jump scare.
Pick curve to match the emotional register of the move: decel for a settling push-in that lands on a line, overshoot or bounce for something more playful or jarring, elastic for a comedic wobble, and plain linear or slide when you just need a clean, unremarkable reposition. Leaving target empty moves the whole frame, which is what you want for establishing shots or scene-wide reveals; setting target to a sprite tag instead keeps the camera locked onto that character as they move, which is the better choice for following someone across the stage without hand-tuning x and y yourself.
Use wait=false when you want the camera drift to run underneath dialogue or another effect instead of blocking the script - stacking a slow @camera with wait=false alongside a @shake or a line of say gives you layered motion without extra bookkeeping. Keep in mind repeated @camera calls don't reset to center automatically; each new call moves relative to the current framing, so if you've zoomed and panned in, a later call meant to return to the establishing shot needs its own explicit x=0, y=0, scale=1 rather than assuming a clean slate.
Parameters
| Parameter | Kind | Required | Default | Notes |
|---|---|---|---|---|
| x | number | no | 0 | -2000 to 2000 pixels. Default 0. |
| y | number | no | 0 | -2000 to 2000 pixels. Default 0. |
| scale | number | no | 1.2 | 0.5-5 × multiplier. Default 1.2. |
| focus_x | number | no | 0.5 | 0-1 (0-1). Default 0.5. |
| focus_y | number | no | 0.5 | 0-1 (0-1). Default 0.5. |
| duration | number | no | 1 | 0-30 seconds. Default 1. |
| curve | string | no | slide | One of: linear, slide, accel, decel, overshoot, bounce, elastic. Default slide. |
| delay | number | no | 0 | 0-10 seconds. Default 0. |
| target | string | no | "" | Optional sprite tag; empty targets the whole frame. |
| wait | boolean | no | false | Block for the effect's duration when true; false fires and continues so effects can overlap. |
Canonical example
bg city-rooftop
@camera(2, x=-320, y=90, scale=2.4, curve=decel)
say "Liam": "There. Top floor."
@camera(1.2, scale=1)
narrate "The whole skyline swallowed the moment."
@camera frames a shot: one event describes the full camera pose -
pan offset (x, y), scale, and the focal point - and the camera
glides there in a single synchronized move with one duration and one
curve. This is the difference from firing @pan and @zoom
together, which animate on separate clocks with a fixed easing.
The shot model
duration=0is a hard cut to the framing.delayholds on the current framing before the move starts.curveuses the same motion vocabulary as the sprite Move event (slide,linear,accel,decel,overshoot,bounce,elastic).x/yare pixels on the nominal 1280x720 stage, so a framing is the same rectangle of the scene at every window size. (@panuses raw canvas pixels; prefer@camerafor new work.)
In the Forge inspector the pose is authored visually: drag a frame rectangle over the stage - the box is exactly what readers will see.
Persistence and reset
Like the other camera verbs, the pose is scene-scoped state: it holds
until another camera event changes it. Reset with
@camera(1, x=0, y=0, scale=1) - or duration=0 to snap back.