def bit_pack_unpack(cls, decoder: BitPackDecoder, metadata) -> "Permalink": version, seed_number = decoder.decode(_PERMALINK_MAX_VERSION, _PERMALINK_MAX_SEED) cls._raise_if_different_version(version) spoiler = bitpacking.decode_bool(decoder) player_count = bitpacking.decode_int_with_limits(decoder, _PERMALINK_PLAYER_COUNT_LIMITS) manager = PresetManager(None) previous_unique_presets = [] presets = {} for index in range(player_count): in_previous_presets = bitpacking.decode_bool(decoder) if in_previous_presets: preset = decoder.decode_element(previous_unique_presets) else: preset = Preset.bit_pack_unpack(decoder, {"manager": manager}) previous_unique_presets.append(preset) presets[index] = preset return Permalink(seed_number, spoiler, presets)
def bit_pack_unpack(cls, decoder: BitPackDecoder, metadata) -> "Permalink": version, seed, spoiler = decoder.decode(_PERMALINK_MAX_VERSION, _PERMALINK_MAX_SEED, 2) cls._raise_if_different_version(version) included_data_hash = decoder.decode_single(256) manager = PresetManager(None) is_custom_preset = bitpacking.decode_bool(decoder) reference_preset = decoder.decode_element(manager.included_presets) if is_custom_preset: patcher_configuration = PatcherConfiguration.bit_pack_unpack( decoder, {"reference": reference_preset.patcher_configuration}) layout_configuration = LayoutConfiguration.bit_pack_unpack( decoder, {"reference": reference_preset.layout_configuration}) preset = Preset( name="{} Custom".format(reference_preset.name), description="A customized preset.", base_preset_name=reference_preset.name, patcher_configuration=patcher_configuration, layout_configuration=layout_configuration, ) else: preset = reference_preset expected_data_hash = _dictionary_byte_hash( preset.layout_configuration.game_data) if included_data_hash != expected_data_hash: raise ValueError( "Given permalink is for a Randovania database with hash '{}', " "but current database has hash '{}'.".format( included_data_hash, expected_data_hash)) return Permalink( seed, bool(spoiler), preset, )
def bit_pack_unpack(cls, decoder: BitPackDecoder, metadata) -> "MajorItemsConfiguration": reference: MajorItemsConfiguration = metadata["reference"] num_items = decoder.decode_single(len(reference.items_state)) indices_with_custom = { decoder.decode_single(len(reference.items_state)) for _ in range(num_items) } items_state = {} for index, item in enumerate(reference.items_state.keys()): if index in indices_with_custom: items_state[item] = MajorItemState.bit_pack_unpack( decoder, item) else: items_state[item] = reference.items_state[item] # default_items default_items = {} for category in reference.default_items.keys(): all_major = [ major for major in reference.items_state.keys() if major.item_category == category ] default_items[category] = decoder.decode_element(all_major) # random starting items minimum, maximum = decoder.decode(RANDOM_STARTING_ITEMS_LIMIT, RANDOM_STARTING_ITEMS_LIMIT) return cls(items_state, default_items=default_items, minimum_random_starting_items=minimum, maximum_random_starting_items=maximum)
def bit_pack_unpack(cls, decoder: BitPackDecoder) -> "PickupQuantities": pickup_database = default_prime2_pickup_database() pickup_list = list(pickup_database.all_useful_pickups) total_pickup_count = pickup_database.total_pickup_count has_custom_quantities = bool(decoder.decode(2)[0]) if not has_custom_quantities: return PickupQuantities(pickup_database, {})._add_missing_pickups_to_quantities() pickup_quantities = {} zero_quantity_pickups = decoder.decode(len(pickup_list))[0] one_quantity_pickups = decoder.decode( len(pickup_list) - zero_quantity_pickups)[0] multiple_quantity_pickups = len( pickup_list) - zero_quantity_pickups - one_quantity_pickups # zero for _ in range(zero_quantity_pickups): index = decoder.decode(len(pickup_list))[0] pickup_quantities[pickup_list.pop(index)] = 0 # multi for i in range(multiple_quantity_pickups): index = decoder.decode(len(pickup_list))[0] if i != multiple_quantity_pickups - 1 or one_quantity_pickups > 0: quantity = decoder.decode(total_pickup_count)[0] else: quantity = total_pickup_count pickup_quantities[pickup_list.pop(index)] = quantity total_pickup_count -= quantity # one assert len(pickup_list) == one_quantity_pickups for one_pickup in pickup_list: pickup_quantities[one_pickup] = 1 return PickupQuantities(pickup_database, pickup_quantities)
def read_values(decoder: BitPackDecoder, metadata): decoder.decode(100, 100) return preset