Let the tour be a choice, and give her a body of her own

The court screen picks WHO as well as WHERE now: two tiles above the court
rows, men's or women's singles, remembered like the court is. No new stage —
three rows and a pair of buttons already fill a phone, so the tiles go side by
side and the tap count from splash to play does not change.

Everything downstream is one line: drawChar already built every frame name off
a single prefix, so SK() appends '_f' when the women's tour is picked and falls
straight through to the men's frame for anything without a twin. The horde, the
officials and the ball boys are shared — they are staff, not the draw — but the
turned CPU is not: a male corpse opposite a female player reads as a bug.

Her frames came back as a different woman in every batch — blonde in one,
auburn in the next, greyscale line art in a third — because each was anchored on
the MAN whose pose it was. "newart" repaints the character and "state" is welded
to the corpse palette, so neither could say "the same living woman, a new pose".
That mode now exists, and every batch anchors on her own settled frame.

The death is drawn to frame 3 and recoloured after it. The generator will not
draw a dead woman in any wording worth using; frames 4 and 5 survive that
because by then she is flat and then a heap of cloth, so they are the men's
drawing with the blue shorts painted into her white (see assets/_die_f.py). The
collapse still falls 224/159/117/103/43 straight through the handoff.

Her first bounce frames reached to the shoulder, which is a catching pose, not
patting a ball — redrawn low rather than bending BOUNCE_IDLE to fit a wrong
drawing, so both tours share one apex and the ball meets her palm.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-04 12:22:21 +02:00
1 parent c75bd5b9ba
commit 14a1e5d261
46 files changed
+295 -24

No files matched your search

+20 -6
View File
@@ -123,10 +123,22 @@
border: 2px solid #3b4354; color: inherit; font: inherit; text-align: left;
cursor: pointer; -webkit-tap-highlight-color: transparent; }
#courts button.court.on { border-color: #e0cc72; background: rgba(224,204,114,0.10); }
#courts img { width: 108px; height: 72px; display: block; image-rendering: pixelated; flex: none; }
#courts b { display: block; font: 400 11px Silkscreen, monospace; color: #dfe6f2; letter-spacing: 0.5px; }
#courts i { display: block; margin-top: 5px; font: 400 9px Silkscreen, monospace; color: #8a96ab; font-style: normal; }
/* scoped to #courtList, not #courts: the tour tiles above are portrait figures and must not
inherit the 108x72 court-thumbnail box */
#courtList img { width: 108px; height: 72px; display: block; image-rendering: pixelated; flex: none; }
#courtList b { display: block; font: 400 11px Silkscreen, monospace; color: #dfe6f2; letter-spacing: 0.5px; }
#courtList i { display: block; margin-top: 5px; font: 400 9px Silkscreen, monospace; color: #8a96ab; font-style: normal; }
#courts .acts { margin-top: 16px; }
/* the tour: two tiles SIDE BY SIDE, not two more full-width rows. The court screen already carries
three rows and a pair of buttons, and a phone has no room left. The figures face the camera —
in play you only ever see your player from behind, so a rear view would show nothing. */
#tours { display: flex; gap: 8px; width: min(340px, 84vw); margin: 0 auto 10px; }
#tours button { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px;
padding: 8px 6px 10px; background: rgba(255,255,255,0.04); border: 2px solid #3b4354;
color: inherit; font: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; }
#tours button.on { border-color: #e0cc72; background: rgba(224,204,114,0.10); }
#tours img { height: 92px; width: auto; display: block; image-rendering: pixelated; }
#tours b { font: 400 10px Silkscreen, monospace; color: #dfe6f2; letter-spacing: 0.5px; }
/* tutorial: Marvin on the left, his line and the picture on the right */
#tutorial .page { display: flex; align-items: flex-end; gap: 14px; width: min(360px, 88vw);
margin: 0 auto; text-align: left; min-height: 190px; }
@@ -159,9 +171,11 @@
<button class="btn plate2" id="mTut">TUTORIAL</button>
<p id="build"></p>
</div>
<!-- court rows are built from config.COURTS in main.js: adding a court is a table row, never markup -->
<!-- tour tiles and court rows are both built from tables in main.js (config.TOURS / config.COURTS):
adding either is a table row, never markup -->
<div id="courts">
<h2>CHOOSE YOUR COURT</h2>
<h2>CHOOSE YOUR MATCH</h2>
<div id="tours"></div>
<div id="courtList"></div>
<div class="acts">
<button class="btn go" id="cStart">START GAME</button>
@@ -184,6 +198,6 @@
</div>
</div>
</div>
<script type="module" src="main.js?v=119"></script>
<script type="module" src="main.js?v=120"></script>
</body>
</html>