Exemplo n.º 1
0
    async def _patches_for_pickup(self, provider_name: str, pickup: PickupEntry):
        inventory_resources: CurrentResources = {
            item: inv_item.capacity
            for item, inv_item in self._inventory.items()
        }
        conditional = pickup.conditional_for_resources(inventory_resources)
        if conditional.name is not None:
            item_name = conditional.name
        else:
            item_name = pickup.name

        resources_to_give = {}
        add_resource_gain_to_current_resources(conditional.resources, inventory_resources)
        add_resource_gain_to_current_resources(conditional.resources, resources_to_give)
        add_resource_gain_to_current_resources(pickup.conversion_resource_gain(inventory_resources),
                                               resources_to_give)

        # Ignore item% for received items
        resources_to_give.pop(self.game.resource_database.item_percentage, None)

        patches = [
            all_prime_dol_patches.adjust_item_amount_and_capacity_patch(self.patches.powerup_functions,
                                                                        item.index, delta)
            for item, delta in resources_to_give.items()
        ]
        return patches, f"Received {item_name} from {provider_name}."
Exemplo n.º 2
0
def test_calculate_hud_text(order: Tuple[str, str]):
    # Setup
    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    resource_b = ItemResourceInfo(2, "B", "B", 10, None)

    pickup_x = PickupEntry("A",
                           1,
                           ItemCategory.TEMPLE_KEY,
                           ItemCategory.KEY,
                           progression=(((resource_a, 1), )))
    pickup_y = PickupEntry("Y",
                           2,
                           ItemCategory.SUIT,
                           ItemCategory.LIFE_SUPPORT,
                           progression=(
                               (resource_b, 1),
                               (resource_a, 5),
                           ))
    pickup_z = PickupEntry("Z",
                           2,
                           ItemCategory.SUIT,
                           ItemCategory.LIFE_SUPPORT,
                           progression=(
                               (resource_a, 1),
                               (resource_b, 5),
                           ))

    memo_data = {
        "A": "You got {A} of A",
        "B": "You found {B} of B",
    }
    pickups = {
        "X": pickup_x,
        "Y": pickup_y,
        "Z": pickup_z,
    }

    # Run
    result = pickup_exporter._calculate_hud_text(pickups[order[0]],
                                                 pickups[order[1]],
                                                 PickupModelStyle.HIDE_ALL,
                                                 memo_data)

    # Assert
    if order[1] == "Y":
        assert result == ["You found 1 of B"]
    elif order[1] == "X":
        assert result == ["You got 1 of A", "You got 1 of A"]
    else:
        assert result == ["You got 1 of A", "You found 5 of B"]
Exemplo n.º 3
0
def test_game_session_request_pickups_one_action(
        mock_session_description: PropertyMock,
        mock_get_resource_database: MagicMock,
        mock_get_pickup_target: MagicMock, flask_app, two_player_session,
        echoes_resource_database):
    # Setup
    sio = MagicMock()
    sio.get_current_user.return_value = database.User.get_by_id(1234)

    pickup = PickupEntry("A",
                         PickupModel(echoes_resource_database.game_enum,
                                     "AmmoModel"),
                         ItemCategory.TEMPLE_KEY,
                         ItemCategory.KEY,
                         progression=((echoes_resource_database.item[0], 1), ))
    mock_get_pickup_target.return_value = PickupTarget(pickup=pickup, player=0)
    mock_get_resource_database.return_value = echoes_resource_database

    # Run
    result = game_session.game_session_request_pickups(sio, 1)

    # Assert
    mock_get_resource_database.assert_called_once_with(
        mock_session_description.return_value, 0)
    mock_get_pickup_target.assert_called_once_with(
        mock_session_description.return_value, 1, 0)
    assert result == {
        "game":
        "prime2",
        "pickups": [{
            'provider_name': 'Other Name',
            'pickup': 'C@fSK*4Fga_C{94xPb='
        }]
    }
Exemplo n.º 4
0
def test_add_pickup_to_state(state_game_data, empty_patches,
                             generic_item_category):
    # Starting State
    s = state.State({}, (), 99, None, empty_patches, None, state_game_data)

    resource_a = ItemResourceInfo("A", "A", 10)
    resource_b = ItemResourceInfo("B", "B", 10)
    p = PickupEntry("B",
                    2,
                    generic_item_category,
                    generic_item_category,
                    progression=(
                        (resource_a, 1),
                        (resource_b, 1),
                    ))

    # Run
    state.add_pickup_to_state(s, p)
    state.add_pickup_to_state(s, p)

    # Assert
    assert s.resources == {
        resource_a: 1,
        resource_b: 1,
    }
Exemplo n.º 5
0
async def test_patches_for_pickup(connector: EchoesRemoteConnector,
                                  version: EchoesDolVersion, mocker,
                                  generic_item_category):
    # Setup
    mock_item_patch: MagicMock = mocker.patch(
        "randovania.patching.prime.all_prime_dol_patches.adjust_item_amount_and_capacity_patch"
    )

    db = connector.game.resource_database
    pickup = PickupEntry("Pickup",
                         0,
                         generic_item_category,
                         generic_item_category,
                         progression=tuple(),
                         extra_resources=(
                             (db.energy_tank, db.energy_tank.max_capacity),
                             (db.item_percentage, 1),
                         ))
    inventory = {
        db.multiworld_magic_item: InventoryItem(0, 0),
        db.energy_tank: InventoryItem(1, 1),
    }

    # Run
    patches, message = await connector._patches_for_pickup(
        "Someone", pickup, inventory)

    # Assert
    mock_item_patch.assert_called_once_with(
        version.powerup_functions, RandovaniaGame.METROID_PRIME_ECHOES,
        db.energy_tank.extra["item_id"], db.energy_tank.max_capacity)
    assert patches == [mock_item_patch.return_value]
    assert message == "Received Pickup from Someone."
Exemplo n.º 6
0
def test_assign_pickup_to_starting_items(empty_patches, state_game_data):
    # Setup

    starting = state.State({}, (), 99, None, empty_patches, None,
                           state_game_data)

    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    resource_b = ItemResourceInfo(2, "B", "B", 10, None)
    p = PickupEntry(
        "A",
        2,
        ItemCategory.SUIT,
        ItemCategory.LIFE_SUPPORT,
        progression=((resource_a, 5), ),
        extra_resources=((state_game_data.resource_database.item_percentage,
                          1), ),
        unlocks_resource=True,
        resource_lock=ResourceLock(resource_a, resource_a, resource_b),
    )

    # Run
    final = starting.assign_pickup_to_starting_items(p)

    # Assert
    assert final.patches.starting_items == {resource_a: 5, resource_b: 0}
    assert final.resources == {resource_a: 5, resource_b: 0}
Exemplo n.º 7
0
def _pickup() -> PickupEntry:
    return PickupEntry(
        name="Pickup",
        model_index=0,
        item_category=ItemCategory.MOVEMENT,
        resources=(ConditionalResources(None, None, ()), ),
    )
Exemplo n.º 8
0
async def test_patches_for_pickup(backend, mocker):
    # Setup
    mock_item_patch: MagicMock = mocker.patch(
        "randovania.games.prime.all_prime_dol_patches.adjust_item_amount_and_capacity_patch")
    backend.patches = dol_patcher.ALL_VERSIONS_PATCHES[0]

    db = backend.game.resource_database
    pickup = PickupEntry("Pickup", 0, ItemCategory.MISSILE, ItemCategory.MISSILE, (
        ConditionalResources(None, None,
                             ((db.energy_tank, db.energy_tank.max_capacity),
                              (db.item_percentage, 1)),
                             ),
    ))
    backend._inventory = {
        db.multiworld_magic_item: InventoryItem(0, 0),
        db.energy_tank: InventoryItem(1, 1),
    }

    # Run
    patches, message = await backend._patches_for_pickup("Someone", pickup)

    # Assert
    mock_item_patch.assert_called_once_with(backend.patches.powerup_functions, db.energy_tank.index,
                                            db.energy_tank.max_capacity)
    assert patches == [mock_item_patch.return_value]
    assert message == "Received Pickup from Someone."
Exemplo n.º 9
0
def _create_pickup_data():
    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    resource_b = ItemResourceInfo(2, "B", "B", 10, None)
    return PickupEntry("Cake", 1, ItemCategory.TEMPLE_KEY, ItemCategory.KEY, (
        ConditionalResources("Sugar", None, ((resource_a, 1), )),
        ConditionalResources("Salt", resource_a, ((resource_b, 1), )),
    ))
Exemplo n.º 10
0
def create_artifact(artifact_index: int,
                    minimum_progression: int,
                    resource_database: ResourceDatabase,
                    ) -> PickupEntry:
    ARTIFACT_CATEGORY = ItemCategory(
        name="artifact",
        long_name="",
        hint_details=("an ", "artifact"),
        is_major=False,
        is_key=True
    )

    return PickupEntry(
        name=prime_items.ARTIFACT_NAMES[artifact_index],
        progression=(
            (resource_database.get_item(prime_items.ARTIFACT_ITEMS[artifact_index]), 1),
        ),
        model=PickupModel(
            game=resource_database.game_enum,
            name=prime_items.ARTIFACT_MODEL[artifact_index],
        ),
        item_category=ARTIFACT_CATEGORY,
        broad_category=GENERIC_KEY_CATEGORY,
        probability_offset=0.25,
        required_progression=minimum_progression,
    )
Exemplo n.º 11
0
def test_create_seeker_launcher(
    ammo_quantity: int,
    ammo_requires_major_item: bool,
    echoes_item_database,
    echoes_resource_database,
):
    # Setup
    missile = echoes_resource_database.get_item(44)
    missile_launcher = echoes_resource_database.get_item(73)
    seeker_launcher = echoes_resource_database.get_item(26)
    temporary = echoes_resource_database.get_item(71)

    state = MajorItemState(
        include_copy_in_original_location=False,
        num_shuffled_pickups=0,
        num_included_in_starting_items=0,
        included_ammo=(ammo_quantity, ),
    )

    # Run
    result = randovania.generator.item_pool.pickup_creator.create_major_item(
        echoes_item_database.major_items["Seeker Launcher"], state, True,
        echoes_resource_database,
        echoes_item_database.ammo["Missile Expansion"],
        ammo_requires_major_item)

    # Assert
    locked_conditional = (
        ConditionalResources("Seeker Launcher",
                             None,
                             resources=(
                                 (seeker_launcher, 1),
                                 (temporary, ammo_quantity),
                                 (echoes_resource_database.item_percentage, 1),
                             )),
        ConditionalResources("Seeker Launcher",
                             missile_launcher,
                             resources=(
                                 (seeker_launcher, 1),
                                 (missile, ammo_quantity),
                                 (echoes_resource_database.item_percentage, 1),
                             )),
    )
    normal_resources = (ConditionalResources(
        "Seeker Launcher",
        None,
        resources=(
            (seeker_launcher, 1),
            (missile, ammo_quantity),
            (echoes_resource_database.item_percentage, 1),
        )), )

    assert result == PickupEntry(
        name="Seeker Launcher",
        resources=locked_conditional
        if ammo_requires_major_item else normal_resources,
        model_index=25,
        item_category=ItemCategory.MISSILE,
        broad_category=ItemCategory.MISSILE_RELATED,
    )
Exemplo n.º 12
0
def test_decode_pickup(client: NetworkClient, echoes_resource_database,
                       generic_item_category):
    data = (
        "h^WxYK%Bzb%4P&bZe?<3c~o*?ZgXa3a!qe!b!=sZ&dS`%<kH75DmyE4E0aqZ0!yPSX#yJyqboamlgnXlAeaHwx"
        "y`|qjis5Tm5_m@(Ur7@&dS`%<kH75DmyE4E0aqZ0!yPSX#yJyqboamlgnXlAeaHwxy`|qjis5Tm5_m@(Ur6S-~"
    )
    expected_pickup = PickupEntry(
        name="The Name",
        model=PickupModel(
            game=RandovaniaGame.METROID_PRIME_ECHOES,
            name="EnergyTransferModule",
        ),
        item_category=generic_item_category,
        broad_category=generic_item_category,
        progression=tuple(),
    )

    # # Uncomment this to encode the data once again and get the new bytefield if it changed for some reason
    # from randovania.server.game_session import _base64_encode_pickup
    # new_data = _base64_encode_pickup(expected_pickup, echoes_resource_database)
    # assert new_data == data

    # Run
    pickup = _decode_pickup(data, echoes_resource_database)

    # Assert
    assert pickup == expected_pickup
Exemplo n.º 13
0
    def bit_pack_unpack(cls, decoder: BitPackDecoder, database: ResourceDatabase) -> PickupEntry:
        helper = DatabaseBitPackHelper(database)

        name = bitpacking.decode_string(decoder)
        model = PickupModel(
            game=RandovaniaGame.bit_pack_unpack(decoder, {}),
            name=bitpacking.decode_string(decoder),
        )
        item_category = ItemCategory.bit_pack_unpack(decoder, {})
        broad_category = ItemCategory.bit_pack_unpack(decoder, {})
        progression = bitpacking.decode_tuple(decoder, helper.decode_resource_quantity)
        extra_resources = bitpacking.decode_tuple(decoder, helper.decode_resource_quantity)
        unlocks_resource = bitpacking.decode_bool(decoder)
        resource_lock = None
        if bitpacking.decode_bool(decoder):
            resource_lock = helper.decode_resource_lock(decoder)
        respects_lock = bitpacking.decode_bool(decoder)
        probability_offset = BitPackFloat.bit_pack_unpack(decoder, _PROBABILITY_OFFSET_META)
        probability_multiplier = BitPackFloat.bit_pack_unpack(decoder, _PROBABILITY_MULTIPLIER_META)

        return PickupEntry(
            name=name,
            model=model,
            item_category=item_category,
            broad_category=broad_category,
            progression=progression,
            extra_resources=extra_resources,
            unlocks_resource=unlocks_resource,
            resource_lock=resource_lock,
            respects_lock=respects_lock,
            probability_offset=probability_offset,
            probability_multiplier=probability_multiplier,
        )
Exemplo n.º 14
0
def create_dark_temple_key(
    key_number: int,
    temple_index: int,
    resource_database: ResourceDatabase,
) -> PickupEntry:
    """
    Creates a Dark Temple Key
    :param key_number:
    :param temple_index: The index of the temple: Dark Agon, Dark Torvus, Hive Temple
    :param resource_database:
    :return:
    """
    TEMPLE_KEY_CATEGORY = ItemCategory(name="temple_key",
                                       long_name="",
                                       hint_details=("a ", "red Temple Key"),
                                       is_major=False,
                                       is_key=True)

    return PickupEntry(
        name=echoes_items.DARK_TEMPLE_KEY_NAMES[temple_index].format(
            key_number + 1),
        progression=((resource_database.get_item(
            echoes_items.DARK_TEMPLE_KEY_ITEMS[temple_index][key_number]),
                      1), ),
        model=PickupModel(
            game=resource_database.game_enum,
            name=echoes_items.DARK_TEMPLE_KEY_MODEL,
        ),
        item_category=TEMPLE_KEY_CATEGORY,
        broad_category=GENERIC_KEY_CATEGORY,
        probability_offset=3,
    )
Exemplo n.º 15
0
def test_add_pickup_to_state(state_game_data, empty_patches,
                             generic_item_category):
    # Starting State
    db = state_game_data.resource_database
    starting_node = state_game_data.world_list.resolve_teleporter_connection(
        empty_patches.game.starting_location)
    s = state.State(ResourceCollection(), (), 99, starting_node, empty_patches,
                    None, state_game_data)

    resource_a = db.item[0]
    resource_b = db.item[1]
    p = PickupEntry("B",
                    2,
                    generic_item_category,
                    generic_item_category,
                    progression=(
                        (resource_a, 1),
                        (resource_b, 1),
                    ))

    # Run
    state.add_pickup_to_state(s, p)
    state.add_pickup_to_state(s, p)

    # Assert
    assert s.resources == ResourceCollection.from_dict(db, {
        resource_a: 1,
        resource_b: 1,
    })
Exemplo n.º 16
0
def test_game_session_collect_pickup_for_self(
        mock_session_description: PropertyMock,
        mock_get_resource_database: MagicMock,
        mock_get_pickup_target: MagicMock, mock_emit: MagicMock, flask_app,
        two_player_session, echoes_resource_database):
    sio = MagicMock()
    sio.get_current_user.return_value = database.User.get_by_id(1234)

    pickup = PickupEntry(
        "A", 1, ItemCategory.TEMPLE_KEY, ItemCategory.KEY,
        (ConditionalResources(None, None,
                              ((echoes_resource_database.item[0], 1), )), ))
    mock_get_resource_database.return_value = echoes_resource_database
    mock_get_pickup_target.return_value = PickupTarget(pickup, 0)

    # Run
    with flask_app.test_request_context():
        result = game_session.game_session_collect_locations(sio, 1, (0, ))

    # Assert
    assert result is None
    mock_emit.assert_not_called()
    mock_get_pickup_target.assert_called_once_with(
        mock_session_description.return_value, 0, 0)
    with pytest.raises(peewee.DoesNotExist):
        database.GameSessionTeamAction.get(session=two_player_session,
                                           provider_row=0,
                                           provider_location_index=0)
Exemplo n.º 17
0
def test_decode_pickup(client, echoes_resource_database):
    data = (
        b'\x88\xa8\xd0\xca@\x9c\xc2\xda\xca\xcc\x08\x8a\xdc\xca\xe4\xce'
        b'\xf2\xa8\xe4\xc2\xdc\xe6\xcc\xca\xe4\x9a\xde\xc8\xea\xd8\xcaB\x00p')
    expected_pickup = PickupEntry(
        name="The Name",
        model=PickupModel(
            game=RandovaniaGame.PRIME2,
            name="EnergyTransferModule",
        ),
        item_category=ItemCategory.MOVEMENT,
        broad_category=ItemCategory.MOVEMENT,
        progression=tuple(),
    )

    # from randovania.bitpacking import bitpacking
    # from randovania.network_common.pickup_serializer import BitPackPickupEntry
    # new_data = bitpacking.pack_value(BitPackPickupEntry(expected_pickup, echoes_resource_database))
    # assert new_data == data

    # Run
    pickup = multiworld_client._decode_pickup(data, echoes_resource_database)

    # Assert
    assert pickup == expected_pickup
Exemplo n.º 18
0
def test_game_session_request_pickups_one_action(
        mock_session_description: PropertyMock,
        mock_get_resource_database: MagicMock,
        mock_get_pickup_target: MagicMock, flask_app, two_player_session,
        echoes_resource_database):
    # Setup
    sio = MagicMock()
    sio.get_current_user.return_value = database.User.get_by_id(1234)

    pickup = PickupEntry(
        "A", 1, ItemCategory.TEMPLE_KEY, ItemCategory.KEY,
        (ConditionalResources(None, None,
                              ((echoes_resource_database.item[0], 1), )), ))
    mock_get_pickup_target.return_value = PickupTarget(pickup=pickup, player=0)
    mock_get_resource_database.return_value = echoes_resource_database

    # Run
    result = game_session.game_session_request_pickups(sio, 1)

    # Assert
    mock_get_resource_database.assert_called_once_with(
        mock_session_description.return_value, 0)
    mock_get_pickup_target.assert_called_once_with(
        mock_session_description.return_value, 1, 0)
    assert result == [{'provider_name': 'Other Name', 'pickup': '6c8P51ON~'}]
Exemplo n.º 19
0
    def assign_pickup_to_starting_items(self, pickup: PickupEntry) -> "State":
        pickup_resources = ResourceCollection.from_resource_gain(
            self.resource_database,
            pickup.resource_gain(self.resources, force_lock=True))

        # Make sure there's no item percentage on starting items
        if self.resource_database.item_percentage is not None:
            pickup_resources.remove_resource(
                self.resource_database.item_percentage)

        new_resources = self.resources.duplicate()
        new_resources.add_resource_gain(pickup_resources.as_resource_gain())
        new_patches = self.patches.assign_extra_initial_items(
            pickup_resources.as_resource_gain())

        tank_delta = _energy_tank_difference(new_resources, self.resources,
                                             self.resource_database)

        return State(
            new_resources,
            self.collected_resource_nodes,
            self.energy + tank_delta * self.game_data.energy_per_tank,
            self.node,
            new_patches,
            self,
            self.game_data,
        )
Exemplo n.º 20
0
def create_energy_cell(
    cell_index: int,
    resource_database: ResourceDatabase,
) -> PickupEntry:
    ENERGY_CELL_CATEGORY = ItemCategory(name="energy_cell",
                                        long_name="",
                                        hint_details=("an ", "energy cell"),
                                        is_major=False,
                                        is_key=True)

    return PickupEntry(
        name=f"Energy Cell {cell_index + 1}",
        progression=((resource_database.get_item(
            corruption_items.ENERGY_CELL_ITEMS[cell_index]), 1), ),
        extra_resources=(
            (resource_database.get_item(
                corruption_items.ENERGY_CELL_TOTAL_ITEM), 1),
            (resource_database.item_percentage, 1),
        ),
        model=PickupModel(
            game=resource_database.game_enum,
            name=corruption_items.ENERGY_CELL_MODEL,
        ),
        item_category=ENERGY_CELL_CATEGORY,
        broad_category=GENERIC_KEY_CATEGORY,
        probability_offset=0.25,
    )
Exemplo n.º 21
0
def create_ammo_expansion(
    ammo: Ammo,
    ammo_count: Sequence[int],
    requires_major_item: bool,
    resource_database: ResourceDatabase,
) -> PickupEntry:
    """
    Creates a Pickup for an expansion of the given ammo.
    :param ammo:
    :param ammo_count:
    :param requires_major_item:
    :param resource_database:
    :return:
    """
    resources = [(resource_database.get_item(item), count)
                 for item, count in zip(ammo.items, ammo_count)]

    if resource_database.item_percentage is not None:
        resources.append((resource_database.item_percentage, 1))

    return PickupEntry(
        name=ammo.name,
        progression=(),
        extra_resources=tuple(resources),
        model=PickupModel(
            game=resource_database.game_enum,
            name=ammo.model_name,
        ),
        item_category=ammo.item_category,
        broad_category=ammo.broad_category,
        respects_lock=requires_major_item,
        resource_lock=ammo.create_resource_lock(resource_database),
        probability_multiplier=2,
    )
Exemplo n.º 22
0
def create_sky_temple_key(
    key_number: int,
    resource_database: ResourceDatabase,
) -> PickupEntry:
    """

    :param key_number:
    :param resource_database:
    :return:
    """
    SKY_TEMPLE_KEY_CATEGORY = ItemCategory(name="sky_temple_key",
                                           long_name="",
                                           hint_details=("a ",
                                                         "Sky Temple Key"),
                                           is_major=False,
                                           is_key=True)

    return PickupEntry(
        name="Sky Temple Key {}".format(key_number + 1),
        progression=((resource_database.get_item(
            echoes_items.SKY_TEMPLE_KEY_ITEMS[key_number]), 1), ),
        model=PickupModel(
            game=resource_database.game_enum,
            name=echoes_items.SKY_TEMPLE_KEY_MODEL,
        ),
        item_category=SKY_TEMPLE_KEY_CATEGORY,
        broad_category=GENERIC_KEY_CATEGORY,
        probability_offset=3,
    )
Exemplo n.º 23
0
    def assign_pickup_to_starting_items(self, pickup: PickupEntry) -> "State":
        pickup_resources = convert_resource_gain_to_current_resources(
            pickup.resource_gain(self.resources))

        # Make sure there's no item percentage on starting items
        pickup_resources.pop(self.resource_database.item_percentage, None)

        new_resources = copy.copy(self.resources)
        add_resources_into_another(new_resources, pickup_resources)
        new_patches = self.patches.assign_extra_initial_items(pickup_resources)

        if self.patches.game_specific is not None:
            energy_per_tank = self.patches.game_specific.energy_per_tank
        else:
            energy_per_tank = 100

        return State(
            new_resources,
            self.collected_resource_nodes,
            self.energy +
            _energy_tank_difference(new_resources, self.resources,
                                    self.resource_database) * energy_per_tank,
            self.node,
            new_patches,
            self,
            self.resource_database,
            self.world_list,
        )
Exemplo n.º 24
0
def create_pickup_hint(
    pickup_assignment: PickupAssignment,
    world_list: WorldList,
    precision: HintItemPrecision,
    target: Optional[PickupTarget],
    players_config: PlayersConfiguration,
    include_owner: bool,
) -> PickupHint:
    """

    :param pickup_assignment:
    :param world_list:
    :param precision:
    :param target:
    :param players_config:
    :param include_owner:
    :return:
    """
    if target is None:
        target = PickupTarget(
            pickup=PickupEntry(
                name="Energy Transfer Module",
                progression=tuple(),
                model=PickupModel(
                    game=RandovaniaGame.METROID_PRIME_ECHOES,
                    name="EnergyTransferModule",
                ),
                item_category=USELESS_ITEM_CATEGORY,
                broad_category=USELESS_ITEM_CATEGORY,
            ),
            player=players_config.player_index,
        )

    if precision is HintItemPrecision.GENERAL_CATEGORY:
        details = target.pickup.item_category.general_details

    elif precision is HintItemPrecision.PRECISE_CATEGORY:
        details = target.pickup.item_category.hint_details

    elif precision is HintItemPrecision.BROAD_CATEGORY:
        details = target.pickup.broad_category.hint_details

    elif precision is HintItemPrecision.DETAILED:
        details = _calculate_determiner(pickup_assignment, target.pickup,
                                        world_list), target.pickup.name

    elif precision is HintItemPrecision.NOTHING:
        details = "an ", "item"

    else:
        raise ValueError(f"Unknown precision: {precision}")

    determiner = Determiner(details[0])
    player = None

    if include_owner and players_config.is_multiworld:
        player = players_config.player_names[target.player]

    return PickupHint(determiner, player, details[1])
Exemplo n.º 25
0
def _make_pickup(item_category: ItemCategory):
    return PickupEntry(
        name="Pickup",
        model_index=0,
        item_category=item_category,
        broad_category=item_category,
        resources=(ConditionalResources(None, None, ()), ),
    )
Exemplo n.º 26
0
def _create_pickup_data(generic_item_category):
    resource_a = ItemResourceInfo(0, "A", "A", 10)
    resource_b = ItemResourceInfo(1, "B", "B", 10)
    return PickupEntry("Cake", 1, generic_item_category, generic_item_category,
                       progression=(
                           (resource_a, 1),
                           (resource_b, 1),
                       ))
Exemplo n.º 27
0
def add_pickup_to_state(state: State, pickup: PickupEntry):
    """
    Modifies inplace the given state, adding the resources of the given pickup
    :param state:
    :param pickup:
    :return:
    """
    add_resource_gain_to_current_resources(pickup.resource_gain(state.resources, force_lock=True), state.resources)
Exemplo n.º 28
0
def test_create_pickup_for(percentage: bool, echoes_resource_database):
    # Setup
    item_a = echoes_resource_database.get_item(10)
    item_b = echoes_resource_database.get_item(15)
    item_c = echoes_resource_database.get_item(18)
    ammo_a = echoes_resource_database.get_item(40)
    ammo_b = echoes_resource_database.get_item(42)

    major_item = MajorItem(
        name="The Item",
        item_category=ItemCategory.MORPH_BALL,
        broad_category=ItemCategory.MORPH_BALL_RELATED,
        model_name="SuperModel",
        progression=(10, 15, 18),
        ammo_index=(40, 42),
        required=False,
        original_index=None,
        probability_offset=5,
    )
    state = MajorItemState(
        include_copy_in_original_location=False,
        num_shuffled_pickups=0,
        num_included_in_starting_items=0,
        included_ammo=(10, 20),
    )

    if percentage:
        extra_resources = (
            (ammo_a, 10),
            (ammo_b, 20),
            (echoes_resource_database.item_percentage, 1),
        )
    else:
        extra_resources = (
            (ammo_a, 10),
            (ammo_b, 20),
        )

    # Run
    result = randovania.generator.item_pool.pickup_creator.create_major_item(major_item, state, percentage,
                                                                             echoes_resource_database,
                                                                             None, False)

    # Assert
    assert result == PickupEntry(
        name="The Item",
        model=PickupModel(echoes_resource_database.game_enum, "SuperModel"),
        progression=(
            (item_a, 1),
            (item_b, 1),
            (item_c, 1),
        ),
        extra_resources=extra_resources,
        item_category=ItemCategory.MORPH_BALL,
        broad_category=ItemCategory.MORPH_BALL_RELATED,
        probability_offset=5,
        respects_lock=False,
    )
Exemplo n.º 29
0
    def bit_pack_unpack(cls, decoder: BitPackDecoder, name: str,
                        database: ResourceDatabase) -> PickupEntry:
        model_index = decoder.decode_single(255)
        probability_offset = BitPackFloat.bit_pack_unpack(
            decoder, _PROBABILITY_OFFSET_META)
        probability_multiplier = BitPackFloat.bit_pack_unpack(
            decoder, _PROBABILITY_MULTIPLIER_META)
        item_category = ItemCategory.bit_pack_unpack(decoder, {})
        broad_category = ItemCategory.bit_pack_unpack(decoder, {})
        has_name = bitpacking.decode_bool(decoder)
        num_conditional = decoder.decode_single(
            MAXIMUM_PICKUP_CONDITIONAL_RESOURCES) + 1

        conditional_resources = []
        for i in range(num_conditional):
            item_name = None  # TODO: get the first resource name
            if i > 0:
                item_dependency = decoder.decode_element(database.item)
            else:
                item_dependency = None

            resources = []
            for _ in range(decoder.decode_single(MAXIMUM_PICKUP_RESOURCES +
                                                 1)):
                resource = decoder.decode_element(database.item)
                quantity = decoder.decode_single(255)
                resources.append((resource, quantity))

            if has_name:
                if bitpacking.decode_bool(decoder):
                    item_name = name
                else:
                    item_name = resources[0][0].long_name

            conditional_resources.append(
                ConditionalResources(
                    name=item_name,
                    item=item_dependency,
                    resources=tuple(resources),
                ))

        num_convert = decoder.decode_single(MAXIMUM_PICKUP_CONVERSION + 1)
        convert_resources = []
        for i in range(num_convert):
            source = decoder.decode_element(database.item)
            target = decoder.decode_element(database.item)
            convert_resources.append(ResourceConversion(source, target))

        return PickupEntry(
            name=name,
            model_index=model_index,
            item_category=item_category,
            broad_category=broad_category,
            resources=tuple(conditional_resources),
            convert_resources=tuple(convert_resources),
            probability_offset=probability_offset,
            probability_multiplier=probability_multiplier,
        )
Exemplo n.º 30
0
def _pickup(echoes_game_description) -> PickupEntry:
    resource = echoes_game_description.resource_database.energy_tank

    return PickupEntry(
        name="Pickup",
        model_index=0,
        item_category=ItemCategory.MOVEMENT,
        broad_category=ItemCategory.LIFE_SUPPORT,
        resources=(ConditionalResources(None, None, ((resource, 2), )), ),
    )