1
1
# -*- coding: utf-8 -*-
2
2
from __future__ import absolute_import
3
3
4
- from sc2reader .utils import Length
5
- from sc2reader .data import Unit
4
+ from sc2reader .events .base import Event
6
5
from sc2reader .log_utils import loggable
7
6
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
-
43
7
@loggable
44
8
class GameEvent (Event ):
45
9
name = 'GameEvent'
@@ -55,51 +19,6 @@ def __init__(self, frame, pid, event_type):
55
19
self .is_player_action = (event_class == 1 )
56
20
self .is_camera_movement = (event_class == 3 )
57
21
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
- #########################
103
22
104
23
class UnknownEvent (GameEvent ):
105
24
name = 'UnknownEvent'
@@ -168,8 +87,11 @@ def __str__(self):
168
87
169
88
def load_context (self , replay ):
170
89
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]
173
95
174
96
@loggable
175
97
class RequestResourceEvent (PlayerActionEvent ):
@@ -252,21 +174,21 @@ def load_context(self, replay):
252
174
if not replay .datapack :
253
175
return
254
176
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 ]
259
180
260
181
else :
261
182
if self .target_type not in replay .datapack .units :
262
183
self .logger .error ("{0}\t {1}\t Missing unit {2} from {3}" .format (self .frame , self .player .name , hex (self .target_type ), replay .datapack .id ))
263
184
unit = Unit (self .target_id , 0x00 )
264
185
265
186
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 )
267
189
268
190
self .target = unit
269
- replay .objects [self . target_id ] = unit
191
+ replay .objects [uid ] = unit
270
192
271
193
def __str__ (self ):
272
194
if self .target :
@@ -332,26 +254,29 @@ def load_context(self, replay):
332
254
if not replay .datapack :
333
255
return
334
256
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 )]
341
266
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 )
344
269
else :
345
270
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 )
348
273
349
- replay .objects [unit_id ] = unit
274
+ replay .objects [( obj_id , obj_type ) ] = obj
350
275
351
- units .append (unit )
276
+ objects .append (obj )
352
277
353
278
354
- self .units = self . objects = units
279
+ self .objects = objects
355
280
356
281
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 ])
0 commit comments