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()