diff --git a/PROJECT.md b/PROJECT.md index 91936eb..ecf5830 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -4888,6 +4888,40 @@ per late opponent check quality ceilings and open-court frequency, with Club Pro control. All 131 tests pass with the default seed and eight additional seeds. Build v349 targets staging only. Combined difficulty still needs Oliver's playtest; shot statistics are not win rates. +## Session log: THE RETEST — sustained final-league returns, a brisker Climb, Gore at the front (2026-09-07, v350) + +Oliver still defends league 5 reliably at level 26; the first 6–7 Climb opponents feel like filler. +The previous final-league pass raised quality CAPS but left the .45 floor intact. Raising pace +traits alone would do nothing here: their return-pace multiplier already hits its cap of 1. + +- Brute / Director / Champion now return in quality bands .62–.76 / .68–.83 / .74–.90, and use + open-court aim on 50% / 70% / 85% of returns. `trySwing` reads the optional foe `qMin` just as + it already reads classic's floor. These final-league traits follow the body into cup, training + and Climb. Player level/peer gifts, opponent legs, wrong-footing, wounds and cup length stay put. +- **Climb-only opening**: `gameplay.matchStep` adds four progression steps at opponent one, + tapering linearly to zero at opponent eight. Movement (including intercept planning), return + pace, width and flub all read it. Actual opponent identity, territory pace and learning still + read the real rung. Cup onboarding and its training reps retain their old early curve. + Measured on actual update/return paths: the first Climb foe chases at 3.407 vs 2.520 m/s, + averages 18.639 vs 14.817 m/s return pace, reaches 2.364 vs 1.595 m return width, and returns + 1152 vs 1073 of 1200 contact attempts. The existing auto-run reachability soak still passes. +- Oliver chose the **direct Gore door** over a mid-season teaser: SPLATTER GORE sits below the + primary league fixture and starts Gore in one tap with the selected court/kit. OTHER GAMES, + STATS and BOARD share one quiet navigation row (44px touch targets); their headline numbers + are removed from the splash. Court/kit setup remains accessible through OTHER GAMES. +- Badge glints peak at the START of their long CSS cycle; the first peak is now .39–.89 s after + creation instead of ~5.5–19 s. The three points stagger, repeat slowly and still respect reduced + motion. Existing art and typography are reused; no generated assets or dependencies. + +Validation: 132 tests pass with the default seed plus 1, 7, 42, 99, 1234, 2026, 8888 and 20260907. +The return sampler measures mean quality .688 / .756 / .820 and open-corner shares 66.8% / 80.1% / +90.7% for the three final opponents. New Climb regression exercises real movement and returns, +including convergence at eight and unchanged cup/training behavior. Browser checked at 390×844 +and 320×568; all splash buttons fit, Gore starts directly, no browser errors in that flow. +This is stronger measured opposition, not a measured human win rate: league 5 still needs +Oliver's level-26 phone verdict. Oliver requested merging to main and pushing for his iPhone +test; this release carries the cache-busting entry version v350. + # OPEN — leftovers, in rough priority order Nothing here is broken; these are known gaps and unverified risks. diff --git a/index.html b/index.html index 444f392..fd785a3 100644 --- a/index.html +++ b/index.html @@ -374,8 +374,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat #cdBadges { display: flex; gap: 10px; align-items: flex-end; } #cdBadges .badge { position: relative; flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 4px; } - /* ...and an earned shield SMOULDERS: two-pixel embers drifting off it, each on its own delay and - lane (main.embers). Pure CSS — the menu parks the game loop and this has no business waking it. */ /* ...and it CATCHES THE LIGHT: three points on the shield, dark for most of a long cycle and flaring for a fraction of it (main.glints). Not a fire — a glint, the way metal behaves. */ #cdBadges .badge em { position: absolute; width: 4px; height: 4px; border-radius: 50%; @@ -383,9 +381,9 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat opacity: 0; pointer-events: none; animation-name: glint; animation-timing-function: ease-out; animation-iteration-count: infinite; } @keyframes glint { - 0%, 88%, 100% { opacity: 0; transform: scale(0.3); } - 92% { opacity: 1; transform: scale(1); } - 96% { opacity: 0.35; transform: scale(0.6); } } + 0%, 12%, 100% { opacity: 0; transform: scale(0.3); } + 4% { opacity: 1; transform: scale(1); } + 8% { opacity: 0.35; transform: scale(0.6); } } @media (prefers-reduced-motion: reduce) { #cdBadges .badge em { display: none; } } #cdBadges img { height: 46px; image-rendering: pixelated; } #cdBadges .badge u { font: 700 7px Silkscreen, monospace; color: var(--acid); letter-spacing: 0.5px; @@ -659,8 +657,16 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat padding-bottom: max(10px, env(safe-area-inset-bottom)); border-top: 2px solid var(--line); background: var(--solid); } .foot .btn { margin-bottom: 0; } - /* ...except the splash's own secondary door: OTHER GAMES sat flush on the STATS/RANKINGS row */ - .foot.bare #mOther { margin-bottom: 12px; } + /* Gore gets a front door; the records become quiet navigation, with full touch targets. */ + #mGore { display: flex; align-items: center; justify-content: center; gap: 12px; + padding: 9px 12px; border-color: #804338; background: #281b19; color: #f1d6bf; } + #mGore b { font: 400 23px/1.1 Bangers, cursive; letter-spacing: 1px; } + #mGore i { margin: 0; color: #d5aa91; font: 400 9px/1.5 Silkscreen, monospace; letter-spacing: 0; } + .splashLinks { display: flex; gap: 4px; margin-top: 5px; } + .splashLinks .btn.sec { flex: 1; width: auto; min-height: 44px; padding: 7px 2px; + background: transparent; border-color: transparent; color: #ccc4b5; + font-size: 16px; letter-spacing: 0; } + .splashLinks #mOther { flex: 1.5; } /* the splash's bottom band: no bar, no rule — the court art has to keep running under it */ .foot.bare { border: 0; background: none; } .foot.bare .btn.big { margin-bottom: 10px; } @@ -680,10 +686,10 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat animation: dealIn 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) backwards; } #intro.deal #splash #plaque { animation-delay: 0.02s; } #intro.deal #splash #mStart { animation-delay: 0.12s; } - #intro.deal #splash #mOther { animation-delay: 0.19s; } - /* the pair of secondary buttons is a CLASS, so it needs the same weight as the shorthand above + #intro.deal #splash #mGore { animation-delay: 0.19s; } + /* the navigation row is a CLASS, so it needs the same weight as the shorthand above to override its delay — the id selectors around it get there on their own */ - #intro.deal #splash .foot.bare > .two { animation-delay: 0.26s; } + #intro.deal #splash .foot.bare > .splashLinks { animation-delay: 0.26s; } #intro.deal #splash #build { animation-delay: 0.33s; } @media (prefers-reduced-motion: reduce) { #intro.deal #splash #plaque, #intro.deal #splash .foot.bare > * { animation: none; } } @@ -696,7 +702,7 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat #boot u { display: block; margin-top: 7px; text-align: center; text-decoration: none; font: 400 9px Silkscreen, monospace; color: var(--dim); letter-spacing: 2px; } #splash.busy #boot { display: block; } - #splash.busy .btn, #splash.busy .two, #splash.busy #build { display: none; } + #splash.busy .btn, #splash.busy .splashLinks, #splash.busy #build { display: none; } /* NOTHING DATA-DRIVEN DURING THE BOOT (2026-08-31, Oliver: "die oberfläche ist hier regelmäßig in einem undefinierten zustand"). The plaque used to stand there as a skeleton, which is still a plaque saying LEVEL 1 to a level-25 player for as long as the profile takes to land. The @@ -847,12 +853,13 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat + Gore has its own secondary door; the other modes live behind OTHER GAMES. --> - -