Skip to content

Commit e2ab8ec

Browse files
committed
Add UTC start/end_time and real_length to replay object.
1 parent adadbaa commit e2ab8ec

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

sc2reader/constants.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@
115115
'tsaF': 'Fast',
116116
'rsaF': 'Faster',
117117
}
118+
119+
GAME_SPEED_FACTOR = {
120+
'Slower': 0.6,
121+
'Slow': 0.8,
122+
'Normal': 1.0,
123+
'Fast': 1.2,
124+
'Faster': 1.4
125+
}
126+
118127
PLAYER_TYPE_CODES = {
119128
'nmuH': 'Human',
120129
'pmoC': 'Computer',

sc2reader/objects.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from sc2reader.utils import PersonDict, AttributeDict
77

88
Location = namedtuple('Location',('x','y'))
9-
Details = namedtuple('Details',['players','map','unknown1','unknown2','unknown3','file_time','unknown4','unknown5','unknown6','unknown7','unknown8','unknown9','unknown10','unknown11'])
9+
Details = namedtuple('Details',['players','map','unknown1','unknown2','unknown3','file_time','utc_adjustment','unknown4','unknown5','unknown6','unknown7','unknown8','unknown9','unknown10'])
1010

1111
MapData = namedtuple('MapData',['unknown','gateway','map_hash'])
1212
PlayerData = namedtuple('PlayerData',['name','bnet','race','color','unknown1','unknown2','handicap','unknown3','result'])

sc2reader/readers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,14 @@ def __call__(self, buffer, replay):
128128
# Unknown2
129129
# Unknown3
130130
# file_time - Time file was created/replay was made
131+
# utc_adjustment
131132
# Unknown4
132133
# Unknown5
133134
# Unknown6
134135
# Unknown7
135136
# Unknown8
136137
# Unknown9
137138
# Unknown10
138-
# Unknown11
139139
#
140140
data = buffer.read_data_struct()
141141

sc2reader/replay.py

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

33
from datetime import datetime
44
from collections import defaultdict
5-
from sc2reader.constants import REGIONS, LOCALIZED_RACES
5+
from sc2reader.constants import REGIONS, LOCALIZED_RACES, GAME_SPEED_FACTOR
66
from sc2reader.objects import Player, Observer, Team
77

88
from sc2reader import utils
@@ -154,14 +154,6 @@ def load_details(self):
154154
if self.gateway == 'sg':
155155
self.gateway = 'sea'
156156

157-
if 'replay.details' in self.raw_data:
158-
details = self.raw_data['replay.details']
159-
self.map = details.map
160-
self.file_time = details.file_time
161-
self.unix_timestamp = utils.windows_to_unix(self.file_time)
162-
self.date = datetime.fromtimestamp(self.unix_timestamp)
163-
self.utc_date = datetime.utcfromtimestamp(self.unix_timestamp)
164-
165157
if 'replay.attributes.events' in self.raw_data:
166158
# Organize the attribute data to be useful
167159
self.attributes = defaultdict(dict)
@@ -176,6 +168,22 @@ def load_details(self):
176168
self.is_ladder = (self.category == "Ladder")
177169
self.is_private = (self.category == "Private")
178170

171+
if 'replay.details' in self.raw_data:
172+
details = self.raw_data['replay.details']
173+
174+
self.map = details.map
175+
176+
self.windows_timestamp = details.file_time-details.utc_adjustment
177+
self.unix_timestamp = utils.windows_to_unix(self.windows_timestamp)
178+
self.time_zone = details.utc_adjustment/(10**7*60*60)
179+
180+
self.end_time = datetime.utcfromtimestamp(self.unix_timestamp)
181+
self.game_length = self.length
182+
self.real_length = utils.Length(seconds=int(self.length.seconds/GAME_SPEED_FACTOR[self.speed]))
183+
self.start_time = datetime.utcfromtimestamp(self.unix_timestamp-self.real_length.seconds)
184+
self.date = self.end_time #backwards compatibility
185+
186+
179187
def load_players(self):
180188
#If we don't at least have details and attributes_events we can go no further
181189
if 'replay.details' not in self.raw_data:

0 commit comments

Comments
 (0)