Skip to content

Commit e92622d

Browse files
committed
Fixes a series of misleading class names and makes minor improvements to the inheritance pattern
1 parent 58d0f43 commit e92622d

File tree

3 files changed

+86
-89
lines changed

3 files changed

+86
-89
lines changed

sc2reader/__init__.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,35 +54,35 @@ class ReaderMap(object):
5454
def __getitem__(self,key):
5555
if int(key) in (16117,16195,16223,16291):
5656
return {
57-
'replay.initData': ReplayInitDataReader(),
58-
'replay.details': ReplayDetailsReader(),
57+
'replay.initData': InitDataReader(),
58+
'replay.details': DetailsReader(),
5959
'replay.attributes.events': AttributeEventsReader(),
6060
'replay.message.events': MessageEventsReader(),
61-
'replay.game.events': GameEventsReader_16291(),
61+
'replay.game.events': GameEventsReader(),
6262
}
6363

6464
elif int(key) in (16561,16605,16755,16939):
6565
return {
66-
'replay.initData': ReplayInitDataReader(),
67-
'replay.details': ReplayDetailsReader(),
66+
'replay.initData': InitDataReader(),
67+
'replay.details': DetailsReader(),
6868
'replay.attributes.events': AttributeEventsReader(),
6969
'replay.message.events': MessageEventsReader(),
70-
'replay.game.events': GameEventsReader(),
70+
'replay.game.events': GameEventsReader_16561(),
7171
}
7272

7373
elif int(key) in (17326,17682,17811,18092,18221,18317):
7474
return {
75-
'replay.initData': ReplayInitDataReader(),
76-
'replay.details': ReplayDetailsReader(),
75+
'replay.initData': InitDataReader(),
76+
'replay.details': DetailsReader(),
7777
'replay.attributes.events': AttributeEventsReader_17326(),
7878
'replay.message.events': MessageEventsReader(),
79-
'replay.game.events': GameEventsReader(),
79+
'replay.game.events': GameEventsReader_16561(),
8080
}
8181

8282
elif int(key) in (18574,):
8383
return {
84-
'replay.initData': ReplayInitDataReader(),
85-
'replay.details': ReplayDetailsReader(),
84+
'replay.initData': InitDataReader(),
85+
'replay.details': DetailsReader(),
8686
'replay.attributes.events': AttributeEventsReader_17326(),
8787
'replay.message.events': MessageEventsReader(),
8888
'replay.game.events': GameEventsReader_18574(),
@@ -149,8 +149,8 @@ def read(self, location):
149149

150150
#Extract and Parse the relevant files based on parse level
151151
for file in self.files:
152-
reader = READERS[replay.build][file]
153-
reader.read(ReplayBuffer(archive.read_file(file)),replay)
152+
buffer = ReplayBuffer(archive.read_file(file))
153+
READERS[replay.build][file].read(buffer,replay)
154154

155155
#Do cleanup and post processing
156156
for processor in self.processors:

sc2reader/parsers.py

Lines changed: 64 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1714
class 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-
270267
class Unknown2Parser(object):
271268
def parse_0206_event(self, buffer, frames, type, code, pid):
272269
buffer.skip(8)

sc2reader/readers.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
#################################################
99

10-
class ReplayInitDataReader(object):
10+
class InitDataReader(object):
1111
def read(self, buffer, replay):
1212

1313
# Game clients
@@ -39,22 +39,22 @@ def read(self, buffer, replay):
3939
replay.attributes = list()
4040
for i in range(0, buffer.read_int(LITTLE_ENDIAN)):
4141
replay.attributes.append(Attribute([
42-
buffer.read_int(LITTLE_ENDIAN), #Header
43-
buffer.read_int(LITTLE_ENDIAN), #Attr Id
44-
buffer.read_byte(), #Player
45-
buffer.read_chars(4) #Value
42+
buffer.read_int(LITTLE_ENDIAN), #Header
43+
buffer.read_int(LITTLE_ENDIAN), #Attr Id
44+
buffer.read_byte(), #Player
45+
buffer.read_chars(4) #Value
4646
]))
4747

4848
def load_header(self, replay, buffer):
49-
buffer.read_chars(4)
49+
buffer.skip(4)
5050

5151
class AttributeEventsReader_17326(AttributeEventsReader):
5252
def load_header(self, replay, buffer):
53-
buffer.read_chars(5)
53+
buffer.skip(5)
5454

5555
##################################################
5656

57-
class ReplayDetailsReader(object):
57+
class DetailsReader(object):
5858
def read(self, buffer, replay):
5959
data = buffer.read_data_struct()
6060

@@ -207,7 +207,7 @@ def get_unknown4_parser(self, code):
207207
class GameEventsReader(GameEventsBase,Unknown2Parser,Unknown4Parser,ActionParser,SetupParser,CameraParser):
208208
pass
209209

210-
class GameEventsReader_16291(GameEventsBase,Unknown2Parser,Unknown4Parser,ActionParser_16291,SetupParser,CameraParser):
210+
class GameEventsReader_16561(GameEventsBase,Unknown2Parser,Unknown4Parser,ActionParser_16561,SetupParser,CameraParser):
211211
pass
212212

213213
class GameEventsReader_18574(GameEventsBase,Unknown2Parser,Unknown4Parser,ActionParser_18574,SetupParser,CameraParser):

0 commit comments

Comments
 (0)