ref: 6eb1478f1b89eea93744ac67cd2d198d951ac9ca
parent: a06cb374ef12552ffd2404eac561c5eb1810b324
author: Bryan Bishop <[email protected]>
date: Sun Apr 29 06:40:34 EDT 2012
clean up comments in Script.parse method
--- a/extras/crystal.py
+++ b/extras/crystal.py
@@ -2082,38 +2082,73 @@
sys.exit(1)
if is_script_already_parsed_at(start_address) and not force and not force_top:
raise Exception, "this script has already been parsed before, please use that instance ("+hex(start_address)+")"
+
+ # load up the rom if it hasn't been loaded already
load_rom()
+
+ # in the event that the script parsing fails.. it would be nice to leave evidence
script_parse_table[start_address:start_address+1] = "incomplete parse_script_with_command_classes"
+
+ # start with a blank script
commands = []
+
+ # use this to control the while loop
end = False
+
+ # for each command found..
while not end:
+ # get the current scripting byte
cur_byte = ord(rom[current_address])
- #find the right address
- right_kls = None
- for kls in command_classes:
- if kls.id == cur_byte:
- right_kls = kls
- if right_kls == None:
+
+ # reset the command class (last command was probably different)
+ scripting_command_class = None
+
+ # match the command id byte to a scripting command class like GivePoke
+ for class_ in command_classes:
+ if class_.id == cur_byte:
+ scripting_command_class = class_
+
+ # no matching command found (not implemented yet)- just end this script
+ # NOTE: might be better to raise an exception and end the program?
+ if scripting_command_class == None:
print "parsing script; current_address is: " + hex(current_address)
current_address += 1
- #continue
asm_output = "\n".join([command.to_asm() for command in commands])
end = True
continue
- #XXX maybe a bad idea to not die ?
+ # maybe the program should exit with failure instead?
#raise Exception, "no command found? id: " + hex(cur_byte) + " at " + hex(current_address) + " asm is:\n" + asm_output
- #print "about to parse command(script@"+hex(start_address)+"): " + str(right_kls.macro_name)
- cls = right_kls(address=current_address, force=force, map_group=map_group, map_id=map_id)
- #print cls.to_asm()
- end = cls.end
+
+ # create an instance of the command class and let it parse its parameter bytes
+ #print "about to parse command(script@"+hex(start_address)+"): " + str(scripting_command_class.macro_name)
+ cls = scripting_command_class(address=current_address, force=force, map_group=map_group, map_id=map_id)
+
+ #if self.debug:
+ # print cls.to_asm()
+
+ # store it in this script object
commands.append(cls)
+
+ # certain commands will end the scripting engine
+ end = cls.end
+
+ # skip past the command's parameter bytes to go to the next command
#current_address = cls.last_address + 1
current_address += cls.size
+
+ # last byte belonging to script is last byte of last command,
+ # or the last byte of the last command's last parameter
self.last_address = current_address
+
+ # store the script in the global table/map thing
script_parse_table[start_address:current_address] = self
+
asm_output = "\n".join([command.to_asm() for command in commands])
print "--------------\n"+asm_output
+
+ # store the script
self.commands = commands
+
return commands
def get_dependencies(self, recompute=False, global_dependencies=set()):