Exemplo n.º 1
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        items = self.database.item
        has_name = any(cond.name is not None for cond in self.value.resources)

        yield self.value.model_index, 255
        yield from BitPackFloat(self.value.probability_offset).bit_pack_encode(_PROBABILITY_OFFSET_META)
        yield from BitPackFloat(self.value.probability_multiplier).bit_pack_encode(_PROBABILITY_MULTIPLIER_META)
        yield from self.value.item_category.bit_pack_encode({})
        yield from bitpacking.encode_bool(has_name)
        yield len(self.value.resources) - 1, MAXIMUM_PICKUP_CONDITIONAL_RESOURCES

        for i, conditional in enumerate(self.value.resources):
            if i > 0:
                yield from bitpacking.pack_array_element(conditional.item, items)

            yield len(conditional.resources), MAXIMUM_PICKUP_RESOURCES + 1
            for resource, quantity in conditional.resources:
                yield from bitpacking.pack_array_element(resource, items)
                yield quantity, 255

            if has_name:
                yield from bitpacking.encode_bool(conditional.name == self.value.name)

        yield len(self.value.convert_resources), MAXIMUM_PICKUP_CONVERSION + 1
        for conversion in self.value.convert_resources:
            yield from bitpacking.pack_array_element(conversion.source, items)
            yield from bitpacking.pack_array_element(conversion.target, items)
Exemplo n.º 2
0
 def encode_resource_lock(self, lock: ResourceLock):
     yield from bitpacking.pack_array_element(lock.locked_by,
                                              self.database.item)
     yield from bitpacking.pack_array_element(lock.item_to_lock,
                                              self.database.item)
     yield from bitpacking.pack_array_element(lock.temporary_item,
                                              self.database.item)
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        reference: MajorItemsConfiguration = metadata["reference"]

        result: List[Tuple[int, MajorItem, MajorItemState]] = []
        for i, (item, state) in enumerate(self.items_state.items()):
            if state != reference.items_state[item]:
                result.append((i, item, state))

        yield len(result), len(self.items_state)
        for index, _, _ in result:
            yield index, len(self.items_state)

        for index, item, state in result:
            yield from state.bit_pack_encode(item)

        # default_items
        for category, default in self.default_items.items():
            all_major = [
                major for major in reference.items_state.keys()
                if major.item_category == category
            ]
            yield from bitpacking.pack_array_element(default, all_major)

        # random starting items
        yield self.minimum_random_starting_items, RANDOM_STARTING_ITEMS_LIMIT
        yield self.maximum_random_starting_items, RANDOM_STARTING_ITEMS_LIMIT
Exemplo n.º 4
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        from randovania.interface_common.preset_manager import PresetManager
        manager: PresetManager = metadata["manager"]

        # Is this a custom preset?
        is_custom_preset = self.base_preset_name is not None
        if is_custom_preset:
            reference_versioned = manager.included_preset_with_name(
                self.base_preset_name)
            if reference_versioned is None:
                reference_versioned = manager.default_preset_for_game(
                    self.game)
            reference = reference_versioned.get_preset()
        else:
            reference = self

        included_presets = [
            versioned.get_preset() for versioned in manager.included_presets
        ]

        yield from bitpacking.encode_bool(is_custom_preset)
        yield from bitpacking.pack_array_element(reference, included_presets)
        if is_custom_preset:
            yield from self.configuration.bit_pack_encode(
                {"reference": reference.configuration})
        yield _dictionary_byte_hash(self.configuration.game_data), 256
Exemplo n.º 5
0
def _encode_preset(preset: Preset, manager: PresetManager):
    """

    :param preset:
    :param manager:
    :return:
    """
    # Is this a custom preset?
    is_custom_preset = preset.base_preset_name is not None
    if is_custom_preset:
        reference_versioned = manager.preset_for_name(preset.base_preset_name)
        if reference_versioned is None:
            reference_versioned = manager.default_preset
        reference_preset = reference_versioned.get_preset()
    else:
        reference_preset = preset

    included_presets = [versioned.get_preset() for versioned in manager.included_presets]

    yield from bitpacking.encode_bool(is_custom_preset)
    yield from bitpacking.pack_array_element(reference_preset, included_presets)
    if is_custom_preset:
        yield from preset.patcher_configuration.bit_pack_encode(
            {"reference": reference_preset.patcher_configuration})
        yield from preset.layout_configuration.bit_pack_encode(
            {"reference": reference_preset.layout_configuration})
    yield _dictionary_byte_hash(preset.layout_configuration.game_data), 256
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        reference: MajorItemsConfiguration = metadata["reference"]

        name_to_item: Dict[str, MajorItem] = {
            item.name: item
            for item in self.items_state.keys()
        }

        modified_items = sorted(item.name
                                for item, state in self.items_state.items()
                                if state != reference.items_state[item])
        yield from bitpacking.pack_sorted_array_elements(
            modified_items, sorted(name_to_item.keys()))
        for item_name in modified_items:
            item = name_to_item[item_name]
            yield from self.items_state[item].bit_pack_encode(
                item, reference=reference.items_state[item])

        # default_items
        for category, default in self.default_items.items():
            all_major = [
                major for major in reference.items_state.keys()
                if major.item_category == category
            ]
            yield from bitpacking.pack_array_element(default, all_major)

        # random starting items
        yield from bitpacking.encode_big_int(
            self.minimum_random_starting_items)
        yield from bitpacking.encode_big_int(
            self.maximum_random_starting_items)
Exemplo n.º 7
0
def test_array_elements_round_trip(element, array):
    generator = bitpacking.pack_array_element(element, array)
    b = bitpacking._pack_encode_results(list(generator))
    decoder = bitpacking.BitPackDecoder(b)

    decoded_element = decoder.decode_element(array)

    assert element == decoded_element
Exemplo n.º 8
0
 def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
     templates = [
         _get_vanilla_actual_translator_configurations(),
         _get_vanilla_colors_translator_configurations(),
         self.with_full_random().translator_requirement,
         self.translator_requirement,
     ]
     yield from bitpacking.pack_array_element(self.translator_requirement, templates)
     if templates.index(self.translator_requirement) == 3:
         for translator in self.translator_requirement.values():
             yield from translator.bit_pack_encode({})
Exemplo n.º 9
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        yield from self.global_level.bit_pack_encode(metadata)

        encodable_levels = list(LayoutTrickLevel)
        encodable_levels.remove(LayoutTrickLevel.MINIMAL_RESTRICTIONS)

        for trick in sorted(TrickLevelConfiguration.all_possible_tricks()):
            if trick in self.specific_levels:
                yield from bitpacking.encode_bool(True)
                yield from bitpacking.pack_array_element(self.specific_levels[trick], encodable_levels)
            else:
                yield from bitpacking.encode_bool(False)
Exemplo n.º 10
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        yield from self.global_level.bit_pack_encode(metadata)

        encodable_levels = list(LayoutTrickLevel)
        encodable_levels.remove(LayoutTrickLevel.MINIMAL_LOGIC)

        for trick in sorted(_all_trick_indices()):
            if trick in self.specific_levels:
                yield from bitpacking.encode_bool(True)
                yield from bitpacking.pack_array_element(self.specific_levels[trick], encodable_levels)
            else:
                yield from bitpacking.encode_bool(False)
Exemplo n.º 11
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        items = self.database.item

        yield self.value.model_index, 255
        yield from self.value.item_category.bit_pack_encode({})
        yield int(any(cond.name is not None
                      for cond in self.value.resources)), 2
        yield len(
            self.value.resources) - 1, MAXIMUM_PICKUP_CONDITIONAL_RESOURCES

        for i, conditional in enumerate(self.value.resources):
            if i > 0:
                yield from bitpacking.pack_array_element(
                    conditional.item, items)

            yield len(conditional.resources), MAXIMUM_PICKUP_RESOURCES + 1
            for resource, quantity in conditional.resources:
                yield from bitpacking.pack_array_element(resource, items)
                yield quantity, 255

        yield len(self.value.convert_resources), MAXIMUM_PICKUP_CONVERSION + 1
        for conversion in self.value.convert_resources:
            yield from bitpacking.pack_array_element(conversion.source, items)
            yield from bitpacking.pack_array_element(conversion.target, items)
Exemplo n.º 12
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        game_data = default_data.read_json_then_binary(self.game)[1]

        yield from bitpacking.encode_bool(self.minimal_logic)
        if self.minimal_logic:
            return

        encodable_levels = list(LayoutTrickLevel)
        encodable_levels.remove(LayoutTrickLevel.DISABLED)

        for trick in sorted(_all_tricks(game_data)):
            has_trick = self.has_specific_level_for_trick(trick)
            yield from bitpacking.encode_bool(has_trick)
            if has_trick:
                yield from bitpacking.pack_array_element(self.level_for_trick(trick), encodable_levels)
Exemplo n.º 13
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        yield from bitpacking.encode_bool(self.minimal_logic)

        encodable_levels = list(LayoutTrickLevel)
        encodable_levels.remove(LayoutTrickLevel.NO_TRICKS)
        encodable_levels.remove(LayoutTrickLevel.MINIMAL_LOGIC)

        for trick in sorted(_all_tricks()):
            level = self.level_for_trick(trick)
            if level in encodable_levels:
                yield from bitpacking.encode_bool(True)
                yield from bitpacking.pack_array_element(
                    level, encodable_levels)
            else:
                yield from bitpacking.encode_bool(False)
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        resource_database = default_database.resource_database_for(self.game)

        yield from bitpacking.encode_bool(self.minimal_logic)
        if self.minimal_logic:
            return

        encodable_levels = list(LayoutTrickLevel)
        encodable_levels.remove(LayoutTrickLevel.DISABLED)

        for trick in _all_tricks(resource_database):
            has_trick = self.has_specific_level_for_trick(trick)
            yield from bitpacking.encode_bool(has_trick)
            if has_trick:
                yield from bitpacking.pack_array_element(
                    self.level_for_trick(trick), encodable_levels)
Exemplo n.º 15
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        yield self.current_version(), _PERMALINK_MAX_VERSION
        yield self.seed_number, _PERMALINK_MAX_SEED
        yield from bitpacking.encode_bool(self.spoiler)
        yield from bitpacking.encode_int_with_limits(self.player_count, _PERMALINK_PLAYER_COUNT_LIMITS)

        manager = PresetManager(None)

        previous_unique_presets = []
        for preset in self.presets.values():
            yield from bitpacking.encode_bool(preset in previous_unique_presets)
            if preset in previous_unique_presets:
                yield from bitpacking.pack_array_element(preset, previous_unique_presets)
                continue

            previous_unique_presets.append(preset)
            yield from _encode_preset(preset, manager)
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        from randovania.layout import configuration_factory
        templates = [
            configuration_factory.get_vanilla_actual_translator_configurations(
            ),
            configuration_factory.get_vanilla_colors_translator_configurations(
            ),
            self.with_full_random().translator_requirement,
            self.translator_requirement,
        ]
        yield from bitpacking.encode_bool(self.fixed_gfmc_compound)
        yield from bitpacking.encode_bool(self.fixed_torvus_temple)
        yield from bitpacking.encode_bool(self.fixed_great_temple)

        yield from bitpacking.pack_array_element(self.translator_requirement,
                                                 templates)
        if templates.index(self.translator_requirement) == 3:
            for translator in self.translator_requirement.values():
                yield from translator.bit_pack_encode({})
Exemplo n.º 17
0
    def bit_pack_encode(self, metadata) -> Iterator[Tuple[int, int]]:
        yield self.current_version(), _PERMALINK_MAX_VERSION
        yield self.seed_number, _PERMALINK_MAX_SEED
        yield int(self.spoiler), 2
        yield _dictionary_byte_hash(self.layout_configuration.game_data), 256

        manager = PresetManager(None)

        # Is this a custom preset?
        is_custom_preset = self.preset.base_preset_name is not None
        if is_custom_preset:
            reference_preset = manager.preset_for_name(
                self.preset.base_preset_name)
        else:
            reference_preset = self.preset

        yield from bitpacking.encode_bool(is_custom_preset)
        yield from bitpacking.pack_array_element(reference_preset,
                                                 manager.included_presets)
        if is_custom_preset:
            yield from self.patcher_configuration.bit_pack_encode(
                {"reference": reference_preset.patcher_configuration})
            yield from self.layout_configuration.bit_pack_encode(
                {"reference": reference_preset.layout_configuration})
Exemplo n.º 18
0
def test_pack_array_element_single():
    assert len(list(bitpacking.pack_array_element("x", ["x"]))) == 0
Exemplo n.º 19
0
 def encode_resource_conversion(self, item: ResourceConversion):
     yield from bitpacking.pack_array_element(item.source, self.database.item)
     yield from bitpacking.pack_array_element(item.target, self.database.item)
Exemplo n.º 20
0
 def encode_resource_quantity(self, item: ResourceQuantity):
     yield from bitpacking.pack_array_element(item[0], self.database.item)
     assert item[1] <= item[0].max_capacity
     yield item[1], item[0].max_capacity + 1
Exemplo n.º 21
0
def test_pack_array_element_missing():
    with pytest.raises(ValueError):
        list(bitpacking.pack_array_element(5, [10, 25]))