Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions sc2reader/readers.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ def __call__(self, data, replay):
tandem_leader_user_id=data.read_bits(4) if replay.base_build >= 34784 and data.read_bool() else None,
commander=data.read_aligned_bytes(data.read_bits(9)) if replay.base_build >= 34784 else None,
commander_level=data.read_uint32() if replay.base_build >= 36442 else None,
has_silence_penalty=data.read_bool() if replay.base_build >= 38215 else None,
) for i in range(data.read_bits(5))],
random_seed=data.read_uint32(),
host_user_id=data.read_bits(4) if data.read_bool() else None,
Expand Down Expand Up @@ -1723,6 +1724,49 @@ def control_group_update_event(self, data):
}[data.read_bits(2)](),
)

class GameEventsReader_38215(GameEventsReader_36442):

def command_event(self, data):
# this function is exactly the same as command_event() from GameEventsReader_36442
# with the only change being that flags now has 25 bits instead of 23.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it is kind of shitty how this bit of code turned out. I can never get up the motivation to rewrite for less repetition though.

return dict(
flags=data.read_bits(25),
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,
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just for my own knowledge, why do we need the subtraction here?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

makes sense. thanks for the explanation!

)
)),
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):

Expand Down
3 changes: 2 additions & 1 deletion sc2reader/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,8 @@ def register_default_readers(self):
self.register_reader('replay.game.events', readers.GameEventsReader_26490(), lambda r: 26490 <= r.base_build < 27950)
self.register_reader('replay.game.events', readers.GameEventsReader_27950(), lambda r: 27950 <= r.base_build < 34784)
self.register_reader('replay.game.events', readers.GameEventsReader_34784(), lambda r: 34784 <= r.base_build < 36442)
self.register_reader('replay.game.events', readers.GameEventsReader_36442(), lambda r: 36442 <= r.base_build)
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)
self.register_reader('replay.game.events', readers.GameEventsReader_HotSBeta(), lambda r: r.versions[1] == 2 and r.build < 24247)

def register_default_datapacks(self):
Expand Down
Binary file added test_replays/3.0.0.38215/first.SC2Replay
Binary file not shown.
3 changes: 3 additions & 0 deletions test_replays/test_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,9 @@ def test_lotv_map(self):
factory = sc2reader.factories.SC2Factory()
replay =factory.load_replay(replayfilename,load_level=1,load_map= True)

def test_30(self):
replay = sc2reader.load_replay("test_replays/3.0.0.38215/first.SC2Replay")


class TestGameEngine(unittest.TestCase):
class TestEvent(object):
Expand Down