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

+19 -8
View File
@@ -55,13 +55,24 @@ NEW_STYLE = RES + (
# mid-throw). "newart" is wrong for it — it licenses the generator to repaint the character, and it
# did: wound frames came back with living tan skin and a redesigned shirt while the healthy frame
# stayed a grey-green corpse. Set "state": true for those.
STATE_STYLE = RES + (
"This is the SAME character as the reference, not a new one. His colours, his clothing, his "
"build, his proportions and his height must be IDENTICAL to the reference — the only things "
"that change are the injuries and the pose described above. His skin stays exactly the same "
"dead grey-green as the reference: he is a walking corpse, never pink, never tan, never living "
"flesh. Do not redesign or recolour any garment. "
) + CANVAS
SAME_CHAR = (
"This is the SAME character as the reference, not a new one. Their colours, their hair colour, "
"their clothing, their build, their proportions and their height must be IDENTICAL to the "
"reference — the only things that change are the pose and any injuries described above. Do not "
"redesign or recolour any garment. Draw them in FULL COLOUR in exactly the reference's drawing "
"style — never greyscale, never line art, never a different rendering style. "
)
CORPSE = (
"Their skin stays exactly the same dead grey-green as the reference: this is a walking corpse, "
"never pink, never tan, never living flesh. "
)
STATE_STYLE = RES + SAME_CHAR + CORPSE + CANVAS
# ...and the fourth case, which the three above between them could not express: the same LIVING
# character in a NEW POSE. "newart" repaints them (a women's-tour batch anchored on the men's frames
# came back blonde in one batch, auburn in the next, and greyscale line art in a third — a different
# woman every sheet), and "state" is welded to the corpse palette. Set "pose": true, and anchor the
# batch on a frame OF THAT CHARACTER rather than on whoever the pose originally belonged to.
POSE_STYLE = RES + SAME_CHAR + CANVAS
def batches():
with open(os.path.join(HERE, '_regen_batches.json')) as f:
@@ -173,7 +184,7 @@ def run(name, spec, dry=False):
ref = ref_sheet(shown, f'{SCRATCH}/{name}_ref.png', spec.get('scale', 2.0),
frames=len(sprites) + (1 if lead else 0))
sheet = f'{SCRATCH}/{name}_hi.png'
prompt = f"{spec['subject']} {STATE_STYLE if spec.get('state') else NEW_STYLE if spec.get('newart') else STYLE}"
prompt = f"{spec['subject']} {STATE_STYLE if spec.get('state') else POSE_STYLE if spec.get('pose') else NEW_STYLE if spec.get('newart') else STYLE}"
if dry:
print(f'[{name}] would generate {len(sprites)} frames: {", ".join(sprites)}'); return True
print(f'[{name}] generating {len(sprites)} frames...')