Sound
Everything *First Light: Lucina* is heard through. One component, mounted on `mount_sound`, owning six audio sources and no game state at all.
Sound
Everything First Light: Lucina is heard through. One component, mounted on
mount_sound, owning six audio sources and no game state at all.
| Source | What it is |
|---|---|
fl_snd_bed | the lamp room — sea below, wind at the storm glazing, the watch-room clock. Twenty seamless seconds, running all night. |
fl_snd_drone_night | the score before the light: a low G with the minor third in it. |
fl_snd_drone_dawn | the same chord with the major third and the octave. The two trade places as Core.state.dawn climbs. |
fl_snd_geiger | the counter, standing on the table beside the plate: a valve hum with the counts fired over it. |
fl_snd_plate | spatial one-shots on the plate — the hands. |
fl_snd_ui | non-spatial one-shots — the screens, and the body. |
fl_snd_score | the moments that are music, on the music channel. |
What it answers
Core.sfx(name) on the shared bus. Every name the design carries a sound for
is a row in game.sound.library, which says which clip it is, how loud, how
far its pitch may wander, and which source plays it — so a new sound is a row
in a table rather than a branch in a hook.
What it derives
Nothing here is switched by an event. Every level is read out of Core.state
each frame, which is why the sound is right the moment the state is, whichever
slice moved it and whether or not that slice fired anything:
- the score crossfades on
state.dawn, and steps back bystate.phase - the counter's rate is
background + crystals × perCrystal + dose × perDose, counted offstate.piecesandstate.dose, with the gaps between counts drawn from an exponential — a counter, not a metronome - the mix ducks music, ambient and sfx under the voice channel for as long
as
state.subtitlesays the Keeper is speaking, and lets go after
Fields
| Field | Meaning |
|---|---|
volume | master trim on everything this component plays, before the channel levels |
geigerOn | whether the counter is powered at all |
clickRate | counts per second right now — read it to see the plate through the mix |
ready | true once every source is built and its clip resolved |
missingClips | how many clips failed to resolve; anything but zero means a bake is missing |
Methods
:fire(name)— play one sound by its bus name, exactly asCore.sfxwould:rebuild()— drop the resolver cache and rebuild every source, after a re-bake
Scoped to this part · feeds back into the world's score.