diff --git a/sc2reader/readers.py b/sc2reader/readers.py index 3345e138..bbc7c3b4 100644 --- a/sc2reader/readers.py +++ b/sc2reader/readers.py @@ -1877,6 +1877,49 @@ def trigger_ping_event(self, data): option=data.read_uint32() - 2147483648, ) +class GameEventsReader_64469(GameEventsReader_38996): + + # this function is exactly the same as command_event() from GameEventsReader_38996 + # with the only change being that flags now has 26 bits instead of 25. + def command_event(self, data): + return dict( + flags=data.read_bits(26), + ability=dict( + ability_link=data.read_uint16(), + ability_command_index=data.read_bits(5), + ability_command_data=data.read_uint8() if data.read_bool() else None, + ) if data.read_bool() else None, + data={ # Choice + 0: lambda: ('None', None), + 1: lambda: ('TargetPoint', dict( + point=dict( + x=data.read_bits(20), + y=data.read_bits(20), + z=data.read_uint32() - 2147483648, + ) + )), + 2: lambda: ('TargetUnit', dict( + flags=data.read_uint16(), + timer=data.read_uint8(), + unit_tag=data.read_uint32(), + unit_link=data.read_uint16(), + control_player_id=data.read_bits(4) if data.read_bool() else None, + upkeep_player_id=data.read_bits(4) if data.read_bool() else None, + point=dict( + x=data.read_bits(20), + y=data.read_bits(20), + z=data.read_uint32() - 2147483648, + ), + )), + 3: lambda: ('Data', dict( + data=data.read_uint32() + )), + }[data.read_bits(2)](), + sequence=data.read_uint32() + 1, + other_unit_tag=data.read_uint32() if data.read_bool() else None, + unit_group=data.read_uint32() if data.read_bool() else None, + ) + class TrackerEventsReader(object): def __init__(self): diff --git a/sc2reader/resources.py b/sc2reader/resources.py index 223f21c9..a24f07b5 100644 --- a/sc2reader/resources.py +++ b/sc2reader/resources.py @@ -585,7 +585,8 @@ def register_default_readers(self): self.register_reader('replay.game.events', readers.GameEventsReader_36442(), lambda r: 36442 <= r.base_build < 38215) self.register_reader('replay.game.events', readers.GameEventsReader_38215(), lambda r: 38215 <= r.base_build < 38749) self.register_reader('replay.game.events', readers.GameEventsReader_38749(), lambda r: 38749 <= r.base_build < 38996) - self.register_reader('replay.game.events', readers.GameEventsReader_38996(), lambda r: 38996 <= r.base_build) + self.register_reader('replay.game.events', readers.GameEventsReader_38996(), lambda r: 38996 <= r.base_build < 64469) + self.register_reader('replay.game.events', readers.GameEventsReader_64469(), lambda r: 64469 <= r.base_build) self.register_reader('replay.game.events', readers.GameEventsReader_HotSBeta(), lambda r: r.versions[1] == 2 and r.build < 24247) def register_default_datapacks(self): diff --git a/test_replays/4.3.0.64469/1.SC2Replay b/test_replays/4.3.0.64469/1.SC2Replay new file mode 100755 index 00000000..9c79072d Binary files /dev/null and b/test_replays/4.3.0.64469/1.SC2Replay differ diff --git a/test_replays/test_all.py b/test_replays/test_all.py index d90b477b..0cc12077 100644 --- a/test_replays/test_all.py +++ b/test_replays/test_all.py @@ -561,6 +561,13 @@ def test_59587(self): factory = sc2reader.factories.SC2Factory() replay = factory.load_replay(replayfilename) + def test_64469(self): + for replayfilename in [ + "test_replays/4.3.0.64469/1.SC2Replay", + ]: + factory = sc2reader.factories.SC2Factory() + replay = factory.load_replay(replayfilename) + class TestGameEngine(unittest.TestCase): class TestEvent(object):