Skip to content

Commit 93c1533

Browse files
committed
Add proper initData parsing for HotS beta replays.
1 parent 2ffcd93 commit 93c1533

File tree

2 files changed

+101
-3
lines changed

2 files changed

+101
-3
lines changed

sc2reader/readers.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,103 @@ def __call__(self, data, replay):
505505
)
506506

507507

508+
class InitDataReader_23925(InitDataReader_22612):
509+
510+
def __call__(self, data, replay):
511+
data = BitPackedDecoder(data)
512+
return dict(
513+
player_init_data=[dict(
514+
name=data.read_aligned_bytes(data.read_uint8()),
515+
clan_tag=None,
516+
highest_league=None,
517+
combined_race_levels=None,
518+
random_seed=data.read_uint32(),
519+
race_preference=data.read_uint8() if data.read_bool() else None,
520+
team_preference=data.read_uint8() if data.read_bool() else None,
521+
test_map=data.read_bool(),
522+
test_auto=data.read_bool(),
523+
examine=data.read_bool(),
524+
custom_interface=None,
525+
observe=data.read_bits(2),
526+
) for i in range(data.read_bits(5))],
527+
528+
game_description=dict(
529+
random_value=data.read_uint32(),
530+
game_cache_name=data.read_aligned_bytes(data.read_bits(10)),
531+
game_options=dict(
532+
lock_teams=data.read_bool(),
533+
teams_together=data.read_bool(),
534+
advanced_shared_control=data.read_bool(),
535+
random_races=data.read_bool(),
536+
battle_net=data.read_bool(),
537+
amm=data.read_bool(),
538+
competitive=data.read_bool(),
539+
no_victory_or_defeat=data.read_bool(),
540+
fog=data.read_bits(2),
541+
observers=data.read_bits(2),
542+
user_difficulty=data.read_bits(2),
543+
client_debug_flags=data.read_uint64(),
544+
),
545+
game_speed=data.read_bits(3),
546+
game_type=data.read_bits(3),
547+
max_users=data.read_bits(5),
548+
max_observers=data.read_bits(5),
549+
max_players=data.read_bits(5),
550+
max_teams=data.read_bits(4)+1,
551+
max_colors=data.read_bits(6),
552+
max_races=data.read_uint8()+1,
553+
max_controls=data.read_uint8()+1,
554+
map_size_x=data.read_uint8(),
555+
map_size_y=data.read_uint8(),
556+
map_file_sync_checksum=data.read_uint32(),
557+
map_file_name=data.read_aligned_bytes(data.read_bits(11)),
558+
map_author_name=data.read_aligned_bytes(data.read_uint8()),
559+
mod_file_sync_checksum=data.read_uint32(),
560+
slot_descriptions=[dict(
561+
allowed_colors=data.read_bits(data.read_bits(6)),
562+
allowed_races=data.read_bits(data.read_uint8()),
563+
allowedDifficulty=data.read_bits(data.read_bits(6)),
564+
allowedControls=data.read_bits(data.read_uint8()),
565+
allowed_observe_types=data.read_bits(data.read_bits(2)),
566+
allowed_ai_builds=data.read_bits(data.read_bits(7)),
567+
) for i in range(data.read_bits(5))],
568+
default_difficulty=data.read_bits(6),
569+
default_AI_build=data.read_bits(7),
570+
cache_handles=[DepotFile(data.read_aligned_bytes(40)) for i in range(data.read_bits(6))],
571+
is_blizzardMap=data.read_bool(),
572+
is_premade_ffa=data.read_bool(),
573+
is_coop_mode=data.read_bool(),
574+
),
575+
576+
lobby_state=dict(
577+
phase=data.read_bits(3),
578+
max_users=data.read_bits(5),
579+
max_observers=data.read_bits(5),
580+
slots=[dict(
581+
control=data.read_uint8(),
582+
user_id=data.read_bits(4) if data.read_bool() else None,
583+
team_id=data.read_bits(4),
584+
colorPref=data.read_bits(5) if data.read_bool() else None,
585+
race_pref=data.read_uint8() if data.read_bool() else None,
586+
difficulty=data.read_bits(6),
587+
ai_build=data.read_bits(7),
588+
handicap=data.read_bits(7),
589+
observe=data.read_bits(2),
590+
working_set_slot_id=None,
591+
rewards=[data.read_uint32() for i in range(data.read_bits(5))],
592+
toon_handle=data.read_aligned_bytes(data.read_bits(7)),
593+
licenses=[data.read_uint32() for i in range(data.read_bits(9))],
594+
) for i in range(data.read_bits(5))],
595+
random_seed=data.read_uint32(),
596+
host_user_id=data.read_bits(4) if data.read_bool() else None,
597+
is_single_player=data.read_bool(),
598+
game_duration=data.read_uint32(),
599+
default_difficulty=data.read_bits(6),
600+
default_ai_build=data.read_bits(7),
601+
),
602+
)
603+
604+
508605
class InitDataReader_24764(InitDataReader_22612):
509606

510607
def __call__(self, data, replay):

sc2reader/resources.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ def load_details(self):
341341
self.game_length = self.length
342342
self.real_length = utils.Length(seconds=int(self.length.seconds/GAME_SPEED_FACTOR[self.speed]))
343343
self.start_time = datetime.utcfromtimestamp(self.unix_timestamp-self.real_length.seconds)
344-
self.date = self.end_time #backwards compatibility
344+
self.date = self.end_time # backwards compatibility
345345

346346
def load_map(self):
347347
self.map = self.factory.load_map(self.map_file, **self.opt)
@@ -445,7 +445,7 @@ def createPlayer(pid, pdata, attributes):
445445

446446
# Assign the default region to computer players for consistency
447447
# We know there will be a default region because there must be
448-
# at least 1 human player or we wouldn't have a self.
448+
# at least 1 human player or we wouldn't have a replay.
449449
default_region = self.humans[0].region
450450
for player in self.players:
451451
if not player.is_human:
@@ -559,7 +559,8 @@ def register_default_readers(self):
559559
self.register_reader('replay.initData', readers.InitDataReader_16561(), lambda r: 16561 <= r.base_build < 17326)
560560
self.register_reader('replay.initData', readers.InitDataReader_17326(), lambda r: 17326 <= r.base_build < 19132)
561561
self.register_reader('replay.initData', readers.InitDataReader_19132(), lambda r: 19132 <= r.base_build < 22612)
562-
self.register_reader('replay.initData', readers.InitDataReader_22612(), lambda r: 22612 <= r.base_build < 24764)
562+
self.register_reader('replay.initData', readers.InitDataReader_22612(), lambda r: 22612 <= r.base_build < 23925)
563+
self.register_reader('replay.initData', readers.InitDataReader_23925(), lambda r: 23925 <= r.base_build < 24764)
563564
self.register_reader('replay.initData', readers.InitDataReader_24764(), lambda r: 24764 <= r.base_build)
564565
self.register_reader('replay.message.events', readers.MessageEventsReader_Base(), lambda r: r.build < 24247 or r.versions[1]==1)
565566
self.register_reader('replay.message.events', readers.MessageEventsReader_Beta_24247(), lambda r: r.build >= 24247 and r.versions[1]==2)

0 commit comments

Comments
 (0)