pokemon/tools/generate/text_pointers.py
Zack Buhman e4ff1b4c5a generate/text: added
Of the "trivial" texts that the current parser can handle, these are
now being inserted in obj_events.
2023-07-30 08:52:46 +00:00

91 lines
3.1 KiB
Python

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