feat: clean mockup artifacts and fix tile reduction
This commit is contained in:
+120
@@ -0,0 +1,120 @@
|
||||
from PIL import Image
|
||||
import numpy as np
|
||||
|
||||
img_path = '/home/enne2/.gemini/antigravity/brain/69a2b2a9-088f-47ee-9f3c-9ba7ac332992/gb_mockup_1781772641040.png'
|
||||
img = Image.open(img_path).convert('RGB')
|
||||
img = img.resize((160, 144), Image.Resampling.LANCZOS)
|
||||
|
||||
gray = img.convert('L')
|
||||
arr = np.array(gray)
|
||||
|
||||
quantized = np.zeros_like(arr, dtype=np.uint8)
|
||||
quantized[arr >= 192] = 0
|
||||
quantized[(arr >= 128) & (arr < 192)] = 1
|
||||
quantized[(arr >= 64) & (arr < 128)] = 2
|
||||
quantized[arr < 64] = 3
|
||||
|
||||
# Patch out rats and bombs with floor color (0) or hedge color depending on position
|
||||
def patch(x1, x2, y1, y2, color=0):
|
||||
quantized[y1:y2, x1:x2] = color
|
||||
|
||||
# Rat 1 (left)
|
||||
patch(8, 24, 76, 92, 0)
|
||||
# Rat 2 (top mid)
|
||||
patch(52, 68, 44, 56, 0)
|
||||
# Rat 3 (right mid)
|
||||
patch(108, 124, 60, 72, 0)
|
||||
# Rat 4 (bottom right)
|
||||
patch(124, 140, 88, 100, 0)
|
||||
# Bomb
|
||||
patch(106, 118, 104, 116, 0)
|
||||
# UI icons
|
||||
patch(120, 140, 0, 10, 0) # Bomb/Rat UI
|
||||
|
||||
tile_map = np.zeros((18, 20), dtype=np.uint16)
|
||||
|
||||
def tile_to_bytes(tile):
|
||||
res = []
|
||||
for row in range(8):
|
||||
lo = hi = 0
|
||||
for col in range(8):
|
||||
val = tile[row, col]
|
||||
if val & 1: lo |= (1 << (7 - col))
|
||||
if val & 2: hi |= (1 << (7 - col))
|
||||
res.append(lo)
|
||||
res.append(hi)
|
||||
return tuple(res)
|
||||
|
||||
unique_tiles_map = {}
|
||||
unique_tiles_list = []
|
||||
|
||||
for y in range(18):
|
||||
for x in range(20):
|
||||
tile = quantized[y*8:(y+1)*8, x*8:(x+1)*8]
|
||||
t_bytes = tile_to_bytes(tile)
|
||||
if t_bytes not in unique_tiles_map:
|
||||
unique_tiles_map[t_bytes] = len(unique_tiles_list)
|
||||
unique_tiles_list.append(t_bytes)
|
||||
tile_map[y, x] = unique_tiles_map[t_bytes]
|
||||
|
||||
print(f"Total unique tiles before reduction: {len(unique_tiles_list)}")
|
||||
|
||||
def tile_diff(t1, t2):
|
||||
return sum(bin(a^b).count('1') for a, b in zip(t1, t2))
|
||||
|
||||
if len(unique_tiles_list) > 256:
|
||||
print("Reducing tiles...")
|
||||
|
||||
# Precompute diffs
|
||||
diffs = {}
|
||||
for i in range(len(unique_tiles_list)):
|
||||
for j in range(i+1, len(unique_tiles_list)):
|
||||
diffs[(i, j)] = tile_diff(unique_tiles_list[i], unique_tiles_list[j])
|
||||
|
||||
while len(unique_tiles_list) > 256:
|
||||
# Find best pair
|
||||
best_pair = min(diffs, key=diffs.get)
|
||||
i, j = best_pair
|
||||
|
||||
# Merge j into i
|
||||
for r in range(18):
|
||||
for c in range(20):
|
||||
if tile_map[r, c] == j:
|
||||
tile_map[r, c] = i
|
||||
elif tile_map[r, c] > j:
|
||||
tile_map[r, c] -= 1
|
||||
|
||||
unique_tiles_list.pop(j)
|
||||
|
||||
# Recompute diffs dict (remove keys with j, shift > j)
|
||||
new_diffs = {}
|
||||
for k, v in diffs.items():
|
||||
ki, kj = k
|
||||
if ki == j or kj == j: continue
|
||||
if ki > j: ki -= 1
|
||||
if kj > j: kj -= 1
|
||||
new_diffs[(ki, kj)] = v
|
||||
|
||||
diffs = new_diffs
|
||||
|
||||
print(f"Reduced to {len(unique_tiles_list)} unique tiles.")
|
||||
|
||||
with open('src/mockup_gfx.c', 'w') as f:
|
||||
f.write('#include "mockup_gfx.h"\n\n')
|
||||
f.write(f'const unsigned char MockupTileData[{len(unique_tiles_list) * 16}] = {{\n')
|
||||
for t in unique_tiles_list:
|
||||
f.write(' ' + ', '.join(f"0x{b:02X}" for b in t) + ',\n')
|
||||
f.write('};\n\n')
|
||||
|
||||
f.write('const unsigned char MockupMapData[360] = {\n')
|
||||
for y in range(18):
|
||||
f.write(' ' + ', '.join(f"{tile_map[y, x]}" for x in range(20)) + ',\n')
|
||||
f.write('};\n')
|
||||
|
||||
with open('src/mockup_gfx.h', 'w') as f:
|
||||
f.write('#ifndef MOCKUP_GFX_H\n#define MOCKUP_GFX_H\n\n')
|
||||
f.write('extern const unsigned char MockupTileData[];\n')
|
||||
f.write('extern const unsigned char MockupMapData[];\n')
|
||||
f.write('#endif\n')
|
||||
|
||||
print("Mockup C files generated.")
|
||||
Reference in New Issue
Block a user