The colour goes on the court, and the dead go off like everyone else
"the colored zombies should also explode like they did before and make the normal splash sound on destruction.. no bleeps please.. can we make the color as a color circle the walk on? the sign they're holding is not nice. also remove the ball slicing in this mode.. this leads to unwanted hits". The silent deaths were my bug: the hook in killZombie did drillKill(zb) and then RETURNED, and everything below that return is the death — decal, pile, 36-particle burst, splat, headshot crack. It resolves after the splice and without returning now. Both halves are load-bearing and each was a bug in turn: splice first or a freshly drawn combination names the corpse; don't return, or the body simply vanishes. The colour is a disc on the court the body walks on, drawn before the sprite. The bib was a flat quad pinned to a walking sprite — UI stuck onto a character, covering the art it sat on. On the ground it takes the court's own perspective, measures 12.4px across at the spawn line against a chest patch's few, and hides none of the sprite. A hard dark rim plus a bright inner line is what keeps it from reading as another gore decal. No slicing in the drill: a cut ball leaves the corpse and strikes whatever it finds next, which in a mode where the wrong body is the failure is the game choosing your target for you, badly. And the mode has no sound of its own now, deliberately. The umpire reading the list was vetoed, the arpeggio that replaced him was vetoed. blip() is deleted. A kill bursts and splats like every other kill in this game; the strip carries the list. 28 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
abd6d4f789
commit
d775ac40ec
7 files changed
+96
-72
No files matched your search
+18
-18
@@ -21,14 +21,16 @@
|
||||
import { TUNE } from './config.js';
|
||||
import { G } from './state.js';
|
||||
import { zombies, spawnZombie } from './zombies.js';
|
||||
import { voice, blip, sfx } from './audio.js';
|
||||
import { voice } from './audio.js';
|
||||
|
||||
// The bib colours. Six, and a colour is on court at most once, so a colour always names exactly one
|
||||
// body. `tone` is its PITCH — see the arpeggio in newRound. The recorded umpire reading the list
|
||||
// aloud is deleted (Oliver: "daniel announcing is maximum annoying"): at ~0.8 s a word he needed
|
||||
// four seconds to get through a list of four, and with rounds running continuously that is a man
|
||||
// talking over the entire mode. A rising figure says the same thing in half a second and does not
|
||||
// wear out. (`drill_*.m4a` stay in assets — cheap to keep, and a slower variant could want them.)
|
||||
// The colours. Six, and a colour is on court at most once, so a colour always names exactly one body.
|
||||
//
|
||||
// THE MODE HAS NO SOUND OF ITS OWN, and that is now deliberate. Two attempts have been vetoed: the
|
||||
// recorded umpire reading the list aloud ("daniel announcing is maximum annoying" — at ~0.8 s a word
|
||||
// he needed four seconds for a list of four, over and over), and the arpeggio that replaced him
|
||||
// ("no bleeps please"). What is left is the game's own vocabulary: a kill bursts and splats like
|
||||
// every other kill in the game, and the strip carries the list. Do not put a third noise here
|
||||
// without a reason — the two that were tried both read as the mode talking over itself.
|
||||
//
|
||||
// THERE IS NO REDUNDANT CHANNEL ANY MORE, and that is a known accessibility gap rather than an
|
||||
// oversight. Die-face dots rode on the bib and the HUD chip so the mode could be played without
|
||||
@@ -37,12 +39,12 @@ import { voice, blip, sfx } from './audio.js';
|
||||
// Oliver's call. If the mode ships, the answer is bibs that differ by SHAPE or marking at sprite
|
||||
// scale, not dots: a channel that fails at the far baseline is not a channel.
|
||||
export const DRILL_COLS = [
|
||||
{ key: 'red', col: '#e5342c', tone: 392, name: 'RED' },
|
||||
{ key: 'blue', col: '#2f6bff', tone: 440, name: 'BLUE' },
|
||||
{ key: 'yellow', col: '#f2c318', tone: 494, name: 'YELLOW' },
|
||||
{ key: 'green', col: '#27bd4a', tone: 587, name: 'GREEN' },
|
||||
{ key: 'purple', col: '#9b3fd8', tone: 659, name: 'PURPLE' },
|
||||
{ key: 'white', col: '#f2f0e8', tone: 784, name: 'WHITE' },
|
||||
{ key: 'red', col: '#e5342c', name: 'RED' },
|
||||
{ key: 'blue', col: '#2f6bff', name: 'BLUE' },
|
||||
{ key: 'yellow', col: '#f2c318', name: 'YELLOW' },
|
||||
{ key: 'green', col: '#27bd4a', name: 'GREEN' },
|
||||
{ key: 'purple', col: '#9b3fd8', name: 'PURPLE' },
|
||||
{ key: 'white', col: '#f2f0e8', name: 'WHITE' },
|
||||
];
|
||||
|
||||
// ---- THE RAMP. One number, 0..1 off time survived; everything else is a lerp on it. Time, not
|
||||
@@ -111,10 +113,7 @@ function newRound(d) {
|
||||
const pool = bibs();
|
||||
d.step = 0; d.faults = 0;
|
||||
d.seq = pool.length ? shuffle(pool.map(z => z.bib)) : [];
|
||||
// THE CALL, without the man: one short note per colour, in the called order. Half a second for the
|
||||
// whole figure. TUNE.drillTones 0 plays it silent.
|
||||
if (TUNE.drillTones > 0)
|
||||
d.seq.forEach((b, i) => blip(DRILL_COLS[b].tone, i * 0.13, 0.22 * TUNE.drillTones));
|
||||
// (no sound: the strip IS the call — see the note on DRILL_COLS)
|
||||
}
|
||||
|
||||
// Called by beats.startDrill once the court is its own.
|
||||
@@ -146,7 +145,8 @@ export function drillKill(zb) {
|
||||
const d = G.drill; if (!d || zb.bib === undefined) return;
|
||||
if (zb.bib === d.seq[d.step]) {
|
||||
d.step++;
|
||||
sfx('pock', 0.7);
|
||||
// no tick here either — killZombie is already bursting the body and playing the splat, and that
|
||||
// burst is a far better "yes, that one" than a beep laid over the top of it
|
||||
if (d.step >= d.seq.length) { // round complete — and the next one is already here
|
||||
d.rounds++;
|
||||
d.msg = { text: 'GOOD', t: 0.9 };
|
||||
|
||||
Reference in new issue
Block a user