Make every weapon hurt the boss, drop his HP bar, un-cap the director
Steps 1-3 of the late-game depth plan, after Oliver's 50+ game playtest. "Sometimes the racket zombie doesn't seem harmable" was real, not a feeling. Three of the five rack slots did nothing at all to him and said nothing about it: TRIPLE side balls skipped him, GUN and horde pellets skipped him, fire couldn't ignite him. BOMB meanwhile deleted him outright ignoring his hp. All of it now routes through one wound() with a TUNE.dmg* table, so damage is proportional to the body and a future 20 hp boss needs no new code. Fractional damage banks on zb.chip so whole points only come off hp — the wound skins switch on hp thresholds. His contact radius goes to 0.7 m, because part of "unharmable" was just missing him. Melee still skips him and that's correct: he's on the far side of the net and melee can't span it. The HP bar is gone. It was the only floating UI on a body, it was on screen for nearly the whole run, and nobody knew what it meant — while the wound skins already say the same thing in the language every other multi-hit enemy uses. A one-per-run modal explains what he is instead. Skins and bleed anchors now read a fraction of hpMax, since his hp scales with the run. And the plateau: every difficulty dial bottomed out by about game 12, so games 12-50 were arithmetically identical. Body cap, spawn gap, shamble speed, variant mix, boss hp and horde size all keep climbing now, calibrated to track the old curve through game 12 rather than replace it. One deliberate exception: shamble speed was time-based and maxed during game 2, so the early game is genuinely gentler now — zSpeedPerGame if that reads flabby. HANDOFF carries the full spec for steps 4 and 5 (ranged attacks with player damage, then chapter bosses) including the decisions we settled, so the next session can pick it up cold. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4cf54603f3
commit
ffac9b5512
6 files changed
+339
-54
No files matched your search
@@ -25,11 +25,42 @@ export const TUNE = {
|
||||
aiReaction: 0.45, // s before the CPU reads your shot — well-aimed corners are winners
|
||||
autoAssist: matchMedia('(pointer: coarse)').matches ? 1.15 : 0, // auto-run speed factor (mobile)
|
||||
zSpeed: 0.7, // zombie shamble speed m/s
|
||||
zSpawnEvery: 3.0, // s between spawns in game 1 — shrinks by zSpawnStep per finished game
|
||||
zSpawnMin: 1.0, // spawn-gap floor late in a run
|
||||
zSpawnStep: 0.22, // spawn-gap reduction per finished game
|
||||
zMax: 3, // shamblers on court in game 1 (cap grows +1 per game to zMaxCap; 0 = spawns off, for tests)
|
||||
zMaxCap: 14, // absolute shambler cap
|
||||
// ---- THE DIFFICULTY DIRECTOR. Every dial below used to bottom out by about game 12, which is why
|
||||
// a 50-game run stopped changing (games 12..50 were arithmetically identical). They are all keyed
|
||||
// on G.runGames now and all keep moving; the ceilings that remain exist for perf or fairness, not
|
||||
// because the curve ran out. See HANDOFF "The difficulty director".
|
||||
// Calibrated to TRACK the old curve through roughly game 12 and then keep going, rather than to
|
||||
// replace it: the first pass at this made games 1-30 easier, which is the opposite of the ask.
|
||||
zSpawnEvery: 3.0, // s between spawns in game 1
|
||||
zSpawnAccel: 0.16, // hyperbolic tightening: gap = zSpawnEvery / (1 + games * this). g5 1.67s,
|
||||
// g11 1.09s (old floored at 1.0 here and stopped dead), g20 0.71s, g30 0.52s
|
||||
zSpawnMin: 0.35, // hard spawn-gap floor, safety only — reached around game 41
|
||||
zMax: 3, // shamblers on court in game 1
|
||||
zMaxPerGame: 0.9, // cap growth per finished game (was a flat +1 into a wall at game 11)
|
||||
zMaxCap: 24, // absolute shambler cap — readability ceiling, reached ~game 24
|
||||
zSpeedPerGame: 0.13, // shamble-speed ramp per finished game. Was TIME-based (splatT/70) and hit its
|
||||
// ceiling after 105 seconds of splatter, i.e. during game 2 — so shamble speed
|
||||
// was never a progression lever at all. g12 matches the old top speed (1.75
|
||||
// m/s), and it climbs to 2.7 m/s by game 22.
|
||||
zSpeedMax: 2.9, // cap on that ramp (top speed = zSpeed * 3.9). runnerVMax still caps runners.
|
||||
nastyPerGame: 0.03, // share of spawns drawn from the advanced roster, per finished game
|
||||
nastyMax: 0.75, // ...capped here (g14 matches the old 0.42, g25 hits the cap). The old mix was
|
||||
// frozen at exactly 0.42 from game 12 to the end of the run.
|
||||
hordeGrow: 0.2, // horde length AND spawn rate both scale by this per set already banked
|
||||
zHordeCap: 34, // hard body ceiling DURING a horde. A horde ignores the director cap on
|
||||
// purpose (that is the point of it), but hordeGrow means a late wave now tries
|
||||
// for ~120 spawns where the old fixed 12 s x 2.5/s could only ever ask for 30,
|
||||
// and a 40-body court on a 270px-wide portrait screen is mush, not menace.
|
||||
racketHpPerGame: 0.12, // the racket zombie stiffens as the run goes on (floored into whole hp)
|
||||
// ---- damage. Bodies with hp (racket boss 'r', brute 'g') take damage in these units, so a big
|
||||
// boss is just a bigger hp number and every weapon stays proportional. Fractions are legal: they
|
||||
// bank on zb.chip and only whole points come off hp (the wound SKINS switch on hp thresholds).
|
||||
dmgBall: 1, // a splat-quality ball or serve
|
||||
dmgSide: 1, // one TRIPLE side ball — used to pass straight through the boss doing nothing
|
||||
dmgPellet: 0.34, // one machine-gun round — three chip a point off. Also used to no-op on the boss
|
||||
dmgBomb: 3, // caught in a blast. Was an instant kill that ignored hp entirely
|
||||
dmgFlame: 2, // a direct flame-ball touch (and it sets the boss alight, which it didn't before)
|
||||
bossBurnMul: 0.4, // burnDps multiplier while a boss body cooks — it burns, just slower than a body
|
||||
changeoverT: 5.0, // s the changeover breather lasts (after odd games, as the rules demand)
|
||||
boyMopSpeed: 2.2, // m/s a MOPPING ball boy crosses at (a fetching one still sprints at 7.5)
|
||||
boyMopDwell: 1.8, // s he stands on a stain pushing the mop before moving to the next one
|
||||
|
||||
Reference in new issue
Block a user