SHOW:
|
|
- or go back to the newest paste.
| 1 | from json import dump,load | |
| 2 | from struct import pack as compile_bytes, unpack, calcsize as struct_size | |
| 3 | ||
| 4 | class RomStructure: | |
| 5 | format = "<" | |
| 6 | fields = "".split() | |
| 7 | def __init__(self,data): | |
| 8 | self.data=data | |
| 9 | def compile(self): | |
| 10 | return compile_bytes(self.format,*map(self.data.get,self.fields)) | |
| 11 | @classmethod | |
| 12 | def size(self):return struct_size(self.format) | |
| 13 | @classmethod | |
| 14 | def decompile(self,bytes): | |
| 15 | return dict(zip(self.fields,unpack(self.format,bytes))) | |
| 16 | - | return self.decompile(source[location:location+struct_size(self.format)]) |
| 16 | + | |
| 17 | def load_from(self,source,location): | |
| 18 | return self.decompile(source[location:location+self.size()]) | |
| 19 | ||
| 20 | class MapMetaStructure(RomStructure): | |
| 21 | - | +"flash_thing weather type show_label battle_type").split() |
| 21 | + | |
| 22 | fields =("map_data event_data map_scripts connection_header music index label "
| |
| 23 | - | class MapConnectionStructure: |
| 23 | + | +"flash_thing weather type unknown show_label battle_type").split() |
| 24 | ||
| 25 | class MapConnectionStructure(RomStructure): | |
| 26 | format = "<IIBBH" | |
| 27 | - | class MapConnectionHeader: |
| 27 | + | |
| 28 | ||
| 29 | class MapConnectionHeader(RomStructure): | |
| 30 | format = "<II" | |
| 31 | fields = "size location".split() | |
| 32 | ||
| 33 | if __name__=="__main__": | |
| 34 | get_offset = lambda ptr:ptr&0x00FFFFFF | |
| 35 | from sys import argv;argv=argv[1:] | |
| 36 | from pprint import pprint | |
| 37 | i,end = 0,len(argv) | |
| 38 | while i<end: | |
| 39 | arg,i = argv[i],i+1 | |
| 40 | if arg[arg.rfind("."):]==".gba":#found the Rom
| |
| 41 | try: bytes = open(arg,'rb').read()#read the bytess | |
| 42 | except: raise | |
| 43 | else: | |
| 44 | while i<end: | |
| 45 | arg,i = argv[i],i+1 | |
| 46 | try:offset = get_offset(int(arg,16)) | |
| 47 | except:raise | |
| 48 | else: | |
| 49 | data=MapMetaStructure.load_from(bytes,offset) | |
| 50 | print("Map@",hex(offset))
| |
| 51 | for key,value in data.items(): | |
| 52 | - | print() |
| 52 | + | |
| 53 | else:print(key,value) | |
| 54 | if key=='connection_header': | |
| 55 | connection_header = MapConnectionHeader.load_from(bytes,get_offset(value)) | |
| 56 | print(connection_header['size'],"connections @",connection_header['location']) | |
| 57 | for ci in range(connection_header['size']): | |
| 58 | offset = get_offset(connection_header['location']+ci*MapConnectionStructure.size()) | |
| 59 | map_connection = MapConnectionStructure.load_from(bytes,offset) | |
| 60 | pprint(map_connection) | |
| 61 | print("\nRecompiling:")
| |
| 62 | print(MapMetaStructure(data).compile()) | |
| 63 | print("="*80) |