Skip to content

Sounds

sounds.ron maps every sound the game makes to its files and how it plays. The code only knows the names of the sounds (cues); everything about how they sound is here. Change a sound by changing its files.

(
sounds: {
Groan: (files: ["sfx/groan_1.wav", "sfx/groan_2.wav", "sfx/groan_3.wav"], volume: 0.42,
pitch: (0.85, 1.15), reach: 40.0, muffle: 0.45, voices: 3),
DoorClose: (files: ["sfx/door_close_1.wav", "sfx/door_close_2.wav"], volume: 0.7,
pitch: (0.92, 1.08), reach: 35.0, voices: 3),
// ...
},
)
Field What it is
files Paths under the audio folder. One is picked at random each time.
volume Loudness at the source, 0 to 2 (1 is as recorded).
pitch Playback speed, picked in this range each time for variety.
reach Metres at which it fades to nothing. It falls off with the square of the distance.
muffle How much gets through a wall, shut door or window, low-passed.
voices At most this many playing at once; the nearest win.

Every cue must be in the file:

Group Cues
Moving FootstepHard, FootstepSoft, Shuffle (zombies dragging their feet)
Fighting SwingLight, SwingHeavy, HitBlunt, HitBlade, Punch, BodyFall, Stomp, Shove, PlayerHurt
Zombies Groan, ThumpDoor, ThumpWindow
Doors and windows DoorOpen, DoorClose, WindowOpen, WindowClose, GlassBreak, DoorBreak
Things Rummage, Pickup, LevelUp
Ambience Bird, and the loops Wind, Room (indoors) and Crickets (at night). These play where you are, so reach and muffle don’t apply.

16-bit PCM WAV, mono or stereo, 8 to 96 kHz. A data folder with its own sounds.ron reads its files from an audio folder beside it:

mods/my-sounds/
data/
sounds.ron
...
audio/
sfx/groan_1.wav
...

The sounds in the game now are placeholders made by tools/audio/synth.py; the real ones replace them file for file. Every sound file in the repository needs a row in ATTRIBUTION.md.

Sounds are only what the client plays. What zombies hear is decided by the simulation (a door is 10 m of noise whatever it sounds like), so changing a sound never changes how the game plays.