534 lines
16 KiB
Python
534 lines
16 KiB
Python
|
|
import os
|
||
|
|
from PIL import Image
|
||
|
|
|
||
|
|
def hex_to_rgba(hex_str, alpha=255):
|
||
|
|
hex_str = hex_str.lstrip('#')
|
||
|
|
return (int(hex_str[0:2], 16), int(hex_str[2:4], 16), int(hex_str[4:6], 16), alpha)
|
||
|
|
|
||
|
|
TRANSPARENT = (0, 0, 0, 0)
|
||
|
|
|
||
|
|
def create_kofola_bottle():
|
||
|
|
img = Image.new("RGBA", (16, 16), TRANSPARENT)
|
||
|
|
pixels = img.load()
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
CAP_GOLD = hex_to_rgba("#FFD54F")
|
||
|
|
CAP_DARK = hex_to_rgba("#C69214")
|
||
|
|
CAP_LIGHT = hex_to_rgba("#FFF59D")
|
||
|
|
|
||
|
|
GLASS_SHINE = hex_to_rgba("#E0F7FA", 180)
|
||
|
|
GLASS_BORDER = hex_to_rgba("#1F0E05", 220)
|
||
|
|
|
||
|
|
COLA_DEEP = hex_to_rgba("#220D04")
|
||
|
|
COLA_MID = hex_to_rgba("#38190A")
|
||
|
|
COLA_LIGHT = hex_to_rgba("#4F2610")
|
||
|
|
COLA_GLOW = hex_to_rgba("#6B381A")
|
||
|
|
|
||
|
|
LABEL_YELLOW = hex_to_rgba("#FFC107")
|
||
|
|
LABEL_LIGHT = hex_to_rgba("#FFD54F")
|
||
|
|
LABEL_DARK = hex_to_rgba("#FFA000")
|
||
|
|
LABEL_TEXT = hex_to_rgba("#4E2608")
|
||
|
|
|
||
|
|
# Cap (row 1-2)
|
||
|
|
pixels[7, 1] = CAP_LIGHT
|
||
|
|
pixels[8, 1] = CAP_GOLD
|
||
|
|
pixels[6, 2] = CAP_DARK
|
||
|
|
pixels[7, 2] = CAP_GOLD
|
||
|
|
pixels[8, 2] = CAP_GOLD
|
||
|
|
pixels[9, 2] = CAP_DARK
|
||
|
|
|
||
|
|
# Neck (rows 3-6)
|
||
|
|
for y in range(3, 7):
|
||
|
|
pixels[6, y] = GLASS_BORDER
|
||
|
|
pixels[7, y] = GLASS_SHINE if y in [3, 4] else COLA_LIGHT
|
||
|
|
pixels[8, y] = COLA_MID
|
||
|
|
pixels[9, y] = GLASS_BORDER
|
||
|
|
|
||
|
|
# Shoulders (rows 7-8)
|
||
|
|
pixels[5, 7] = GLASS_BORDER
|
||
|
|
pixels[6, 7] = COLA_LIGHT
|
||
|
|
pixels[7, 7] = COLA_MID
|
||
|
|
pixels[8, 7] = COLA_MID
|
||
|
|
pixels[9, 7] = COLA_DEEP
|
||
|
|
pixels[10, 7] = GLASS_BORDER
|
||
|
|
|
||
|
|
pixels[4, 8] = GLASS_BORDER
|
||
|
|
pixels[5, 8] = GLASS_SHINE
|
||
|
|
pixels[6, 8] = COLA_LIGHT
|
||
|
|
pixels[7, 8] = COLA_MID
|
||
|
|
pixels[8, 8] = COLA_MID
|
||
|
|
pixels[9, 8] = COLA_DEEP
|
||
|
|
pixels[10, 8] = COLA_DEEP
|
||
|
|
pixels[11, 8] = GLASS_BORDER
|
||
|
|
|
||
|
|
# Body (rows 9-13)
|
||
|
|
for y in range(9, 14):
|
||
|
|
pixels[4, y] = GLASS_BORDER
|
||
|
|
pixels[5, y] = GLASS_SHINE if y in [9, 12] else COLA_LIGHT
|
||
|
|
pixels[6, y] = COLA_LIGHT
|
||
|
|
pixels[7, y] = COLA_MID
|
||
|
|
pixels[8, y] = COLA_MID
|
||
|
|
pixels[9, y] = COLA_DEEP
|
||
|
|
pixels[10, y] = COLA_DEEP
|
||
|
|
pixels[11, y] = GLASS_BORDER
|
||
|
|
|
||
|
|
# Label on body (rows 10-11)
|
||
|
|
# Famous yellow label with Kofola brown wave
|
||
|
|
pixels[5, 10] = LABEL_DARK
|
||
|
|
pixels[6, 10] = LABEL_YELLOW
|
||
|
|
pixels[7, 10] = LABEL_TEXT
|
||
|
|
pixels[8, 10] = LABEL_LIGHT
|
||
|
|
pixels[9, 10] = LABEL_YELLOW
|
||
|
|
pixels[10, 10] = LABEL_DARK
|
||
|
|
|
||
|
|
pixels[5, 11] = LABEL_DARK
|
||
|
|
pixels[6, 11] = LABEL_LIGHT
|
||
|
|
pixels[7, 11] = LABEL_YELLOW
|
||
|
|
pixels[8, 11] = LABEL_TEXT
|
||
|
|
pixels[9, 11] = LABEL_LIGHT
|
||
|
|
pixels[10, 11] = LABEL_DARK
|
||
|
|
|
||
|
|
# Bottom curve (row 14)
|
||
|
|
pixels[5, 14] = GLASS_BORDER
|
||
|
|
pixels[6, 14] = COLA_LIGHT
|
||
|
|
pixels[7, 14] = COLA_MID
|
||
|
|
pixels[8, 14] = COLA_DEEP
|
||
|
|
pixels[9, 14] = COLA_DEEP
|
||
|
|
pixels[10, 14] = GLASS_BORDER
|
||
|
|
|
||
|
|
# Base (row 15)
|
||
|
|
for x in range(6, 10):
|
||
|
|
pixels[x, 15] = GLASS_BORDER
|
||
|
|
|
||
|
|
return img
|
||
|
|
|
||
|
|
def create_kofola_can():
|
||
|
|
img = Image.new("RGBA", (16, 16), TRANSPARENT)
|
||
|
|
pixels = img.load()
|
||
|
|
|
||
|
|
# Silver colors
|
||
|
|
SILVER_LIGHT = hex_to_rgba("#E8ECEF")
|
||
|
|
SILVER_MID = hex_to_rgba("#B0B7BC")
|
||
|
|
SILVER_DARK = hex_to_rgba("#7A8288")
|
||
|
|
SILVER_DEEP = hex_to_rgba("#4E555B")
|
||
|
|
|
||
|
|
# Can body
|
||
|
|
CAN_DARK = hex_to_rgba("#1C1512")
|
||
|
|
CAN_MID = hex_to_rgba("#2E1E17")
|
||
|
|
CAN_SHINE = hex_to_rgba("#5E4438")
|
||
|
|
|
||
|
|
# Kofola yellow label
|
||
|
|
GOLD_LIGHT = hex_to_rgba("#FFE082")
|
||
|
|
GOLD_MAIN = hex_to_rgba("#FFC107")
|
||
|
|
GOLD_DARK = hex_to_rgba("#FF8F00")
|
||
|
|
SWIRL = hex_to_rgba("#6D2B05")
|
||
|
|
|
||
|
|
# Top rim (rows 1-2)
|
||
|
|
for x in range(6, 10):
|
||
|
|
pixels[x, 1] = SILVER_LIGHT
|
||
|
|
pixels[5, 2] = SILVER_DARK
|
||
|
|
pixels[6, 2] = SILVER_LIGHT
|
||
|
|
pixels[7, 2] = SILVER_MID
|
||
|
|
pixels[8, 2] = SILVER_LIGHT
|
||
|
|
pixels[9, 2] = SILVER_MID
|
||
|
|
pixels[10, 2] = SILVER_DARK
|
||
|
|
|
||
|
|
# Can body (rows 3-13)
|
||
|
|
for y in range(3, 14):
|
||
|
|
pixels[4, y] = SILVER_DEEP if (y == 3 or y == 13) else CAN_DARK
|
||
|
|
pixels[5, y] = CAN_SHINE
|
||
|
|
pixels[6, y] = CAN_MID
|
||
|
|
pixels[7, y] = CAN_DARK
|
||
|
|
pixels[8, y] = CAN_DARK
|
||
|
|
pixels[9, y] = CAN_MID
|
||
|
|
pixels[10, y] = CAN_DARK
|
||
|
|
pixels[11, y] = SILVER_DEEP if (y == 3 or y == 13) else CAN_DARK
|
||
|
|
|
||
|
|
# Label band on can (rows 7-10)
|
||
|
|
for y in range(7, 11):
|
||
|
|
pixels[5, y] = GOLD_DARK
|
||
|
|
pixels[6, y] = GOLD_LIGHT
|
||
|
|
pixels[7, y] = GOLD_MAIN
|
||
|
|
pixels[8, y] = GOLD_MAIN
|
||
|
|
pixels[9, y] = GOLD_DARK
|
||
|
|
pixels[10, y] = GOLD_DARK
|
||
|
|
|
||
|
|
# Swirl on label
|
||
|
|
pixels[7, 8] = SWIRL
|
||
|
|
pixels[8, 8] = GOLD_LIGHT
|
||
|
|
pixels[7, 9] = GOLD_LIGHT
|
||
|
|
pixels[8, 9] = SWIRL
|
||
|
|
|
||
|
|
# Bottom rim (rows 14-15)
|
||
|
|
pixels[5, 14] = SILVER_DARK
|
||
|
|
for x in range(6, 10):
|
||
|
|
pixels[x, 14] = SILVER_MID
|
||
|
|
pixels[10, 14] = SILVER_DARK
|
||
|
|
|
||
|
|
for x in range(6, 10):
|
||
|
|
pixels[x, 15] = SILVER_DEEP
|
||
|
|
|
||
|
|
return img
|
||
|
|
|
||
|
|
def create_draft_kofola():
|
||
|
|
img = Image.new("RGBA", (16, 16), TRANSPARENT)
|
||
|
|
pixels = img.load()
|
||
|
|
|
||
|
|
# Glass
|
||
|
|
GLASS = hex_to_rgba("#CFD8DC", 200)
|
||
|
|
GLASS_SHINE = hex_to_rgba("#FFFFFF", 230)
|
||
|
|
GLASS_BORDER = hex_to_rgba("#546E7A", 220)
|
||
|
|
|
||
|
|
# Foam head
|
||
|
|
FOAM_TOP = hex_to_rgba("#FFFDF5")
|
||
|
|
FOAM_MID = hex_to_rgba("#F5EBE1")
|
||
|
|
FOAM_SHADOW = hex_to_rgba("#DECAB8")
|
||
|
|
FOAM_CREAM = hex_to_rgba("#CDB29B")
|
||
|
|
|
||
|
|
# Cola
|
||
|
|
COLA_DEEP = hex_to_rgba("#220D04")
|
||
|
|
COLA_MID = hex_to_rgba("#38190A")
|
||
|
|
COLA_LIGHT = hex_to_rgba("#4E240E")
|
||
|
|
BUBBLE = hex_to_rgba("#D28B54")
|
||
|
|
|
||
|
|
# Foam Head (rows 2-5)
|
||
|
|
# Fluffy irregular top
|
||
|
|
pixels[4, 2] = FOAM_TOP
|
||
|
|
pixels[6, 2] = FOAM_TOP
|
||
|
|
pixels[7, 2] = FOAM_TOP
|
||
|
|
pixels[9, 2] = FOAM_TOP
|
||
|
|
|
||
|
|
for x in range(3, 11):
|
||
|
|
pixels[x, 3] = FOAM_TOP if (x % 2 == 0) else FOAM_MID
|
||
|
|
for x in range(3, 11):
|
||
|
|
pixels[x, 4] = FOAM_MID if (x in [4, 7, 8]) else FOAM_SHADOW
|
||
|
|
for x in range(3, 11):
|
||
|
|
pixels[x, 5] = FOAM_CREAM
|
||
|
|
|
||
|
|
# Mug Body (rows 6-13)
|
||
|
|
for y in range(6, 14):
|
||
|
|
pixels[2, y] = GLASS_BORDER
|
||
|
|
pixels[3, y] = GLASS_SHINE if y in [6, 7, 10, 11] else COLA_LIGHT
|
||
|
|
pixels[4, y] = COLA_LIGHT
|
||
|
|
pixels[5, y] = COLA_MID
|
||
|
|
pixels[6, y] = COLA_DEEP
|
||
|
|
pixels[7, y] = COLA_MID
|
||
|
|
pixels[8, y] = COLA_DEEP
|
||
|
|
pixels[9, y] = COLA_DEEP
|
||
|
|
pixels[10, y] = GLASS_BORDER
|
||
|
|
|
||
|
|
# Carbonation bubbles
|
||
|
|
pixels[4, 11] = BUBBLE
|
||
|
|
pixels[6, 9] = BUBBLE
|
||
|
|
pixels[5, 7] = BUBBLE
|
||
|
|
pixels[8, 12] = BUBBLE
|
||
|
|
pixels[7, 8] = BUBBLE
|
||
|
|
|
||
|
|
# Handle on right side (rows 7-11)
|
||
|
|
pixels[11, 7] = GLASS_SHINE
|
||
|
|
pixels[12, 7] = GLASS_BORDER
|
||
|
|
pixels[12, 8] = GLASS_BORDER
|
||
|
|
pixels[13, 8] = GLASS_SHINE
|
||
|
|
pixels[12, 9] = GLASS_BORDER
|
||
|
|
pixels[13, 9] = GLASS_SHINE
|
||
|
|
pixels[12, 10] = GLASS_BORDER
|
||
|
|
pixels[13, 10] = GLASS_SHINE
|
||
|
|
pixels[11, 11] = GLASS_BORDER
|
||
|
|
pixels[12, 11] = GLASS_BORDER
|
||
|
|
|
||
|
|
# Glass bottom (rows 14-15)
|
||
|
|
for x in range(2, 11):
|
||
|
|
pixels[x, 14] = GLASS_SHINE if x in [3, 4] else GLASS
|
||
|
|
for x in range(3, 10):
|
||
|
|
pixels[x, 15] = GLASS_BORDER
|
||
|
|
|
||
|
|
return img
|
||
|
|
|
||
|
|
def create_kofo_syrup():
|
||
|
|
img = Image.new("RGBA", (16, 16), TRANSPARENT)
|
||
|
|
pixels = img.load()
|
||
|
|
|
||
|
|
CORK = hex_to_rgba("#A1724E")
|
||
|
|
CORK_DARK = hex_to_rgba("#704A2D")
|
||
|
|
|
||
|
|
GLASS_BORDER = hex_to_rgba("#1C1008", 220)
|
||
|
|
GLASS_SHINE = hex_to_rgba("#E8F5E9", 200)
|
||
|
|
|
||
|
|
SYRUP_DARK = hex_to_rgba("#140601")
|
||
|
|
SYRUP_MID = hex_to_rgba("#2B0E03")
|
||
|
|
SYRUP_LIGHT = hex_to_rgba("#4A1C0A")
|
||
|
|
|
||
|
|
HERB_GREEN = hex_to_rgba("#558B2F")
|
||
|
|
HERB_LIGHT = hex_to_rgba("#8BC34A")
|
||
|
|
GOLD_LABEL = hex_to_rgba("#FFD54F")
|
||
|
|
|
||
|
|
# Cork (rows 1-3)
|
||
|
|
pixels[7, 1] = CORK
|
||
|
|
pixels[8, 1] = CORK
|
||
|
|
pixels[7, 2] = CORK_DARK
|
||
|
|
pixels[8, 2] = CORK
|
||
|
|
pixels[6, 3] = CORK_DARK
|
||
|
|
pixels[7, 3] = CORK
|
||
|
|
pixels[8, 3] = CORK
|
||
|
|
pixels[9, 3] = CORK_DARK
|
||
|
|
|
||
|
|
# Glass neck (rows 4-6)
|
||
|
|
for y in range(4, 7):
|
||
|
|
pixels[6, y] = GLASS_BORDER
|
||
|
|
pixels[7, y] = SYRUP_LIGHT
|
||
|
|
pixels[8, y] = SYRUP_DARK
|
||
|
|
pixels[9, y] = GLASS_BORDER
|
||
|
|
|
||
|
|
# Body (rows 7-13)
|
||
|
|
for y in range(7, 14):
|
||
|
|
left = 4 if y >= 8 else 5
|
||
|
|
right = 11 if y >= 8 else 10
|
||
|
|
pixels[left, y] = GLASS_BORDER
|
||
|
|
pixels[left + 1, y] = GLASS_SHINE if y in [8, 11] else SYRUP_LIGHT
|
||
|
|
for x in range(left + 2, right):
|
||
|
|
pixels[x, y] = SYRUP_MID if x % 2 == 0 else SYRUP_DARK
|
||
|
|
pixels[right, y] = GLASS_BORDER
|
||
|
|
|
||
|
|
# Herbal Label with green leaf & gold banner (rows 9-11)
|
||
|
|
pixels[6, 9] = GOLD_LABEL
|
||
|
|
pixels[7, 9] = HERB_LIGHT
|
||
|
|
pixels[8, 9] = HERB_GREEN
|
||
|
|
pixels[9, 9] = GOLD_LABEL
|
||
|
|
|
||
|
|
pixels[6, 10] = GOLD_LABEL
|
||
|
|
pixels[7, 10] = HERB_GREEN
|
||
|
|
pixels[8, 10] = HERB_LIGHT
|
||
|
|
pixels[9, 10] = GOLD_LABEL
|
||
|
|
|
||
|
|
pixels[6, 11] = GOLD_LABEL
|
||
|
|
pixels[7, 11] = GOLD_LABEL
|
||
|
|
pixels[8, 11] = GOLD_LABEL
|
||
|
|
pixels[9, 11] = GOLD_LABEL
|
||
|
|
|
||
|
|
# Base (rows 14-15)
|
||
|
|
for x in range(5, 11):
|
||
|
|
pixels[x, 14] = SYRUP_DARK
|
||
|
|
for x in range(6, 10):
|
||
|
|
pixels[x, 15] = GLASS_BORDER
|
||
|
|
|
||
|
|
return img
|
||
|
|
|
||
|
|
def create_kofola_bucket():
|
||
|
|
# Load vanilla bucket style outline
|
||
|
|
img = Image.new("RGBA", (16, 16), TRANSPARENT)
|
||
|
|
pixels = img.load()
|
||
|
|
|
||
|
|
IRON_LIGHT = hex_to_rgba("#FFFFFF")
|
||
|
|
IRON_MID = hex_to_rgba("#D2D6D9")
|
||
|
|
IRON_DARK = hex_to_rgba("#879097")
|
||
|
|
IRON_SHADOW = hex_to_rgba("#4B5359")
|
||
|
|
|
||
|
|
COLA_DEEP = hex_to_rgba("#220D04")
|
||
|
|
COLA_MID = hex_to_rgba("#38190A")
|
||
|
|
COLA_LIGHT = hex_to_rgba("#502610")
|
||
|
|
FOAM = hex_to_rgba("#E8D3BD")
|
||
|
|
|
||
|
|
# Bucket rim top ears
|
||
|
|
pixels[3, 3] = IRON_LIGHT
|
||
|
|
pixels[4, 3] = IRON_MID
|
||
|
|
pixels[11, 3] = IRON_MID
|
||
|
|
pixels[12, 3] = IRON_DARK
|
||
|
|
|
||
|
|
pixels[2, 4] = IRON_LIGHT
|
||
|
|
pixels[3, 4] = IRON_DARK
|
||
|
|
pixels[12, 4] = IRON_DARK
|
||
|
|
pixels[13, 4] = IRON_SHADOW
|
||
|
|
|
||
|
|
# Liquid top surface (rows 5-7)
|
||
|
|
for x in range(4, 12):
|
||
|
|
pixels[x, 5] = FOAM if x in [5, 8, 9] else COLA_LIGHT
|
||
|
|
for x in range(4, 12):
|
||
|
|
pixels[x, 6] = COLA_LIGHT if x in [4, 6] else COLA_MID
|
||
|
|
for x in range(4, 12):
|
||
|
|
pixels[x, 7] = COLA_MID if x % 2 == 0 else COLA_DEEP
|
||
|
|
|
||
|
|
# Bucket sides
|
||
|
|
for y in range(5, 10):
|
||
|
|
pixels[3, y] = IRON_LIGHT if y in [5, 6] else IRON_MID
|
||
|
|
pixels[12, y] = IRON_SHADOW
|
||
|
|
|
||
|
|
for y in range(10, 13):
|
||
|
|
pixels[4, y] = IRON_MID
|
||
|
|
for x in range(5, 11):
|
||
|
|
pixels[x, y] = COLA_DEEP if y == 10 else COLA_MID
|
||
|
|
pixels[11, y] = IRON_SHADOW
|
||
|
|
|
||
|
|
# Bottom rows
|
||
|
|
for x in range(5, 11):
|
||
|
|
pixels[x, 13] = IRON_DARK
|
||
|
|
pixels[5, 13] = IRON_MID
|
||
|
|
pixels[10, 13] = IRON_SHADOW
|
||
|
|
|
||
|
|
for x in range(6, 10):
|
||
|
|
pixels[x, 14] = IRON_SHADOW
|
||
|
|
|
||
|
|
return img
|
||
|
|
|
||
|
|
def create_crate_textures():
|
||
|
|
# Palette for wooden crate (Spruce / Oak styled crate)
|
||
|
|
WOOD_LIGHT = hex_to_rgba("#8C6747")
|
||
|
|
WOOD_MID = hex_to_rgba("#734F32")
|
||
|
|
WOOD_DARK = hex_to_rgba("#563821")
|
||
|
|
WOOD_SHADOW = hex_to_rgba("#3B2313")
|
||
|
|
|
||
|
|
GOLD = hex_to_rgba("#FFC107")
|
||
|
|
GOLD_LIGHT = hex_to_rgba("#FFE082")
|
||
|
|
GOLD_DARK = hex_to_rgba("#FFA000")
|
||
|
|
DARK_BROWN = hex_to_rgba("#291307")
|
||
|
|
BOTTLE_CAP = hex_to_rgba("#FFD54F")
|
||
|
|
|
||
|
|
# Front texture (with Kofola logo plaque/stamp)
|
||
|
|
front = Image.new("RGBA", (16, 16))
|
||
|
|
fp = front.load()
|
||
|
|
for y in range(16):
|
||
|
|
for x in range(16):
|
||
|
|
if x in [0, 15] or y in [0, 15] or y in [5, 10]:
|
||
|
|
fp[x, y] = WOOD_DARK if (x == 0 or y == 0) else WOOD_SHADOW
|
||
|
|
else:
|
||
|
|
fp[x, y] = WOOD_MID if (x + y) % 3 != 0 else WOOD_LIGHT
|
||
|
|
|
||
|
|
# Front label oval stamp
|
||
|
|
for y in range(6, 10):
|
||
|
|
for x in range(4, 12):
|
||
|
|
fp[x, y] = GOLD_DARK
|
||
|
|
for y in range(7, 9):
|
||
|
|
for x in range(5, 11):
|
||
|
|
fp[x, y] = GOLD
|
||
|
|
# Kofola swirl emblem in center of stamp
|
||
|
|
fp[7, 7] = DARK_BROWN
|
||
|
|
fp[8, 7] = GOLD_LIGHT
|
||
|
|
fp[7, 8] = GOLD_LIGHT
|
||
|
|
fp[8, 8] = DARK_BROWN
|
||
|
|
|
||
|
|
# Side texture (with handle cutout slot)
|
||
|
|
side = Image.new("RGBA", (16, 16))
|
||
|
|
sp = side.load()
|
||
|
|
for y in range(16):
|
||
|
|
for x in range(16):
|
||
|
|
if x in [0, 15] or y in [0, 15] or y in [5, 10]:
|
||
|
|
sp[x, y] = WOOD_DARK if (x == 0 or y == 0) else WOOD_SHADOW
|
||
|
|
else:
|
||
|
|
sp[x, y] = WOOD_MID if (x + y) % 3 != 0 else WOOD_LIGHT
|
||
|
|
|
||
|
|
# Handle slot (cutout dark opening)
|
||
|
|
for y in range(7, 9):
|
||
|
|
for x in range(5, 11):
|
||
|
|
sp[x, y] = WOOD_SHADOW
|
||
|
|
for x in range(5, 11):
|
||
|
|
sp[x, 6] = WOOD_DARK
|
||
|
|
|
||
|
|
# Top texture (showing 6 bottle caps inside partitions!)
|
||
|
|
top = Image.new("RGBA", (16, 16))
|
||
|
|
tp = top.load()
|
||
|
|
for y in range(16):
|
||
|
|
for x in range(16):
|
||
|
|
# Outer border and inner grid
|
||
|
|
if x in [0, 15] or y in [0, 15] or x in [5, 10] or y == 7 or y == 8:
|
||
|
|
tp[x, y] = WOOD_DARK if (x == 0 or y == 0) else WOOD_SHADOW
|
||
|
|
else:
|
||
|
|
# Dark interior
|
||
|
|
tp[x, y] = DARK_BROWN
|
||
|
|
|
||
|
|
# 6 bottle caps at centers (x: 2..3, 7..8, 12..13; y: 3..4, 11..12)
|
||
|
|
bottle_centers = [(2, 3), (7, 3), (12, 3), (2, 11), (7, 11), (12, 11)]
|
||
|
|
for cx, cy in bottle_centers:
|
||
|
|
tp[cx, cy] = GOLD_LIGHT
|
||
|
|
tp[cx+1, cy] = BOTTLE_CAP
|
||
|
|
tp[cx, cy+1] = BOTTLE_CAP
|
||
|
|
tp[cx+1, cy+1] = GOLD_DARK
|
||
|
|
|
||
|
|
# Bottom texture (plain wood planks)
|
||
|
|
bottom = Image.new("RGBA", (16, 16))
|
||
|
|
bp = bottom.load()
|
||
|
|
for y in range(16):
|
||
|
|
for x in range(16):
|
||
|
|
if x in [0, 15] or y in [0, 15] or y in [5, 10]:
|
||
|
|
bp[x, y] = WOOD_SHADOW
|
||
|
|
else:
|
||
|
|
bp[x, y] = WOOD_MID if (x + y) % 2 == 0 else WOOD_LIGHT
|
||
|
|
|
||
|
|
return front, side, top, bottom
|
||
|
|
|
||
|
|
def create_fluid_textures():
|
||
|
|
# Still fluid
|
||
|
|
still = Image.new("RGBA", (16, 16))
|
||
|
|
sp = still.load()
|
||
|
|
|
||
|
|
COLA_DEEP = hex_to_rgba("#200D04", 230)
|
||
|
|
COLA_MID = hex_to_rgba("#351708", 230)
|
||
|
|
COLA_LIGHT = hex_to_rgba("#4A220D", 230)
|
||
|
|
BUBBLE = hex_to_rgba("#8D5428", 240)
|
||
|
|
|
||
|
|
for y in range(16):
|
||
|
|
for x in range(16):
|
||
|
|
val = (x * 7 + y * 13) % 17
|
||
|
|
if val == 0:
|
||
|
|
sp[x, y] = BUBBLE
|
||
|
|
elif val < 6:
|
||
|
|
sp[x, y] = COLA_LIGHT
|
||
|
|
elif val < 12:
|
||
|
|
sp[x, y] = COLA_MID
|
||
|
|
else:
|
||
|
|
sp[x, y] = COLA_DEEP
|
||
|
|
|
||
|
|
# Flowing fluid (vertical streaks)
|
||
|
|
flow = Image.new("RGBA", (32, 32))
|
||
|
|
fp = flow.load()
|
||
|
|
for y in range(32):
|
||
|
|
for x in range(32):
|
||
|
|
val = (x * 5 + y * 19) % 13
|
||
|
|
if val == 0:
|
||
|
|
fp[x, y] = BUBBLE
|
||
|
|
elif val < 5:
|
||
|
|
fp[x, y] = COLA_LIGHT
|
||
|
|
elif val < 9:
|
||
|
|
fp[x, y] = COLA_MID
|
||
|
|
else:
|
||
|
|
fp[x, y] = COLA_DEEP
|
||
|
|
|
||
|
|
return still, flow
|
||
|
|
|
||
|
|
def main():
|
||
|
|
base_item = "src/main/resources/assets/kofola/textures/item"
|
||
|
|
base_block = "src/main/resources/assets/kofola/textures/block"
|
||
|
|
os.makedirs(base_item, exist_ok=True)
|
||
|
|
os.makedirs(base_block, exist_ok=True)
|
||
|
|
|
||
|
|
bottle = create_kofola_bottle()
|
||
|
|
bottle.save(os.path.join(base_item, "kofola_bottle.png"))
|
||
|
|
|
||
|
|
can = create_kofola_can()
|
||
|
|
can.save(os.path.join(base_item, "kofola_can.png"))
|
||
|
|
|
||
|
|
draft = create_draft_kofola()
|
||
|
|
draft.save(os.path.join(base_item, "draft_kofola.png"))
|
||
|
|
|
||
|
|
syrup = create_kofo_syrup()
|
||
|
|
syrup.save(os.path.join(base_item, "kofo_syrup.png"))
|
||
|
|
|
||
|
|
bucket = create_kofola_bucket()
|
||
|
|
bucket.save(os.path.join(base_item, "kofola_bucket.png"))
|
||
|
|
|
||
|
|
# Mod icon (can be the bottle or a high-res composition)
|
||
|
|
bottle.resize((64, 64), Image.NEAREST).save("src/main/resources/icon.png")
|
||
|
|
|
||
|
|
front, side, top, bottom = create_crate_textures()
|
||
|
|
front.save(os.path.join(base_block, "kofola_crate_front.png"))
|
||
|
|
side.save(os.path.join(base_block, "kofola_crate_side.png"))
|
||
|
|
top.save(os.path.join(base_block, "kofola_crate_top.png"))
|
||
|
|
bottom.save(os.path.join(base_block, "kofola_crate_bottom.png"))
|
||
|
|
|
||
|
|
still, flow = create_fluid_textures()
|
||
|
|
still.save(os.path.join(base_block, "kofola_still.png"))
|
||
|
|
flow.save(os.path.join(base_block, "kofola_flow.png"))
|
||
|
|
|
||
|
|
print("All textures successfully created!")
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
main()
|