diff --git a/config.js b/config.js index 2e8219d..93b55a4 100644 --- a/config.js +++ b/config.js @@ -111,6 +111,12 @@ export const TUNE = { bossSalvoGap: 0.42, // s between the shots of one volley bossWind: 0.5, // s of telegraph before a boss throws — shorter than the machine's 0.9 on purpose: // he asked for a tighter reaction time, and a boss should be harder than furniture + bossDeathT: 0.7, // s of GAME time the chapter card holds off after the boss dies. The card used to + // land on the same frame as the kill and bury it — you never saw the thing you + // spent a whole fight earning. Game time, so the slow motion below stretches it + // to roughly a second and a half on the clock. + bossSlowT: 1.2, // s of REAL time the world runs slow while a boss comes apart + bossSlowMo: 0.35, // ...and how slow bossShotSpeed: 15.5, // m/s a boss throws at (the machine's is machSpeed 13) racketEvery: 3, // games between racket-zombie (plain opponent) spawns — was EVERY won game, which // is why he read as "the boss" and why a real boss would not have stood out diff --git a/gameplay.js b/gameplay.js index 81ff80e..678e8e1 100644 --- a/gameplay.js +++ b/gameplay.js @@ -484,8 +484,9 @@ export function endBossFight() { shots.length = 0; cheer(3.4, 0.9); voice('unbelievable', 0.3); G.card = { title: 'CHAPTER ' + c + ' DOWN', sub1: 'THE STANDS ARE ON THEIR FEET', - sub2: 'GAME ' + (G.runGames + 1) + ' NEXT', color: UI.pick, t: TUNE.setCardT }; - ball.active = false; G.phase = 'over'; G.overT = TUNE.setCardT; + sub2: 'GAME ' + (G.runGames + 1) + ' NEXT', color: UI.pick, t: TUNE.setCardT, + wait: TUNE.bossDeathT }; // ...after the body has finished coming apart + ball.active = false; G.phase = 'over'; G.overT = TUNE.setCardT + TUNE.bossDeathT; // hand back the game beat the boss interrupted — same contract resolveInterlude uses if (G.afterDuel) { G.afterClear = G.afterDuel; G.afterDuel = null; proceedAfterClear(); } } @@ -919,8 +920,14 @@ export function update(dt) { return; } if (G.flash) { G.flash.t -= dt; if (G.flash.t <= 0) G.flash = null; } - if (G.card) { G.card.t -= dt; if (G.card.t <= 0) G.card = null; } + // A card can wait before it shows. The chapter card used to land on the same frame as the boss + // died, so the biggest gore burst in the game happened underneath it and nobody ever saw it. + if (G.card) { + if (G.card.wait > 0) G.card.wait -= dt; + else { G.card.t -= dt; if (G.card.t <= 0) G.card = null; } + } if (G.shake && (G.shake.t -= dt) <= 0) G.shake = null; + if (G.bossBurst && (G.bossBurst.t -= dt) <= 0) G.bossBurst = null; if (G.boomFlash > 0) G.boomFlash -= dt; // A modal freezes the WORLD, not the clock: no zombie steps, no ball flight, no spawn timers, // so nobody gets eaten while reading a popup. idleT keeps running for the blink. diff --git a/index.html b/index.html index 1f1bd19..4ef5baa 100644 --- a/index.html +++ b/index.html @@ -97,6 +97,6 @@
- +