@@ -10,14 +10,73 @@ def parse_join_event(self, buffer, frames, type, code, pid):
1010
1111 def parse_start_event (self , buffer , frames , type , code , pid ):
1212 return GameStartEvent (frames , pid , type , code )
13-
14- counter = defaultdict (int )
15- flag_counter = defaultdict (int )
1613
1714class ActionParser (object ):
1815 def parse_leave_event (self , buffer , frames , type , code , pid ):
1916 return PlayerLeaveEvent (frames , pid , type , code )
20-
17+
18+ def parse_ability_event (self , buffer , frames , type , code , pid ):
19+ buffer .skip (7 )
20+ switch = buffer .read_byte ()
21+ if switch in (0x30 ,0x50 ):
22+ buffer .read_byte ()
23+ buffer .skip (24 )
24+ return AbilityEvent (frames , pid , type , code , None )
25+
26+ def parse_selection_event (self , buffer , frames , type , code , pid ):
27+ bank = code >> 4
28+ selFlags = buffer .read_byte ()
29+ dsuCount = buffer .read_byte ()
30+ buffer .read (bits = dsuCount )
31+
32+ # <count> (<type_id>, <count>,)*
33+ object_types = [ (buffer .read_object_type (read_modifier = True ), buffer .read_byte (), ) for i in range (buffer .read_byte ()) ]
34+ # <count> (<object_id>,)*
35+ object_ids = [ buffer .read_object_id () for i in range (buffer .read_byte ()) ]
36+
37+ # repeat types count times
38+ object_types = chain (* [[object_type ,]* count for (object_type , count ) in object_types ])
39+ objects = zip (object_ids , object_types )
40+
41+ return AbilityEvent (frames , pid , type , code , None )
42+
43+ def parse_hotkey_event (self , buffer , frames , type , code , pid ):
44+ hotkey = code >> 4
45+ action , mode = buffer .shift (2 ), buffer .shift (2 )
46+
47+ if mode == 1 : # deselect overlay mask
48+ mask = buffer .read_bitmask ()
49+ 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 )
56+ else :
57+ overlay = None
58+
59+ if action == 0 :
60+ return SetToHotkeyEvent (frames , pid , type , code , hotkey , overlay )
61+ elif action == 1 :
62+ return AddToHotkeyEvent (frames , pid , type , code , hotkey , overlay )
63+ elif action == 2 :
64+ return GetHotkeyEvent (frames , pid , type , code , hotkey , overlay )
65+
66+ def parse_transfer_event (self , buffer , frames , type , code , pid ):
67+ def read_resource (buffer ):
68+ block = buffer .read_int (BIG_ENDIAN )
69+ base , multiplier , extension = block >> 8 , block & 0xF0 , block & 0x0F
70+ return base * multiplier + extension
71+
72+ target = code >> 4
73+ buffer .skip (1 ) #Always 84
74+ minerals ,vespene = read_resource (buffer ), read_resource (buffer )
75+ buffer .skip (8 )
76+
77+ return ResourceTransferEvent (frames , pid , type , code , target , minerals , vespene )
78+
79+ class ActionParser_16561 (ActionParser ):
2180 def parse_ability_event (self , buffer , frames , type , code , pid ):
2281 flag = buffer .read_byte ()
2382 atype = buffer .read_byte ()
@@ -129,44 +188,8 @@ def parse_selection_event(self, buffer, frames, type, code, pid):
129188 objects = zip (object_ids , object_types )
130189
131190 return SelectionEvent (frames , pid , type , code , bank , objects , deselect )
132-
133- def parse_hotkey_event (self , buffer , frames , type , code , pid ):
134- hotkey = code >> 4
135- action , mode = buffer .shift (2 ), buffer .shift (2 )
136-
137- if mode == 1 : # deselect overlay mask
138- mask = buffer .read_bitmask ()
139- overlay = lambda a : Selection .mask (a , mask )
140- elif mode == 2 : # deselect mask
141- indexes = [buffer .read_byte () for i in range (buffer .read_byte ())]
142- overlay = lambda a : Selection .deselect (a , indexes )
143- elif mode == 3 : # replace mask
144- indexes = [buffer .read_byte () for i in range (buffer .read_byte ())]
145- overlay = lambda a : Selection .replace (a , indexes )
146- else :
147- overlay = None
148-
149- if action == 0 :
150- return SetToHotkeyEvent (frames , pid , type , code , hotkey , overlay )
151- elif action == 1 :
152- return AddToHotkeyEvent (frames , pid , type , code , hotkey , overlay )
153- elif action == 2 :
154- return GetHotkeyEvent (frames , pid , type , code , hotkey , overlay )
155-
156- def parse_transfer_event (self , buffer , frames , type , code , pid ):
157- def read_resource (buffer ):
158- block = buffer .read_int (BIG_ENDIAN )
159- base , multiplier , extension = block >> 8 , block & 0xF0 , block & 0x0F
160- return base * multiplier + extension
161-
162- target = code >> 4
163- buffer .skip (1 ) #84
164- minerals ,vespene = read_resource (buffer ), read_resource (buffer )
165- buffer .skip (8 )
166-
167- return ResourceTransferEvent (frames , pid , type , code , target , minerals , vespene )
168191
169- class ActionParser_18574 (ActionParser ):
192+ class ActionParser_18574 (ActionParser_16561 ):
170193 def parse_ability_event (self , buffer , frames , type , code , pid ):
171194 flag = buffer .read_byte ()
172195 atype = buffer .read_byte ()
@@ -241,32 +264,6 @@ def parse_ability_event(self, buffer, frames, type, code, pid):
241264 print "%s - %s" % (hex (atype ),hex (flag ))
242265 raise TypeError ("Shouldn't be here EVER!" )
243266
244- class ActionParser_16291 (ActionParser ):
245- def parse_ability_event (self , buffer , frames , type , code , pid ):
246- buffer .skip (7 )
247- switch = buffer .read_byte ()
248- if switch in (0x30 ,0x50 ):
249- buffer .read_byte ()
250- buffer .skip (24 )
251- return AbilityEvent (frames , pid , type , code , None )
252-
253- def parse_selection_event (self , buffer , frames , type , code , pid ):
254- bank = code >> 4
255- selFlags = buffer .read_byte ()
256- dsuCount = buffer .read_byte ()
257- buffer .read (bits = dsuCount )
258-
259- # <count> (<type_id>, <count>,)*
260- object_types = [ (buffer .read_object_type (read_modifier = True ), buffer .read_byte (), ) for i in range (buffer .read_byte ()) ]
261- # <count> (<object_id>,)*
262- object_ids = [ buffer .read_object_id () for i in range (buffer .read_byte ()) ]
263-
264- # repeat types count times
265- object_types = chain (* [[object_type ,]* count for (object_type , count ) in object_types ])
266- objects = zip (object_ids , object_types )
267-
268- return AbilityEvent (frames , pid , type , code , None )
269-
270267class Unknown2Parser (object ):
271268 def parse_0206_event (self , buffer , frames , type , code , pid ):
272269 buffer .skip (8 )
0 commit comments