from operator import itemgetter from parse import parse from generate.generate import renderer """ parse.scripts_list() == { 'PalletTown_TextPointers': ({'TEXT_PALLETTOWN_FISHER': 'PalletTownFisherText', 'TEXT_PALLETTOWN_GIRL': 'PalletTownGirlText', 'TEXT_PALLETTOWN_OAK': 'PalletTownOakText', 'TEXT_PALLETTOWN_OAKSLAB_SIGN': 'PalletTownOaksLabSignText', 'TEXT_PALLETTOWN_PLAYERSHOUSE_SIGN': 'PalletTownPlayersHouseSignText', 'TEXT_PALLETTOWN_RIVALSHOUSE_SIGN': 'PalletTownRivalsHouseSignText', 'TEXT_PALLETTOWN_SIGN': 'PalletTownSignText'}, {'PalletTownFisherText': '_PalletTownFisherText', 'PalletTownGirlText': '_PalletTownGirlText', 'PalletTownOaksLabSignText': '_PalletTownOaksLabSignText', 'PalletTownPlayersHouseSignText': '_PalletTownPlayersHouseSignText', 'PalletTownRivalsHouseSignText': '_PalletTownRivalsHouseSignText', 'PalletTownSignText': '_PalletTownSignText'}), } """ def labels_by_constant(constants, labels): # fixme: removes constants with no (parsed) label for text_name, label_name in constants.items(): if label_name in labels: yield text_name, labels[label_name] def sorted_text_pointers(constants, labels): return sorted(labels_by_constant(constants, labels), key=itemgetter(0)) def text_constant_enum(name, constants, labels): yield f"enum {name} {{" for i, (k, _) in enumerate(sorted_text_pointers(constants, labels)): yield f"{k} = {i}," yield "};" def header_includes(): yield "#pragma once" yield "" def text_constant_enums(): map_text_pointers = parse.scripts_list() for name, (constants, labels) in map_text_pointers.items(): yield from text_constant_enum(name, constants, labels) def extern_text_pointer(name, constants, labels): pointers = list(sorted_text_pointers(constants, labels)) yield f"extern const start_size_t {name}[{len(pointers)}];" def extern_text_pointers(): map_text_pointers = parse.scripts_list() for name, (constants, labels) in map_text_pointers.items(): yield from extern_text_pointer(name, constants, labels) def generate_header(): render, out = renderer() render(header_includes()) render(text_constant_enums()) render(extern_text_pointers()) return out def text_pointer(name, constants, labels): yield f"const start_size_t {name}[] = {{" pointers = list(sorted_text_pointers(constants, labels)) for constant, label in pointers: yield f"[{constant}] = {{" yield f".start = &{label}[0]," yield f".size = (sizeof ({label}))," yield "}," yield "};" def text_pointers(): map_text_pointers = parse.scripts_list() for name, (constants, labels) in map_text_pointers.items(): yield from text_pointer(name, constants, labels) def source_includes(): yield '#include "../start_size.hpp"' yield "" yield '#include "text_pointers.hpp"' yield '#include "text.hpp"' yield "" def generate_source(): render, out = renderer() render(source_includes()) render(text_pointers()) return out