diff options
| author | Bryan Bishop <kanzure@gmail.com> | 2012-05-12 02:18:27 -0500 | 
|---|---|---|
| committer | Bryan Bishop <kanzure@gmail.com> | 2012-05-12 02:18:27 -0500 | 
| commit | bde9d3f21e9ee994bc6626e7083a977b3d3d9b39 (patch) | |
| tree | f6e83dac575d0aec2737b566cae5da9959841e95 /crystal.py | |
| parent | 3d40673c9c0d9510b27618f220d6017e7dd51e4f (diff) | |
slightly better applymovement parsing
original-commit-id: 1a8257995677828041f6150d63d70377e73236fe
Diffstat (limited to 'crystal.py')
| -rw-r--r-- | crystal.py | 86 | 
1 files changed, 71 insertions, 15 deletions
| @@ -1896,12 +1896,6 @@ class DataByteWordMacro(Command):      def to_asm(self): pass  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 @@ -1990,9 +1984,74 @@ class MovementCommand(Command):          return name -movement_command_classes = inspect.getmembers(sys.modules[__name__], \ -                           lambda obj: inspect.isclass(obj) and \ -                           issubclass(obj, MovementCommand)) +movement_command_bases = { +    0x00: "turn_head", +    0x04: "half_step", +    0x08: "slow_step", #small_step? +    0x0C: "step", +    0x10: "big_step", #fast_step? +    0x14: "slow_slide_step", +    0x18: "slide_step", +    0x1C: "fast_slide_step", +    0x20: "turn_away", +    0x24: "turn_in", #towards? +    0x28: "turn_waterfall", #what?? +    0x2C: "slow_jump_step", +    0x30: "jump_step", +    0x34: "fast_jump_step", + +    # tauwasser says the pattern stops at $45 but $38 looks more realistic? +    0x3A: "remove_fixed_facing", +    0x3B: "fix_facing", +    0x3D: "hide_person", +    0x45: "accelerate_last", +    0x46: ["step_sleep", ["duration", DecimalParam]], +    0x47: "step_end", +    0x49: "hide_person", + +    # do these next two have any params ?? +    0x4C: "teleport_from", +    0x4D: "teleport_to", +     +    0x4E: "skyfall", +    0x4F: "step_wait5", +    0x55: ["step_shake", ["displacement", DecimalParam]], +} + +# create MovementCommands from movement_command_bases +def create_movement_commands(): +    """ Creates MovementCommands from movement_command_bases. +    This is just a cheap trick instead of manually defining +    all of those classes. +    """ +    #movement_command_classes = inspect.getmembers(sys.modules[__name__], \ +    #                       lambda obj: inspect.isclass(obj) and \ +    #                       issubclass(obj, MovementCommand) and \ +    #                       not (obj is MovementCommand)) +    movement_command_classes = [] +    for (byte, cmd) in movement_command_bases.items(): +        if type(cmd) == str: +            cmd = [cmd] +        cmd_name = cmd[0].replace(" ", "_") +        params = {"id": byte, "size": 1, "end": byte is 0x47, "macro_name": cmd_name} +        params["param_types"] = {} +        if len(cmd) > 1: +            param_types = cmd[1:] +            for (i, each) in enumerate(param_types): +                thing = {"name": each[0], "class": each[1]} +                params["param_types"][i] = thing +                if debug: +                    print "each is: " + str(each) +                    print "thing[class] is: " + str(thing["class"]) +                params["size"] += thing["class"].size +        klass_name = cmd_name+"Command" +        klass = classobj(klass_name, (Command,), params) +        globals()[klass_name] = klass +        movement_command_classes.append(klass) +    #later an individual klass will be instantiated to handle something +    return movement_command_classes + +movement_command_classes = create_movement_commands()  all_movements = []  class ApplyMovementData: @@ -2004,13 +2063,13 @@ class ApplyMovementData:          self.map_id    = map_id          self.debug     = debug          self.force     = force -        self.dependencies = []          if not label:              label = self.base_label + hex(address)          self.label     = Label(name=label, address=address, object=self) -        self.commands = [] +        self.dependencies = [] +        self.commands     = []          self.parse() @@ -2057,7 +2116,6 @@ 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 @@ -2065,9 +2123,7 @@ class ApplyMovementData:              # 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)) -                end = True -                continue +                raise Exception, "unable to parse movement command $%.2x in the movement script at %s" % (cur_byte, hex(start_address))              # 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) | 
