The splatter music stays on the splatter court
Every run starts the ambience, and the ambience was un-ducking both court beds at once — so once you had played the gore mode, its music followed you into classic tennis for the rest of the session. Leaving the court is one event; arriving is not. Each bed brings itself back and nothing else. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3cf3e029a4
commit
2f0c04fad4
5 files changed
+26
-3
No files matched your search
@@ -451,6 +451,13 @@ followed you onto the silent menu.
|
|||||||
`menuMusic()` is now the one call that means "we are in the menus": it starts the theme, un-ducks
|
`menuMusic()` is now the one call that means "we are in the menus": it starts the theme, un-ducks
|
||||||
it, and ducks both court beds. `ambient()` and `zombieMusic()` un-duck themselves for the same
|
it, and ducks both court beds. `ambient()` and `zombieMusic()` un-duck themselves for the same
|
||||||
reason — the SECOND run would otherwise have been played in the silence the menu left them in.
|
reason — the SECOND run would otherwise have been played in the silence the menu left them in.
|
||||||
|
|
||||||
|
**...and each of those un-ducks ITS OWN BED ONLY.** The first cut had `ambient()` un-duck both
|
||||||
|
court beds together, which put the splatter music back on in classic tennis for the rest of the
|
||||||
|
session — Oliver caught it on the retest: *"after playing the splatter gore, the zombie background
|
||||||
|
sound also keeps playing in the normal tennis game."* LEAVING the court is one event and ducks both
|
||||||
|
beds; ARRIVING is not. The ambience belongs to every mode, the zombie bed belongs to the gore, and
|
||||||
|
only `enterSplatter` may bring that one up.
|
||||||
**The rule, for anything added here later: a bed's start function must also un-duck it, because
|
**The rule, for anything added here later: a bed's start function must also un-duck it, because
|
||||||
starting it is a no-op the second time and ducking it is not.** `audio.bedTest` exposes the duck
|
starting it is a no-op the second time and ducking it is not.** `audio.bedTest` exposes the duck
|
||||||
set to the suite (same idea as `netTest`), which is what makes this testable at all — the beds
|
set to the suite (same idea as `netTest`), which is what makes this testable at all — the beds
|
||||||
|
|||||||
+1
-1
@@ -547,6 +547,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one') {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="module" src="src/main.js?v=261"></script>
|
<script type="module" src="src/main.js?v=262"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
+9
-1
@@ -164,7 +164,15 @@ function loopBed(file, lowcut, vol, loopEnd = 0) {
|
|||||||
// whole-scene atmosphere, from the first tap. Un-ducks as well as starts, for the same reason
|
// whole-scene atmosphere, from the first tap. Un-ducks as well as starts, for the same reason
|
||||||
// menuMusic does: loopBed no-ops once the bed exists, so a SECOND run would have opened over the
|
// menuMusic does: loopBed no-ops once the bed exists, so a SECOND run would have opened over the
|
||||||
// silence the menu left it in.
|
// silence the menu left it in.
|
||||||
export const ambient = () => { loopBed('tennis-ambient-loop.wav', 500, 0.035); courtDuck(false); };
|
// ...but ONLY ITS OWN BED. It briefly un-ducked both court beds together (courtDuck) and that put
|
||||||
|
// the splatter music back on in classic tennis for the rest of the session, because every run
|
||||||
|
// starts here (Oliver, 2026-08-15: "after playing the splatter gore, the zombie background sound
|
||||||
|
// also keeps playing in the normal tennis game"). Leaving the court is one event and ducks both;
|
||||||
|
// ARRIVING is not — the ambience belongs to every mode and the zombie bed belongs to the gore.
|
||||||
|
export const ambient = () => {
|
||||||
|
loopBed('tennis-ambient-loop.wav', 500, 0.035);
|
||||||
|
fadeBed('tennis-ambient-loop.wav', false);
|
||||||
|
};
|
||||||
// ...and the splatter bed, same treatment: 5.9 MB of 24-bit WAV down to 287 KB. Its master is
|
// ...and the splatter bed, same treatment: 5.9 MB of 24-bit WAV down to 287 KB. Its master is
|
||||||
// 982597 frames at 48 kHz, which is the un-round 20.47077 s below — an AAC loop needs the SOURCE
|
// 982597 frames at 48 kHz, which is the un-round 20.47077 s below — an AAC loop needs the SOURCE
|
||||||
// length as loopEnd, not the decoder's padded one. See the note on menuMusic.
|
// length as loopEnd, not the decoder's padded one. See the note on menuMusic.
|
||||||
|
|||||||
+1
-1
@@ -221,7 +221,7 @@ function farB(z) {
|
|||||||
// Asset cache-buster — bump with main.js?v=N (see the img.src note below). EXPORTED because the
|
// Asset cache-buster — bump with main.js?v=N (see the img.src note below). EXPORTED because the
|
||||||
// menu screens hang <img> tags on the same files, and two copies of this number is one copy too
|
// menu screens hang <img> tags on the same files, and two copies of this number is one copy too
|
||||||
// many: the one that does not get bumped is the one that serves a cached 404.
|
// many: the one that does not get bumped is the one that serves a cached 404.
|
||||||
export const SPRV = 130;
|
export const SPRV = 131;
|
||||||
// The boot bar in main.js watches this. Nothing here CHANGES when things load — every sprite was
|
// The boot bar in main.js watches this. Nothing here CHANGES when things load — every sprite was
|
||||||
// already requested at import — it just makes the wait visible and holds the menu back until the
|
// already requested at import — it just makes the wait visible and holds the menu back until the
|
||||||
// last sheet has landed. See the onerror note below for the other half of "sometimes missing".
|
// last sheet has landed. See the onerror note below for the other half of "sometimes missing".
|
||||||
|
|||||||
@@ -869,6 +869,14 @@ test('the menus own the theme, and hand the court back its silence', () => {
|
|||||||
assert.ok(d.has(AMB) && d.has(ZOM), '...and the court does not follow you into the menu');
|
assert.ok(d.has(AMB) && d.has(ZOM), '...and the court does not follow you into the menu');
|
||||||
audio.ambient(); audio.zombieMusic(); // ...and the NEXT run is not played in silence
|
audio.ambient(); audio.zombieMusic(); // ...and the NEXT run is not played in silence
|
||||||
assert.ok(!d.has(AMB) && !d.has(ZOM), 'a second run sounds like the first');
|
assert.ok(!d.has(AMB) && !d.has(ZOM), 'a second run sounds like the first');
|
||||||
|
// ...but the SPLATTER BED IS THE GORE'S ALONE. Every run of every mode starts the ambience, so
|
||||||
|
// un-ducking both court beds there put the zombie music back on in classic tennis for the rest of
|
||||||
|
// the session (Oliver: "after playing the splatter gore, the zombie background sound also keeps
|
||||||
|
// playing in the normal tennis game"). Leaving the court is one event; arriving is not.
|
||||||
|
audio.menuMusic(); // back to the menu after a gore run
|
||||||
|
audio.ambient(); // ...and into a game of plain tennis
|
||||||
|
assert.ok(!d.has(AMB), 'the ambience belongs to every mode');
|
||||||
|
assert.ok(d.has(ZOM), 'the splatter music does NOT follow you into classic tennis');
|
||||||
audio.menuMusic();
|
audio.menuMusic();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user