@@ -232,21 +232,24 @@ def __call__(self, data, replay):
232
232
data_length = data .length
233
233
read_timestamp = data .read_timestamp
234
234
read_bits = data .read_bits
235
+ read_byte = data .read_byte
235
236
read_bytes = data .read_bytes
236
237
byte_align = data .byte_align
237
238
append = game_events .append
238
239
event_start = 0
239
240
240
241
try :
241
242
while event_start != data_length :
242
- event = None
243
243
fstamp += read_timestamp ()
244
244
pid = read_bits (5 )
245
245
event_type = read_bits (7 )
246
246
247
247
# Check for a lookup
248
248
if event_type in EVENT_DISPATCH :
249
249
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 )
250
253
251
254
# Otherwise maybe it is an unknown chunk
252
255
elif event_type == 0x26 :
@@ -272,12 +275,6 @@ def __call__(self, data, replay):
272
275
raise ReadError ("Event type {} unknown at position {}." .format (hex (event_type ),hex (event_start )), event_type , event_start , replay , game_events , data )
273
276
274
277
byte_align ()
275
-
276
- if event :
277
- if debug :
278
- event .bytes = data .read_range (event_start , data .tell ())
279
- append (event )
280
-
281
278
event_start = data .tell ()
282
279
283
280
return game_events
@@ -320,7 +317,7 @@ def player_selection_event(self, data, fstamp, pid, event_type):
320
317
unit_types = [(data .read_short (BIG_ENDIAN ) << 8 | data .read_byte (),data .read_bits (self .UNIT_INDEX_BITS )) for index in range (type_count )]
321
318
322
319
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 )]
324
321
325
322
unit_types = chain (* [[utype ]* count for (utype , count ) in unit_types ])
326
323
units = list (zip (unit_ids , unit_types ))
@@ -364,21 +361,22 @@ def player_request_resource_event(self, data, fstamp, pid, event_type):
364
361
365
362
def camera_event (self , data , fstamp , pid , event_type ):
366
363
# 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
369
367
distance = pitch = yaw = height = 0
370
368
if data .read_bits (1 ):
371
- distance = data .read_bits ( 16 )/ 256.0
369
+ distance = data .read_short ( BIG_ENDIAN )/ 256.0
372
370
if data .read_bits (1 ):
373
371
#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 ) #?
375
373
pitch = 45 * (((((pitch * 0x10 - 0x2000 ) << 17 ) - 1 ) >> 17 ) + 1 ) / 4096.0
376
374
if data .read_bits (1 ):
377
375
#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 ) #?
379
377
yaw = 45 * (((((yaw * 0x10 - 0x2000 ) << 17 ) - 1 ) >> 17 ) + 1 ) / 4096.0
380
378
if data .read_bits (1 ):
381
- height_offset = data .read_bits ( 16 )/ 256.0
379
+ height_offset = data .read_short ( BIG_ENDIAN )/ 256.0
382
380
return CameraEvent (fstamp , pid , event_type , x , y , distance , pitch , yaw , height )
383
381
384
382
@@ -421,7 +419,7 @@ def player_ability_event(self, data, fstamp, pid, event_type):
421
419
422
420
default_ability = not data .read_bits (1 )
423
421
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 )
425
423
default_actor = not data .read_bits (1 )
426
424
else :
427
425
ability = 0
@@ -430,17 +428,17 @@ def player_ability_event(self, data, fstamp, pid, event_type):
430
428
if target_type == 1 :
431
429
x = data .read_bits (20 )/ 4096.0
432
430
y = data .read_bits (20 )/ 4096.0
433
- z = data .read_bits ( 32 )
431
+ z = data .read_int ( BIG_ENDIAN )
434
432
z = (z >> 1 )/ 8192.0 * pow (- 1 , z & 0x1 )
435
433
unknown = data .read_bits (1 )
436
434
return LocationAbilityEvent (fstamp , pid , event_type , ability , (x , y , z ))
437
435
438
436
elif target_type == 2 :
439
437
player = team = None
440
438
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 ))
444
442
445
443
if self .ABILITY_TEAM_FLAG and data .read_bits (1 ):
446
444
team = data .read_bits (4 )
@@ -450,13 +448,13 @@ def player_ability_event(self, data, fstamp, pid, event_type):
450
448
451
449
x = data .read_bits (20 )/ 4096.0
452
450
y = data .read_bits (20 )/ 4096.0
453
- z = data .read_bits ( 32 )
451
+ z = data .read_int ( BIG_ENDIAN )
454
452
z = (z >> 1 )/ 8192.0 * pow (- 1 , z & 0x1 )
455
453
unknown = data .read_bits (1 )
456
454
return TargetAbilityEvent (fstamp , pid , event_type , ability , unit , player , team , (x , y , z ))
457
455
458
456
elif target_type == 3 :
459
- unit_id = data .read_bits ( 32 )
457
+ unit_id = data .read_int ( BIG_ENDIAN )
460
458
unknown = data .read_bits (1 )
461
459
return SelfAbilityEvent (fstamp , pid , event_type , ability , unit_id )
462
460
0 commit comments