Let the horde gun keep up with the horde
The run ended on the second wave every time: the gun fired 6 flat rounds a second, hit one body each, and every shambler soaked one — while hordeGrow made each wave longer and denser. Doubled the rate and scaled it with the wave (14/s at one set banked, 21/s at four), gave a round 0.5m of extra reach, a wider cone, and enough damage to drop a shambler outright. Raised the spawn rate to match, so surviving a wave still leaves a standing crowd on your half — that pressure is the point of it. Also: he no longer carries a second racket at his hip while holding one forward (the run frames are the racket-less art), the umpire stopped talking over himself and saying "remain seated" twice, and a timed freeze now shows what it is counting down to instead of reading as dead controls. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
571cd4c399
commit
e904dfefa6
5 files changed
+47
-13
No files matched your search
@@ -24,9 +24,17 @@ function reverb(ac) { // stadium PA tail: exponentially decaying noise as impuls
|
||||
return reverbNode;
|
||||
}
|
||||
|
||||
// The umpire is one man with one microphone. Several triggers landing together used to play two or
|
||||
// three lines on top of each other; a line that would start while he is still talking is DROPPED.
|
||||
// The check happens at play time (not call time) so a first-play fetch/decode is judged fairly.
|
||||
let voiceUntil = 0;
|
||||
|
||||
export function voice(name, delay = 0, rate = 1) {
|
||||
const ac = audio();
|
||||
const play = buf => {
|
||||
const at = ac.currentTime + delay;
|
||||
if (at < voiceUntil) return;
|
||||
voiceUntil = at + buf.duration / rate + 0.2; // + a breath, so lines never butt against each other
|
||||
const src = ac.createBufferSource(); src.buffer = buf;
|
||||
src.playbackRate.value = rate; // < 1 = slower and lower — the umpire's dark register
|
||||
src.connect(ac.destination); // dry
|
||||
|
||||
Reference in new issue
Block a user