Skip to content

Commit 012fb73

Browse files
committed
Fix initData parsing for all builds.
1 parent aac4a6b commit 012fb73

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

sc2reader/readers.py

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,47 @@ def __call__(self, data, replay):
2121

2222
class InitDataReader_Base(Reader):
2323

24+
def __call__(self, data, replay):
25+
data = BitPackedDecoder(data)
26+
27+
init_data = dict( #58
28+
player_init_data = [dict( #38
29+
name = data.read_aligned_bytes(data.read_uint8()),
30+
random_seed = data.read_uint32(),
31+
race_preference = data.read_uint8() if data.read_bool() else None, #38
32+
team_preference = data.read_uint8() if data.read_bool() else None, #39
33+
test_map = data.read_bool(),
34+
test_auto = data.read_bool(),
35+
examine = data.read_bool(),
36+
observe = data.read_bits(2),
37+
) for i in range(data.read_bits(5))
38+
],
39+
)
40+
41+
distance = data.read_range(data.tell(), data.length).find('s2ma')
42+
data.read_aligned_bytes(distance)
43+
44+
# The final block of this file that we concern ourselves with is a list
45+
# of what appears to be map data with the s2ma header on each element.
46+
# Each element consists of two unknown bytes, a realm id (e.g EU or US)
47+
# and a map hash which probably ties back to the sc2map files.
48+
#
49+
# Some replays don't seem to have a maps section at all, now we can't
50+
# know what gateway its from? Very strange...
51+
#
52+
# TODO: Figure out how we could be missing a maps section.
53+
map_data = list()
54+
while data.peek(4) == 's2ma':
55+
map_data.append(DepotFile(data.read_aligned_bytes(40)))
56+
57+
return AttributeDict(
58+
map_data=map_data,
59+
player_names=[d['name'] for d in init_data['player_init_data'] if d['name']],
60+
sc_account_id=None,#sc_account_id,
61+
)
62+
63+
class InitDataReader_23260(Reader):
64+
2465
def __call__(self, data, replay):
2566
data = BitPackedDecoder(data)
2667

@@ -83,8 +124,7 @@ def __call__(self, data, replay):
83124
is_blizzardMap = data.read_bool(),
84125
is_premade_ffa = data.read_bool(),
85126
),
86-
)
87-
""" # For builds <= 1.5.4 this won't work.
127+
88128
lobby_state = dict( #56
89129
phase = data.read_bits(3),
90130
max_users = data.read_bits(5),
@@ -98,17 +138,17 @@ def __call__(self, data, replay):
98138
difficulty = data.read_bits(6),
99139
handicap = data.read_bits(7),
100140
observe = data.read_bits(2),
101-
rewards = [data.read_uint32() for i in range(data.read_bits(6))],
141+
rewards = [data.read_uint32() for i in range(data.read_bits(5))], # 52
102142
toon_handle = data.read_aligned_bytes(data.read_bits(7)), # 14
103-
licenses = [data.read_uint32() for i in range(data.read_bits(9))], # 56
143+
licenses = [data.read_uint32() for i in range(data.read_bits(9))], # 53
104144
) for i in range(data.read_bits(5))], # 58
105145
random_seed = data.read_uint32(),
106146
host_user_id = data.read_bits(4) if data.read_bool() else None, # 52
107147
is_single_player = data.read_bool(), # 27
108148
game_duration = data.read_uint32(), # 4
109149
default_difficulty = data.read_bits(6), # 1
110150
),
111-
)"""
151+
)
112152

113153
return AttributeDict(
114154
map_data=init_data['game_description']['cache_handles'],

sc2reader/resources.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,8 @@ def register_default_readers(self):
549549
self.register_reader('replay.details', readers.DetailsReader_22612(), lambda r: r.build >= 22612 and r.versions[1]==1)
550550
self.register_reader('replay.details', readers.DetailsReader_Beta(), lambda r: r.build < 24764 and r.versions[1]==2)
551551
self.register_reader('replay.details', readers.DetailsReader_Beta_24764(), lambda r: r.build >= 24764)
552-
self.register_reader('replay.initData', readers.InitDataReader_Base(), lambda r: r.build < 24764)
552+
self.register_reader('replay.initData', readers.InitDataReader_Base(), lambda r: r.build < 23260)
553+
self.register_reader('replay.initData', readers.InitDataReader_23260(), lambda r: r.build >= 23260 and r.build < 24764)
553554
self.register_reader('replay.initData', readers.InitDataReader_24764(), lambda r: r.build >= 24764)
554555
self.register_reader('replay.message.events', readers.MessageEventsReader_Base(), lambda r: r.build < 24247 or r.versions[1]==1)
555556
self.register_reader('replay.message.events', readers.MessageEventsReader_Beta_24247(), lambda r: r.build >= 24247 and r.versions[1]==2)

0 commit comments

Comments
 (0)