KofolaMod/generate_textures.py

534 lines
16 KiB
Python
Raw Normal View History

2026-11-12 15:05:03 +00:00
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()