Skip to content

Commit c6fdb74

Browse files
committed
handle 3.0 replays, work in progress.
test now passes, meaning that we can parse the replay without barfing. test doesn't check the parsed data at all; just confirms that no exception is thrown. Conflicts: sc2reader/readers.py test_replays/test_all.py
1 parent e48f306 commit c6fdb74

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

sc2reader/readers.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ def __call__(self, data, replay):
118118
tandem_leader_user_id=data.read_bits(4) if replay.base_build >= 34784 and data.read_bool() else None,
119119
commander=data.read_aligned_bytes(data.read_bits(9)) if replay.base_build >= 34784 else None,
120120
commander_level=data.read_uint32() if replay.base_build >= 36442 else None,
121+
has_silence_penalty=data.read_bool() if replay.base_build >= 38215 else None,
121122
) for i in range(data.read_bits(5))],
122123
random_seed=data.read_uint32(),
123124
host_user_id=data.read_bits(4) if data.read_bool() else None,
@@ -1723,6 +1724,50 @@ def control_group_update_event(self, data):
17231724
}[data.read_bits(2)](),
17241725
)
17251726

1727+
class GameEventsReader_38215(GameEventsReader_36442):
1728+
1729+
def command_event(self, data):
1730+
# this function is exactly the same as command_event() from GameEventsReader_36442
1731+
# with the only change being that flags now has 25 bits instead of 23.
1732+
return dict(
1733+
flags=data.read_bits(25),
1734+
ability=dict(
1735+
ability_link=data.read_uint16(),
1736+
ability_command_index=data.read_bits(5),
1737+
ability_command_data=data.read_uint8() if data.read_bool() else None,
1738+
) if data.read_bool() else None,
1739+
data={ # Choice
1740+
0: lambda: ('None', None),
1741+
1: lambda: ('TargetPoint', dict(
1742+
point=dict(
1743+
x=data.read_bits(20),
1744+
y=data.read_bits(20),
1745+
z=data.read_uint32() - 2147483648,
1746+
)
1747+
)),
1748+
2: lambda: ('TargetUnit', dict(
1749+
flags=data.read_uint16(),
1750+
timer=data.read_uint8(),
1751+
unit_tag=data.read_uint32(),
1752+
unit_link=data.read_uint16(),
1753+
control_player_id=data.read_bits(4) if data.read_bool() else None,
1754+
upkeep_player_id=data.read_bits(4) if data.read_bool() else None,
1755+
point=dict(
1756+
x=data.read_bits(20),
1757+
y=data.read_bits(20),
1758+
z=data.read_uint32() - 2147483648,
1759+
),
1760+
)),
1761+
3: lambda: ('Data', dict(
1762+
data=data.read_uint32()
1763+
)),
1764+
}[data.read_bits(2)](),
1765+
sequence=data.read_uint32() + 1,
1766+
other_unit_tag=data.read_uint32() if data.read_bool() else None,
1767+
unit_group=data.read_uint32() if data.read_bool() else None,
1768+
)
1769+
1770+
17261771
class TrackerEventsReader(object):
17271772

17281773
def __init__(self):

sc2reader/resources.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,8 @@ def register_default_readers(self):
570570
self.register_reader('replay.game.events', readers.GameEventsReader_26490(), lambda r: 26490 <= r.base_build < 27950)
571571
self.register_reader('replay.game.events', readers.GameEventsReader_27950(), lambda r: 27950 <= r.base_build < 34784)
572572
self.register_reader('replay.game.events', readers.GameEventsReader_34784(), lambda r: 34784 <= r.base_build < 36442)
573-
self.register_reader('replay.game.events', readers.GameEventsReader_36442(), lambda r: 36442 <= r.base_build)
573+
self.register_reader('replay.game.events', readers.GameEventsReader_36442(), lambda r: 36442 <= r.base_build < 38215)
574+
self.register_reader('replay.game.events', readers.GameEventsReader_38215(), lambda r: 38215 <= r.base_build)
574575
self.register_reader('replay.game.events', readers.GameEventsReader_HotSBeta(), lambda r: r.versions[1] == 2 and r.build < 24247)
575576

576577
def register_default_datapacks(self):
80.8 KB
Binary file not shown.

test_replays/test_all.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,10 @@ def test_lotv_map(self):
426426
]:
427427
factory = sc2reader.factories.SC2Factory()
428428
replay =factory.load_replay(replayfilename,load_level=1,load_map= True)
429-
429+
430+
def test_30(self):
431+
replay = sc2reader.load_replay("test_replays/3.0.0.38215/first.SC2Replay")
432+
430433

431434
class TestGameEngine(unittest.TestCase):
432435
class TestEvent(object):

0 commit comments

Comments
 (0)