The leagues, phase 1: the profile clock ticks — xp, levels, the identity screen, the server mirror

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-29 12:22:33 +02:00
1 parent bc10216d0b
commit 9133c0d351
12 files changed
+507 -19

No files matched your search

+4 -1
View File
@@ -11,6 +11,7 @@ import { drillKill, drillCaught } from './drill.js';
import { splatPoint, cheer, spentBall, aside, grantWeapon, endBurst, sliceCarom } from './gameplay.js';
import { resolveInterlude, endBossFight } from './beats.js'; // runtime-only cycle, like the gameplay one
import { tally, multiKill, endRun, MODE_MATCH } from './stats.js';
import { award } from './profile.js';
export const zombies = []; // {x, z, v, walkT, variant: 'a'|'b'|'c'}
export const gore = []; // lawn decals {x, z, r, a} — the flat ground layer
@@ -498,10 +499,12 @@ function killZombie(i, quiet) {
// the one that has been killing you.
// A MATCH OPPONENT FILES UNDER WHO IT IS, not under the generic body it wears: the screen is a
// list of who you have felled, and 'r' is a body, not a name. zb.foe is set by matchOpponent.
if (zb.variant !== 'o')
if (zb.variant !== 'o') {
tally(zb.foe ? zb.foe.key
: zb.variant === 'B' ? 'B' + Math.max(0, BOSS_ART.indexOf(zb.art))
: zb.variant, CAUSE);
award('kill'); // the leagues' clock, at the same single funnel — award() mutes no-stakes modes
}
zombies.splice(i, 1);
// THE DRILL RESOLVES HERE — after the splice, and WITHOUT returning. Both halves are load-bearing:
// splice first, because drillKill can draw a new combination on the spot (a double fault