paradramorama/tools/cardgen/hero_spec.py
m3ultra f3773919e5 Card-art generation pipeline for monsterrobot.games
Four directions per tile (neon box art / vector side art / amiga comic /
80s airbrush) generated on the farm, plus the picker page and the installer
that ships chosen art and its risograph hover b-side.

Recipe rules, all learned the hard way against the existing covers:
tiles render 172-240px so silhouette and colour are all that read; the page
draws every title in HTML so art carries no lettering (the old covers baked
in garbled type); busy interiors smuggle text back via album sleeves and go
muddy small, so it is one hero subject per card.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 12:05:04 +10:00

34 lines
1.9 KiB
Python

#!/usr/bin/env python3
"""Hero banner variants. The slot is 21:9 and the current art is a PORTRAIT
image cropped to fit, so most of it is thrown away. The page scrims the left
side for the headline, so the robot is composed hard right with clean dark
space on the left."""
import json, os
OUT = '/private/tmp/claude-501/-Users-m3ultra-Documents/097e3817-807d-439d-b5f5-95a6ffd4a1f9/scratchpad/hero'
SUBJ = ("a colossal chrome monster robot standing menacingly among glowing arcade "
"cabinets in a dark neon arcade, reflections on a wet tiled floor, "
"composed on the right hand side of a wide frame")
READS = ("ultra wide cinematic banner, the left third is empty dark negative space, "
"strong silhouette, high contrast, saturated neon on near black")
NOTEXT = ("completely wordless, no text, no letters, no words, no logo, no marquee "
"lettering, no watermark, no signature, blank unmarked cabinet panels")
STYLES = {
'neon': "1987 British home-computer game box art, airbrushed gouache, glossy highlights, screaming neon cyan and magenta on black",
'vector': "1980s arcade cabinet side art, bold flat vector shapes, thick black outlines, blazing neon on black, geometric",
'comic': "early-1990s Amiga game cover painting, chunky saturated brushwork, bold cel shading, dark vignette",
'paint': "classic 1980s airbrush poster painting, silhouettes against a glowing backlit haze, lush deep colour, cinematic",
}
spec = []
for k, st in STYLES.items():
p = {'prompt': f'{st}. {SUBJ}. {READS}. {NOTEXT}',
'model': 'z-image-turbo' if k == 'paint' else 'flux2-klein-4b',
'steps': 8 if k == 'paint' else 4,
'width': 1344, 'height': 576, 'seed': 13}
if k == 'paint':
p['quantize'] = '4'
spec.append({'out': f'{OUT}/hero__{k}.png', 'operator': 'flux_local', 'params': p})
os.makedirs(OUT, exist_ok=True)
json.dump(spec, open(OUT + '/spec.json', 'w'), indent=1)
print(len(spec), 'hero jobs')