Upload via GUI (123 Dateien)
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
"""
|
||||
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')
|
||||
Reference in New Issue
Block a user