story
The staged beats of Sengoku Trance: the opening that establishes the place, the beat before and after every duel, the ending, the camera work that attends to all of it, and every spoken line in the game.
game.story — staging, camera and voice
The staged beats of Sengoku Trance: the opening that establishes the place, the beat before and after every duel, the ending, the camera work that attends to all of it, and every spoken line in the game.
Everything it builds lives under the Staging scene anchor. It is the only
slice that moves the camera, and it puts the camera back on the authored
gameplay framing — ST.resetCamera() — every time a beat lets go, however
that beat ended.
Playing a beat
local Story = ST.need("game.story")
Story.playOpening(function() end) -- the opening
Story.playPre("okehazama", function() end) -- tops a duel; start it in the callback
Story.playPost("okehazama", "break") -- tails a duel
Story.playEnding() -- the ending, perfect-run aware
Story.play("pre:nagashino") -- any beat by id
Story.skip() -- what the skip key does
Story.startCampaign() -- opening → three duels → ending
Every entry point takes an onDone(reason) callback, called with
"completed", "skipped" or "stopped". A beat also announces itself on
the bus, so nothing has to hold a callback to follow along:
| topic | payload | when |
|---|---|---|
screen.change | { screen = "story" } | a beat takes the screen |
story.line | { speaker, who, text, voice, seconds } | each line, as it is delivered |
story.done | { beat, reason } | the beat lets go |
screen.change | { screen = <previous> } | the screen goes back |
Anyone can ask for a beat without reaching for the module:
ST.bus.emit("story.cue", { beat = "pre", stage = "nagashino" })
ST.bus.emit("story.cue", { beat = "post", stage = "nagashino", outcome = "break" })
Story also listens for duel.end and tails the duel itself, so a duel is
topped and tailed even when nobody asks — and it answers
ui.command { action = "start" } by running the whole campaign, unless the
conductor publishes a startCampaign of its own, in which case it stands
back and only serves beats.
The camera
A beat is one shot per line, framed on whoever is speaking: Nobunaga close, the rival close and mirrored, the chronicle wide. The framings are measured by capture against the real 3:4 viewport, not derived — a row of paper lanterns hangs along the front of the stage at head height, so every close shot stands above the lantern line and looks down across it.
A key light finds the speaker and eases onto them in their own colour, with a cold rim behind so the figure keeps an edge against the back wall.
The written form
Every spoken line is printed on a lacquer plate low on the screen, clear of the letterbox bands, with the speaker's name and kanji over a gold hairline. That is what makes a line survive a failed generation, a muted player and a noisy room — the audio can go missing, the line never does.
What it stands on
story.script— the words, and who says them.story.voice— the generated audio for them, cached as.soundClip.game.core—ST.WORLDfor where everything stands,ST.PALETTEfor colour,ST.busfor talking to the other slices.
Scoped to this part · feeds back into the world's score.