Skip to content

Commit 4be87ef

Browse files
committed
Fix LotV time by fps modifier (for length) and new game_speed_factors (for real_length).
1 parent 5e6e235 commit 4be87ef

File tree

3 files changed

+42
-18
lines changed

3 files changed

+42
-18
lines changed

sc2reader/constants.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,27 @@
6060

6161

6262
GAME_SPEED_FACTOR = {
63-
'Slower': 0.6,
64-
'Slow': 0.8,
65-
'Normal': 1.0,
66-
'Fast': 1.2,
67-
'Faster': 1.4
63+
'WoL': {
64+
'Slower': 0.6,
65+
'Slow': 0.8,
66+
'Normal': 1.0,
67+
'Fast': 1.2,
68+
'Faster': 1.4
69+
},
70+
'HotS': {
71+
'Slower': 0.6,
72+
'Slow': 0.8,
73+
'Normal': 1.0,
74+
'Fast': 1.2,
75+
'Faster': 1.4
76+
},
77+
'LotV': {
78+
'Slower': 0.2,
79+
'Slow': 0.4,
80+
'Normal': 0.6,
81+
'Fast': 0.8,
82+
'Faster': 1.0
83+
},
6884
}
6985

7086
GATEWAY_CODES = {

sc2reader/resources.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,11 @@ def __init__(self, replay_file, filename=None, load_level=4, engine=sc2reader.en
252252
self.build = self.versions[4]
253253
self.base_build = self.versions[5]
254254
self.release_string = "{0}.{1}.{2}.{3}".format(*self.versions[1:5])
255-
self.game_length = utils.Length(seconds=self.frames/16)
256-
self.length = self.real_length = utils.Length(seconds=int(self.frames/self.game_fps))
255+
fps = self.game_fps
256+
if (34784 <= self.build): # lotv replay, adjust time
257+
fps = self.game_fps * 1.4
258+
259+
self.length = self.game_length = self.real_length = utils.Length(seconds=int(self.frames/fps))
257260

258261
# Load basic details if requested
259262
if load_level >= 1:
@@ -362,7 +365,7 @@ def load_details(self):
362365
self.time_zone = (details['utc_adjustment']-details['file_time'])/(10**7*60*60)
363366

364367
self.game_length = self.length
365-
self.real_length = utils.Length(seconds=int(self.length.seconds/GAME_SPEED_FACTOR[self.speed]))
368+
self.real_length = utils.Length(seconds=int(self.length.seconds/GAME_SPEED_FACTOR[self.expansion][self.speed]))
366369
self.start_time = datetime.utcfromtimestamp(self.unix_timestamp-self.real_length.seconds)
367370
self.date = self.end_time # backwards compatibility
368371

@@ -772,26 +775,26 @@ def __init__(self, summary_file, filename=None, lang='enUS', **options):
772775
while not buffer.done():
773776
self.parts.append(buffer.read_struct())
774777

778+
self.load_translations()
779+
dependencies = [sheet[1] for sheet in self.lang_sheets['enUS']]
780+
if 'Swarm (Mod)' in dependencies:
781+
self.expansion = 'HotS'
782+
elif 'Liberty (Mod)' in dependencies:
783+
self.expansion = 'WoL'
784+
else:
785+
self.expansion = ''
786+
775787
self.end_time = datetime.utcfromtimestamp(self.parts[0][8])
776788
self.game_speed = LOBBY_PROPERTIES[0xBB8][1][self.parts[0][0][1].decode('utf8')]
777789
self.game_length = utils.Length(seconds=self.parts[0][7])
778-
self.real_length = utils.Length(seconds=int(self.parts[0][7]/GAME_SPEED_FACTOR[self.game_speed]))
790+
self.real_length = utils.Length(seconds=int(self.parts[0][7]/GAME_SPEED_FACTOR[self.expansion][self.game_speed]))
779791
self.start_time = datetime.utcfromtimestamp(self.parts[0][8] - self.real_length.seconds)
780792

781-
self.load_translations()
782793
self.load_map_info()
783794
self.load_settings()
784795
self.load_player_stats()
785796
self.load_players()
786797

787-
dependencies = [sheet[1] for sheet in self.lang_sheets['enUS']]
788-
if 'Swarm (Mod)' in dependencies:
789-
self.expansion = 'HotS'
790-
elif 'Liberty (Mod)' in dependencies:
791-
self.expansion = 'WoL'
792-
else:
793-
self.expansion = ''
794-
795798
self.game_type = self.settings['Teams'].replace(" ", "")
796799
self.real_type = utils.get_real_type(self.teams)
797800

test_replays/test_all.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,11 @@ def test_32(self):
489489
replay = sc2reader.load_replay("test_replays/3.2.0/1.SC2Replay")
490490
self.assertTrue(replay is not None)
491491

492+
def test_lotv_time(self):
493+
replay = sc2reader.load_replay("test_replays/lotv/lotv1.SC2Replay")
494+
self.assertEqual(replay.length.seconds, 1002)
495+
self.assertEqual(replay.real_length.seconds, 1002)
496+
492497

493498
class TestGameEngine(unittest.TestCase):
494499
class TestEvent(object):

0 commit comments

Comments
 (0)