shithub: pokecrystal

Download patch

ref: 1a8257995677828041f6150d63d70377e73236fe
parent: 3f5955b453e479f3594c04105092337bd191f84a
author: Bryan Bishop <[email protected]>
date: Fri May 11 22:18:27 EDT 2012

slightly better applymovement parsing

--- a/extras/crystal.py
+++ b/extras/crystal.py
@@ -1896,12 +1896,6 @@
     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,10 +1984,75 @@
 
         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:
     base_label = "MovementData_"
@@ -2004,13 +2063,13 @@
         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 @@
                    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 @@
             
             # 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)