diff --git a/PROJECT.md b/PROJECT.md index 9f7a54b..f2943d2 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -1020,6 +1020,20 @@ contact radius: the tap must be honest" rule stands). A rally mode lives on cont 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. +**TWENTY-THIRD PASS — first game won, and the rungs flatten.** Fourth recorded session, his +verdict "better": **he beat opponent one — the first game won in any recorded session — and reached +opponent two,** which then took him apart with gaps of 1.66-2.13 m (60 Hz, accurate) while he swung +at closest approach every time. The ladder gradient is real; the STEP was a wall, because every +rung moves three dials at once (speed, width, pace, plus flub). Per-rung increments softened: +`matchSpeedPer` .12->.08, `matchWidePer` .4->.25, `matchOppPacePer` .05->.035. Opponent one is +untouched — the bases stay; only the slope flattens. + +The contact chain is now verified end to end by recorded play: LEGS (matchAssist) -> DESTINATION +(assistK in intercept + the anyHit short-ball chase) -> REACH (matchReach). Each link was a separate +defect found by a separate recorded session. The flight recorder earned a permanent place in the +toolbox: passive 20-60 Hz sampling with pre-loss trails ended four rounds of "still the same" in +four sessions, where autopilot measurement had failed for three passes straight. + **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 ef792ea..9337e41 100644 --- a/index.html +++ b/index.html @@ -400,6 +400,6 @@ - + diff --git a/src/config.js b/src/config.js index 91a3802..fa911e5 100644 --- a/src/config.js +++ b/src/config.js @@ -390,7 +390,9 @@ export const TUNE = { // the broken recovery (the player never walked back to centre, so every // wide return looked like opponent strength) — with real footwork restored // it starts gentler and the ladder still climbs - matchSpeedPer: 0.12, // ...growing this much per opponent felled + matchSpeedPer: 0.08, // ...growing this much per opponent felled. Softened once: each rung moves + // THREE dials at once (speed, flub, width, pace), and the recorder showed + // opponent two as a wall — he beat one and lost every gap to two by ~0.3 m 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 @@ -402,11 +404,11 @@ export const TUNE = { // is the game's job. Held keys still override matchOppPace: 0.78, // scale on the opponent's return SPEED for opponent one (~21 m/s instead // of ~27) — the flight time auto-run needs. THE reachability dial - matchOppPacePer: 0.05,// ...climbing back per rung, capped at full pace + matchOppPacePer: 0.035,// ...climbing back per rung, capped at full pace (softened with speedPer) matchWideBase: 2.1, // m either side of centre the FIRST opponent's returns may land — the width an // auto-run player can actually cover. Its scatter painted lines from game one // ("still a LOT of unreachable balls"); now line-painting is the late ladder - matchWidePer: 0.4, // ...earning this much more width per opponent felled + matchWidePer: 0.25, // ...earning this much more width per opponent felled (softened with speedPer) matchHeal: 2, // hp back for a game won (the duel's healPerDuel rate) // The timing windows, DRAWN (the match's whole ask: "what is the possible tap window, what is the // sweet spot"). Numbers shared with the mechanics they visualise, so the picture cannot lie: