166 lines
5.1 KiB
Python
166 lines
5.1 KiB
Python
"""
|
|
map_headers[0].tileset == 'OVERWORLD'
|
|
map_headers[0].name1 = 'PalletTown'
|
|
map_headers[0].name2 = 'PALLET_TOWN'
|
|
map_headers[0].blocks() == 'PalletTown_Blocks'
|
|
map_constants_list['PALLET_TOWN'] == MapConstant(10, 19)
|
|
maps_blocks_list['PalletTown_Blocks'] == 'maps/PalletTown.blk'
|
|
tileset_constants_list['OVERWORLD'] == 0
|
|
tileset_headers_list[0].name == 'Overworld'
|
|
tileset_headers_list[0].blockset() == 'Overworld_Block'
|
|
tileset_headers_list[0].gfx() == 'Overworld_GFX'
|
|
gfx_tilesets_list['Overworld_Block'] == 'gfx/blocksets/overworld.bst'
|
|
gfx_tilesets_list['Overworld_GFX'] == 'gfx/tilesets/overworld.2bpp'
|
|
"""
|
|
|
|
from parse import parse
|
|
|
|
from generate.sort import default_sort
|
|
from generate.binary import binary_res, start_size_value
|
|
from generate.generate import renderer
|
|
|
|
def sorted_map_constants_list():
|
|
return sorted(parse.map_constants_list.items(), key=default_sort)
|
|
|
|
def sorted_map_headers():
|
|
map_constants_list = sorted_map_constants_list()
|
|
map_headers_dict = dict((map_header.name2, map_header) for map_header in parse.map_headers)
|
|
# hack to remove unused/duplicate underground_path_route_7
|
|
#map_headers = sorted(parse.map_headers, key=lambda m: m.name2)
|
|
#return filter(lambda m: m.name1 != "UndergroundPathRoute7Copy", map_headers)
|
|
return (
|
|
map_headers_dict[map_name2] for map_name2, _ in map_constants_list
|
|
if map_name2 in map_headers_dict
|
|
# e.g CERULEAN_TRASHED_HOUSE_COPY has no map header
|
|
)
|
|
|
|
def sorted_tilesets_constants_list():
|
|
return sorted(parse.tileset_constants_list.items(), key=default_sort)
|
|
|
|
def includes_header():
|
|
yield "#pragma once"
|
|
yield ""
|
|
yield '#include "../start_size.hpp"'
|
|
yield ""
|
|
for map_header in sorted_map_headers():
|
|
block_path = parse.maps_blocks_list[map_header.blocks()]
|
|
yield f'#include "../res/{block_path}.h"'
|
|
for tileset_name, _ in sorted_tilesets_constants_list():
|
|
tileset_index = parse.tileset_constants_list[tileset_name]
|
|
tileset_header = parse.tileset_headers_list[tileset_index]
|
|
|
|
blockset_path = parse.gfx_tilesets_list[tileset_header.blockset()]
|
|
gfx_path = parse.gfx_tilesets_list[tileset_header.gfx()]
|
|
|
|
yield f'#include "../res/{blockset_path}.h"'
|
|
yield f'#include "../res/{gfx_path}.h"'
|
|
yield ""
|
|
|
|
def struct_tileset_t():
|
|
tileset_names = (
|
|
f"{name.lower()},"
|
|
for name, _ in sorted_tilesets_constants_list()
|
|
)
|
|
return [
|
|
"struct tileset_t {",
|
|
"start_size_t blockset;",
|
|
"start_size_t tileset;",
|
|
"",
|
|
"enum tileset {",
|
|
*tileset_names,
|
|
"};",
|
|
"};",
|
|
]
|
|
|
|
def struct_map_t():
|
|
map_names = (
|
|
f"{map_header.name2.lower()},"
|
|
for map_header in sorted_map_headers()
|
|
)
|
|
return [
|
|
"struct map_t {",
|
|
"start_size_t blocks;",
|
|
"enum tileset_t::tileset tileset;",
|
|
"uint32_t width;",
|
|
"uint32_t height;",
|
|
"",
|
|
"enum map {",
|
|
*map_names,
|
|
"last_map,", # special map name
|
|
"unused_map_ed,", # special silph co elevator map name
|
|
"};",
|
|
"};",
|
|
]
|
|
|
|
def blockset_tileset(name: str):
|
|
tileset_index = parse.tileset_constants_list[name]
|
|
tileset_header = parse.tileset_headers_list[tileset_index]
|
|
|
|
blockset_path = parse.gfx_tilesets_list[tileset_header.blockset()]
|
|
gfx_path = parse.gfx_tilesets_list[tileset_header.gfx()]
|
|
|
|
return [
|
|
f"[tileset_t::{name.lower()}] = {{",
|
|
".blockset = {",
|
|
*start_size_value(blockset_path),
|
|
"},",
|
|
".tileset = {",
|
|
*start_size_value(gfx_path),
|
|
"}",
|
|
"},"
|
|
]
|
|
|
|
def tilesets_header():
|
|
yield "extern const tileset_t tilesets[];"
|
|
|
|
def tilesets():
|
|
yield "const tileset_t tilesets[] = {"
|
|
for name, _ in sorted_tilesets_constants_list():
|
|
yield from blockset_tileset(name)
|
|
yield "};"
|
|
|
|
def map(map_header):
|
|
block_path = parse.maps_blocks_list[map_header.blocks()]
|
|
map_constant = parse.map_constants_list[map_header.name2]
|
|
return [
|
|
f"[map_t::{map_header.name2.lower()}] = {{",
|
|
".blocks = {",
|
|
*start_size_value(block_path),
|
|
"},",
|
|
f".tileset = tileset_t::{map_header.tileset.lower()},",
|
|
f".width = {map_constant.width},",
|
|
f".height = {map_constant.height},",
|
|
"},",
|
|
]
|
|
|
|
def maps_header():
|
|
yield "extern const map_t maps[];"
|
|
|
|
def maps():
|
|
yield "const map_t maps[] = {"
|
|
for map_header in sorted_map_headers():
|
|
yield from map(map_header)
|
|
yield "};"
|
|
|
|
def generate_maps_header():
|
|
render, out = renderer()
|
|
render(includes_header())
|
|
render(struct_tileset_t())
|
|
render(struct_map_t())
|
|
render(tilesets_header());
|
|
render(maps_header());
|
|
return out
|
|
|
|
def includes_source():
|
|
yield '#include <cstdint>'
|
|
yield ''
|
|
yield '#include "maps.hpp"'
|
|
yield ''
|
|
|
|
def generate_maps_source():
|
|
render, out = renderer()
|
|
render(includes_source())
|
|
render(tilesets())
|
|
render(maps())
|
|
return out
|