"""Generate clod.png and clod_eyes.png textures for the Clod entity.""" from PIL import Image, ImageDraw OUTPUT_DIR = "src/main/resources/assets/clod/textures/entity" # Colors TERRACOTTA = (212, 132, 91) # #D4845B CREAM = (245, 230, 211) # #F5E6D3 DARK_TRIM = (61, 61, 61) # #3D3D3D AMBER_EYES = (232, 168, 76) # #E8A84C TRANSPARENT = (0, 0, 0, 0) # ============================================================ # clod.png (64x64 main texture) # ============================================================ # UV layout (matches ClodModel): # Head (10x10x10): texOffs(0,0) # - top/bottom: U=10..20, V=0..10 and U=20..30, V=0..10 # - front: U=10, V=10, 10x10 # - back: U=30, V=10, 10x10 # - left: U=0, V=10, 10x10 # - right: U=20, V=10, 10x10 # # Body (10x8x6): texOffs(0,20) # - top/bottom: U=6..16, V=20..26 and U=16..26, V=20..26 # - front: U=6, V=26, 10x8 # - back: U=22, V=26, 10x8 # - left: U=0, V=26, 6x8 # - right: U=16, V=26, 6x8 # # Right arm (4x8x4): texOffs(40,20) # - top/bottom: U=44..48, V=20..24 and U=48..52, V=20..24 # - front: U=44, V=24, 4x8 # - back: U=52, V=24, 4x8 # - left: U=40, V=24, 4x8 # - right: U=48, V=24, 4x8 # # Left arm (4x8x4): texOffs(40,32) # - Same layout offset to (40,32) # # Right leg (4x8x4): texOffs(0,34) # - top/bottom: U=4..8, V=34..38 and U=8..12, V=34..38 # - front: U=4, V=38, 4x8 # - back: U=12, V=38, 4x8 # - left: U=0, V=38, 4x8 # - right: U=8, V=38, 4x8 # # Left leg (4x8x4): texOffs(16,34) # - Same layout offset to (16,34) # # Antenna (1x3x1): texOffs(0,46) # - top/bottom: U=1..2, V=46..47 and U=2..3, V=46..47 # - front: U=1, V=47, 1x3 # - back: U=3, V=47, 1x3 # - left: U=0, V=47, 1x3 # - right: U=2, V=47, 1x3 img = Image.new("RGBA", (64, 64), TRANSPARENT) draw = ImageDraw.Draw(img) # ---- HEAD ---- # Top face draw.rectangle([10, 0, 29, 9], fill=TERRACOTTA) # Bottom face draw.rectangle([20, 0, 29, 9], fill=TERRACOTTA) # Front face (U=10, V=10, 10x10) draw.rectangle([10, 10, 19, 19], fill=TERRACOTTA) # Cream face area (inner 6x6) draw.rectangle([12, 12, 17, 17], fill=CREAM) # Eyes — amber 2x2 squares on front face # Left eye (from viewer perspective): around U=13-14, V=14-15 draw.rectangle([13, 14, 14, 15], fill=AMBER_EYES) # Right eye: around U=16-17, V=14-15 draw.rectangle([16, 14, 17, 15], fill=AMBER_EYES) # Back face draw.rectangle([30, 10, 39, 19], fill=TERRACOTTA) # Dark trim stripe on back draw.rectangle([34, 12, 35, 17], fill=DARK_TRIM) # Left face draw.rectangle([0, 10, 9, 19], fill=TERRACOTTA) # Right face draw.rectangle([20, 10, 29, 19], fill=TERRACOTTA) # Top face (head top) draw.rectangle([10, 0, 19, 9], fill=TERRACOTTA) # Dark trim on top edge draw.rectangle([10, 0, 19, 0], fill=DARK_TRIM) # ---- BODY ---- # Front face (U=6, V=26, 10x8) draw.rectangle([6, 26, 15, 33], fill=TERRACOTTA) # Cream chest starburst/asterisk pattern # Vertical line draw.rectangle([10, 27, 11, 32], fill=CREAM) # Horizontal line draw.rectangle([8, 29, 13, 30], fill=CREAM) # Diagonal hints draw.point((9, 28), fill=CREAM) draw.point((12, 28), fill=CREAM) draw.point((9, 31), fill=CREAM) draw.point((12, 31), fill=CREAM) # Back face draw.rectangle([22, 26, 31, 33], fill=TERRACOTTA) # Side faces draw.rectangle([0, 26, 5, 33], fill=TERRACOTTA) draw.rectangle([16, 26, 21, 33], fill=TERRACOTTA) # Top face draw.rectangle([6, 20, 15, 25], fill=TERRACOTTA) # Bottom face draw.rectangle([16, 20, 25, 25], fill=TERRACOTTA) # ---- RIGHT ARM ---- # All faces terracotta with dark trim edges # Front draw.rectangle([44, 24, 47, 31], fill=TERRACOTTA) # Back draw.rectangle([52, 24, 55, 31], fill=TERRACOTTA) # Left draw.rectangle([40, 24, 43, 31], fill=TERRACOTTA) # Right draw.rectangle([48, 24, 51, 31], fill=TERRACOTTA) # Top draw.rectangle([44, 20, 47, 23], fill=TERRACOTTA) # Bottom draw.rectangle([48, 20, 51, 23], fill=TERRACOTTA) # Dark trim on edges draw.rectangle([44, 31, 47, 31], fill=DARK_TRIM) draw.rectangle([52, 31, 55, 31], fill=DARK_TRIM) # ---- LEFT ARM ---- # Front draw.rectangle([44, 36, 47, 43], fill=TERRACOTTA) # Back draw.rectangle([52, 36, 55, 43], fill=TERRACOTTA) # Left draw.rectangle([40, 36, 43, 43], fill=TERRACOTTA) # Right draw.rectangle([48, 36, 51, 43], fill=TERRACOTTA) # Top draw.rectangle([44, 32, 47, 35], fill=TERRACOTTA) # Bottom draw.rectangle([48, 32, 51, 35], fill=TERRACOTTA) # Dark trim draw.rectangle([44, 43, 47, 43], fill=DARK_TRIM) draw.rectangle([52, 43, 55, 43], fill=DARK_TRIM) # ---- RIGHT LEG ---- # Front draw.rectangle([4, 38, 7, 45], fill=TERRACOTTA) # Back draw.rectangle([12, 38, 15, 45], fill=TERRACOTTA) # Left draw.rectangle([0, 38, 3, 45], fill=TERRACOTTA) # Right draw.rectangle([8, 38, 11, 45], fill=TERRACOTTA) # Top draw.rectangle([4, 34, 7, 37], fill=TERRACOTTA) # Bottom draw.rectangle([8, 34, 11, 37], fill=TERRACOTTA) # Dark trim at bottom draw.rectangle([4, 45, 7, 45], fill=DARK_TRIM) draw.rectangle([12, 45, 15, 45], fill=DARK_TRIM) draw.rectangle([0, 45, 3, 45], fill=DARK_TRIM) draw.rectangle([8, 45, 11, 45], fill=DARK_TRIM) # ---- LEFT LEG ---- # Front draw.rectangle([20, 38, 23, 45], fill=TERRACOTTA) # Back draw.rectangle([28, 38, 31, 45], fill=TERRACOTTA) # Left draw.rectangle([16, 38, 19, 45], fill=TERRACOTTA) # Right draw.rectangle([24, 38, 27, 45], fill=TERRACOTTA) # Top draw.rectangle([20, 34, 23, 37], fill=TERRACOTTA) # Bottom draw.rectangle([24, 34, 27, 37], fill=TERRACOTTA) # Dark trim at bottom draw.rectangle([20, 45, 23, 45], fill=DARK_TRIM) draw.rectangle([28, 45, 31, 45], fill=DARK_TRIM) draw.rectangle([16, 45, 19, 45], fill=DARK_TRIM) draw.rectangle([24, 45, 27, 45], fill=DARK_TRIM) # ---- ANTENNA ---- # Front (U=1, V=47, 1x3) draw.rectangle([1, 47, 1, 49], fill=DARK_TRIM) # Back (U=3, V=47, 1x3) draw.rectangle([3, 47, 3, 49], fill=DARK_TRIM) # Left (U=0, V=47, 1x3) draw.rectangle([0, 47, 0, 49], fill=DARK_TRIM) # Right (U=2, V=47, 1x3) draw.rectangle([2, 47, 2, 49], fill=DARK_TRIM) # Top (U=1, V=46, 1x1) draw.point((1, 46), fill=AMBER_EYES) # Glowing tip # Bottom draw.point((2, 46), fill=DARK_TRIM) img.save(f"{OUTPUT_DIR}/clod.png") print(f"Saved {OUTPUT_DIR}/clod.png") # ============================================================ # clod_eyes.png (64x64 emissive overlay) # ============================================================ # Fully transparent except amber pixels at eye UV positions # on the head front face. # Head front face: texOffs(0,0) means front starts at U=10, V=10 # Eyes at (13,14)-(14,15) and (16,14)-(17,15) eyes = Image.new("RGBA", (64, 64), TRANSPARENT) eyes_draw = ImageDraw.Draw(eyes) # Left eye (amber, full opacity) eyes_draw.rectangle([13, 14, 14, 15], fill=(232, 168, 76, 255)) # Right eye (amber, full opacity) eyes_draw.rectangle([16, 14, 17, 15], fill=(232, 168, 76, 255)) eyes.save(f"{OUTPUT_DIR}/clod_eyes.png") print(f"Saved {OUTPUT_DIR}/clod_eyes.png")