Stop story bosses' rush at the net
Oliver: the strawberry seller as act I's first boss is way too hard, "or it should not cross the net". His charge is the one boss move exempt from the court band: it runs to a strike line in front of you, and contact is death. In the story every boss's rush now stops a metre short of the net and withdraws as before, so the threat is kept and the reach is not. The Physio in act IV is held the same way. Only the Champion's MATCH POINT rush in act V stays, because it is the finale. New test. v385, staging only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
16d0532f97
commit
2c9c7b84fd
6 files changed
+45
-1
No files matched your search
@@ -1268,6 +1268,9 @@ function startStoryBoss(kind) {
|
||||
const act = G.story.act;
|
||||
G.story.fight = kind;
|
||||
startBossFight(storyBossChapter(act, kind), storyBossArt(act, kind));
|
||||
// no story boss crosses the net — except THE CHAMPION, whose MATCH POINT rush IS the finale
|
||||
const b = zombies.find(z => z.variant === 'B');
|
||||
if (b) b.holdNet = !(act === 5 && kind === 'end');
|
||||
}
|
||||
|
||||
// THE MID-BOSS IS DOWN: the checkpoint. The rack is topped back up to the act's stock (never down),
|
||||
|
||||
@@ -318,6 +318,7 @@ export const TUNE = {
|
||||
bossZMax: 5.6, // you (~57 s at bossSpeed) rather than by you killing it — and every extra hp
|
||||
// above just made that MORE likely, not less. Only 'charge' breaks the band.
|
||||
bossChargeV: 4.2, // m/s the physio rushes at once it commits
|
||||
bossNetStop: 1.0, // m short of the net a STORY boss's rush stops (holdNet): the threat without the reach
|
||||
bossChargeT: 2.2, // s ONE RUSH takes, start to arrival — the charge speed is derived from it and
|
||||
// from how far away it is (bossAI), so the run-up reads the same every time and
|
||||
// is long enough to see coming. Was 1.5 s at a flat 4.2 m/s, which only reached
|
||||
|
||||
@@ -202,6 +202,10 @@ function bossAI(zb, dt) {
|
||||
// turns and withdraws the instant it arrives. A rush that misses is over.
|
||||
zb.x += Math.sign(zb.lane - zb.x) * Math.min(Math.abs(zb.lane - zb.x), TUNE.bossStrafe * 2 * dt);
|
||||
zb.z += zb.chargeV * dt;
|
||||
// THE STORY's bosses keep their own half (Oliver, 2026-10-15: the strawberry seller as act I's first
|
||||
// boss was "way too hard — or it should not cross the net"): the rush runs at you and stops short
|
||||
// of the net, a threat you read and punish rather than an instant death. (beats.startStoryBoss)
|
||||
if (zb.holdNet) zb.z = Math.min(zb.z, COURT.netZ - TUNE.bossNetStop);
|
||||
if (zb.moveT <= 0) { zb.charging = false; zb.moveT = TUNE.bossChargeRest; } // spent: it turns and walks back
|
||||
} else {
|
||||
// AND IT FALLS BACK. A rush that ended where it landed left the boss parked on top of you for
|
||||
|
||||
Reference in new issue
Block a user