Skip to content

Commit f9bd389

Browse files
committed
Always use 0-indexed pids; refs #74
For consistency, this applies to older patches as well.
1 parent a8d07fb commit f9bd389

File tree

2 files changed

+12
-19
lines changed

2 files changed

+12
-19
lines changed

sc2reader/readers.py

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,7 @@ def __call__(self, data, replay):
8383
data.read(4).strip('\00 ')[::-1]
8484
]
8585

86-
# Hack added for 24247 and higher in HotS
87-
if info[2]!=16 and self.offset:
88-
info[2]= info[2]-1
89-
86+
if info[2]!=16: info[2]-=1 # Convert from 1-offset to 0-offset
9087
#print hex(info[1]), "P"+str(info[2]), info[3]
9188
attribute_events.append(Attribute(info))
9289

@@ -97,8 +94,6 @@ class AttributesEventsReader_17326(AttributesEventsReader_Base):
9794
# The header length is increased from 4 to 5 bytes from patch 17326 and on.
9895
header_length = 5
9996

100-
class AttributesEventsReader_24247(AttributesEventsReader_17326):
101-
offset=True
10297

10398
class DetailsReader_Base(Reader):
10499
Details = namedtuple('Details',['players','map','unknown1','unknown2','os','file_time','utc_adjustment','unknown4','unknown5','unknown6','unknown7','unknown8','unknown9','unknown10'])
@@ -173,6 +168,8 @@ class DetailsReader_Beta(DetailsReader_Base):
173168
Details = namedtuple('Details',['players','map','unknown1','unknown2','os','file_time','utc_adjustment','unknown4','unknown5','unknown6','unknown7','unknown8','unknown9','unknown10', 'unknown11', 'unknown12'])
174169

175170
class MessageEventsReader_Base(Reader):
171+
POFFSET=-1
172+
176173
def __call__(self, data, replay):
177174
# The replay.message.events file is a single long list containing three
178175
# different element types (minimap pings, player messages, and some sort
@@ -186,6 +183,7 @@ def __call__(self, data, replay):
186183
# All the element types share the same time, pid, flags header.
187184
frame += data.read_timestamp()
188185
pid = data.read_bits(5)
186+
if pid != 16: pid+=self.POFFSET
189187
t = data.read_bits(3)
190188
flags = data.read_byte()
191189

@@ -208,13 +206,16 @@ def __call__(self, data, replay):
208206

209207
return AttributeDict(pings=pings, messages=messages, packets=packets)
210208

209+
class MessageEventsReader_Beta_24247(MessageEventsReader_Base):
210+
POFFSET=0
211211

212212
class GameEventsReader_Base(object):
213213
PLAYER_JOIN_FLAGS = 4
214214
PLAYER_ABILITY_FLAGS = 17
215215
ABILITY_TEAM_FLAG = False
216216
UNIT_INDEX_BITS = 8
217217
HOTKEY_OVERLAY = 0
218+
POFFSET = -1
218219

219220
def __call__(self, data, replay):
220221
EVENT_DISPATCH = {
@@ -249,6 +250,7 @@ def __call__(self, data, replay):
249250
while event_start != data_length:
250251
fstamp += read_timestamp()
251252
pid = read_bits(5)
253+
if pid != 16: pid+= self.POFFSET
252254
event_type = read_bits(7)
253255

254256
# Check for a lookup
@@ -354,7 +356,7 @@ def player_hotkey_event(self, data, fstamp, pid, event_type):
354356
raise ParseError("Hotkey Action '{0}' unknown".format(hotkey))
355357

356358
def player_send_resource_event(self, data, fstamp, pid, event_type):
357-
target = data.read_bits(4)
359+
target = data.read_bits(4)-1 # Convert from 1-offset to 0-offset
358360
unknown = data.read_bits(4) #??
359361
minerals = data.read_bits(32)
360362
vespene = data.read_bits(32)
@@ -553,13 +555,4 @@ class GameEventsReader_Beta_23925(GameEventsReader_Beta):
553555
PLAYER_JOIN_FLAGS = 32
554556

555557
class GameEventsReader_Beta_24247(GameEventsReader_Beta_23925):
556-
POFFSET = 1
557-
558-
def player_send_resource_event(self, data, fstamp, pid, event_type):
559-
target = data.read_bits(4)-1
560-
unknown = data.read_bits(4) #??
561-
minerals = data.read_bits(32)
562-
vespene = data.read_bits(32)
563-
terrazine = data.read_bits(32) #??
564-
custom = data.read_bits(32) #??
565-
return SendResourceEvent(fstamp, pid, event_type, target, minerals, vespene, terrazine, custom)
558+
POFFSET = 0

sc2reader/resources.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,10 +552,10 @@ def register_default_readers(self):
552552
self.register_reader('replay.details', readers.DetailsReader_22612(), lambda r: r.build >= 22612 and r.expansion=='WoL')
553553
self.register_reader('replay.details', readers.DetailsReader_Beta(), lambda r: r.expansion=='HotS')
554554
self.register_reader('replay.initData', readers.InitDataReader_Base())
555-
self.register_reader('replay.message.events', readers.MessageEventsReader_Base())
555+
self.register_reader('replay.message.events', readers.MessageEventsReader_Base(), lambda r: r.build < 24247)
556+
self.register_reader('replay.message.events', readers.MessageEventsReader_Beta_24247(), lambda r: r.build >= 24247)
556557
self.register_reader('replay.attributes.events', readers.AttributesEventsReader_Base(), lambda r: r.build < 17326)
557558
self.register_reader('replay.attributes.events', readers.AttributesEventsReader_17326(), lambda r: r.build >= 17326)
558-
self.register_reader('replay.attributes.events', readers.AttributesEventsReader_24247(), lambda r: r.build >= 24247 and r.expansion=='HotS')
559559
self.register_reader('replay.game.events', readers.GameEventsReader_16117(), lambda r: 16117 <= r.build < 16561)
560560
self.register_reader('replay.game.events', readers.GameEventsReader_16561(), lambda r: 16561 <= r.build < 18574)
561561
self.register_reader('replay.game.events', readers.GameEventsReader_18574(), lambda r: 18574 <= r.build < 19595)

0 commit comments

Comments
 (0)