@@ -108,27 +108,71 @@ 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
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.
112117tag_font = font (28 , variation = "SemiBold" )
113- y_base = 172
114- x = 197
115- prefix = "Sliders in. .pak out. "
116- d .text ((x , y_base ), prefix , font = tag_font , fill = GREY )
117- x += int (d .textlength (prefix , font = tag_font ))
118- for i , number in enumerate (STRUCK_NUMBERS ):
119- tile = scribbled_number (number , 28 , (128 , 130 , 134 ),
120- angle = (- 2.5 , 2.0 , - 1.5 )[i % 3 ])
121- img .paste (tile , (x , y_base + (- 12 , - 17 , - 9 )[i % 3 ]), tile )
122- x += tile .width - 8
123- tile = scribbled_number (CURRENT_NUMBER , 31 , AMBER , strike = False , angle = - 2.0 )
124- img .paste (tile , (x , y_base - 16 ), tile )
125- x += tile .width - 14
126- d .text ((x , y_base ), " tweaks \u2013 zero modding knowledge needed." ,
127- font = tag_font , fill = GREY )
128-
129- slider (d , 200 , 740 , 266 , 0.67 )
130- slider (d , 200 , 740 , 312 , 0.29 )
131- slider (d , 200 , 740 , 356 , 0.51 )
118+ X0 , X_MAX , Y_BASE , LINE_H = 197 , 1268 , 172 , 40
119+ PREFIX = "Sliders in. .pak out. "
120+ 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
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
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 pos , (x , kind , payload , dy ) in enumerate (line ):
161+ if kind == "text" :
162+ d .text ((x , y ), payload , font = tag_font , fill = GREY )
163+ else :
164+ # Schnipsel haben 14 px Rand: am Zeilenanfang so weit nach links
165+ # ruecken, dass die Ziffer buendig mit "Sliders" steht.
166+ img .paste (payload , (x - (12 if pos == 0 else 0 ), y + dy ), payload )
167+
168+ # Slider: bei einer Tagline-Zeile wie bisher, bei zwei etwas tiefer, damit
169+ # die zweite Zeile nicht in den ersten Regler laeuft.
170+ slider_ys = (266 , 312 , 356 ) if len (lines ) == 1 else (282 , 322 , 358 )
171+ slider (d , 200 , 740 , slider_ys [0 ], 0.67 )
172+ slider (d , 200 , 740 , slider_ys [1 ], 0.29 )
173+ slider (d , 200 , 740 , slider_ys [2 ], 0.51 )
174+ print (f"Tagline: { len (lines )} Zeile(n), { len (STRUCK_NUMBERS )} durchgestrichene "
175+ f"Zahlen, aktuell { CURRENT_NUMBER } " )
132176
133177OUT .parent .mkdir (parents = True , exist_ok = True )
134178img .save (OUT )
0 commit comments