bank
`Bank.clip(name)` answers a `.soundClip` ref or `nil`. A name with no clip behind it is a hole in the mix, warned once and then silent — never an error that takes a frame down with it.
bank — every sound by name, with the level it is heard at
Bank.clip(name) answers a .soundClip ref or nil. A name with no clip
behind it is a hole in the mix, warned once and then silent — never an error
that takes a frame down with it.
local Bank = require("game.sound.bank")
Bank.clip("plate_ring") -- an AssetRef, or nil
Bank.LEVEL.burn -- how loud that one is meant to be
Bank.BED_FOR.firstlight -- "bed_firstlight"
Bank.VOICE.firstlight.text -- the words, for the caption
Each identity is a string literal in its own resolver. That is the form
the asset-reference checker can read; a concatenated identity publishes as an
unresolvable edge and world.push refuses the whole world for it.
The names
| group | names |
|---|---|
| score | bed_night bed_firstlight bed_day bed_dusk |
| air | amb_valley amb_threat amb_zyme beam_hum |
| field kit | ui_move ui_confirm ui_back ui_open ui_close |
| the hill | sow harvest harvest_leavened burn plate_ring zyme_well |
| dawn | bird_a bird_b bird_c dawn_chime |
| the end | sting_won sting_lost |
| the Almanac | almanac_title almanac_firstnight almanac_firstlight almanac_leavened almanac_won almanac_lost |
Bank.CHANNELS is the mixer's four channels — music, ambient, sfx,
voice — and their levels. Bank.LEVEL is the per-clip level under them.
Nothing sits at the same level as anything else.
The Almanac's script
Bank.VOICE holds all six lines: the id, the clip name, the written text,
and how long the read runs. The text ships with every line on purpose — it is
what the HUD prints, and it is the difference between a lost line and a quiet
one when a player is muted, in a noisy room, or a generation failed.
Scoped to this part · feeds back into the world's score.