Skip to content

Commit 67b67b7

Browse files
committed
Split events.py into a series of files in the events package.
1 parent 8e7e0da commit 67b67b7

File tree

6 files changed

+113
-106
lines changed

6 files changed

+113
-106
lines changed

sc2reader/events/__init__.py

Whitespace-only changes.

sc2reader/events/base.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import absolute_import
3+
4+
from sc2reader.log_utils import loggable
5+
6+
@loggable
7+
class Event(object):
8+
name = 'Event'
9+
10+
def __init__(self, frame, pid):
11+
self.pid = pid
12+
self.frame = frame
13+
self.second = frame >> 4
14+
# This is sorta expensive considering no one uses it
15+
# self.time = Length(seconds=self.second)
16+
17+
def load_context(self, replay):
18+
if replay.versions[1]==1 or (replay.versions[1]==2 and replay.build < 24247):
19+
if self.pid <= len(replay.people):
20+
self.player = replay.person[self.pid]
21+
elif self.pid != 16:
22+
self.logger.error("Bad pid ({0}) for event {1} at {2}.".format(self.pid, self.__class__, Length(seconds=self.second)))
23+
else:
24+
pass # This is a global event
25+
26+
else:
27+
if self.pid < len(replay.clients):
28+
self.player = replay.client[self.pid]
29+
elif self.pid != 16:
30+
self.logger.error("Bad pid ({0}) for event {1} at {2}.".format(self.pid, self.__class__, Length(seconds=self.second)))
31+
else:
32+
pass # This is a global event
33+
34+
def _str_prefix(self):
35+
player_name = self.player.name if getattr(self,'pid', 16)!=16 else "Global"
36+
return "%s\t%-15s " % (Length(seconds=int(self.frame/16)), player_name)
37+
38+
def __str__(self):
39+
return self._str_prefix() + self.name

sc2reader/events.py renamed to sc2reader/events/game.py

Lines changed: 29 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,9 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import absolute_import
33

4-
from sc2reader.utils import Length
5-
from sc2reader.data import Unit
4+
from sc2reader.events.base import Event
65
from sc2reader.log_utils import loggable
76

8-
@loggable
9-
class Event(object):
10-
name = 'Event'
11-
12-
def __init__(self, frame, pid):
13-
self.pid = pid
14-
self.frame = frame
15-
self.second = frame >> 4
16-
# This is sorta expensive considering no one uses it
17-
# self.time = Length(seconds=self.second)
18-
19-
def load_context(self, replay):
20-
if replay.versions[1]==1 or (replay.versions[1]==2 and replay.build < 24247):
21-
if self.pid <= len(replay.people):
22-
self.player = replay.person[self.pid]
23-
elif self.pid != 16:
24-
self.logger.error("Bad pid ({0}) for event {1} at {2}.".format(self.pid, self.__class__, Length(seconds=self.second)))
25-
else:
26-
pass # This is a global event
27-
28-
else:
29-
if self.pid < len(replay.clients):
30-
self.player = replay.client[self.pid]
31-
elif self.pid != 16:
32-
self.logger.error("Bad pid ({0}) for event {1} at {2}.".format(self.pid, self.__class__, Length(seconds=self.second)))
33-
else:
34-
pass # This is a global event
35-
36-
def _str_prefix(self):
37-
player_name = self.player.name if getattr(self,'pid', 16)!=16 else "Global"
38-
return "%s\t%-15s " % (Length(seconds=int(self.frame/16)), player_name)
39-
40-
def __str__(self):
41-
return self._str_prefix() + self.name
42-
437
@loggable
448
class GameEvent(Event):
459
name = 'GameEvent'
@@ -55,51 +19,6 @@ def __init__(self, frame, pid, event_type):
5519
self.is_player_action = (event_class == 1)
5620
self.is_camera_movement = (event_class == 3)
5721

58-
#############################################3
59-
# Message Events
60-
#########################
61-
62-
@loggable
63-
class MessageEvent(Event):
64-
name = 'MessageEvent'
65-
66-
def __init__(self, frame, pid, flags):
67-
super(MessageEvent, self).__init__(frame, pid)
68-
self.flags=flags
69-
70-
@loggable
71-
class ChatEvent(MessageEvent):
72-
name = 'ChatEvent'
73-
74-
def __init__(self, frame, pid, flags, target, text, extension):
75-
super(ChatEvent, self).__init__(frame, pid, flags)
76-
self.target = target
77-
self.extension = extension
78-
self.text = text
79-
self.to_all = (self.target == 0)
80-
self.to_allies = (self.target == 2)
81-
self.to_observers = (self.target == 4)
82-
83-
@loggable
84-
class PacketEvent(MessageEvent):
85-
name = 'PacketEvent'
86-
87-
def __init__(self, frame, pid, flags, info):
88-
super(PacketEvent, self).__init__(frame, pid, flags)
89-
self.info = info
90-
91-
@loggable
92-
class PingEvent(MessageEvent):
93-
name = 'PingEvent'
94-
95-
def __init__(self, frame, pid, flags, x, y):
96-
super(PingEvent, self).__init__(frame, pid, flags)
97-
self.x, self.y = x, y
98-
99-
100-
#############################################3
101-
# Game Events
102-
#########################
10322

10423
class UnknownEvent(GameEvent):
10524
name = 'UnknownEvent'
@@ -168,8 +87,11 @@ def __str__(self):
16887

16988
def load_context(self, replay):
17089
super(SendResourceEvent, self).load_context(replay)
171-
self.sender = self.player
172-
self.reciever = replay.players[self.reciever]
90+
# DJ disabled this on 20130222 because GGTracker doesnt use this event
91+
# and it is currently broken for a replay thats now in the test suite.
92+
#
93+
# self.sender = replay.player[self.sender]
94+
# self.reciever = replay.players[self.reciever]
17395

17496
@loggable
17597
class RequestResourceEvent(PlayerActionEvent):
@@ -252,21 +174,21 @@ def load_context(self, replay):
252174
if not replay.datapack:
253175
return
254176

255-
if self.target_id in replay.objects:
256-
self.target = replay.objects[self.target_id]
257-
if not self.target.is_type(self.target_type):
258-
replay.datapack.change_type(self.target, self.target_type, self.frame)
177+
uid = (self.target_id, self.target_type)
178+
if uid in replay.objects:
179+
self.target = replay.objects[uid]
259180

260181
else:
261182
if self.target_type not in replay.datapack.units:
262183
self.logger.error("{0}\t{1}\tMissing unit {2} from {3}".format(self.frame, self.player.name, hex(self.target_type), replay.datapack.id))
263184
unit = Unit(self.target_id, 0x00)
264185

265186
else:
266-
unit = replay.datapack.create_unit(self.target_id, self.target_type, 0x00, self.frame)
187+
unit_class = replay.datapack.units[self.target_type]
188+
unit = unit_class(self.target_id, 0x00)
267189

268190
self.target = unit
269-
replay.objects[self.target_id] = unit
191+
replay.objects[uid] = unit
270192

271193
def __str__(self):
272194
if self.target:
@@ -332,26 +254,29 @@ def load_context(self, replay):
332254
if not replay.datapack:
333255
return
334256

335-
units = list()
336-
for (unit_id, unit_type, unit_flags) in self.raw_objects:
337-
if unit_id in replay.objects:
338-
unit = replay.objects[unit_id]
339-
if not unit.is_type(unit_type):
340-
replay.datapack.change_type(unit, unit_type, self.frame)
257+
objects = list()
258+
data = replay.datapack
259+
for (obj_id, obj_type, obj_flags) in self.raw_objects:
260+
# Hack that defaults viking selection to fighter mode instead of assault
261+
if replay.versions[1] == 2 and replay.build >= 23925 and obj_type == 71:
262+
obj_type = 72
263+
264+
if (obj_id, obj_type) in replay.objects:
265+
obj = replay.objects[(obj_id,obj_type)]
341266
else:
342-
if unit_type in replay.datapack.units:
343-
unit = replay.datapack.create_unit(unit_id, unit_type, unit_flags, self.frame)
267+
if obj_type in data.units:
268+
obj = data.units[obj_type](obj_id, obj_flags)
344269
else:
345270
msg = "Unit Type {0} not found in {1}"
346-
self.logger.error(msg.format(hex(unit_type), replay.datapack.__class__.__name__))
347-
unit = Unit(unit_id, unit_flags)
271+
self.logger.error(msg.format(hex(obj_type), data.__class__.__name__))
272+
obj = Unit(obj_id, obj_flags)
348273

349-
replay.objects[unit_id] = unit
274+
replay.objects[(obj_id,obj_type)] = obj
350275

351-
units.append(unit)
276+
objects.append(obj)
352277

353278

354-
self.units = self.objects = units
279+
self.objects = objects
355280

356281
def __str__(self):
357-
return GameEvent.__str__(self)+str([str(u) for u in self.units])
282+
return GameEvent.__str__(self)+str([str(u) for u in self.objects])

sc2reader/events/message.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import absolute_import
3+
4+
from sc2reader.events.base import Event
5+
from sc2reader.log_utils import loggable
6+
7+
@loggable
8+
class MessageEvent(Event):
9+
name = 'MessageEvent'
10+
11+
def __init__(self, frame, pid, flags):
12+
super(MessageEvent, self).__init__(frame, pid)
13+
self.flags=flags
14+
15+
@loggable
16+
class ChatEvent(MessageEvent):
17+
name = 'ChatEvent'
18+
19+
def __init__(self, frame, pid, flags, target, text, extension):
20+
super(ChatEvent, self).__init__(frame, pid, flags)
21+
self.target = target
22+
self.extension = extension
23+
self.text = text
24+
self.to_all = (self.target == 0)
25+
self.to_allies = (self.target == 2)
26+
self.to_observers = (self.target == 4)
27+
28+
@loggable
29+
class PacketEvent(MessageEvent):
30+
name = 'PacketEvent'
31+
32+
def __init__(self, frame, pid, flags, info):
33+
super(PacketEvent, self).__init__(frame, pid, flags)
34+
self.info = info
35+
36+
@loggable
37+
class PingEvent(MessageEvent):
38+
name = 'PingEvent'
39+
40+
def __init__(self, frame, pid, flags, x, y):
41+
super(PingEvent, self).__init__(frame, pid, flags)
42+
self.x, self.y = x, y

sc2reader/readers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88

99
from sc2reader.exceptions import ParseError, ReadError
1010
from sc2reader.objects import *
11-
from sc2reader.events import *
11+
from sc2reader.events.game import *
12+
from sc2reader.events.message import *
1213
from sc2reader.utils import AttributeDict
1314
from sc2reader.decoders import BitPackedDecoder, ByteDecoder
1415

sc2reader/resources.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from sc2reader import readers
2424
from sc2reader import exceptions
2525
from sc2reader.data import builds as datapacks
26-
from sc2reader.events import AbilityEvent, CameraEvent, HotkeyEvent, SelectionEvent
26+
from sc2reader.events.game import AbilityEvent, CameraEvent, HotkeyEvent, SelectionEvent
2727
from sc2reader.exceptions import SC2ReaderLocalizationError
2828
from sc2reader.objects import Player, Observer, Team, PlayerSummary, Graph, DepotFile, BuildEntry
2929
from sc2reader.constants import REGIONS, LOCALIZED_RACES, GAME_SPEED_FACTOR, LOBBY_PROPERTIES, GATEWAY_LOOKUP

0 commit comments

Comments
 (0)