diff options
Diffstat (limited to 'crystal.py')
-rw-r--r-- | crystal.py | 52 |
1 files changed, 48 insertions, 4 deletions
@@ -898,11 +898,47 @@ def find_text_addresses(): useful for testing parse_text_engine_script_at""" return TextScript.find_addresses() -class EncodedText(): +class EncodedText: """a sequence of bytes that, when decoded, represent readable text based on the chars table from textpre.py and other places""" + base_label = "UnknownRawText_" - def to_asm(self): raise NotImplementedError, bryan_message + def __init__(self, address, bank=None, map_group=None, map_id=None, debug=True, label=None): + self.address = address + if bank: + self.bank = bank + else: + self.bank = calculate_bank(address) + self.map_group, self.map_id, self.debug = map_group, map_id, debug + if not label: + label = self.base_label + hex(address) + self.label = label + self.parse() + script_parse_table[self.address : self.last_address] = self + + def get_dependencies(self): + return [] + + def parse(self): + offset = self.address + + #read until $57, $50 or $58 + jump57 = how_many_until(chr(0x57), offset) + jump50 = how_many_until(chr(0x50), offset) + jump58 = how_many_until(chr(0x58), offset) + + #whichever command comes first + jump = min([jump57, jump50, jump58]) + + end_address = offset + jump #we want the address before $57 + + text = parse_text_at2(offset, end_address-offset, debug=self.debug) + self.text = text + + self.last_address = self.end_address = end_address + + def to_asm(self): + return "\""+self.text+"\"" @staticmethod def process_00_subcommands(start_address, end_address, debug=True): @@ -1225,6 +1261,7 @@ class PointerLabelParam(MultiByteParam): if kwargs["bank"] != False and kwargs["bank"] != None and kwargs["bank"] in [True, "reverse"]: #not +=1 because child classes set size=3 already self.size = self.default_size + 1 + self.given_bank = kwargs["bank"] #if kwargs["bank"] not in [None, False, True, "reverse"]: # raise Exception, "bank cannot be: " + str(kwargs["bank"]) if self.size > 3: @@ -1432,8 +1469,15 @@ class MenuDataPointerParam(PointerLabelParam): class RawTextPointerLabelParam(PointerLabelParam): #not sure if these are always to a text script or raw text? - pass + def parse(self): + PointerLabelParam.parse(self) + #bank = calculate_bank(self.address) + address = calculate_pointer_from_bytes_at(self.address, bank=False) + self.calculated_address = address + self.text = TextScript(address, map_group=self.map_group, map_id=self.map_id, debug=self.debug) + def get_dependencies(self): + return [self.text] class TextPointerLabelParam(PointerLabelParam): """this is a pointer to a text script""" @@ -1713,7 +1757,7 @@ pksv_crystal_more = { 0x4F: ["loadmenudata", ["data", MenuDataPointerParam]], 0x50: ["writebackup"], 0x51: ["jumptextfaceplayer", ["text_pointer", RawTextPointerLabelParam]], - 0x53: ["jumptext", ["text_pointer", TextPointerLabelParam]], + 0x53: ["jumptext", ["text_pointer", RawTextPointerLabelParam]], 0x54: ["closetext"], 0x55: ["keeptextopen"], 0x56: ["pokepic", ["pokemon", PokemonParam]], |