Make it readable: 2x sprites, a flatter camera, honest hit timing
The umpire is situational again. Each line is tied to the thing that justifies it — a new variant appearing, the court filling, one crossing your baseline, a game lost, a horde, a changeover — behind one shared cooldown, so several triggers at once still yield one remark. The random timer pool is gone, the interval went 26s to 55s, and ump_out_of_order, ump_let and ump_no_appeal are deleted. "Visually the ball is not yet at the player but somehow the player already is hit" was real and measurable. The hostile-ball hit test reused the parry's hypot(dx, dz*0.8), and weighting depth shrinks it: contact fired while the ball was still 0.68 m up-court and drawn up around his head. It has its own unweighted test now, and contact lands at 0.25 m with the ball on his chest. The parry keeps its weighting — a racket sweep really is wider than it is deep. On "everything is a tad too small": measured first, because higher-resolution sprites are only half the answer. At RES 3 the player rasterises into 170 device pixels from a 112px source — upscaled 1.5x — while a far shambler is downscaled to 78. So near bodies needed resolution and far bodies needed the camera. Camera: pushed back and lengthened (camZ 42->48, camF 580->760) to flatten the perspective so distant bodies grow relative to near ones rather than everything zooming, camY raised for a steeper look-down, horizon re-centred. Far shambler 26->30px, boss 39->45px, player unchanged, court in the same band. Sprites: the original sheets were still in the repo at full resolution, so nothing needed regenerating — IDLE_TARGET_H went to 224 and every sheet was re-sliced. The sheet-to-output mapping was never recorded, so it was recovered by matching sliced frames to existing assets by image signature: 58 came back from sheets, the 29 without a confident match were 2x-upscaled to stay on the shared scale, since a sprite off that scale renders at half height. Tennis untouched: 50 hits / 0 whiffs. 45-game soak clean, all four chapters. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
8bc57e9358
commit
49d391dc64
95 files changed
+119
-21
No files matched your search
@@ -67,6 +67,11 @@ export const TUNE = {
|
||||
machWind: 0.9, // s of TELEGRAPH before each shot — the fairness contract, same idea as shriek()
|
||||
machSpeed: 13, // m/s it fires at
|
||||
machDmg: 1, // player hp a shot costs if you don't return it
|
||||
shotHitR: 0.42, // m — how close a hostile ball must ACTUALLY be to hit you. Measured: the old test
|
||||
// (0.55 m with the parry's 0.8 z-weighting) fired while the ball was still 0.68 m
|
||||
// up-court and drawn up around his head — "visually the ball is not yet at the
|
||||
// player but somehow the player already is hit". Depth is NOT weighted here.
|
||||
shotHitY: 1.75, // m — and it has to be at body height, so a lob passing overhead never counts
|
||||
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
|
||||
@@ -98,7 +103,7 @@ export const TUNE = {
|
||||
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
|
||||
asideEvery: 26, // s between the umpire's sarcastic asides in splatter (jittered +-40%). He never
|
||||
asideEvery: 55, // s between the umpire's sarcastic asides in splatter (jittered +-40%). He never
|
||||
// acknowledged that the match had changed; now he comments on it, disapprovingly.
|
||||
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
|
||||
@@ -289,4 +294,8 @@ export const POSE_TIME = 0.38;
|
||||
export const BOUNCE_IDLE = { dx: 0.5, apex: 0.55, tempo: 3.6 };
|
||||
|
||||
// generated sprite sheets: the idle pose is this many pixels tall; all scales derive from it
|
||||
export const SPRITE_H = 112;
|
||||
export const SPRITE_H = 224; // 2x remaster (was 112). RES is 3, so the player at the baseline
|
||||
// rasterises into ~170 DEVICE pixels — a 112px source was being UPSCALED
|
||||
// 1.5x, which is why near sprites looked soft and mushy. Every sprite that
|
||||
// goes through drawChar/drawBoy/the wound-stage height rule must share this
|
||||
// scale, so unmatched sprites were 2x-upscaled rather than left at 112.
|
||||
Reference in new issue
Block a user