87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
"""
|
||
make-mc-textures.py – erzeugt die 16×16-Kacheln für das Minecraft-Design
|
||
(src/assets/design/*.png). Eigene, zufällig erzeugte Muster im Block-Stil –
|
||
keine Original-Texturen aus dem Spiel.
|
||
|
||
Aufruf: python scripts/make-mc-textures.py
|
||
"""
|
||
import os
|
||
import random
|
||
from PIL import Image
|
||
|
||
ZIEL = os.path.join(os.path.dirname(__file__), '..', 'src', 'assets', 'design')
|
||
os.makedirs(ZIEL, exist_ok=True)
|
||
|
||
|
||
def klemme(v):
|
||
return max(0, min(255, int(v)))
|
||
|
||
|
||
def rauschen(basis, streuung, seed, flecken=None):
|
||
"""Grundfarbe mit Pixelrauschen; flecken = (anteil, farbe, streuung)."""
|
||
rnd = random.Random(seed)
|
||
img = Image.new('RGB', (16, 16))
|
||
px = img.load()
|
||
for y in range(16):
|
||
for x in range(16):
|
||
d = rnd.randint(-streuung, streuung)
|
||
farbe = basis
|
||
if flecken and rnd.random() < flecken[0]:
|
||
farbe = flecken[1]
|
||
d = rnd.randint(-flecken[2], flecken[2])
|
||
px[x, y] = tuple(klemme(c + d) for c in farbe)
|
||
return img
|
||
|
||
|
||
def speichere(img, name):
|
||
img.save(os.path.join(ZIEL, name))
|
||
print(name)
|
||
|
||
|
||
# Hintergrund der Instanzliste: dunkle Erde (wie hinter Menüs im Spiel)
|
||
speichere(rauschen((44, 32, 23), 6, 11, (0.16, (31, 22, 15), 4)), 'erde-dunkel.png')
|
||
|
||
# Leisten (Werkzeugleiste, Seitenleiste, Statusleiste): dunkler Schiefer
|
||
schiefer = rauschen((46, 46, 50), 6, 23, (0.12, (34, 34, 38), 3))
|
||
px = schiefer.load()
|
||
rnd = random.Random(5)
|
||
for _ in range(5): # ein paar waagerechte Bruchkanten wie bei Tiefenschiefer
|
||
y = rnd.randrange(16)
|
||
x0 = rnd.randrange(16)
|
||
for x in range(x0, min(16, x0 + rnd.randint(3, 7))):
|
||
px[x, y] = (30, 30, 33)
|
||
speichere(schiefer, 'schiefer.png')
|
||
|
||
# Dialoge: Stein
|
||
stein = rauschen((78, 78, 80), 8, 37, (0.10, (60, 60, 62), 4))
|
||
speichere(stein, 'stein.png')
|
||
|
||
# Holzbretter (z. B. Kopf der Dialoge): vier Bretter zu je 4 Pixeln
|
||
bretter = Image.new('RGB', (16, 16))
|
||
px = bretter.load()
|
||
rnd = random.Random(41)
|
||
farben = [(122, 92, 56), (114, 86, 52), (128, 97, 60), (118, 89, 54)]
|
||
fugen = [3, 11, 7, 14]
|
||
for brett in range(4):
|
||
for y in range(brett * 4, brett * 4 + 4):
|
||
for x in range(16):
|
||
c = farben[brett]
|
||
d = rnd.randint(-5, 5)
|
||
if y == brett * 4 + 3: # dunkle Fuge unter jedem Brett
|
||
c, d = (74, 55, 33), rnd.randint(-2, 2)
|
||
elif x == fugen[brett]: # Stoßfuge
|
||
c, d = (88, 66, 40), 0
|
||
px[x, y] = tuple(klemme(v + d) for v in c)
|
||
speichere(bretter, 'bretter.png')
|
||
|
||
# Grasnarbe: oberer Rand der Werkzeugleiste (16×4, grün mit "Tropfen")
|
||
gras = Image.new('RGBA', (16, 4), (0, 0, 0, 0))
|
||
px = gras.load()
|
||
rnd = random.Random(53)
|
||
tiefe = [2, 3, 2, 2, 4, 3, 2, 3, 2, 2, 3, 4, 2, 3, 2, 3]
|
||
for x in range(16):
|
||
for y in range(tiefe[x]):
|
||
g = rnd.randint(-10, 10)
|
||
px[x, y] = (klemme(84 + g), klemme(140 + g), klemme(52 + g // 2), 255)
|
||
speichere(gras, 'gras.png')
|