diff --git a/PROJECT.md b/PROJECT.md index 651c812..6ec9bb9 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -493,7 +493,11 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu ## Session log: THE READ, the walk-on modal, the training court, movement reads (2026-08-28) -Four items from one phone report. PHONE VERDICT PENDING on all of them. +Four items from one phone report. PHONE VERDICT PENDING on 2-4; item 1 got its first verdict the +same day — *"die Gegner sind jetzt etwas zuu einfach"* — and was turned down a notch: `readHabit` +3 -> 4, `surpRead` 0.85 -> 0.6, `surpSlow` 0.45 -> 0.3, `surpFlub` 0.35 -> 0.22. A surprise is an +opening the player still has to play, not a point handed over. The whiff-window test pin moved +0.25 -> 0.15 with it. ### 1. THE READ — the twist for the post-COACH wall Oliver: past the HEAD COACH *"the opponents are very fast and barely make mistakes any more — we diff --git a/index.html b/index.html index a7630be..6dae971 100644 --- a/index.html +++ b/index.html @@ -675,6 +675,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat - + diff --git a/src/config.js b/src/config.js index 930d7cf..36e234c 100644 --- a/src/config.js +++ b/src/config.js @@ -608,11 +608,14 @@ export const TUNE = { // the champion — "HE RETURNS EVERYTHING" — is exactly the one you beat by setting a habit and // breaking it on the big point. Skill, not grind, is what opens the ladder past the coach. // Rally lanes only (doHit's aimed player shots); serves keep their own game. Solo match only. - readHabit: 3, // same-lane returns in a row before the opponent has learned the pattern + // RETUNED DOWN 2026-08-28 same day (Oliver: "die Gegner sind jetzt etwas zuu einfach"): the + // habit takes one more shot to learn and the wrong-foot costs about a third less on every dial, + // so a surprise is an opening you still have to play, not a point handed over. + readHabit: 4, // same-lane returns in a row before the opponent has learned the pattern readAnticipate: 0.97,// what aiRead climbs toward on an EXPECTED ball at the top rung - surpRead: 0.85, // fraction of aiRead a wrong-footed opponent loses (x rung scale) - surpSlow: 0.45, // fraction of chase speed it loses on the surprise ball (x rung scale) - surpFlub: 0.35, // whiff ADDED at contact on the surprise ball at the top rung + surpRead: 0.6, // fraction of aiRead a wrong-footed opponent loses (x rung scale) + surpSlow: 0.3, // fraction of chase speed it loses on the surprise ball (x rung scale) + surpFlub: 0.22, // whiff ADDED at contact on the surprise ball at the top rung // ---- MOVEMENT READS (2026-08-28): the sprites run, the court answers. Two cheap effects, both // live-tunable: feet kick the surface's own dust once a body crosses trailMin, and a body moving // that fast leaves a two-ghost speed streak behind it (the modal masthead's own trick, sampled diff --git a/test.js b/test.js index 880efcf..dcaa33b 100644 --- a/test.js +++ b/test.js @@ -2110,7 +2110,9 @@ test('THE READ: a habit is learned by repetition and a break wrong-foots the rac 'a wrong-footed champion runs slower than the head coach at full stride'); const champFlub = TUNE.matchFlub * Math.pow(TUNE.matchFlubKeep, cfg.LADDER - 1) * cfg.matchFoe(cfg.LADDER).flub; assert.ok(champFlub < 0.02, '(the champion barely misses on his own — the wall being answered)'); - assert.ok(champFlub + TUNE.surpFlub > 0.25, 'the surprise opens a real whiff window in that racket'); + // 0.15, not 0.25: the same-day retune ("die Gegner sind jetzt etwas zuu einfach") took a third + // off every surprise dial — the window must stay REAL, but it is an opening, not a free point + assert.ok(champFlub + TUNE.surpFlub > 0.15, 'the surprise opens a real whiff window in that racket'); assert.ok(TUNE.readAnticipate <= 1, 'anticipation never reads better than perfect'); assert.ok(TUNE.readHabit >= 2 && TUNE.readHabit <= 6, 'a habit is learnable inside one game'); });