forked from klensy/wt-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wrpl_unpack.py
79 lines (60 loc) · 2.47 KB
/
wrpl_unpack.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import os.path, struct, zlib
import argparse
WRPL_MAGIC = 0xe5ac0010
def unpack(data, filename):
blk_files = []
'''cur_p = 0x8
while struct.unpack_from('B', data, cur_p)[0] != 0x0: cur_p += 1
replay_level = data[0x8:cur_p]
print replay_level
cur_p = 0x88
while struct.unpack_from('B', data, cur_p)[0] != 0x0: cur_p += 1
game_data = data[0x88:cur_p]
print game_data
cur_p = 0x18c
while struct.unpack_from('B', data, cur_p)[0] != 0x0: cur_p += 1
gs_data = data[0x18c:cur_p]
print gs_data
cur_p = 0x20c
while struct.unpack_from('B', data, cur_p)[0] != 0x0: cur_p += 1
part_of_day = data[0x20c:cur_p]
print part_of_day
cur_p = 0x28c
while struct.unpack_from('B', data, cur_p)[0] != 0x0: cur_p += 1
visibility = data[0x28c:cur_p]
print visibility'''
if struct.unpack_from('>I', data, 0)[0] != WRPL_MAGIC:
raise TypeError("Wrong wrpl file")
current_replay_version = struct.unpack_from('B', data, 0x4)[0]
if current_replay_version == 0x9a: # 1.45
blk_start_off = 0x450
elif current_replay_version in [0xc8, 0xca, 0xe7, 0x64]: # 1.47, 1.51, 1.63
blk_start_off = 0x440
else:
raise TypeError("Unknown wrpl version")
cur_p = blk_start_off + 0x8 # BBF header + size
first_bbf_file_size = struct.unpack_from('I', data, cur_p)[0]
cur_p = blk_start_off + first_bbf_file_size + 0xc
blk_files.append(('m_set', data[blk_start_off: cur_p]))
unc_replay, blk_off_from_end = zlib_decompress(data, cur_p)
open(os.path.splitext(filename)[0] + '.' + 'wrplu', 'wb').write(unc_replay)
# old replays(1.43?) need +4 to start point: data[len(data) - blk_off_from_end + 4:]
blk_files.append(('rez', data[len(data) - blk_off_from_end:]))
for blk in blk_files:
with open(os.path.splitext(filename)[0] + '.' + blk[0] + '.blk', 'wb') as f:
f.write(blk[1])
def zlib_decompress(data, offset):
zdo = zlib.decompressobj()
uncompressed_data = zdo.decompress(data[offset:])
# print "unused: %s" % (len(zdo.unused_data))
return uncompressed_data, len(zdo.unused_data)
def main():
parser = argparse.ArgumentParser(description="Unpacks wrpl replays to wrplu data file and blk files")
parser.add_argument('filename', help="unpack from")
parse_result = parser.parse_args()
filename = parse_result.filename
with open(filename, 'rb') as f:
data = f.read()
unpack(data, filename)
if __name__ == '__main__':
main()