View difference between Paste ID: PyyTB3t9 and iBiPL1SD
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)