Skip to content

Commit 202cda7

Browse files
Zayn995claude
andcommitted
Header image: corrections squeezed around the original 41, current count fixed before the sentence
The owner's idea for the running gag: the original number stays in the sentence, every later correction is scribbled around it - smaller, tilted, deliberately clumsy - and the current count stands in amber right before the sentence, which therefore never leaves the image again. Slots are fixed; later numbers continue below the sentence to the right. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1 parent 75ce6bb commit 202cda7

1 file changed

Lines changed: 50 additions & 60 deletions

File tree

tools/make_header.py

Lines changed: 50 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -108,69 +108,59 @@ def scribbled_number(text: str, size: int, color, strike=True,
108108
return tile.rotate(angle, expand=True, resample=Image.BICUBIC)
109109

110110

111-
# Tagline: "Sliders in. .pak out." + immer wieder durchgestrichene Zahlen.
112-
# Die Zahlen fliessen wie Woerter: was rechts nicht mehr passt, wandert in
113-
# die naechste Zeile (Wunsch des Besitzers, 05.09.2026 - vorher schob die
114-
# Reihe den Satz aus dem Bild). Die aktuelle Zahl und der Satz dahinter
115-
# bleiben immer zusammen. Bei zwei Zeilen ruecken die Slider etwas nach
116-
# unten; reichen zwei Zeilen nicht, werden die Zahlen kleiner gesetzt.
111+
# Tagline: "Sliders in. .pak out." + die immer wieder korrigierte Zahl.
112+
# Idee des Besitzers (05.09.2026): die urspruengliche 41 steht fest im
113+
# Satz, und alle spaeteren Korrekturen sind drumherum gequetscht - links,
114+
# rechts, oben, unten, schief und kleiner, wie von Hand nachgetragen.
115+
# Direkt vor dem Satz steht die bisher endgueltige Zahl in Bernstein.
116+
# Bewusst unbeholfen; es muss nicht sauber aussehen. Jede weitere Zahl
117+
# bekommt den naechsten Platz aus SLOTS; sind die Plaetze aufgebraucht,
118+
# geht es unter dem Satz nach rechts weiter.
117119
tag_font = font(28, variation="SemiBold")
118-
X0, X_MAX, Y_BASE, LINE_H = 197, 1268, 172, 40
120+
X0, X_MAX, Y_BASE = 197, 1268, 182
119121
PREFIX = "Sliders in. .pak out. "
120122
SUFFIX = " tweaks \u2013 zero modding knowledge needed."
121-
122-
123-
def layout(struck_size: int, current_size: int):
124-
"""Zeilen aus Praefix, Zahlen-Schnipseln und Schlusssatz zusammensetzen.
125-
Liefert eine Liste von Zeilen; jede Zeile ist eine Liste von
126-
(x, art, nutzlast, dy)."""
127-
lines = [[]]
128-
x = X0
129-
lines[-1].append((x, "text", PREFIX, 0))
130-
x += int(d.textlength(PREFIX, font=tag_font))
131-
for i, number in enumerate(STRUCK_NUMBERS):
132-
tile = scribbled_number(number, struck_size, (128, 130, 134),
133-
angle=(-2.5, 2.0, -1.5)[i % 3])
134-
if x + tile.width > X_MAX:
135-
lines.append([])
136-
x = X0 - 12 # Schnipsel-Rand (14 px) ausgleichen: Ziffer buendig mit "Sliders"
137-
lines[-1].append((x, "tile", tile, (-12, -17, -9)[i % 3]))
138-
x += tile.width - 8
139-
current = scribbled_number(CURRENT_NUMBER, current_size, AMBER,
140-
strike=False, angle=-2.0)
141-
tail = (current.width - 14) + int(d.textlength(SUFFIX, font=tag_font))
142-
if x + tail > X_MAX:
143-
lines.append([])
144-
x = X0 - 12
145-
lines[-1].append((x, "tile", current, -16))
146-
x += current.width - 14
147-
lines[-1].append((x, "text", SUFFIX, 0))
148-
return lines
149-
150-
151-
lines = layout(28, 31)
152-
if len(lines) > 2:
153-
lines = layout(23, 31)
154-
if len(lines) > 2:
155-
raise SystemExit("Zu viele durchgestrichene Zahlen fuer zwei Zeilen - "
156-
"STRUCK_NUMBERS kuerzen oder LINE_H/Slider anpassen.")
157-
158-
for row, line in enumerate(lines):
159-
y = Y_BASE + row * LINE_H
160-
for x, kind, payload, dy in line:
161-
if kind == "text":
162-
d.text((x, y), payload, font=tag_font, fill=GREY)
163-
else:
164-
img.paste(payload, (x, y + dy), payload)
165-
166-
# Slider: bei einer Tagline-Zeile wie bisher, bei zwei etwas tiefer, damit
167-
# die zweite Zeile nicht in den ersten Regler laeuft.
168-
slider_ys = (266, 312, 356) if len(lines) == 1 else (282, 322, 358)
169-
slider(d, 200, 740, slider_ys[0], 0.67)
170-
slider(d, 200, 740, slider_ys[1], 0.29)
171-
slider(d, 200, 740, slider_ys[2], 0.51)
172-
print(f"Tagline: {len(lines)} Zeile(n), {len(STRUCK_NUMBERS)} durchgestrichene "
173-
f"Zahlen, aktuell {CURRENT_NUMBER}")
123+
STRUCK_GREY = (128, 130, 134)
124+
GAP_BEFORE = 26 # Luft vor der 41 (fuer die Zahl links davon)
125+
GAP_AFTER = 62 # Luft zwischen 41 und aktueller Zahl (fuer die Zahl dazwischen)
126+
# (dx, dy) relativ zur linken oberen Ecke des 41-Schnipsels, Groesse, Winkel
127+
SLOTS = [
128+
(60, 7, 22, -11), # rechts daneben, zwischen 41 und aktueller Zahl
129+
(30, -23, 20, 9), # oben rechts, ueber den Rand der 41 geschoben
130+
(-38, 33, 23, -7), # unten links
131+
(30, 35, 23, 5), # unten rechts
132+
(-28, -24, 20, 13), # oben links
133+
(92, 31, 24, -4), # weiter unten rechts
134+
]
135+
136+
x = X0
137+
d.text((x, Y_BASE), PREFIX, font=tag_font, fill=GREY)
138+
x += int(d.textlength(PREFIX, font=tag_font)) + GAP_BEFORE
139+
anchor = scribbled_number(STRUCK_NUMBERS[0], 28, STRUCK_GREY, angle=-2.5)
140+
ax, ay = x, Y_BASE - 12
141+
img.paste(anchor, (ax, ay), anchor)
142+
x += anchor.width - 8 + GAP_AFTER
143+
current = scribbled_number(CURRENT_NUMBER, 31, AMBER, strike=False, angle=-2.0)
144+
img.paste(current, (x, Y_BASE - 16), current)
145+
x += current.width - 14
146+
d.text((x, Y_BASE), SUFFIX, font=tag_font, fill=GREY)
147+
if x + int(d.textlength(SUFFIX, font=tag_font)) > X_MAX:
148+
raise SystemExit("Die Tagline passt nicht mehr ins Bild - PREFIX/SUFFIX kuerzen.")
149+
150+
for i, number in enumerate(STRUCK_NUMBERS[1:]):
151+
if i < len(SLOTS):
152+
dx, dy, size, angle = SLOTS[i]
153+
else: # Nachzuegler: unter dem Satz nach rechts
154+
k = i - len(SLOTS)
155+
dx, dy, size, angle = 150 + 66 * k, 32, 20, (-6, 4, -3, 8)[k % 4]
156+
tile = scribbled_number(number, size, STRUCK_GREY, angle=angle)
157+
img.paste(tile, (ax + dx, ay + dy), tile)
158+
159+
slider(d, 200, 740, 276, 0.67)
160+
slider(d, 200, 740, 318, 0.29)
161+
slider(d, 200, 740, 358, 0.51)
162+
print(f"Tagline: 41 fest, {len(STRUCK_NUMBERS) - 1} Korrekturen drumherum, "
163+
f"aktuell {CURRENT_NUMBER}")
174164

175165
OUT.parent.mkdir(parents=True, exist_ok=True)
176166
img.save(OUT)

0 commit comments

Comments
 (0)