2 changed files with 340 additions and 4 deletions
@ -0,0 +1,330 @@
|
||||
import os |
||||
from PIL import Image |
||||
|
||||
# Meticulously crafted 8x8 organic tiles matching the mockup style |
||||
floors = [ |
||||
# 0: Clean floor |
||||
[ |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000" |
||||
], |
||||
# 1: Tiny pebble/crack |
||||
[ |
||||
"00000000", |
||||
"00100000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000001", |
||||
"00000000", |
||||
"00000000" |
||||
], |
||||
# 2: Subtle horizontal vein |
||||
[ |
||||
"00000000", |
||||
"00000000", |
||||
"01100000", |
||||
"00010000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000" |
||||
], |
||||
# 3: Diagonal crack |
||||
[ |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000010", |
||||
"00000100", |
||||
"00001000", |
||||
"00000000", |
||||
"00000000" |
||||
], |
||||
# 4: Forked crack |
||||
[ |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00100000", |
||||
"00011000", |
||||
"00000100", |
||||
"00000000" |
||||
], |
||||
# 5: Dots / dust |
||||
[ |
||||
"00000000", |
||||
"00000000", |
||||
"00000000", |
||||
"00010000", |
||||
"00000000", |
||||
"00001000", |
||||
"00000000", |
||||
"00000000" |
||||
] |
||||
] |
||||
|
||||
walls = [ |
||||
# 0: Isolated bush |
||||
[ |
||||
"00111100", |
||||
"01122110", |
||||
"11222211", |
||||
"12222221", |
||||
"12222221", |
||||
"03333330", |
||||
"00333300", |
||||
"00000000" |
||||
], |
||||
# 1: W connected (End pointing East) |
||||
[ |
||||
"11111100", |
||||
"11222110", |
||||
"22222211", |
||||
"22222221", |
||||
"22222221", |
||||
"33333330", |
||||
"33333300", |
||||
"00000000" |
||||
], |
||||
# 2: S connected (End pointing North) |
||||
[ |
||||
"00111100", |
||||
"01122110", |
||||
"11222211", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221" |
||||
], |
||||
# 3: S, W connected (Top-Right Corner) |
||||
[ |
||||
"11111100", |
||||
"11222110", |
||||
"22222211", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221" |
||||
], |
||||
# 4: E connected (End pointing West) |
||||
[ |
||||
"00111111", |
||||
"01122211", |
||||
"11222222", |
||||
"12222222", |
||||
"12222222", |
||||
"03333333", |
||||
"00333333", |
||||
"00000000" |
||||
], |
||||
# 5: E, W connected (Horizontal Straight) |
||||
[ |
||||
"11111111", |
||||
"11222211", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"33333333", |
||||
"33333333", |
||||
"00000000" |
||||
], |
||||
# 6: E, S connected (Top-Left Corner) |
||||
[ |
||||
"00111111", |
||||
"01122211", |
||||
"11222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222" |
||||
], |
||||
# 7: E, S, W connected (Top T-Junction) |
||||
[ |
||||
"11111111", |
||||
"11222211", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222" |
||||
], |
||||
# 8: N connected (End pointing South) |
||||
[ |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"03333330", |
||||
"00333300", |
||||
"00000000" |
||||
], |
||||
# 9: N, W connected (Bottom-Right Corner) |
||||
[ |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"33333330", |
||||
"33333300", |
||||
"00000000" |
||||
], |
||||
# 10: N, S connected (Vertical Straight) |
||||
[ |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221", |
||||
"12222221" |
||||
], |
||||
# 11: N, S, W connected (Right T-Junction) |
||||
[ |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221", |
||||
"22222221" |
||||
], |
||||
# 12: N, E connected (Bottom-Left Corner) |
||||
[ |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"03333333", |
||||
"00333333", |
||||
"00000000" |
||||
], |
||||
# 13: N, E, W connected (Bottom T-Junction) |
||||
[ |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"33333333", |
||||
"33333333", |
||||
"00000000" |
||||
], |
||||
# 14: N, E, S connected (Left T-Junction) |
||||
[ |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222", |
||||
"12222222" |
||||
], |
||||
# 15: N, E, S, W connected (Cross Junction) |
||||
[ |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222", |
||||
"22222222" |
||||
] |
||||
] |
||||
|
||||
# Randomize texture inside the solid walls slightly for variation |
||||
import random |
||||
random.seed(12345) |
||||
for i in range(16): |
||||
w = [list(r) for r in walls[i]] |
||||
for r in range(1, 6): |
||||
for c in range(1, 7): |
||||
if w[r][c] == '2': |
||||
if random.random() < 0.1: |
||||
w[r][c] = '1' |
||||
elif random.random() < 0.1: |
||||
w[r][c] = '3' |
||||
walls[i] = ["".join(row) for row in w] |
||||
|
||||
# Add texture to horizontal/vertical segments |
||||
for r in range(1, 6): |
||||
for c in range(1, 7): |
||||
if walls[5][r][c] == '2' and random.random() < 0.15: walls[5][r][c] = '1' |
||||
if walls[10][r][c] == '2' and random.random() < 0.15: walls[10][r][c] = '3' |
||||
|
||||
tiles = floors + walls |
||||
|
||||
def to_gb_format(lines): |
||||
bytes_arr = [] |
||||
for line in lines: |
||||
lo = hi = 0 |
||||
for i, char in enumerate(line): |
||||
val = int(char) |
||||
if val & 1: lo |= (1 << (7 - i)) |
||||
if val & 2: hi |= (1 << (7 - i)) |
||||
bytes_arr.append(lo) |
||||
bytes_arr.append(hi) |
||||
return bytes_arr |
||||
|
||||
with open('src/tiles.c', 'w') as f: |
||||
f.write('#include "tiles.h"\n\n') |
||||
f.write(f'const unsigned char TileData[{len(tiles)*16}] = {{\n') |
||||
|
||||
# 6 Floors |
||||
for i in range(6): |
||||
f.write(f' // Floor variant {i}\n') |
||||
b = to_gb_format(floors[i]) |
||||
f.write(' ' + ', '.join(f"0x{val:02X}" for val in b) + ',\n') |
||||
|
||||
# 16 Walls |
||||
for i in range(16): |
||||
f.write(f' // Wall {i}\n') |
||||
b = to_gb_format(walls[i]) |
||||
f.write(' ' + ', '.join(f"0x{val:02X}" for val in b) + ',\n') |
||||
|
||||
f.write('};\n') |
||||
|
||||
# Also generate a PNG preview so the user can see them |
||||
colors = { |
||||
0: (224, 248, 208), |
||||
1: (136, 192, 112), |
||||
2: (52, 104, 86), |
||||
3: (8, 24, 32) |
||||
} |
||||
|
||||
cols = 6 |
||||
rows = 4 |
||||
img = Image.new('RGB', (cols * 10, rows * 10), (255, 255, 255)) |
||||
|
||||
for idx, t in enumerate(tiles): |
||||
c = idx % cols |
||||
r = idx // cols |
||||
x_offset = c * 10 + 1 |
||||
y_offset = r * 10 + 1 |
||||
for ty in range(8): |
||||
for tx in range(8): |
||||
color = colors[int(t[ty][tx])] |
||||
img.putpixel((x_offset + tx, y_offset + ty), color) |
||||
|
||||
img = img.resize((cols * 10 * 4, rows * 10 * 4), Image.Resampling.NEAREST) |
||||
img.save('/home/enne2/.gemini/antigravity/brain/69a2b2a9-088f-47ee-9f3c-9ba7ac332992/pro_tiles_preview.png') |
||||
|
||||
print("tiles.c and pro_tiles_preview.png generated!") |
||||
Loading…
Reference in new issue