From 4be87ef6b119158ad611edabe24edbb858acab20 Mon Sep 17 00:00:00 2001 From: Anders Nickelsen Date: Thu, 14 Apr 2016 20:38:50 +0200 Subject: [PATCH 1/2] Fix LotV time by fps modifier (for length) and new game_speed_factors (for real_length). --- sc2reader/constants.py | 26 +++++++++++++++++++++----- sc2reader/resources.py | 29 ++++++++++++++++------------- test_replays/test_all.py | 5 +++++ 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/sc2reader/constants.py b/sc2reader/constants.py index fa65d1c0..f06fccf6 100644 --- a/sc2reader/constants.py +++ b/sc2reader/constants.py @@ -60,11 +60,27 @@ GAME_SPEED_FACTOR = { - 'Slower': 0.6, - 'Slow': 0.8, - 'Normal': 1.0, - 'Fast': 1.2, - 'Faster': 1.4 + 'WoL': { + 'Slower': 0.6, + 'Slow': 0.8, + 'Normal': 1.0, + 'Fast': 1.2, + 'Faster': 1.4 + }, + 'HotS': { + 'Slower': 0.6, + 'Slow': 0.8, + 'Normal': 1.0, + 'Fast': 1.2, + 'Faster': 1.4 + }, + 'LotV': { + 'Slower': 0.2, + 'Slow': 0.4, + 'Normal': 0.6, + 'Fast': 0.8, + 'Faster': 1.0 + }, } GATEWAY_CODES = { diff --git a/sc2reader/resources.py b/sc2reader/resources.py index 3ba19af3..aa00a880 100644 --- a/sc2reader/resources.py +++ b/sc2reader/resources.py @@ -252,8 +252,11 @@ def __init__(self, replay_file, filename=None, load_level=4, engine=sc2reader.en self.build = self.versions[4] self.base_build = self.versions[5] self.release_string = "{0}.{1}.{2}.{3}".format(*self.versions[1:5]) - self.game_length = utils.Length(seconds=self.frames/16) - self.length = self.real_length = utils.Length(seconds=int(self.frames/self.game_fps)) + fps = self.game_fps + if (34784 <= self.build): # lotv replay, adjust time + fps = self.game_fps * 1.4 + + self.length = self.game_length = self.real_length = utils.Length(seconds=int(self.frames/fps)) # Load basic details if requested if load_level >= 1: @@ -362,7 +365,7 @@ def load_details(self): self.time_zone = (details['utc_adjustment']-details['file_time'])/(10**7*60*60) self.game_length = self.length - self.real_length = utils.Length(seconds=int(self.length.seconds/GAME_SPEED_FACTOR[self.speed])) + self.real_length = utils.Length(seconds=int(self.length.seconds/GAME_SPEED_FACTOR[self.expansion][self.speed])) self.start_time = datetime.utcfromtimestamp(self.unix_timestamp-self.real_length.seconds) self.date = self.end_time # backwards compatibility @@ -772,26 +775,26 @@ def __init__(self, summary_file, filename=None, lang='enUS', **options): while not buffer.done(): self.parts.append(buffer.read_struct()) + self.load_translations() + dependencies = [sheet[1] for sheet in self.lang_sheets['enUS']] + if 'Swarm (Mod)' in dependencies: + self.expansion = 'HotS' + elif 'Liberty (Mod)' in dependencies: + self.expansion = 'WoL' + else: + self.expansion = '' + self.end_time = datetime.utcfromtimestamp(self.parts[0][8]) self.game_speed = LOBBY_PROPERTIES[0xBB8][1][self.parts[0][0][1].decode('utf8')] self.game_length = utils.Length(seconds=self.parts[0][7]) - self.real_length = utils.Length(seconds=int(self.parts[0][7]/GAME_SPEED_FACTOR[self.game_speed])) + self.real_length = utils.Length(seconds=int(self.parts[0][7]/GAME_SPEED_FACTOR[self.expansion][self.game_speed])) self.start_time = datetime.utcfromtimestamp(self.parts[0][8] - self.real_length.seconds) - self.load_translations() self.load_map_info() self.load_settings() self.load_player_stats() self.load_players() - dependencies = [sheet[1] for sheet in self.lang_sheets['enUS']] - if 'Swarm (Mod)' in dependencies: - self.expansion = 'HotS' - elif 'Liberty (Mod)' in dependencies: - self.expansion = 'WoL' - else: - self.expansion = '' - self.game_type = self.settings['Teams'].replace(" ", "") self.real_type = utils.get_real_type(self.teams) diff --git a/test_replays/test_all.py b/test_replays/test_all.py index 3ea7e248..d68b44e0 100644 --- a/test_replays/test_all.py +++ b/test_replays/test_all.py @@ -489,6 +489,11 @@ def test_32(self): replay = sc2reader.load_replay("test_replays/3.2.0/1.SC2Replay") self.assertTrue(replay is not None) + def test_lotv_time(self): + replay = sc2reader.load_replay("test_replays/lotv/lotv1.SC2Replay") + self.assertEqual(replay.length.seconds, 1002) + self.assertEqual(replay.real_length.seconds, 1002) + class TestGameEngine(unittest.TestCase): class TestEvent(object): From 73d11a9a1cd7bd2a2991014bc9f7352c394d83d0 Mon Sep 17 00:00:00 2001 From: Jonathan Gravel Date: Sun, 17 Apr 2016 22:05:05 -0400 Subject: [PATCH 2/2] Fix MapInfo parsing for version 0x26 --- sc2reader/objects.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/sc2reader/objects.py b/sc2reader/objects.py index eeedfe53..3dd22651 100644 --- a/sc2reader/objects.py +++ b/sc2reader/objects.py @@ -539,9 +539,14 @@ def __init__(self, contents): if self.version >= 0x1f: self.unknown3 = data.read_cstring() - self.unknown4 = data.read_uint32() - self.unknown5 = data.read_uint32() + if self.version >= 0x26: + self.unknown4 = data.read_cstring() + + if self.version >= 0x1f: + self.unknown5 = data.read_uint32() + + self.unknown6 = data.read_uint32() #: The type of fog of war used on the map self.fog_type = data.read_cstring() @@ -575,7 +580,7 @@ def __init__(self, contents): self.load_screen_path = data.read_cstring() #: Unknown string, usually empty - self.unknown6 = data.read_bytes(data.read_uint16()).decode('utf8') + self.unknown7 = data.read_bytes(data.read_uint16()).decode('utf8') #: Load screen image scaling strategy: 0 = normal, 1 = aspect scaling, 2 = stretch the image. self.load_screen_scaling = data.read_uint32() @@ -617,16 +622,16 @@ def __init__(self, contents): #: self.data_flags = data.read_uint32() - self.unknown7 = data.read_uint32() + self.unknown8 = data.read_uint32() if self.version >= 0x19: - self.unknown8 = data.read_bytes(8) + self.unknown9 = data.read_bytes(8) if self.version >= 0x1f: - self.unknown9 = data.read_bytes(9) + self.unknown10 = data.read_bytes(9) if self.version >= 0x20: - self.unknown10 = data.read_bytes(4) + self.unknown11 = data.read_bytes(4) #: The number of players enabled via the data editor self.player_count = data.read_uint32()