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 ' 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