The owner's call from the sound audit (2026-10-24): "quips get their own subfolder" and "quips get their own on/off setting and volume slider". Before, a quip was a random announcer line (any line with sound, call-outs included). It played only when ANNOUNCER was on and at ANNOUNCER VOLUME.
Quips as their own sounds (src/client/audio.h / audio.cpp, src/client/overrides.h / .cpp)
- What: each voice has its own quip set, held with that voice's announcer lines (
AnnouncerLines::quip/quipName) and played asSND_QUIP + k, up to 64 per voice. Changing the voice swaps the set and cuts a quip that is playing. - Default set: HEADSHOT, AIR_ROCKET, SPREE, RAMPAGE, UNSTOPPABLE, GODLIKE, NEW_LEADER and HIGH_SCORE in that voice, sorted by name.
- Why only these: a quip that sounds like a countdown, objective, round or time call would mislead a player.
- If one of those announcer lines is overridden, the default quip uses the override.
- Overrides:
- Any
voices/<voice>/quips/<NAME>.<wav|ogg|flac|mp3>, shipped (assets/overrides) or the player's own, replaces that voice's whole set, sorted by name. If a name is both shipped and the player's own, the player's file wins. - Each file is loudness-matched to the default quip with the same name, or to HEADSHOT, unless
sound-levels.txtlists it. Files are cut at 5 s. - Files in sub-folders, and files that don't decode, are skipped.
- The new helper
overrides::listFolderlists the folder. - Why the whole set and not a merge: the owner asked for the subfolder to be the quip list. A merge would make it impossible to remove a default quip.
- Any
- Own category:
- QUIPS off: a quip doesn't start, and one already playing goes silent from the next mix period.
- QUIPS VOLUME scales quips only.
- EFFECTS and ANNOUNCER volume no longer touch quips.
Network (unchanged protocol)
- EV_QUIP still carries one random pick byte, the same for everyone. Each listener plays pick modulo the size of their own voice's set.
- Announcer lines already play in each listener's own voice, so quips do the same. Two players with the same voice and quip files hear the same quip.
Settings and menu (src/client/config.*, src/client/ui)
- New saved settings:
quips(default 1) andvolume_quips(default 1.00). They are applied at startup and from the console. - VIDEO + AUDIO > SOUND:
- QUIPS VOLUME is a full-width slider under ANNOUNCER VOLUME.
- QUIPS shares HITSOUND's row at half width. Turning it on plays a quip.
- Why the shared row: on Windows the column also holds EXCLUSIVE AUDIO and its hint. A full extra row would push VOICE into the DEVICES button. With the shared row there is a 3 px gap, checked with a simulated Windows layout.
- The UI test (2432 widgets, 3 resolutions) passes with no layout issues.
Assets, provenance, sound editor
quark_tests exportassetswritesvoices/<voice>/quips/<NAME>.wav: 56 files, 8 per voice.tools/provenance.pyknows the new ids.assets/provenance/voices.jsonhas 56 new entries, andcheckis ok.- The sound editor:
- shows a QUIPS group per voice in the Voices tab;
- exports to
voices/<voice>/quips/<NAME>.wav; - includes quips when copying a voice's chain.
- Docs: docs/ASSETS.md and docs/RELEASE_CHECKLIST.md. The checklist has two new rows, and the announcer row no longer mentions quips.
Tests
- New
testQuips(assets group) checks:- the default set has no call-out, is sorted, and matches the voice's lines;
- pick modulo set size;
- the player's own files replace one voice's set only, with broken files and sub-folders skipped and the
sound-levels.txtlevel kept; - QUIPS off blocks new quips and silences one already playing;
- QUIPS VOLUME is independent of EFFECTS and ANNOUNCER volume.