love-demo2/minecraft/gen/block_ids.py

96 lines
2.9 KiB
Python

import csv
from dataclasses import dataclass
import data
@dataclass
class Decl:
name: str
block_id: int
data: int
linear_texture_index: str
custom_mesh: str
properties: set[str]
def decls():
with open("block_ids.csv", "r") as f:
reader = csv.reader(f)
rows = list(reader)
header = ('name', 'block id', 'data', 'linear texture index', 'custom mesh', 'properties')
assert tuple(rows[0][:len(header)]) == header, rows[0]
data_rows = rows[1:]
for name, block_id, data, texture_index, custom_mesh, properties, *_ in data_rows:
block_id = int(block_id)
texture_index = (int(texture_index) - 1) if texture_index.strip() != '' else 62
custom_mesh = custom_mesh if custom_mesh.strip() != '' else 'cube'
properties = set(properties.split(','))
if ',' in data:
for d in data.split(","):
yield Decl(name, block_id, int(d), texture_index, custom_mesh, properties)
else:
data = int(data) if data.strip() != '' else 0
yield Decl(name, block_id, data, texture_index, custom_mesh, properties)
def key_block_id_data(decl):
return decl.block_id, decl.data
sorted_decls = list(sorted(decls(), key=key_block_id_data))
by_id_data = {
(decl.block_id, decl.data): decl
for decl in sorted_decls
}
default_decl = Decl(
name = "_undefined",
block_id = 999,
data = 111,
linear_texture_index = 62,
custom_mesh = "cube",
properties = set(),
)
def is_neighbor_block(block_id, block_data):
if block_id == data.BlockID.AIR:
return False
decl = by_id_data.get((block_id, block_data), default_decl)
return decl.custom_mesh == 'cube'
def is_light_source(block_id, block_data):
decl = by_id_data.get((block_id, block_data), default_decl)
return 'emits_light' in decl.properties
def is_cube_block(block_id, block_data):
decl = by_id_data.get((block_id, block_data), default_decl)
return decl.custom_mesh == 'cube'
sorted_custom_mesh = list(sorted(set(decl.custom_mesh for decl in sorted_decls if decl.custom_mesh != "cube")))
custom_mesh_index = {
custom_mesh: index
for index, custom_mesh in enumerate(sorted_custom_mesh)
}
def get_custom_mesh_index(block_id, block_data):
decl = by_id_data.get((block_id, block_data), default_decl)
return custom_mesh_index[decl.custom_mesh]
def get_texture_id(block_id, block_data):
decl = by_id_data.get((block_id, block_data), default_decl)
return decl.linear_texture_index
def get_special(block_id, block_data):
decl = by_id_data.get((block_id, block_data), default_decl)
if "two_sided" in decl.properties:
return -1
if "torch_oriented" in decl.properties:
return 1
if "stair_oriented" in decl.properties:
return 2
if "slab_oriented" in decl.properties:
return 3
return 0
if __name__ == "__main__":
from pprint import pprint
print(sorted_custom_mesh)
#pprint(sorted_decls)