@@ -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.
117119tag_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
119121PREFIX = "Sliders in. .pak out. "
120122SUFFIX = " 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
175165OUT .parent .mkdir (parents = True , exist_ok = True )
176166img .save (OUT )
0 commit comments