The friend across the net wears your kit, drawn from the front

His colour landed on the shirt while yours lands on the shorts, because he was
drawn on the roster opponent's red sheets and dyed on an arc of his own. Red is
the one hue that art cannot hang a kit on: the men's shorts are neutral grey at
saturation 0.05, so no rotation ever reached them, and the women's red top sits
at her skin's and her hair's hue — a dark pick was painting her arms and her
ponytail, live, on the shipped build.

So he gets his own sheets. `assets/_frontroll.py` is `_famroll`'s trick pointed
at the tennis poses — image 1 is the ten `o_*` frames composed from disk, image 2
is the player from behind — and two calls drew all twenty. He rides the PLAYER's
arcs and the tour's own mode now: his shorts dye, her whites wash. `TINT.oKit` is
gone. The roster CPU keeps the red art; it is not a person.

The setup screen shows that front too — picking a face off the back of a head was
only ever what the art allowed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-20 16:04:10 +02:00
1 parent 4052ab1404
commit 5f9170b7d7
27 files changed
+324 -31

No files matched your search

+12 -3
View File
@@ -56,8 +56,11 @@ def bands(a):
return out
def cut(sheet, fam, outdir):
want = layout(fam)
def cut(sheet, fam, outdir, want=None, level=None):
# `want`/`level` let a NON-zombie family reuse this cutter: the netplay opponent's ten tennis
# poses are not nine rows of walk/wound (see _frontroll.py). `level` names the frame groups that
# must come back the same height, which is what the zombie branch below works out by name.
want = want or layout(fam)
src = Image.open(sheet).convert('RGB')
a = key(src)
# THE ENCLOSED MAGENTA IS THE RACKET, AND HERE IT IS MEANT TO GO. _fine.py repaints magenta that
@@ -105,8 +108,14 @@ def cut(sheet, fam, outdir):
# racket family's, at 224/224) gets a factor of 1.0 and is untouched — which is the check that
# this rule is the right one rather than a fudge for one bad sheet.
mult = [1.0] * len(crops)
if level is not None:
at = {n: j for j, n in enumerate(flat)}
for grp in level:
h0 = crops[at[grp[0]]].shape[0]
for n in grp[1:]:
if crops[at[n]].shape[0]: mult[at[n]] = h0 / crops[at[n]].shape[0]
i = 0
for row in want:
for row in want if level is None else []:
if row[0].endswith('fall1') and crops[i].shape[0]:
k_row = crops[0].shape[0] / crops[i].shape[0]
for j in range(i, i + len(row)):