11# -*- coding: utf-8 -*-
22from __future__ import absolute_import
33
4- from sc2reader .utils import Length
5- from sc2reader .data import Unit
4+ from sc2reader .events .base import Event
65from 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
448class 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
10423class 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
17597class 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}\t Missing 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 ])
0 commit comments