shithub: pokecrystal

Download patch

ref: 235b123666136ce582431efd746fb40ac9d833c6
parent: 979b3767410248893bf0411706aca9e3a68196da
author: Bryan Bishop <[email protected]>
date: Fri May 18 12:48:39 EDT 2012

initial work on trainer name parsing

--- /dev/null
+++ b/extras/trainers.py
@@ -1,0 +1,127 @@
+# url: http://hax.iimarck.us/topic/8/
+import re
+
+trainer_group_pointer_table_address = 0x39999
+# gs: 0x3993E
+
+trainer_group_names = {
+0x01: {"name": "Leader [Falkner]"},
+0x02: {"name": "Leader [Whitney]"},
+0x03: {"name": "Leader [Bugsy]"},
+0x04: {"name": "Leader [Morty]"},
+0x05: {"name": "Leader [Pryce]"},
+0x06: {"name": "Leader [Jasmine]"},
+0x07: {"name": "Leader [Chuck]"},
+0x08: {"name": "Leader [Clair]"},
+0x09: {"name": "Silver [1]"},
+0x0A: {"name": "Pokémon Prof."},
+0x0B: {"name": "Elite Four [Will]"},
+0x0C: {"name": "PKMN Trainer [Cal]"},
+0x0D: {"name": "Elite Four [Bruno]"},
+0x0E: {"name": "Elite Four [Karen]"},
+0x0F: {"name": "Elite Four [Koga]"},
+0x10: {"name": "Champion"},
+0x11: {"name": "Leader [Brock]"},
+0x12: {"name": "Leader [Misty]"},
+0x13: {"name": "Leader [Lt.Surge]"},
+0x14: {"name": "Scientist"},
+0x15: {"name": "Leader [Erika]"},
+0x16: {"name": "Youngster"},
+0x17: {"name": "Schoolboy"},
+0x18: {"name": "Bird Keeper"},
+0x19: {"name": "Lass"},
+0x1A: {"name": "Leader [Janine]"},
+0x1B: {"name": "Cooltrainer♂"},
+0x1C: {"name": "Cooltrainer♀"},
+0x1D: {"name": "Beauty"},
+0x1E: {"name": "Pokémaniac"},
+0x1F: {"name": "Rocket [Male Grunt]"},
+0x20: {"name": "Gentleman"},
+0x21: {"name": "Skier"},
+0x22: {"name": "Teacher"},
+0x23: {"name": "Leader [Sabrina]"},
+0x24: {"name": "Bug Catcher"},
+0x25: {"name": "Fisher"},
+0x26: {"name": "Swimmer♂"},
+0x27: {"name": "Swimmer♀"},
+0x28: {"name": "Sailor"},
+0x29: {"name": "Super Nerd"},
+0x2A: {"name": "Silver [2]"},
+0x2B: {"name": "Guitarist"},
+0x2C: {"name": "Hiker"},
+0x2D: {"name": "Biker"},
+0x2E: {"name": "Leader [Blaine]"},
+0x2F: {"name": "Burglar"},
+0x30: {"name": "Firebreather"},
+0x31: {"name": "Juggler"},
+0x32: {"name": "Blackbelt"},
+0x33: {"name": "Rocket [Male Executive]"},
+0x34: {"name": "Psychic"},
+0x35: {"name": "Picnicker"},
+0x36: {"name": "Camper"},
+0x37: {"name": "Rocket [Female Executive]"},
+0x38: {"name": "Sage"},
+0x39: {"name": "Medium"},
+0x3A: {"name": "Boarder"},
+0x3B: {"name": "Pokéfan [Male]"},
+0x3C: {"name": "Kimono Girl"},
+0x3D: {"name": "Twins"},
+0x3E: {"name": "Pokéfan [Female]"},
+0x3F: {"name": "PKMN Trainer [Red]"},
+0x40: {"name": "Leader [Blue]"},
+0x41: {"name": "Officer"},
+0x42: {"name": "Rocket [Female Grunt]"},
+0x43: {"name": "Mysticalman [Eusine]"}, # crystal only
+}
+
+def remove_parentheticals_from_trainer_group_names():
+    """ Clean up the trainer group names.
+    """
+    i = 0
+    for (key, value) in trainer_group_names.items():
+        newvalue = re.sub(r'\[[^\)]*\]', '', value["name"]).strip()
+        trainer_group_names[key] = {"name": newvalue,
+                                    "pointer_address": trainer_group_pointer_table_address + (i * 2),
+                                   }
+        i += 1
+    return trainer_group_names
+
+# remove [Blue] from each trainer group name
+remove_parentheticals_from_trainer_group_names()
+
+class TrainerGroupTable:
+    def __init__(self):
+        self.address = trainer_group_pointer_table_address
+        self.bank = calculate_bank(trainer_group_pointer_table_address)
+        self.label = Label(name="TrainerGroupPointerTable", address=self.address, object=self)
+        self.size = None
+        self.last_address = None
+        self.dependencies = None
+        self.headers = []
+        self.parse()
+
+    def get_dependencies(self, recompute=False, global_dependencies=set()):
+        global_dependencies.update(self.headers)
+        if recompute == True and self.dependencies != None and self.dependencies != []:
+            return self.dependencies
+        dependencies = [self.headers]
+        for header in self.headers:
+            dependencies += header.get_dependencies(recompute=recompute, global_dependencies=global_dependencies)
+        return dependencies
+    def parse(self):
+        size = 0
+        for (key, kvalue) in trainer_group_names.items():
+            name = kvalue["name"]
+            pointer_bytes_location = kvalue["pointer_address"]
+            parsed_address = calculate_pointer_from_bytes_at(pointer_bytes_location, bank=self.bank)
+            trainer_group_names[key]["parsed_address"] = parsed_address
+            trainer_group_header = TrainerGroupHeader(address=parsed_address, group_id=key, group_name=name)
+            trainer_group_names[key]["header"] = trainer_group_header
+            self.headers.append(trainer_group_header)
+            size += trainer_group_header.size
+        self.size = size
+        self.last_address = self.address + self.size
+
+    def to_asm(self):
+        pass
+