Skip to content

Commit b8982c2

Browse files
committed
Merge branch 'v0.6.5' of http://github.com/GraylinKim/sc2reader into upstream
Conflicts: CHANGELOG.rst sc2reader/data/__init__.py sc2reader/engine/plugins/__init__.py sc2reader/engine/plugins/context.py sc2reader/events/tracker.py test_replays/test_all.py
2 parents f5b1975 + 3d34e4c commit b8982c2

File tree

5 files changed

+55
-16
lines changed

5 files changed

+55
-16
lines changed

CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ CHANGELOG
55
0.6.5 - December ?? 2013
66
---------------------------
77

8+
* Deprecated unit.killed_by in favor of unit.killing_player
9+
* Added unit.killed_units
10+
* Added unit.killing_unit
11+
* Added UnitDiedEvent.killing_player
12+
* Added UnitDiedEvent.killing_unit
13+
* Deprecated UnitDiedEvent.killer_pid in favor of UnitDiedEvent.killing_player_id
14+
* Deprecated UnitDiedEvent.killer in favor of UnitDiedEvent.killing_player
815
* Use generic UnitType and Ability classes for data. This means no more unit._type_class.__class__.__name__. But hopefully people were not doing that anyway.
916
* Now a CorruptTrackerFileError is raised when the tracker file is corrupted (generally only older resume_from_replay replays)
1017
* Removed the defunct replay.player_names attribute.

sc2reader/data/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,24 @@ def __init__(self, unit_id):
5353
#: Specifically, it is the frame that the :class:`~sc2reader.events.tracker.UnitDiedEvent` is received.
5454
self.died_at = None
5555

56+
#: Deprecated, see :attr:`self.killing_player`
57+
self.killed_by = None
58+
5659
#: A reference to the player that killed this unit. Only available for 2.0.8+ replays.
5760
#: This value is not set if the killer is unknown or not relevant (morphed into a
5861
#: different unit or used to create a building, etc)
59-
self.killed_by = None
62+
self.killing_player = None
63+
64+
#: A reference to the unit that killed this unit. Only available for 2.1+ replays.
65+
#: This value is not set if the killer is unknown or not relevant (morphed into a
66+
#: different unit or used to create a building, etc). If the killing unit dies before
67+
#: the killed unit dies, a bug may cause the killing unit to be None. This can occur
68+
#: due because of projectile speeds.
69+
self.killing_unit = None
70+
71+
#: A list of units that this unit has killed. Only available for 2.1+ replays.
72+
#: The unit only gets credit for the kills that it gets the final blow on.
73+
self.killed_units = list()
6074

6175
#: The unique in-game id for this unit. The id can sometimes be zero because
6276
#: TargetAbilityEvents will create a new unit with id zero when a unit

sc2reader/engine/plugins/context.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,21 @@ def handleUnitDiedEvent(self, event, replay):
141141
else:
142142
self.logger.error("Unit {0} died at {1} [{2}] before it was born!".format(event.unit_id, Length(seconds=event.second), event.frame))
143143

144-
if event.killer_pid in replay.player:
145-
event.killer = replay.player[event.killer_pid]
144+
if event.killing_player_id in replay.player:
145+
event.killing_player = event.killer = replay.player[event.killing_player_id]
146146
if event.unit:
147-
event.unit.killed_by = event.killer
148-
event.killer.killed_units.append(event.unit)
149-
elif event.killer_pid:
150-
self.logger.error("Unknown killer pid {0} at {1} [{2}]".format(event.killer_pid, Length(seconds=event.second), event.frame))
147+
event.unit.killing_player = event.unit.killed_by = event.killing_player
148+
event.killing_player.killed_units.append(event.unit)
149+
elif event.killing_player_id:
150+
self.logger.error("Unknown killing player id {0} at {1} [{2}]".format(event.killing_player_id, Length(seconds=event.second), event.frame))
151+
152+
if event.killing_unit_id in replay.objects:
153+
event.killing_unit = replay.objects[event.killing_unit_id]
154+
if event.unit:
155+
event.unit.killing_unit = event.killing_unit
156+
event.killing_unit.killed_units.append(event.unit)
157+
elif event.killing_unit_id:
158+
self.logger.error("Unknown killing unit id {0} at {1} [{2}]".format(event.killing_unit_id, Length(seconds=event.second), event.frame))
151159

152160
def handleUnitOwnerChangeEvent(self, event, replay):
153161
self.load_tracker_controller(event, replay)

sc2reader/events/tracker.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -319,12 +319,18 @@ def __init__(self, frames, data, build):
319319
#: The unit object that died
320320
self.unit = None
321321

322-
#: The id of the player that killed this unit. None when not available.
322+
#: Deprecated, see :attr:`killing_player_id`
323323
self.killer_pid = data[2]
324324

325-
#: The player object of the that killed the unit. Not always available.
325+
#: Deprecated, see :attr:`killing_player`
326326
self.killer = None
327327

328+
#: The id of the player that killed this unit. None when not available.
329+
self.killing_player_id = data[2]
330+
331+
#: The player object of the that killed the unit. Not always available.
332+
self.killing_player = None
333+
328334
#: The x coordinate of the center of the dying unit's footprint. Only 4 point resolution
329335
#: prior to Starcraft Patch 2.1.
330336
self.x = data[3]
@@ -337,24 +343,27 @@ def __init__(self, frames, data, build):
337343
self.location = (self.x, self.y)
338344

339345
#: The index portion of the killing unit's id. Available for build 27950+
340-
self.killer_unit_index = None
346+
self.killing_unit_index = None
341347

342348
#: The recycle portion of the killing unit's id. Available for build 27950+
343-
self.killer_unit_recycle = None
349+
self.killing_unit_recycle = None
344350

345351
#: The unique id of the unit doing the killing. Available for build 27950+
346-
self.killer_unit_id = None
352+
self.killing_unit_id = None
353+
354+
#: A reference to the :class:`Unit` that killed this :class:`Unit`
355+
self.killing_unit = None
347356

348357
if build < 27950:
349358
self.x = self.x * 4
350359
self.y = self.y * 4
351360
self.location = (self.x, self.y)
352361
else:
353362
# Starcraft patch 2.1 introduced killer unit indexes
354-
self.killer_unit_index = data[5]
355-
self.killer_unit_recycle = data[6]
356-
if self.killer_unit_index:
357-
self.killer_unit_id = self.killer_unit_index << 18 | self.killer_unit_recycle
363+
self.killing_unit_index = data[5]
364+
self.killing_unit_recycle = data[6]
365+
if self.killing_unit_index:
366+
self.killing_unit_id = self.killing_unit_index << 18 | self.killing_unit_recycle
358367

359368
def __str__(self):
360369
return self._str_prefix() + "{0: >15} - Unit died {1}.".format(self.unit.owner, self.unit)

test_replays/test_all.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,5 +443,6 @@ def test_plugin1(self):
443443
self.assertEqual(replay.plugin_result['TestPlugin2'], (0, dict()))
444444

445445

446+
446447
if __name__ == '__main__':
447448
unittest.main()

0 commit comments

Comments
 (0)