attract
The art the opening is made of. Ten painted pixel canvases and the placement rules for them; the timeline that drives them lives in `emberline.staging.director`, so the opening can be recut without touching a pixel.
staging.attract
The art the opening is made of. Ten painted pixel canvases and the placement
rules for them; the timeline that drives them lives in
emberline.staging.director, so the opening can be recut without touching a
pixel.
| Sheet | What it is |
|---|---|
sky | the smog, its sodium bloom, drifting soot, a cold moon |
far | the Kessai skyline: towers, chimneys, lit windows, beacons, the flooded waterline |
mid | the viaduct — arches, deck, rail, signal gantries, lamps, rain |
near | the platform edge, railing, a close sodium lamp, cables, heavy rain |
train | the Emberline crossing, lit carriages and a firebox |
ember | the Ember itself, eight frames of pulse |
title | the EMBERLINE logotype and its subtitle |
roster | MAG, KITE and BELL, revealed one per frame |
warden | the Warden, eight frames of lantern swing |
type | the opening's writing, one frame per line |
Placement
The opening is a curtain, not a stage: its layers sit between the fighters
(z = 0) and the camera (z = 14), in front of everything the fight puts on
screen, because an attract sequence has to read as one place whatever is
standing behind it. The depths keep their order, so the parallax still
separates them — Attract.parallax(camX) moves each painted layer by
camX * (1 - p) with the factors from Rules.LAYERS.parallax.
Cards are type, so they hold their share of the screen whatever the camera is
doing: Attract.pin(key, camX, camY, camHeight) scales and places them against
the live framing. A card left at world scale grows out of frame the moment a
beat pushes in.
Building
beginBuild() then buildStep() until it returns true draws one canvas per
call, so the cost can be spread over frames; buildAll() does the lot at once.
Everything lands under a temporary parent, so none of it is saved into the
scene. teardown() removes it.
show(key, frame, x, y, z) / hide(key) / hideAll() / frame(key, n) /
move(key, x, y, z) are what the timeline drives. Omit z and the sheet takes
its resting depth from Attract.LAYOUT.
Scoped to this part · feeds back into the world's score.