shithub: pokecrystal

Download patch

ref: 0cb84a7e3a012ca1fd80c506c55e63d8728bc635
parent: f90f05050d3834a8d9fd6555c926e7d8c40ec12e
author: Bryan Bishop <[email protected]>
date: Sat Apr 14 14:23:55 EDT 2012

class for MapEventHeader

--- a/extras/crystal.py
+++ b/extras/crystal.py
@@ -2550,8 +2550,15 @@
     0xCC: ["unknown0xcc"],
 }
 
-class Command():
+class Command:
+    """
+    Note: when dumping to asm, anything in script_parse_table that directly
+    inherits Command should not be .to_asm()'d.
+    """
+    #use this when the "byte id" doesn't matter
+    #.. for example, a non-script command doesn't use the "byte id"
     override_byte_check = False
+    
     def __init__(self, address=None, *pargs, **kwargs):
         """params:
         address     - where the command starts
@@ -5347,50 +5354,93 @@
         "connections": connections,
     }
 
-def parse_map_event_header_at(address, map_group=None, map_id=None, debug=True):
-    """parse crystal map event header byte structure thing"""
-    returnable = {}
+class MapEventHeader:
+    base_label = "MapEventHeader_"
+    def __init__(self, address, map_group=None, map_id=None, debug=True, bank=None, label=None):
+        self.address = address
+        self.map_group = map_group
+        self.map_id = map_id
+        self.debug = debug
+        self.bank = bank
+        if label:
+            self.label = label
+        else:
+            self.label = self.base_label + hex(address)
+        self.parse()
+        script_parse_table[address : self.last_address] = self
+    def parse(self):
+        address = self.address
+        bank = calculate_bank(self.address) #or use self.bank
+        print "event header address is: " + hex(address)
+        
+        filler1 = ord(rom[address])
+        filler2 = ord(rom[address+1])
+        self.fillers = [filler1, filler2]
+        
+        #warps
+        warp_count = ord(rom[address+2])
+        warp_byte_count = warp_byte_size * warp_count
+        after_warps = address + 3 + warp_byte_count
+        warps = parse_warps(address+3, warp_count, bank=bank, map_group=map_group, map_id=map_id, debug=debug)
+        self.warp_count = warp_count
+        self.warps = warps
 
-    bank = calculate_bank(address)
+        #triggers (based on xy location)
+        trigger_count = ord(rom[after_warps])
+        trigger_byte_count = trigger_byte_size * trigger_count
+        xy_triggers = parse_xy_triggers(after_warps+1, trigger_count, bank=bank, map_group=map_group, map_id=map_id, debug=debug)
+        after_triggers = after_warps + 1 + trigger_byte_count
+        self.xy_trigger_count = xy_trigger_count
+        self.xy_triggers = xy_triggers
+        
+        #signposts
+        signpost_count = ord(rom[after_triggers])
+        signpost_byte_count = signpost_byte_size * signpost_count
+        #signposts = rom_interval(after_triggers+1, signpost_byte_count)
+        signposts = parse_signposts(after_triggers+1, signpost_count, bank=bank, map_group=map_group, map_id=map_id, debug=debug)
+        after_signposts = after_triggers + 1 + signpost_byte_count
+        self.signpost_count = signpost_count
+        self.signposts = signposts
+      
+        #people events
+        people_event_count = ord(rom[after_signposts])
+        people_event_byte_count = people_event_byte_size * people_event_count
+        #people_events_bytes = rom_interval(after_signposts+1, people_event_byte_count)
+        #people_events = parse_people_event_bytes(people_events_bytes, address=after_signposts+1, map_group=map_group, map_id=map_id)
+        people_events = parse_people_events(after_signposts+1, people_event_count, bank=bank, map_group=map_group, map_id=map_id, debug=debug)
+        self.people_event_count = people_event_count
+        self.people_events = people_events
+        
+        if people_event_count > 0:
+            self.last_address = people_events[-1].last_address
+        else:
+            self.last_address = after_signposts+1
+        return True
+    def to_asm(self):
+        output += spacing + "; warps\n"
+        output += spacing + "db %d\n"%(self.warp_count)
+        output += "\n".join([spacing+warp.to_asm() for warp in self.warps])
 
-    print "event header address is: " + hex(address)
-    filler1 = ord(rom[address])
-    filler2 = ord(rom[address+1])
-    returnable.update({"1": filler1, "2": filler2})
-    
-    #warps
-    warp_count = ord(rom[address+2])
-    warp_byte_count = warp_byte_size * warp_count
-    after_warps = address + 3 + warp_byte_count
-    warps = parse_warps(address+3, warp_count, bank=bank, map_group=map_group, map_id=map_id, debug=debug)
-    returnable.update({"warp_count": warp_count, "warps": warps})
-    
-    #triggers (based on xy location)
-    trigger_count = ord(rom[after_warps])
-    trigger_byte_count = trigger_byte_size * trigger_count
-    #triggers = rom_interval(after_warps+1, trigger_byte_count)
-    #xy_triggers = parse_xy_trigger_bytes(triggers, bank=bank, map_group=map_group, map_id=map_id)
-    xy_triggers = parse_xy_triggers(after_warps+1, trigger_count, bank=bank, map_group=map_group, map_id=map_id, debug=debug)
-    after_triggers = after_warps + 1 + trigger_byte_count
-    returnable.update({"xy_trigger_count": trigger_count, "xy_triggers": xy_triggers})
-    
-    #signposts
-    signpost_count = ord(rom[after_triggers])
-    signpost_byte_count = signpost_byte_size * signpost_count
-    #signposts = rom_interval(after_triggers+1, signpost_byte_count)
-    signposts = parse_signposts(after_triggers+1, signpost_count, bank=bank, map_group=map_group, map_id=map_id, debug=debug)
-    after_signposts = after_triggers + 1 + signpost_byte_count
-    returnable.update({"signpost_count": signpost_count, "signposts": signposts})
-  
-    #people events
-    people_event_count = ord(rom[after_signposts])
-    people_event_byte_count = people_event_byte_size * people_event_count
-    #people_events_bytes = rom_interval(after_signposts+1, people_event_byte_count)
-    #people_events = parse_people_event_bytes(people_events_bytes, address=after_signposts+1, map_group=map_group, map_id=map_id)
-    people_events = parse_people_events(after_signposts+1, people_event_count, bank=bank, map_group=map_group, map_id=map_id, debug=debug)
-    returnable.update({"people_event_count": people_event_count, "people_events": people_events})
+        output += "\n\n"
+        output += spacing + "; xy triggers\n"
+        output += spacing + "db %d\n"%(self.xy_trigger_count)
+        output += "\n".join([spacing+xy_trigger.to_asm() for xy_trigger in self.xy_triggers])
 
-    return returnable
+        output += "\n\n"
+        output += spacing + "; signposts\n"
+        output += spacing + "db %d\n"%(self.signpost_count)
+        output += "\n".join([spacing+signpost.to_asm() for signpost in self.signposts])
+
+        output += "\n\n"
+        output += spacing + "; people-events\n"
+        output += spacing + "db %d\n"%(self.people_event_count)
+        output += "\n".join([spacing+people_event.to_asm() for people_event in self.people_events])
+
+        return output
+
+def parse_map_event_header_at(address, map_group=None, map_id=None, debug=True, bank=None):
+    """parse crystal map event header byte structure thing"""
+    return MapEventHeader(address, map_group=map_group, map_id=map_id, debug=debug, bank=bank)
 
 def parse_map_script_header_at(address, map_group=None, map_id=None, debug=True):
     """parses a script header