voice
WICK has one speaker. The Keeper is at the foot of the shaft with the sea coming in and a broken leg, and he talks the cat up the tower. His eight lines live in `game.Core`'s `LINES`; this module turns each of them into a clip named `wick_v_<id>` exactly once and hands it back by…
audio.voice — the Keeper, spoken
WICK has one speaker. The Keeper is at the foot of the shaft with the sea
coming in and a broken leg, and he talks the cat up the tower. His eight lines
live in game.Core's LINES; this module turns each of them into a clip
named wick_v_<id> exactly once and hands it back by line id.
local V = require("audio.voice")
V.report() -- every line: whether it has a clip, and what is in it
V.generate() -- start the lines that have none
V.collect() -- promote what landed into .soundClip assets
generate and collect are run from an execute, never from a component:
an asset created inside a component callback is filed in the ephemeral runtime
store and never reaches the commit.
Said once, kept
A line that already has a clip is skipped, so re-running after a reload costs nothing and the eight readings never change between sessions.
The written form is never the generation's to lose
Core.say emits caption whatever happens here, and the screens slice prints
it. A line whose audio is missing is a line that is read rather than a line
that is gone, and game.Sound reports it once and carries on.
One voice, on purpose
The generator offers one reading voice. The Keeper is that voice, and there is nobody else in WICK who speaks — the cat does not talk, and the sea does not need to.
Scoped to this part · feeds back into the world's score.