@@ -232,21 +232,24 @@ def __call__(self, data, replay):
232232 data_length = data .length
233233 read_timestamp = data .read_timestamp
234234 read_bits = data .read_bits
235+ read_byte = data .read_byte
235236 read_bytes = data .read_bytes
236237 byte_align = data .byte_align
237238 append = game_events .append
238239 event_start = 0
239240
240241 try :
241242 while event_start != data_length :
242- event = None
243243 fstamp += read_timestamp ()
244244 pid = read_bits (5 )
245245 event_type = read_bits (7 )
246246
247247 # Check for a lookup
248248 if event_type in EVENT_DISPATCH :
249249 event = EVENT_DISPATCH [event_type ](data , fstamp , pid , event_type )
250+ if debug :
251+ event .bytes = data .read_range (event_start , data .tell ())
252+ append (event )
250253
251254 # Otherwise maybe it is an unknown chunk
252255 elif event_type == 0x26 :
@@ -272,12 +275,6 @@ def __call__(self, data, replay):
272275 raise ReadError ("Event type {} unknown at position {}." .format (hex (event_type ),hex (event_start )), event_type , event_start , replay , game_events , data )
273276
274277 byte_align ()
275-
276- if event :
277- if debug :
278- event .bytes = data .read_range (event_start , data .tell ())
279- append (event )
280-
281278 event_start = data .tell ()
282279
283280 return game_events
@@ -320,7 +317,7 @@ def player_selection_event(self, data, fstamp, pid, event_type):
320317 unit_types = [(data .read_short (BIG_ENDIAN ) << 8 | data .read_byte (),data .read_bits (self .UNIT_INDEX_BITS )) for index in range (type_count )]
321318
322319 unit_count = data .read_bits (self .UNIT_INDEX_BITS )
323- unit_ids = [data .read_bits ( 32 ) for index in range (unit_count )]
320+ unit_ids = [data .read_int ( BIG_ENDIAN ) for index in range (unit_count )]
324321
325322 unit_types = chain (* [[utype ]* count for (utype , count ) in unit_types ])
326323 units = list (zip (unit_ids , unit_types ))
@@ -364,21 +361,22 @@ def player_request_resource_event(self, data, fstamp, pid, event_type):
364361
365362 def camera_event (self , data , fstamp , pid , event_type ):
366363 # From https://github.com/Mischanix/sc2replay-csharp/wiki/replay.game.events
367- x = data .read_bits (16 )/ 256.0
368- y = data .read_bits (16 )/ 256.0
364+ block = data .read_int (BIG_ENDIAN )
365+ x = (block >> 16 )/ 256.0
366+ y = (block & 0xFFFF )/ 256.0
369367 distance = pitch = yaw = height = 0
370368 if data .read_bits (1 ):
371- distance = data .read_bits ( 16 )/ 256.0
369+ distance = data .read_short ( BIG_ENDIAN )/ 256.0
372370 if data .read_bits (1 ):
373371 #Note: this angle is relative to the horizontal plane, but the editor shows the angle relative to the vertical plane. Subtract from 90 degrees to convert.
374- pitch = data .read_bits ( 16 ) #?
372+ pitch = data .read_short ( BIG_ENDIAN ) #?
375373 pitch = 45 * (((((pitch * 0x10 - 0x2000 ) << 17 ) - 1 ) >> 17 ) + 1 ) / 4096.0
376374 if data .read_bits (1 ):
377375 #Note: this angle is the vector from the camera head to the camera target projected on to the x-y plane in positive coordinates. So, default is 90 degrees, while insert and delete produce 45 and 135 degrees by default.
378- yaw = data .read_bits ( 16 ) #?
376+ yaw = data .read_short ( BIG_ENDIAN ) #?
379377 yaw = 45 * (((((yaw * 0x10 - 0x2000 ) << 17 ) - 1 ) >> 17 ) + 1 ) / 4096.0
380378 if data .read_bits (1 ):
381- height_offset = data .read_bits ( 16 )/ 256.0
379+ height_offset = data .read_short ( BIG_ENDIAN )/ 256.0
382380 return CameraEvent (fstamp , pid , event_type , x , y , distance , pitch , yaw , height )
383381
384382
@@ -421,7 +419,7 @@ def player_ability_event(self, data, fstamp, pid, event_type):
421419
422420 default_ability = not data .read_bits (1 )
423421 if not default_ability :
424- ability = data .read_bits ( 16 ) << 5 | data .read_bits (5 )
422+ ability = data .read_short ( BIG_ENDIAN ) << 5 | data .read_bits (5 )
425423 default_actor = not data .read_bits (1 )
426424 else :
427425 ability = 0
@@ -430,17 +428,17 @@ def player_ability_event(self, data, fstamp, pid, event_type):
430428 if target_type == 1 :
431429 x = data .read_bits (20 )/ 4096.0
432430 y = data .read_bits (20 )/ 4096.0
433- z = data .read_bits ( 32 )
431+ z = data .read_int ( BIG_ENDIAN )
434432 z = (z >> 1 )/ 8192.0 * pow (- 1 , z & 0x1 )
435433 unknown = data .read_bits (1 )
436434 return LocationAbilityEvent (fstamp , pid , event_type , ability , (x , y , z ))
437435
438436 elif target_type == 2 :
439437 player = team = None
440438
441- data .read_bits ( 8 )
442- data .read_bits ( 8 )
443- unit = (data .read_bits ( 32 ), data .read_bits ( 16 ))
439+ data .read_byte ( )
440+ data .read_byte ( )
441+ unit = (data .read_int ( BIG_ENDIAN ), data .read_short ( BIG_ENDIAN ))
444442
445443 if self .ABILITY_TEAM_FLAG and data .read_bits (1 ):
446444 team = data .read_bits (4 )
@@ -450,13 +448,13 @@ def player_ability_event(self, data, fstamp, pid, event_type):
450448
451449 x = data .read_bits (20 )/ 4096.0
452450 y = data .read_bits (20 )/ 4096.0
453- z = data .read_bits ( 32 )
451+ z = data .read_int ( BIG_ENDIAN )
454452 z = (z >> 1 )/ 8192.0 * pow (- 1 , z & 0x1 )
455453 unknown = data .read_bits (1 )
456454 return TargetAbilityEvent (fstamp , pid , event_type , ability , unit , player , team , (x , y , z ))
457455
458456 elif target_type == 3 :
459- unit_id = data .read_bits ( 32 )
457+ unit_id = data .read_int ( BIG_ENDIAN )
460458 unknown = data .read_bits (1 )
461459 return SelfAbilityEvent (fstamp , pid , event_type , ability , unit_id )
462460
0 commit comments