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

+21 -12
View File
@@ -1806,20 +1806,29 @@ test('the wash leaves the shading: her folds stay in order', () => {
assert.ok(lum(lit) > lum(shade), 'the lit fold stays lighter than the shaded one');
});
// NETPLAY: the friend across the net wears their own pick. Their sprites are RED, not blue, so the
// kit rides its own arc — safe there only because the opponent art carries no drawn blood.
test("the opponent's red kit takes a dye on its own arc, and his skin still reads as skin", () => {
const HIS_SHIRT = [184, 8, 8], HER_TOP = [184, 48, 48], HIS_SKIN = [248, 176, 128];
// NETPLAY: the friend across the net wears their own pick, on the friend's OWN sheets — n_*, the
// player's kit drawn from the front (assets/_frontroll.py). The claim this pins is that he needs no
// arc of his own any more: every colour below is measured off n_idle1.png / n_idle1_f.png, and they
// fall into the SAME two buckets the player's back-view sheets do.
//
// The old netplay art was the roster opponent's red, on a third arc (`TINT.oKit`, 345->15). Both
// halves of why that had to go are pinned here: on his sheet the only thing in that arc was the
// SHIRT, so his pick moved a different garment than yours; on hers the arc also held her skin.
test('the friend across the net rides the PLAYER arcs: his shorts dye, her whites wash, skin holds', () => {
const HIS_SHORTS = [24, 112, 176], HIS_SHIRT = [224, 216, 208], HIS_SKIN = [232, 136, 104];
const HER_KIT = [240, 240, 248], HER_SKIN = [240, 168, 136], HIS_SHOE = [176, 176, 184];
const green = cfg.KITS.find(k => k.id === 'green');
for (const [nm, c] of [['his', HIS_SHIRT], ['hers', HER_TOP]]) {
const out = tintPx(...c, green, cfg.SKINS[0], 'dye', cfg.TINT.oKit);
assert.ok(out && dom(out) === 'g', `${nm} red shirt takes the pick`);
}
// his skin must not go with it, and the player's own blue arc must not claim his shirt
assert.equal(tintPx(...HIS_SKIN, green, cfg.SKINS[0], 'dye', cfg.TINT.oKit), null,
'the opponent kit arc leaves his skin alone');
const out = tintPx(...HIS_SHORTS, green, cfg.SKINS[0], 'dye', cfg.TINT.kit);
assert.ok(out && dom(out) === 'g', 'his blue shorts take the pick — the same garment yours moves');
assert.equal(tintPx(...HIS_SHIRT, green, cfg.SKINS[0], 'dye', cfg.TINT.kit), null,
"and the PLAYER's blue arc never claims the opponent's red");
'his white shirt stays white on a dye tour');
assert.equal(tintPx(...HIS_SHOE, green, cfg.SKINS[0], 'dye', cfg.TINT.kit), null,
'and his shoe grey is under the kit floor, blue-ish hue or not');
assert.ok(dom(tintPx(...HER_KIT, green, cfg.SKINS[0], 'wash')) === 'g',
'her whole white kit takes the wash — top and skirt together, which is the fix');
for (const [nm, c] of [['his', HIS_SKIN], ['hers', HER_SKIN]])
assert.equal(tintPx(...c, green, cfg.SKINS[0], nm === 'his' ? 'dye' : 'wash', cfg.TINT.kit), null,
`${nm} skin is left alone — the old red arc is what used to claim it`);
});
// The look crosses the wire ONCE, on pairing — neither phone can change its pick mid-match, because