The twelve-rung ladder: director, champion, physio and mascot walk on

Oliver's four picks, each rolled off its own settled BOSS frame through the
family pipeline (rows in _famroll.py) — the rung and the chapter boss are the
same person. matchFoe decoupled from bossArt's cycling on his call: the match
ladder is 12 with the champion capping rung 12; chapters keep their ten.

The champion refused to bulk through four rolls (words lost, then a new
pair-reference in char_ref only half-won), so his mass is stature: OPPONENTS
rows carry an optional world height h read by zombieH — champion 2.1 m, the
Bulk 2.0 m — and the serve aims at the body actually drawn. HEAD_CROP measured
for all four; ramp test extended to 12 rungs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-13 18:37:43 +02:00
1 parent 99a87115b3
commit 9a49acff51
130 files changed
+98 -22

No files matched your search

+19
View File
@@ -1832,6 +1832,25 @@ pipeline's knowledge:
faces RIGHT by convention — the gameplay.js note at the swing aim). The new rows are all drawn
facing right, which quietly fixed it.
## THE TWELVE-RUNG LADDER — four new families, and the pair-reference lesson (2026-08-13)
Oliver: at least 12 opponents. His picks: **DIRECTOR, CHAMPION, PHYSIO, MASCOT** — all four already
existed as chapter bosses, so each family anchors on its own settled boss frame (`z_dir1`,
`z_champ1`, `z_physio1`, `z_mascot1`): the rung and the boss are the same person, which is the
roster's narrative. Rolled through `_famroll.py` (rows added), cut with `_zsheet.py`, HEAD_CROP
measured for the four. The ladder is now 12 rungs (mascot at 5, physio at 8, director 11,
champion 12) and **`matchFoe` is DECOUPLED from `bossArt`'s cycling** — his call, champion caps
rung 12 while chapters keep their 10-rotation. The lists share characters, not arithmetic.
**THE PAIR REFERENCE, and when words lose.** The champion came back club-pro-slim through FOUR
rolls — two prompt escalations ("shoulders TWICE as wide", "if he is as slim as image 1 it is
WRONG") and a general build-override clause in `_famroll.prompt()` all lost to the pose sheet's
figures. `char_ref` now takes a `pair`: the character pasted NEXT TO a club-pro frame on one
ground line, so the size difference is shown, not described. Even that only half-worked, so the
champion's mass is STATURE instead: `OPPONENTS` rows carry an optional `h` (world height, read by
`zombieH` so the serve aims at the body actually drawn) — champion 2.1 m, the Bulk 2.0 m. When a
build matters, budget rolls for it, and remember the fallback is a data row, not a fifth roll.
## THE ZOMBIE FAMILY PIPELINE — one sheet, one character, 31 sprites (2026-08-12)
**This replaces the nine-batch flow above for a whole opponent family.** `_regen.py` still exists and
+43 -6
View File
@@ -37,6 +37,23 @@ FAMS = {
'ru': ('z_f1', 'a wiry FAST ZOMBIE RUNNER in a sleeveless tennis top, lean and forward-leaning'),
'gk': ('z_boss1', 'a heavy ZOMBIE GROUNDSKEEPER in stained work overalls and a shapeless hat'),
'lj': ('z_judge1', 'a ZOMBIE LINE JUDGE in a dark blazer and pale trousers, upright and severe'),
# the 2026-08-13 four (Oliver picked them): each anchors on its own settled BOSS frame, so the
# match opponent and the chapter boss are the same person — which is the roster's whole narrative
'dr': ('z_dir1', 'a ZOMBIE TOURNAMENT DIRECTOR in a navy club blazer with a gold crest, a striped '
'tie, glasses, a laminated ID badge on a lanyard, and tan trousers — stiff and officious'),
'ch': ('z_champ1', 'an ENORMOUS HULKING ZOMBIE CHAMPION, a mountain of muscle: shoulders TWICE as '
'wide as the figures in image 1, arms thicker than their legs, a massive barrel '
'chest straining a stained vintage white tennis kit with a gold-trimmed collar, '
'a bandage wrapped around his head, sweatbands. Image 2 shows him STANDING NEXT '
'TO one of image 1\'s men at true scale: THAT is the size difference every '
'figure keeps, in every pose. If he is as slim as his neighbour, it is WRONG',
'z_r1'),
'ph': ('z_physio1', 'a ZOMBIE PHYSIO in a white polo shirt with a red cross on the chest, glasses, '
'bright blue medical gloves, and dark green trousers'),
'ma': ('z_mascot1', 'a ZOMBIE MASCOT wearing a GIANT FUZZY YELLOW TENNIS BALL costume: his gaunt '
'grey-green head pokes out of a hole in the ball, thin ragged green arms and '
'legs stick out of it, one white glove, worn sneakers. The huge yellow ball IS '
'his torso in every pose'),
}
@@ -48,14 +65,28 @@ def key():
sys.exit('no OPENROUTER_API_KEY')
def char_ref(k, spr):
def char_ref(k, spr, pair=None):
"""IMAGE 2: the character, at 4x NEAREST on magenta. Raw sprite pixels, no round trip — the same
rule the pose sheet now follows, and for the same reason."""
rule the pose sheet now follows, and for the same reason.
`pair` puts a SECOND sprite beside it at true relative scale. A picture beats a paragraph (the
project's own lesson, both ways): three rolls of prompt language could not make the champion
keep his bulk against the pose sheet's slim figures — showing him STANDING NEXT TO the club pro
is the claim the words kept failing to make."""
im = Image.open(os.path.join(HERE, spr + '.png')).convert('RGBA')
big = im.resize((im.width * 4, im.height * 4), Image.NEAREST)
pad = round(big.height * 0.08)
out = Image.new('RGB', (big.width + 2 * pad, big.height + 2 * pad), (255, 0, 255))
out.paste(big, (pad, pad), big)
tiles = [big]
if pair:
pim = Image.open(os.path.join(HERE, pair + '.png')).convert('RGBA')
tiles.append(pim.resize((pim.width * 4, pim.height * 4), Image.NEAREST))
w = sum(t.width for t in tiles) + pad * (len(tiles) + 1)
h = max(t.height for t in tiles) + 2 * pad
out = Image.new('RGB', (w, h), (255, 0, 255))
x = pad
for t in tiles:
out.paste(t, (x, h - pad - t.height), t) # shared ground line: the size difference IS the message
x += t.width + pad
p = os.path.join(SCRATCH, f'char_{k}.png')
os.makedirs(SCRATCH, exist_ok=True)
out.save(p)
@@ -74,6 +105,11 @@ def prompt(who):
'damage states in the same places. A figure with no head keeps no head; a figure missing an arm '
'keeps that arm missing with the same stump and blood. Only the body wearing the poses changes. '
'Do not carry over the previous character\'s shirt, shorts, shoes, hair or headband.\n\n'
# "the same sizes" above is about LAYOUT, and the model reads it as licence to keep image 1's
# slim build — the champion came back club-pro-thin twice. The build belongs to the CHARACTER.
'THE CHARACTER\'S OWN BUILD OVERRIDES IMAGE 1\'S: if image 2 shows a wider, heavier or fatter '
'body than the figures of image 1, every redrawn figure keeps that wider, heavier body in '
'every pose. Only the POSE comes from image 1 — never the physique.\n\n'
# EVERY UNDAMAGED FIGURE HAS A HEAD, said out loud. The clause above ("a figure with no head
# keeps no head") is there for the wound rows and the old normalisation pass took it as licence
# to remove one from the play row — which is how six families came back with a decapitated
@@ -96,8 +132,9 @@ def u(p):
def roll(k):
spr, who = FAMS[k]
ch = char_ref(k, spr)
spr, who = FAMS[k][:2]
pair = FAMS[k][2] if len(FAMS[k]) > 2 else None
ch = char_ref(k, spr, pair)
r = requests.post('https://openrouter.ai/api/v1/images',
headers={'Authorization': f'Bearer {key()}', 'Content-Type': 'application/json'},
# 4K and 9:16: the endpoint DEFAULTS to 1K and snaps the aspect to an enum, so both are
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Loaded 100 of 130 files, more files were not shown because too many files have changed in this diff. Show more