Skip to content

Commit 1d03283

Browse files
committed
First pass at replay resume support. refs #91
1 parent bb8f9d2 commit 1d03283

File tree

6 files changed

+34
-2
lines changed

6 files changed

+34
-2
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
0.7.0 -
55
---------------------------
66

7+
* Added replay.resume_from_replay flag. See replay.resume_user_info for additional info.
78
* PacketEvent is now ProgressEvent.
89
* SetToHotkeyEvent is now SetControlGroupEvent.
910
* AddToHotkeyEvent is now AddToControlGroupEvent.

sc2reader/engine/plugins/context.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ def handleResourceTradeEvent(self, event, replay):
9999
event.sender = event.player
100100
event.recipient = replay.players[event.recipient_id]
101101

102+
def handleHijackReplayGameEvent(self, event, replay):
103+
replay.resume_from_replay = True
104+
replay.resume_method = event.method
105+
replay.resume_user_info = event.user_infos
106+
102107
def handlePlayerStatsEvent(self, event, replay):
103108
self.load_tracker_player(event, replay)
104109

sc2reader/events/game.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,3 +581,17 @@ def __init__(self, frame, pid, data):
581581

582582
#: The id of the request being cancelled
583583
self.request_id = data['request_id']
584+
585+
586+
class HijackReplayGameEvent(GameEvent):
587+
"""
588+
Generated when players take over from a replay.
589+
"""
590+
def __init__(self, frame, pid, data):
591+
super(HijackReplayGameEvent, self).__init__(frame, pid)
592+
593+
#: The method used. Not sure what 0/1 represent
594+
self.method = data['method']
595+
596+
#: Information on the users hijacking the game
597+
self.user_infos = data['user_infos']

sc2reader/readers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,7 +1326,7 @@ def __init__(self):
13261326
21: (None, self.save_game_event), # New
13271327
22: (None, self.save_game_done_event), # Override
13281328
23: (None, self.load_game_done_event), # Override
1329-
43: (None, self.hijack_replay_game_event), # New
1329+
43: (HijackReplayGameEvent, self.hijack_replay_game_event), # New
13301330
62: (None, self.trigger_target_mode_update_event), # New
13311331
101: (PlayerLeaveEvent, self.game_user_leave_event), # New
13321332
102: (None, self.game_user_join_event), # New
@@ -1356,7 +1356,7 @@ def load_game_done_event(self, data):
13561356
def hijack_replay_game_event(self, data):
13571357
return dict(
13581358
user_infos=[dict(
1359-
game_unit_id=data.read_bits(4),
1359+
game_user_id=data.read_bits(4),
13601360
observe=data.read_bits(2),
13611361
name=data.read_aligned_string(data.read_uint8()),
13621362
toon_handle=data.read_aligned_string(data.read_bits(7)) if data.read_bool() else None,

sc2reader/resources.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,16 @@ class Replay(Resource):
184184
#: SC2 Expansion. One of 'WoL', 'HotS'
185185
expasion = str()
186186

187+
#: True of the game was resumed from a replay
188+
resume_from_replay = False
189+
190+
#: A flag marking which method was used to resume from replay. Unknown interpretation.
191+
resume_method = None
192+
193+
#: Lists info for each user that is resuming from replay.
194+
resume_user_info = None
195+
196+
187197
def __init__(self, replay_file, filename=None, load_level=4, engine=sc2reader.engine, **options):
188198
super(Replay, self).__init__(replay_file, filename, **options)
189199
self.datapack = None

test_replays/test_all.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ def test_oracle_parsing(self):
227227

228228
def test_resume_from_replay(self):
229229
replay = sc2reader.load_replay("test_replays/2.0.3.24764/resume_from_replay.SC2Replay")
230+
self.assertTrue(replay.resume_from_replay)
231+
self.assertEqual(replay.resume_method, 0)
230232

231233
def test_clan_players(self):
232234
replay = sc2reader.load_replay("test_replays/2.0.4.24944/Lunar Colony V.SC2Replay")

0 commit comments

Comments
 (0)