Sound
Everything Helsinki Life is heard through. The scene entrypoint mounts it on `mount_sound`; nothing else needs to touch it.
Sound
Everything Helsinki Life is heard through. The scene entrypoint mounts it
on mount_sound; nothing else needs to touch it.
What it spawns
Four temporary sources under the mount, and nothing else:
| Entity | What it is |
|---|---|
hl_sound_bed | The waltz, looping, on the music channel. |
hl_sound_harbour | The quay, looping, on the ambient channel. |
hl_sound_ui | A flat host for one-shots with no place on the board. |
hl_sound_board | A spatial host, moved to a sound's pos before it fires. |
What it listens to
The contract is HL.emit("sfx", { name, pos }) - any slice can ask for any
of the 22 names in HL.SFX, and a pos puts the sound where it happened
on the board. On top of that it answers the game's own events directly:
spinStart starts a run of ratchet ticks that slows down the way a wheel
does, spinResult ends it with the clunk, a money delta pays or costs, a
milestone rings the Cathedral or sounds the ferry, and the phase decides
how loud the bed is. So a payday pays whether or not the slice that caused
it remembered to ask for a sound, and the same clip firing twice inside a
frame is heard once.
say - the deck slice's narration cue - ducks the bed and the harbour
under the Konduktööri and lets them back up when he has finished.
Fields
| Field | Meaning |
|---|---|
masterVolume | The whole mix, 0..1. |
musicVolume / ambienceVolume / sfxVolume | Trims over the levels game.sound.bank already sets. |
spatialSfx | Whether an effect carrying a board position is heard from that position. |
Checking it
audio.observe() is the reading that matters: the two beds should come
back audible with looping = true, and audio.levels().rms should stay
off zero through a turn. A clip that was never baked into this world is
logged once by name and costs nothing else - the game plays on, quieter.
Scoped to this part · feeds back into the world's score.