diff options
author | Bryan Bishop <kanzure@gmail.com> | 2012-05-05 02:29:41 -0500 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2012-05-05 02:29:41 -0500 |
commit | e229ba5fa9483671970732e9246dd79387fb5e7b (patch) | |
tree | 48d0650964de98ff08f35a51e60cb8c35dda0f4f /crystal.py | |
parent | b38bec53b359829d34e8ca7104e77f8ec725475a (diff) |
possible fix for movement scripts (many broken?)
original-commit-id: 47d1e412b9199d97c148abd8019b071c14039f2e
Diffstat (limited to 'crystal.py')
-rw-r--r-- | crystal.py | 28 |
1 files changed, 19 insertions, 9 deletions
@@ -1687,7 +1687,7 @@ class TextPointerLabelAfterBankParam(PointerLabelAfterBank): class MovementPointerLabelParam(PointerLabelParam): def parse(self): PointerLabelParam.parse(self) - self.movement = MovementData(self.address, map_group=self.map_group, map_id=self.map_id, debug=self.debug) + self.movement = ApplyMovementData(self.parsed_address, map_group=self.map_group, map_id=self.map_id, debug=self.debug) def get_dependencies(self, recompute=False, global_dependencies=set()): if hasattr(self, "movement") and self.movement: @@ -1882,6 +1882,9 @@ class MovementCommand(Command): # by default.. handle all the <$45s #id = [0, 4, 8, 0x0C, 0x10, 0x14, 0x18, 0x1C, 0x20, 0x24, 0x28, 0x2C, 0x30, 0x34, 0x3A, 0x3B, 0x3D] + # this is just for the "temporary" fix until a better applymovement parser is written + id = [x for x in range(0, 56)] + # the vast majority of movement commands do not end the movement script end = False @@ -1974,14 +1977,16 @@ movement_command_classes = inspect.getmembers(sys.modules[__name__], \ lambda obj: inspect.isclass(obj) and \ issubclass(obj, MovementCommand)) +all_movements = [] class ApplyMovementData: base_label = "MovementData_" - def __init__(self, address, map_group=None, map_id=None, debug=False, label=None): + def __init__(self, address, map_group=None, map_id=None, debug=False, label=None, force=False): self.address = address self.map_group = map_group self.map_id = map_id self.debug = debug + self.force = force if not label: label = self.base_label + hex(address) @@ -1995,7 +2000,8 @@ class ApplyMovementData: # with the exception of using text_command_classes instead of command_classes def parse(self): global apply_movement_command_classes, script_parse_table - + address = self.address + # i feel like checking myself assert is_valid_address(address), "ApplyMovementData.parse must be given a valid address" @@ -2033,9 +2039,17 @@ class ApplyMovementData: or class_[1].id == cur_byte: scripting_command_class = class_[1] + + # temporary fix for applymovement scripts + if ord(rom[current_address]) == 0x47: + end = True + scripting_command_class = movement_command_classes[0][1] + # no matching command found if scripting_command_class == None: - raise Exception, "unable to parse movement command $%.2x in the movement script at %s" % (cur_byte, hex(start_address)) + #raise Exception, "unable to parse movement command $%.2x in the movement script at %s" % (cur_byte, hex(start_address)) + end = True + continue # create an instance of the command class and let it parse its parameter bytes cls = scripting_command_class(address=current_address, map_group=self.map_group, map_id=self.map_id, debug=self.debug, force=self.force) @@ -2048,10 +2062,6 @@ class ApplyMovementData: # certain commands will end the movement engine end = cls.end - - # temporary fix for applymovement scripts - if ord(rom[current_address]) == 0x47: - end = True # skip past the command's parameter bytes to go to the next command current_address += cls.size @@ -2062,8 +2072,8 @@ class ApplyMovementData: self.last_address = current_address # store the script in the global table/map thing + all_movements.append(self) script_parse_table[start_address:current_address] = self - all_texts.append(self) if self.debug: asm_output = "\n".join([command.to_asm() for command in commands]) |