diff --git a/PROJECT.md b/PROJECT.md index a13a727..9f7a54b 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -1010,6 +1010,16 @@ vignette. just a slight red pulsing from below"*. Three distinct defects: - **Test-measurement trap for the log**: reading `P.z` after the chase loop proves nothing — the point reset teleports him home. Measure the minimum DURING the chase. +**TWENTY-SECOND PASS — the longer racket.** Third recorded session, and the previous fixes did +their job while exposing the last gap: he ran onto every ball (2.9-3.9 m per point, was 0.2-0.5), +the ball reached him (died at z 22.5-24, was 18-20), he swung every single time — and the closest +approach clustered at a sampled 1.3-1.6 m, centimetres outside the 1.3 m post-bounce reach, point +after point. The assist can deliver you NEAR the ball but not inside a phone-tuned contact radius. +`matchReach` 1.35 widens the contact test in the match only (gore modes untouched — their "tight +contact radius: the tap must be honest" rule stands). A rally mode lives on contact feeling fair. +Note for future recorder sessions: **a 20 Hz sampler overstates closest approach by up to ~0.5 m** +on a 20 m/s ball — the recorder now samples at 60 Hz. + **Open, and every one of them is Oliver's call after he plays it:** 1. ~~**A ball that carries through the lane can complete two steps at once.**~~ Largely CLOSED by the slice removal (seventh pass) — a cut ball picking its own next victim was the main way this diff --git a/index.html b/index.html index 0e15987..ef792ea 100644 --- a/index.html +++ b/index.html @@ -400,6 +400,6 @@ - + diff --git a/src/config.js b/src/config.js index 0d71333..91a3802 100644 --- a/src/config.js +++ b/src/config.js @@ -394,6 +394,9 @@ export const TUNE = { matchFlub: 0.08, // the match's own whiff base — the duel's 0.2 gives away a fifth of all // returns, which across a game is an opponent that beats itself matchFlubKeep: 0.82, // ...and it keeps only this much per rung — the ladder now that hp is flat + matchReach: 1.35, // contact reach multiplier in the MATCH. The recorder showed swings missing by + // centimetres point after point — the assist parks you near the ball, not inside + // a 1.3 m reach. A rally mode lives on contact feeling fair. Match-only matchAssist: 1.15, // auto-run floor DURING A MATCH, any device. autoAssist keys off pointer:coarse, // so desktop had no legs at all — the match is a tap-timing game and footwork // is the game's job. Held keys still override diff --git a/src/gameplay.js b/src/gameplay.js index 15b1dbe..35c4285 100644 --- a/src/gameplay.js +++ b/src/gameplay.js @@ -953,7 +953,12 @@ function trySwing(ch, isAI, qCap = TUNE.aiQualityMax) { // Contact happens if the ball is inside reach while the swing window is open. // Player volleys (pre-bounce) get wider reach + window: full-speed ball, no bounce cue. const volley = !isAI && ball.bounces === 0; - const reach = isAI ? TUNE.aiReach : TUNE.reach * (volley ? VOLLEY.reach : 1); + // The MATCH plays with a longer racket. The flight recorder's third session: he ran onto every + // ball (2.9-3.9 m per point) and swung every time, and the closest approach clustered at a + // sampled 1.3-1.6 m — centimetres outside the 1.3 m post-bounce reach, point after point. The + // assist can deliver you NEAR the ball but not INSIDE a phone-tuned reach; a rally mode lives or + // dies on contact feeling fair, and the gore modes are untouched. + const reach = isAI ? TUNE.aiReach : TUNE.reach * (volley ? VOLLEY.reach : 1) * (G.match ? TUNE.matchReach : 1); const win = TUNE.swingWindow * (volley ? VOLLEY.window : 1); const t = ch.swingT; if (t < TUNE.swingWindup || t > TUNE.swingWindup + win) return; diff --git a/test.js b/test.js index 232045d..b735c64 100644 --- a/test.js +++ b/test.js @@ -684,6 +684,11 @@ test('REACHABILITY: an auto-run player can cover the first opponent\'s returns', } finally { TUNE.autoAssist = assist; } }); +test('the match racket is longer, and only the match racket', () => { + assert.ok(TUNE.matchReach > 1.2, 'match contact reach is widened — the recorder showed misses by centimetres'); + // the gore modes' contact stays untouched: matchReach only multiplies inside G.match +}); + test('the ladder pace dial exists and starts below full pace', () => { assert.ok(TUNE.matchOppPace < 1, 'opponent one returns slower than the physics maximum'); assert.ok(TUNE.matchOppPacePer > 0, 'and earns pace back per rung');