Skip to content

Commit 5c237f2

Browse files
committed
Fixes a serious bug in the hotkey parsing for 1.0.x version replays
1 parent 02adf48 commit 5c237f2

File tree

1 file changed

+31
-10
lines changed

1 file changed

+31
-10
lines changed

sc2reader/parsers.py

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,11 @@ def parse_selection_event(self, buffer, frames, type, code, pid):
4242

4343
def parse_hotkey_event(self, buffer, frames, type, code, pid):
4444
hotkey = code >> 4
45-
action, mode = buffer.shift(2), buffer.shift(2)
45+
action, read = buffer.shift(2), buffer.shift(1)
4646

47-
if mode == 1: # deselect overlay mask
48-
mask = buffer.read_bitmask()
47+
if read:
48+
mask = buffer.read(bits=buffer.read_byte())
4949
overlay = lambda a: Selection.mask(a, mask)
50-
elif mode == 2: # deselect mask
51-
indexes = [buffer.read_byte() for i in range(buffer.read_byte())]
52-
overlay = lambda a: Selection.deselect(a, indexes)
53-
elif mode == 3: # replace mask
54-
indexes = [buffer.read_byte() for i in range(buffer.read_byte())]
55-
overlay = lambda a: Selection.replace(a, indexes)
5650
else:
5751
overlay = None
5852

@@ -189,6 +183,29 @@ def parse_selection_event(self, buffer, frames, type, code, pid):
189183

190184
return SelectionEvent(frames, pid, type, code, bank, objects, deselect)
191185

186+
def parse_hotkey_event(self, buffer, frames, type, code, pid):
187+
hotkey = code >> 4
188+
action, mode = buffer.shift(2), buffer.shift(2)
189+
190+
if mode == 1: # deselect overlay mask
191+
mask = buffer.read_bitmask()
192+
overlay = lambda a: Selection.mask(a, mask)
193+
elif mode == 2: # deselect mask
194+
indexes = [buffer.read_byte() for i in range(buffer.read_byte())]
195+
overlay = lambda a: Selection.deselect(a, indexes)
196+
elif mode == 3: # replace mask
197+
indexes = [buffer.read_byte() for i in range(buffer.read_byte())]
198+
overlay = lambda a: Selection.replace(a, indexes)
199+
else:
200+
overlay = None
201+
202+
if action == 0:
203+
return SetToHotkeyEvent(frames, pid, type, code, hotkey, overlay)
204+
elif action == 1:
205+
return AddToHotkeyEvent(frames, pid, type, code, hotkey, overlay)
206+
elif action == 2:
207+
return GetHotkeyEvent(frames, pid, type, code, hotkey, overlay)
208+
192209
class ActionParser_18574(ActionParser_16561):
193210
def parse_ability_event(self, buffer, frames, type, code, pid):
194211
flag = buffer.read_byte()
@@ -283,7 +300,11 @@ def parse_camera87_event(self, buffer, frames, type, code, pid):
283300
return CameraMovementEvent(frames, pid, type, code)
284301

285302
def parse_camera08_event(self, buffer, frames, type, code, pid):
286-
buffer.skip( (buffer.read_short(BIG_ENDIAN) & 0x0F) << 3 )
303+
short = buffer.read_short(BIG_ENDIAN)
304+
count = short & 0x0F
305+
#print "Short %X, Count %X, Skipped %X" % (short,count,count << 3)
306+
307+
buffer.skip( count << 3 )
287308
return CameraMovementEvent(frames, pid, type, code)
288309

289310
def parse_camera18_event(self, buffer, frames, type, code, pid):

0 commit comments

Comments
 (0)