Skip to content

Commit ffd010b

Browse files
committed
Fix #97 and #103. Fix resource.expansion values.
1 parent 0dec991 commit ffd010b

File tree

5 files changed

+46
-24
lines changed

5 files changed

+46
-24
lines changed

sc2reader/events.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ def __init__(self, frame, pid):
1717
# self.time = Length(seconds=self.second)
1818

1919
def load_context(self, replay):
20-
if replay.expansion == 'WoL' or replay.build < 24247:
20+
if replay.versions[1]==1 or (replay.versions[1]==2 and replay.build < 24247):
2121
if self.pid <= len(replay.people):
2222
self.player = replay.person[self.pid]
2323
elif self.pid != 16:
2424
self.logger.error("Bad pid ({0}) for event {1} at {2}.".format(self.pid, self.__class__, Length(seconds=self.second)))
2525
else:
2626
pass # This is a global event
2727

28-
elif replay.expansion == 'HotS':
28+
else:
2929
if self.pid < len(replay.clients):
3030
self.player = replay.client[self.pid]
3131
elif self.pid != 16:

sc2reader/readers.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class AttributesEventsReader_17326(AttributesEventsReader_Base):
122122

123123
class DetailsReader_Base(Reader):
124124
PlayerData = namedtuple('PlayerData',['name','bnet','race','color','unknown1','unknown2','handicap','unknown3','result'])
125-
Details = namedtuple('Details',['players','map','unknown1','unknown2','os','file_time','utc_adjustment','unknown4','unknown5','unknown6','unknown7','unknown8','unknown9','unknown10'])
125+
Details = namedtuple('Details',['players','map','unknown1','unknown2','os','file_time','utc_adjustment','unknown4','unknown5','unknown6','dependencies','unknown8','unknown9','unknown10'])
126126

127127
def __call__(self, data, replay):
128128
# The entire details file is just a serialized data structure
@@ -183,16 +183,16 @@ def __call__(self, data, replay):
183183
player = self.PlayerData(*ordered_values(pdata))
184184
players.append(player)
185185
details[0] = players
186-
186+
details[10] = [DepotFile(bytes) for bytes in details[10]]
187187
# As a final touch, label all extracted information using the Details
188188
# named tuple from objects.py
189189
return self.Details(*ordered_values(details))
190190

191191
class DetailsReader_22612(DetailsReader_Base):
192-
Details = namedtuple('Details',['players','map','unknown1','unknown2','os','file_time','utc_adjustment','unknown4','unknown5','unknown6','unknown7','unknown8','unknown9','unknown10', 'unknown11'])
192+
Details = namedtuple('Details',['players','map','unknown1','unknown2','os','file_time','utc_adjustment','unknown4','unknown5','unknown6','dependencies','unknown8','unknown9','unknown10', 'unknown11'])
193193

194194
class DetailsReader_Beta(DetailsReader_Base):
195-
Details = namedtuple('Details',['players','map','unknown1','unknown2','os','file_time','utc_adjustment','unknown4','unknown5','unknown6','unknown7','unknown8','unknown9','unknown10', 'unknown11', 'unknown12'])
195+
Details = namedtuple('Details',['players','map','unknown1','unknown2','os','file_time','utc_adjustment','unknown4','unknown5','unknown6','dependencies','unknown8','unknown9','unknown10', 'unknown11', 'unknown12'])
196196

197197
class DetailsReader_Beta_24764(DetailsReader_Beta):
198198
PlayerData = namedtuple('PlayerData',['name','bnet','race','color','unknown1','unknown2','handicap','unknown3','result','unknown4'])

sc2reader/resources.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,6 @@ class Replay(Resource):
7070
#: The game speed: Slower, Slow, Normal, Fast, Faster
7171
speed = str()
7272

73-
#: The operating system the replay was recorded on.
74-
#: Useful for interpretting certain kind of raw data.
75-
os = str()
76-
7773
#: Deprecated, use :attr:`game_type` or :attr:`real_type` instead
7874
type = str()
7975

@@ -203,7 +199,6 @@ def __init__(self, replay_file, filename=None, load_level=4, **options):
203199
self.other_people = set()
204200
self.speed = ""
205201
self.type = ""
206-
self.os = str()
207202
self.game_type = ""
208203
self.real_type = ""
209204
self.category = ""
@@ -298,13 +293,13 @@ def load_details(self):
298293

299294
self.map_name = details.map
300295

301-
# Keep this theory for now but it seems like it could be wrong
302-
if details.os == 0:
303-
self.os = "Windows"
304-
elif details.os == 1:
305-
self.os = "Mac"
296+
dependency_hashes = [d.hash for d in details.dependencies]
297+
if hashlib.sha256('Standard Data: Swarm.SC2Mod').hexdigest() in dependency_hashes:
298+
self.expansion = 'HotS'
299+
elif hashlib.sha256('Standard Data: Liberty.SC2Mod').hexdigest() in dependency_hashes:
300+
self.expansion = 'WoL'
306301
else:
307-
raise ValueError("Unknown operating system {0} detected.".format(details.os))
302+
self.expansion = ''
308303

309304
self.windows_timestamp = details.file_time
310305
self.unix_timestamp = utils.windows_to_unix(self.windows_timestamp)
@@ -537,22 +532,22 @@ def register_datapack(self, datapack, filterfunc=lambda r: True):
537532
def register_default_readers(self):
538533
"""Registers factory default readers."""
539534
self.register_reader('replay.details', readers.DetailsReader_Base(), lambda r: r.build < 22612)
540-
self.register_reader('replay.details', readers.DetailsReader_22612(), lambda r: r.build >= 22612 and r.expansion=='WoL')
541-
self.register_reader('replay.details', readers.DetailsReader_Beta(), lambda r: r.build < 24764 and r.expansion=='HotS')
535+
self.register_reader('replay.details', readers.DetailsReader_22612(), lambda r: r.build >= 22612 and r.versions[1]==1)
536+
self.register_reader('replay.details', readers.DetailsReader_Beta(), lambda r: r.build < 24764 and r.versions[1]==2)
542537
self.register_reader('replay.details', readers.DetailsReader_Beta_24764(), lambda r: r.build >= 24764)
543538
self.register_reader('replay.initData', readers.InitDataReader_Base(), lambda r: r.build < 24764)
544539
self.register_reader('replay.initData', readers.InitDataReader_24764(), lambda r: r.build >= 24764)
545-
self.register_reader('replay.message.events', readers.MessageEventsReader_Base(), lambda r: r.build < 24247 or r.expansion=='WoL')
546-
self.register_reader('replay.message.events', readers.MessageEventsReader_Beta_24247(), lambda r: r.build >= 24247 and r.expansion=='HotS')
540+
self.register_reader('replay.message.events', readers.MessageEventsReader_Base(), lambda r: r.build < 24247 or r.versions[1]==1)
541+
self.register_reader('replay.message.events', readers.MessageEventsReader_Beta_24247(), lambda r: r.build >= 24247 and r.versions[1]==2)
547542
self.register_reader('replay.attributes.events', readers.AttributesEventsReader_Base(), lambda r: r.build < 17326)
548543
self.register_reader('replay.attributes.events', readers.AttributesEventsReader_17326(), lambda r: r.build >= 17326)
549544
self.register_reader('replay.game.events', readers.GameEventsReader_16117(), lambda r: 16117 <= r.build < 16561)
550545
self.register_reader('replay.game.events', readers.GameEventsReader_16561(), lambda r: 16561 <= r.build < 18574)
551546
self.register_reader('replay.game.events', readers.GameEventsReader_18574(), lambda r: 18574 <= r.build < 19595)
552547
self.register_reader('replay.game.events', readers.GameEventsReader_19595(), lambda r: 19595 <= r.build < 22612)
553-
self.register_reader('replay.game.events', readers.GameEventsReader_22612(), lambda r: 22612 <= r.build and r.expansion=='WoL')
554-
self.register_reader('replay.game.events', readers.GameEventsReader_Beta(), lambda r: r.expansion=='HotS' and r.build < 23925)
555-
self.register_reader('replay.game.events', readers.GameEventsReader_Beta_23925(), lambda r: r.expansion=='HotS' and 23925 <= r.build)
548+
self.register_reader('replay.game.events', readers.GameEventsReader_22612(), lambda r: 22612 <= r.build and r.versions[1]==1)
549+
self.register_reader('replay.game.events', readers.GameEventsReader_Beta(), lambda r: r.versions[1]==2 and r.build < 23925)
550+
self.register_reader('replay.game.events', readers.GameEventsReader_Beta_23925(), lambda r: r.versions[1]==2 and 23925 <= r.build)
556551

557552

558553
def register_default_datapacks(self):
@@ -747,6 +742,14 @@ def __init__(self, summary_file, filename=None, lang='enUS', **options):
747742
self.load_player_stats()
748743
self.load_players()
749744

745+
dependencies = [sheet[1] for sheet in self.lang_sheets['enUS']]
746+
if 'Swarm (Mod)' in dependencies:
747+
self.expansion = 'HotS'
748+
elif 'Liberty (Mod)' in dependencies:
749+
self.expansion = 'WoL'
750+
else:
751+
self.expansion = ''
752+
750753
self.game_type = self.settings['Teams'].replace(" ","")
751754
self.real_type = real_type(self.teams.values())
752755

test_replays/test_all.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
def test_standard_1v1():
1717
replay = sc2reader.load_replay("test_replays/1.2.2.17811/1.SC2Replay")
1818

19+
assert replay.expansion == 'WoL'
1920
assert str(replay.length) == "32.47"
2021
assert replay.map_name == "Lost Temple"
2122
assert replay.build == 17811
@@ -82,6 +83,7 @@ def test_standard_1v1():
8283

8384
def test_private_category():
8485
replay = sc2reader.load_replay("test_replays/1.2.2.17811/2.SC2Replay")
86+
assert replay.expansion == 'WoL'
8587
assert replay.is_private == True
8688
assert replay.is_ladder == False
8789

@@ -137,8 +139,11 @@ def test_us_realm():
137139
# Waiting for response https://github.com/arkx/mpyq/issues/closed#issue/7
138140
def test_kr_realm_and_tampered_messages():
139141
replay = sc2reader.load_replay("test_replays/1.1.3.16939/11.SC2Replay")
142+
assert replay.expansion == 'WoL'
143+
140144
first = next(player for player in replay.players if player.name == '명지대학교')
141145
second = next(player for player in replay.players if player.name == '티에스엘사기수')
146+
142147
assert first.url == "http://kr.battle.net/sc2/en/profile/258945/1/명지대학교/"
143148
assert second.url == "http://kr.battle.net/sc2/en/profile/102472/1/티에스엘사기수/"
144149

@@ -190,6 +195,8 @@ def test_hots_pids():
190195
print "Processing {fname}".format(fname=replayfilename)
191196
replay = sc2reader.load_replay(replayfilename)
192197

198+
assert replay.expansion == 'HotS'
199+
193200
player_pids = set( [ player.pid for player in replay.players if player.is_human] )
194201
ability_pids = set( [ event.player.pid for event in replay.events if 'AbilityEvent' in event.name ] )
195202

@@ -198,6 +205,8 @@ def test_hots_pids():
198205
def test_wol_pids():
199206
replay = sc2reader.load_replay("test_replays/1.5.4.24540/ggtracker_1471849.SC2Replay")
200207

208+
assert replay.expansion == 'WoL'
209+
201210
ability_pids = set( [ event.player.pid for event in replay.events if 'AbilityEvent' in event.name ] )
202211
player_pids = set( [ player.pid for player in replay.players ] )
203212

@@ -212,10 +221,13 @@ def test_hots_hatchfun():
212221

213222
def test_hots_vs_ai():
214223
replay = sc2reader.load_replay("test_replays/2.0.0.24247/Cloud Kingdom LE (13).SC2Replay")
224+
assert replay.expansion == 'HotS'
215225
replay = sc2reader.load_replay("test_replays/2.0.0.24247/Korhal City (19).SC2Replay")
226+
assert replay.expansion == 'HotS'
216227

217228
def test_oracle_parsing():
218229
replay = sc2reader.load_replay("test_replays/2.0.3.24764/ggtracker_1571740.SC2Replay")
230+
assert replay.expansion == 'HotS'
219231
oracles = [unit for unit in replay.objects.values() if unit.name=='Oracle']
220232
assert len(oracles) == 2
221233

@@ -224,10 +236,14 @@ def test_resume_from_replay():
224236

225237
def test_clan_players():
226238
replay = sc2reader.load_replay("test_replays/2.0.4.24944/Lunar Colony V.SC2Replay")
239+
assert replay.expansion == 'WoL'
227240
assert len(replay.people) == 4
228241

229242
def test_WoL_204():
230243
replay = sc2reader.load_replay("test_replays/2.0.4.24944/ggtracker_1789768.SC2Replay")
244+
assert replay.expansion == 'WoL'
231245
assert len(replay.people) == 2
246+
247+
def test_send_resources():
232248
replay = sc2reader.load_replay("test_replays/2.0.4.24944/Backwater Complex (15).SC2Replay")
233249

test_s2gs/test_all_s2gs.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ def test_a_WoL_s2gs():
1414
summary = sc2reader.load_game_summary("test_s2gs/s2gs1.s2gs")
1515
assert summary.players[0].resource_collection_rate == 1276
1616
assert summary.players[0].build_order[0].order == 'Probe'
17+
assert summary.expansion == 'WoL'
1718

1819
def test_a_HotS_s2gs():
1920
summary = sc2reader.load_game_summary("test_s2gs/hots1.s2gs")
2021
assert summary.players[0].resource_collection_rate == 1599
2122
assert summary.players[0].build_order[0].order == 'SCV'
23+
assert summary.expansion == 'HotS'
2224

2325
def test_another_HotS_s2gs():
2426
summary = sc2reader.load_game_summary("test_s2gs/hots2.s2gs")
@@ -29,4 +31,5 @@ def test_another_HotS_s2gs():
2931
assert summary.players[0].apm == 204
3032
assert summary.players[0].workers_active_graph.as_points()[8][1] == 25
3133
assert summary.players[0].upgrade_spending_graph.as_points()[8][1] == 300
34+
assert summary.expansion == 'HotS'
3235

0 commit comments

Comments
 (0)