pokemon/tools/generate/tilesets.py

94 lines
2.7 KiB
Python

from parse import parse
from generate.sort import default_sort
from generate.generate import renderer
from generate.binary import start_size_value
def sorted_tilesets_constants_list():
return sorted(enumerate(parse.tileset_constants_list()), key=default_sort)
def includes_header():
yield "#pragma once"
yield ""
yield '#include "../start_size.hpp"'
yield ""
for tileset_index, _ in sorted_tilesets_constants_list():
tileset_header = parse.tileset_headers_list()[tileset_index]
blockset_path = parse.tileset_gfx_list()[tileset_header.blockset()]
gfx_path = parse.tileset_gfx_list()[tileset_header.gfx()]
yield f'#include "../res/{blockset_path}.h"'
yield f'#include "../res/{gfx_path}.h"'
def struct_tileset_t():
_sorted_tilesets_constants_list = list(sorted_tilesets_constants_list())
tileset_names = (
f"{name.lower()},"
for _, name in _sorted_tilesets_constants_list
)
return [
"struct tileset_t {",
"start_size_t blockset;",
"start_size_t tileset;",
"start_size_t collision;",
"",
"enum tileset {",
*tileset_names,
"};",
"",
f"static constexpr int32_t count = {len(_sorted_tilesets_constants_list)};",
"};",
]
def extern_tilesets():
yield "extern const tileset_t tilesets[];"
def generate_header():
render, out = renderer()
render(includes_header())
render(struct_tileset_t())
render(extern_tilesets())
return out
def blockset_tileset(index, name):
tileset_header = parse.tileset_headers_list()[index]
blockset_path = parse.tileset_gfx_list()[tileset_header.blockset()]
gfx_path = parse.tileset_gfx_list()[tileset_header.gfx()]
coll_path = tileset_header.coll()
return [
f"[tileset_t::{name.lower()}] = {{",
".blockset = {",
*start_size_value(blockset_path),
"},",
".tileset = {",
*start_size_value(gfx_path),
"},",
".collision = {",
f".start = &{coll_path}[0],",
f".size = (sizeof ({coll_path})),",
"}",
"},"
]
def tilesets():
yield "const tileset_t tilesets[] = {"
for index, name in sorted_tilesets_constants_list():
yield from blockset_tileset(index, name)
yield "};"
def includes_source():
yield '#include <cstdint>'
yield ''
yield '#include "tilesets.hpp"'
yield '#include "collision_tile_ids.hpp"'
yield ''
def generate_source():
render, out = renderer()
render(includes_source())
render(tilesets())
return out