Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
 def read_values(decoder: BitPackDecoder, metadata):
     decoder.decode(100, 100)
     return preset