# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# audio.cues — the tally of what was actually played
`game.Sound` bumps a counter every time it hands a clip to the mixer, so a
round can be checked against the events that drove it: one kick sound per
`kick`, one line per `say`, one surge and one lamp.
```lua
local C = require("audio.cues")
C.reset()
-- play a round --
C.report() -- { played = { kick = 34, land = 33, ... }, refused = {}, total = 71 }
```
Reading a component's fields says what was ASKED for. This says what was SENT,
which is the half that a missing clip or a cue with nothing behind it
otherwise hides — `refused` counts exactly those.
It counts; it decides nothing. Nothing in the game reads it.
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# 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.
```lua
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.
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# Core
The one table every slice of WICK shares: the constants that define the shaft,
the sea and the camera framing, the blackboard the rules write and everyone
reads, an event bus, the phase machine's single writer, and the Keeper's
script. `local Core = require("game.Core")`. See `/zero/source/design/spec.md`.
## Exports
- `Core.SHAFT`, `Core.SEA`, `Core.CAMERA`, `Core.STAGING_TIMEOUT` — the place.
- `Core.state` — `phase`, `player {x, y, vx, vy, wall, facing, gripping, grip, alive}`, `height`, `best`, `seaHeight`, `seaRate`, `surged`, `lampLit`, `elapsed`, `kicks`, `run`.
- `Core.events.on(name, fn) -> unsubscribe`, `Core.events.emit(name, ...)`, `Core.events.count(name)`.
- `Core.setPhase(p)` — called by `game.Climb` only.
- `Core.LINES`, `Core.say(id)` — the Keeper's lines; `say` emits `"say"` and `"caption"`.
- `Core.heightClimbed()`, `Core.seaGap()`, `Core.resetRun()`, `Core.clamp`, `Core.lerp`.
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).
# SoundClip
Managed audio asset. `data.zaud` is the engine-native ZAUD payload the runtime decodes and plays; compression settings live in the `.metadata` `settings` block (edit to re-encode).