From 7fb595ca22773c83a0f310ed9131decd88b10ef5 Mon Sep 17 00:00:00 2001 From: Oliver Rieger Date: Sun, 30 Aug 2026 16:16:54 +0200 Subject: [PATCH] The look stops lying: the fallback never reports done, and the women's frame gets room to stand tall Co-Authored-By: Claude Fable 5 --- PROJECT.md | 14 ++++++++++++++ index.html | 8 ++++---- src/render.js | 10 +++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/PROJECT.md b/PROJECT.md index 0c31397..a9166c5 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -491,6 +491,20 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu `RETURNED`, `DOUBLE KILL`) is a footnote to something you already watched happen. Sharing the loud FACE with the milestone cards is right; sharing their SIZE made every footnote read as a milestone. +## Session log: the look stops lying (2026-08-29, Oliver: "the man with a pink shirt") + +After a reload with the women's tour picked, the live-player preview showed THE MAN from behind +in her kit colour — and the woman, when she did show, stood a head shorter. Two root causes: + +- **drawLook's fallback satisfied the retry poll.** `n_idle1_f || p_idle1_f || p_idle1` drew + whichever loaded first and returned true — the caller's 200 ms poll stopped on the lie and the + stand-in stuck. It still draws the stand-in (better than a blank) but returns done only when + the WANTED frame drew. +- **The 96px canvas width-bound the contain fit.** Both front sheets are 224 tall, but hers is + 127 wide against his 114 (she reaches further — the TOURS note), so contain on 96 shrank her + 10% more than him. The three look canvases are 128 wide now; both bodies are height-bound and + stand equally tall. + ## Session log: training pays a quarter, the bar wears its endpoints (2026-08-29, the batch's two discussions, both go) - **THE TRAINING COURT PAYS A QUARTER.** Zero pay made it feel pointless in a meta game (his diff --git a/index.html b/index.html index d2b6574..fc07a76 100644 --- a/index.html +++ b/index.html @@ -665,7 +665,7 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat where you can watch it land. Kit and skin rows are built in main.js from the tables. -->

01 · PLAYER

- +
KIT @@ -707,7 +707,7 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat

THE BODY

- +
KIT @@ -741,7 +741,7 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat

YOUR PLAYER

- +
@@ -871,6 +871,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat
- + diff --git a/src/render.js b/src/render.js index 5a0cd0f..e82a5ec 100644 --- a/src/render.js +++ b/src/render.js @@ -1778,9 +1778,13 @@ function PS(name) { // off the back of a head was the best the art allowed while every player frame was a back view; the // moment the front existed, Oliver asked for it here. It is the same kit, the same palette and the // same tint pass, so the promise above still holds — only the side you are standing on changes. -// Returns false while the sprites are still loading, so the caller knows to come back. +// Returns false while the sprites are still loading, so the caller knows to come back — and +// "still loading" includes DRAWING A FALLBACK: the women's front frame arriving after the men's +// used to satisfy this with the wrong body (a man in her kit colour), and the caller's retry +// poll stopped on the lie. A stand-in is drawn (better than a blank) but never reported done. export function drawLook(cv2, t, k, sk) { - const img = SPR['n_idle1' + (t.sfx || '')] || SPR['p_idle1' + (t.sfx || '')] || SPR.p_idle1; + const want = SPR['n_idle1' + (t.sfx || '')]; + const img = want || SPR['p_idle1' + (t.sfx || '')] || SPR.p_idle1; if (!img) return false; const out = tinted('look' + (t.sfx || ''), img, k, sk, t.kit, TINT.kit); const g = cv2.getContext('2d'); @@ -1789,7 +1793,7 @@ export function drawLook(cv2, t, k, sk) { const s = Math.min(cv2.width / out.width, cv2.height / out.height); const w = Math.round(out.width * s), h = Math.round(out.height * s); g.drawImage(out, Math.round((cv2.width - w) / 2), cv2.height - h, w, h); - return true; + return !!want; } // BOUNCE_IDLE.dx/apex are measured off the DRAWN PALM (see config), so a tour whose player reaches