Skip to content

Commit ef60adc

Browse files
committed
Add new RangeMap lookup utility to handle variation in SC2Reader builds.
1 parent ed4e8d1 commit ef60adc

File tree

2 files changed

+58
-70
lines changed

2 files changed

+58
-70
lines changed

sc2reader/config.py

Lines changed: 41 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from .processors import *
22
from .readers import *
3-
from .utils import AttributeDict
3+
from .utils import AttributeDict, RangeMap
44

55
ALL_FILES = [
66
'replay.initData',
@@ -50,73 +50,44 @@
5050
apply=False
5151
)
5252

53-
class ReaderMap(dict):
54-
def __init__(self):
55-
self.set1 = {
56-
'replay.initData': InitDataReader(),
57-
'replay.details': DetailsReader(),
58-
'replay.attributes.events': AttributeEventsReader(),
59-
'replay.message.events': MessageEventsReader(),
60-
'replay.game.events': GameEventsReader(),
61-
}
6253

63-
self.set2 = {
64-
'replay.initData': InitDataReader(),
65-
'replay.details': DetailsReader(),
66-
'replay.attributes.events': AttributeEventsReader(),
67-
'replay.message.events': MessageEventsReader(),
68-
'replay.game.events': GameEventsReader_16561(),
69-
}
70-
71-
self.set3 = {
72-
'replay.initData': InitDataReader(),
73-
'replay.details': DetailsReader(),
74-
'replay.attributes.events': AttributeEventsReader_17326(),
75-
'replay.message.events': MessageEventsReader(),
76-
'replay.game.events': GameEventsReader_16561(),
77-
}
78-
79-
self.set4 = {
80-
'replay.initData': InitDataReader(),
81-
'replay.details': DetailsReader(),
82-
'replay.attributes.events': AttributeEventsReader_17326(),
83-
'replay.message.events': MessageEventsReader(),
84-
'replay.game.events': GameEventsReader_18574(),
85-
}
86-
87-
self.set5 = {
88-
'replay.initData': InitDataReader(),
89-
'replay.details': DetailsReader(),
90-
'replay.attributes.events': AttributeEventsReader_17326(),
91-
'replay.message.events': MessageEventsReader(),
92-
'replay.game.events': GameEventsReader_19595(),
93-
}
94-
95-
# 1.0.0-3
96-
for key in (16117,16195,16223,16291):
97-
self[key] = self.set1
98-
99-
# 1.1.0-3
100-
for key in (16561,16605,16755,16939):
101-
self[key] = self.set2
102-
103-
# 1.2.0-1.3.2
104-
for key in (17326,17682,17811,18092,18221,18317):
105-
self[key] = self.set3
106-
107-
# 1.3.3-1.3.6
108-
for key in (18574,18701,19132,19269):
109-
self[key] = self.set4
110-
111-
# 1.4beta, 1.4.0
112-
for key in (19595,19679):
113-
self[key] = self.set5
114-
115-
def __getitem__(self,key):
116-
try:
117-
return super(ReaderMap,self).__getitem__(key)
118-
# Keep using the latest dict for all newer replay versions
119-
except KeyError:
120-
return self.set5
121-
122-
readers = ReaderMap()
54+
readers = RangeMap()
55+
readers.add_range(0, 16561, {
56+
'replay.initData': InitDataReader(),
57+
'replay.details': DetailsReader(),
58+
'replay.attributes.events': AttributeEventsReader(),
59+
'replay.message.events': MessageEventsReader(),
60+
'replay.game.events': GameEventsReader(),
61+
})
62+
63+
readers.add_range(16561, 17326, {
64+
'replay.initData': InitDataReader(),
65+
'replay.details': DetailsReader(),
66+
'replay.attributes.events': AttributeEventsReader(),
67+
'replay.message.events': MessageEventsReader(),
68+
'replay.game.events': GameEventsReader_16561(),
69+
})
70+
71+
readers.add_range(17326, 18574, {
72+
'replay.initData': InitDataReader(),
73+
'replay.details': DetailsReader(),
74+
'replay.attributes.events': AttributeEventsReader_17326(),
75+
'replay.message.events': MessageEventsReader(),
76+
'replay.game.events': GameEventsReader_16561(),
77+
})
78+
79+
readers.add_range(18574, 19595, {
80+
'replay.initData': InitDataReader(),
81+
'replay.details': DetailsReader(),
82+
'replay.attributes.events': AttributeEventsReader_17326(),
83+
'replay.message.events': MessageEventsReader(),
84+
'replay.game.events': GameEventsReader_18574(),
85+
})
86+
87+
readers.add_range(19595, None, {
88+
'replay.initData': InitDataReader(),
89+
'replay.details': DetailsReader(),
90+
'replay.attributes.events': AttributeEventsReader_17326(),
91+
'replay.message.events': MessageEventsReader(),
92+
'replay.game.events': GameEventsReader_19595(),
93+
})

sc2reader/utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,23 @@ def __str__(self):
592592
else:
593593
return "{0:0>2}.{1:0>2}".format(self.mins,self.secs)
594594

595+
class RangeMap(dict):
596+
def add_range(self, start, end, reader_set):
597+
self.ranges.append((start, end, reader_set))
598+
599+
def __init__(self):
600+
self.ranges = list()
601+
602+
def __getitem__(self,key):
603+
for start, end, range_set in self.ranges:
604+
if end:
605+
if (start <= key < end):
606+
return range_set
607+
else:
608+
if start <= key:
609+
return range_set
610+
raise KeyError(key)
611+
595612
class Formatter(argparse.RawTextHelpFormatter):
596613
"""FlexiFormatter which respects new line formatting and wraps the rest
597614

0 commit comments

Comments
 (0)