diff --git a/sc2reader/readers.py b/sc2reader/readers.py index 0ae4b317..ed45c0ee 100644 --- a/sc2reader/readers.py +++ b/sc2reader/readers.py @@ -16,7 +16,8 @@ def __call__(self, data, replay): raise NotImplementedError class InitDataReader_Base(Reader): - def __call__(self, data, replay): + + def get_player_names(self, data, replay): # The first block of the replay.initData file represents a list of # human player names; computers are no recorded. This list appears to # always be 16 long, with "" names filling in the balance. Each name @@ -27,6 +28,10 @@ def __call__(self, data, replay): data.skip(5) if name: player_names.append(name) + return player_names + + def __call__(self, data, replay): + player_names = self.get_player_names(data, replay) # The next block contains information about the structure of the MPQ # archive. We don't read this information because we've got mpyq for @@ -59,6 +64,23 @@ def __call__(self, data, replay): sc_account_id=sc_account_id, ) +class InitDataReader_24764(InitDataReader_Base): + def get_player_names(self, data, replay): + player_names = list() + for player in range(data.read_byte()): + name_length = data.read_byte() + data.byte_align() # Strings seem to be always byte aligned + name = data.read_string(length=name_length) + data.read_bits(1) # Not sure why we have this offset, it could be a flag? + clan_length = data.read_byte() + data.byte_align() + clan_name = data.read_string(length=clan_length) + unknown = data.read_bits(42) + data.read_bytes(5) + player_names.append(name) + return player_names + + class AttributesEventsReader_Base(Reader): header_length = 4 diff --git a/sc2reader/resources.py b/sc2reader/resources.py index a0e005a5..d7dd4ab8 100644 --- a/sc2reader/resources.py +++ b/sc2reader/resources.py @@ -562,7 +562,8 @@ def register_default_readers(self): self.register_reader('replay.details', readers.DetailsReader_22612(), lambda r: r.build >= 22612 and r.expansion=='WoL') self.register_reader('replay.details', readers.DetailsReader_Beta(), lambda r: r.build < 24764 and r.expansion=='HotS') self.register_reader('replay.details', readers.DetailsReader_Beta_24764(), lambda r: r.build >= 24764 and r.expansion=='HotS') - self.register_reader('replay.initData', readers.InitDataReader_Base()) + self.register_reader('replay.initData', readers.InitDataReader_Base(), lambda r: r.expansion=='WoL' or r.build < 24764) + self.register_reader('replay.initData', readers.InitDataReader_24764(), lambda r: r.expansion=='HotS' and r.build >= 24764) self.register_reader('replay.message.events', readers.MessageEventsReader_Base(), lambda r: r.build < 24247 or r.expansion=='WoL') self.register_reader('replay.message.events', readers.MessageEventsReader_Beta_24247(), lambda r: r.build >= 24247 and r.expansion=='HotS') self.register_reader('replay.attributes.events', readers.AttributesEventsReader_Base(), lambda r: r.build < 17326)