Make the parry reachable, and stop a boss dying to one flame ball
Six reports from Oliver's first playtest of the boss build. Two mattered. A boss sprite turned up in the shambler crowd because z_B1.png and z_b1.png are the same file on a case-insensitive filesystem — writing the boss frames silently overwrote the 'b' shambler's first two frames, and `ls` only ever showed the original lowercase name. Restored from HEAD~1, boss frames renamed z_boss*, and the rule is now in the asset pipeline notes. The parry was unreachable, which killed the entire new mechanic: P.swingT is only set in keyPressed's `phase === 'rally'` branch, and splatter sits in pretoss almost all the time, so every tap aimed at an incoming shot tossed the serve ball instead of swinging. An incoming shot inside parryArm now owns the tap in every phase, with its own generous reach and window — this is a phone, one thumb, against something aimed at you. The three fail cases (too early, too late, no tap) are what keep it a timing skill. The swish no longer eats shots: it runs first in keyPressed and was swallowing the very ball the parry was about to return. One flame ball killed a 16 hp boss, and that was a bug rather than tuning. A flame ball is not consumed on contact (full pierce, so it can cut a lane) but a boss is not removed when hit, so the same ball re-wounded it every frame. Boss bodies now take a contact cooldown and flame spends itself on them. Chapter 1 costs 4 flame balls or 16 clean smashes, and bossHp goes 10 to 16. The boss had no wounded state while throwing — correct, the wound skins were standing poses only. New sheet gives all four damage states their own overarm pitch. The ball machine's four painted rects are replaced with a real sheet, idle and firing, keeping only the muzzle glow procedural because the telegraph has to read at 20px tall. And the player's blood no longer sits on him as a painted layer: live drip and the screen-edge wash, nothing else. Tennis untouched: 30 tapped points, 50 hits / 0 whiffs. 45-game soak clean, all four chapters firing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4a066e5cc6
commit
295470b73c
21 files changed
+137
-85
No files matched your search
@@ -68,11 +68,19 @@ export const TUNE = {
|
||||
machSpeed: 13, // m/s it fires at
|
||||
machDmg: 1, // player hp a shot costs if you don't return it
|
||||
parryPow: 0.85, // shot quality of a RETURNED machine ball — a parry is a real weapon
|
||||
// The parry gets its OWN generous reach and window, not the normal swing's. Returning a shot is the
|
||||
// intended answer, on a phone, with one thumb, against something aimed at you — it has to be
|
||||
// forgiving. parryWindow must stay <= swingWindup + swingWindow*VOLLEY.window (0.348 s) or the
|
||||
// swing clock in update() expires before the window closes.
|
||||
parryArm: 6.0, // m — an incoming shot this close makes the next tap a SWING instead of a serve
|
||||
parryReach: 2.4, // m — how far off the racket a return still connects (normal volley reach is 1.82)
|
||||
parryWindow: 0.34, // s the return window stays open after the tap
|
||||
// ---- chapter bosses: one every bossEvery games, escalating. The racket zombie is demoted to an
|
||||
// occasional opponent (racketEvery) so the boss is the only thing that reads as a wall.
|
||||
bossEvery: 10, // games between chapter bosses
|
||||
bossHp: 10, // hp of the FIRST one; each later chapter adds bossHpPerChapter
|
||||
bossHpPerChapter: 8,
|
||||
bossHp: 16, // hp of the FIRST one; each later chapter adds bossHpPerChapter. 10 was far too
|
||||
// soft — three banked flame balls took chapter 1 down (2 impact + 2.4 burn each)
|
||||
bossHpPerChapter: 9,
|
||||
bossScale: 1.5, // body height multiplier at chapter 1 (a shambler is 1.8 m)
|
||||
bossScalePer: 0.18, // ...growing per chapter, so chapter 4 towers
|
||||
bossSpeed: 0.42, // m/s it advances — slow, deliberate, unstoppable
|
||||
@@ -90,6 +98,10 @@ export const TUNE = {
|
||||
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
|
||||
bossHitCool: 0.2, // s a boss body is immune to further BALL contact after taking a hit. A flame ball
|
||||
// has full pierce (it is not consumed on contact, so it can cut a lane), and a boss
|
||||
// is not removed when hit — so the same ball sat inside its radius and re-wounded it
|
||||
// EVERY FRAME. That is why one flame ball killed a 16 hp chapter boss.
|
||||
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
|
||||
@@ -206,6 +218,7 @@ COURT.svcNear = COURT.netZ + 6.4; // near service line
|
||||
|
||||
// world sizes (meters)
|
||||
export const PLAYER_H = 1.88;
|
||||
export const MACH_H = 1.15; // a ball machine stands about waist high — it must read as furniture, not as a body
|
||||
export const BOY_H = 1.5; // was 1.2 — the mopping boy read as a distant speck at that scale
|
||||
// how far off-court a boy starts. The mop boy comes in from just off-screen (he is slow, and
|
||||
// waiting 8s for him to walk into shot is dead time); a fetching boy sprints in from further out.
|
||||
|
||||
Reference in new issue
Block a user