Esempio n. 1
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,
    }
Esempio n. 2
0
def _state_game_data() -> StateGameData:
    return StateGameData(
        Mock(energy_tank=ItemResourceInfo(42, "Energy Tank", "EnergyTank", 14,
                                          None),
             item_percentage=ItemResourceInfo(47, "Item Percentage",
                                              "Percentage", 255, None)), None,
        100)
Esempio n. 3
0
def test_multi_create_pickup_data_for_self(pickup_for_create_pickup_data):
    # Setup
    solo = pickup_exporter.PickupExporterSolo(
        pickup_exporter.GenericAcquiredMemo())
    creator = pickup_exporter.PickupExporterMulti(
        solo, MagicMock(), PlayersConfiguration(0, {
            0: "You",
            1: "Someone"
        }))
    model = MagicMock()
    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    resource_b = ItemResourceInfo(2, "B", "B", 10, None)

    # Run
    data = creator.create_details(
        PickupIndex(10), PickupTarget(pickup_for_create_pickup_data,
                                      0), pickup_for_create_pickup_data,
        PickupModelStyle.ALL_VISIBLE, "Scan Text", model)

    # Assert
    assert data == pickup_exporter.ExportedPickupDetails(
        index=PickupIndex(10),
        scan_text="Your Scan Text",
        hud_text=['A acquired!', 'B acquired!'],
        conditional_resources=[
            ConditionalResources("A", None, ((resource_a, 1), )),
            ConditionalResources("B", resource_a, ((resource_b, 1), )),
        ],
        conversion=[],
        model=model,
    )
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), )),
    ))
Esempio n. 5
0
def test_multi_create_pickup_data_for_other(pickup_for_create_pickup_data):
    # Setup
    multi = ItemResourceInfo(10, "Multiworld", "Multiworld", 30, None)
    solo = pickup_exporter.PickupExporterSolo(
        pickup_exporter.GenericAcquiredMemo())
    creator = pickup_exporter.PickupExporterMulti(
        solo, multi, PlayersConfiguration(0, {
            0: "You",
            1: "Someone"
        }))
    model = MagicMock()
    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    resource_b = ItemResourceInfo(2, "B", "B", 10, None)

    # Run
    data = creator.create_details(
        PickupIndex(10), PickupTarget(pickup_for_create_pickup_data,
                                      1), pickup_for_create_pickup_data,
        PickupModelStyle.ALL_VISIBLE, "Scan Text", model)

    # Assert
    assert data == pickup_exporter.ExportedPickupDetails(
        index=PickupIndex(10),
        scan_text="Someone's Scan Text",
        hud_text=['Sent Cake to Someone!'],
        conditional_resources=[
            ConditionalResources(None, None, ((multi, 11), )),
        ],
        conversion=[],
        model=model,
    )
Esempio 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}
def test_solo_create_pickup_data(pickup_for_create_pickup_data):
    # Setup
    creator = pickup_exporter.PickupExporterSolo(pickup_exporter.GenericAcquiredMemo())
    model = MagicMock()
    resource_a = ItemResourceInfo(0, "A", "A", 10)
    resource_b = ItemResourceInfo(1, "B", "B", 10)

    # Run
    data = creator.create_details(PickupIndex(10), PickupTarget(pickup_for_create_pickup_data, 0),
                                  pickup_for_create_pickup_data, PickupModelStyle.ALL_VISIBLE,
                                  "Scan Text", model)

    # Assert
    assert data == pickup_exporter.ExportedPickupDetails(
        index=PickupIndex(10),
        scan_text="Scan Text",
        hud_text=['A acquired!', 'B acquired!'],
        conditional_resources=[
            ConditionalResources("A", None, ((resource_a, 1),)),
            ConditionalResources("B", resource_a, ((resource_b, 1),)),
        ],
        conversion=[],
        model=model,
        other_player=False,
        original_pickup=pickup_for_create_pickup_data,
    )
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),
                       ))
Esempio n. 9
0
 def make_req(item_id: int):
     return RequirementAnd([
         ResourceRequirement(
             ItemResourceInfo("Scan Visor", "Scan", 1, frozendict({"item_id": 9})), 1, False,
         ),
         ResourceRequirement(
             ItemResourceInfo("Other", "Other", 1, frozendict({"item_id": item_id})), 1, False,
         ),
     ])
Esempio n. 10
0
def _logbook_node(request):
    has_translator = request.param
    scan_visor = ItemResourceInfo(1, "Scan", "S", 1, None)
    translator = ItemResourceInfo(2, "Translator", "T", 1, None)

    node = LogbookNode("Logbook", False, None, 0, 1000, scan_visor,
                       LoreType.LUMINOTH_LORE,
                       translator if has_translator else None, None)

    return has_translator, scan_visor, translator, node
Esempio n. 11
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,
                       progression=(
                           (resource_a, 1),
                           (resource_b, 1),
                       ))
Esempio n. 12
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"]
Esempio n. 13
0
def test_add_resource_gain_to_current_resources_convert(blank_pickup):
    # Setup
    resource_a = ItemResourceInfo("A", "A", 10, None)
    resource_b = ItemResourceInfo("B", "B", 10, None)

    pickup = dataclasses.replace(
        blank_pickup,
        progression=(),
        resource_lock=ResourceLock(resource_b, resource_b, resource_a),
        unlocks_resource=True,
    )
    current_resources = {resource_a: 5}

    # Run
    add_resource_gain_to_current_resources(
        pickup.resource_gain(current_resources), current_resources)

    # Assert
    assert current_resources == {resource_a: 0, resource_b: 5}
Esempio n. 14
0
def test_add_resource_gain_to_current_resources_convert():
    # Setup
    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    resource_b = ItemResourceInfo(2, "B", "B", 10, None)

    pickup = PickupEntry(name="P1",
                         model_index=1,
                         item_category=ItemCategory.SUIT,
                         broad_category=ItemCategory.LIFE_SUPPORT,
                         resources=(ConditionalResources(None, None, ()), ),
                         convert_resources=(ResourceConversion(
                             resource_a, resource_b), ))
    current_resources = {resource_a: 5}

    # Run
    add_resource_gain_to_current_resources(
        pickup.resource_gain(current_resources), current_resources)

    # Assert
    assert current_resources == {resource_a: 0, resource_b: 5}
Esempio n. 15
0
def test_add_pickup_to_state(database, patches):
    # Starting State
    s = state.State({}, (), 99, None, patches, None, database, None)

    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    resource_b = ItemResourceInfo(2, "B", "B", 10, None)
    p = PickupEntry("B", 2, ItemCategory.SUIT, ItemCategory.LIFE_SUPPORT, (
        ConditionalResources(None, None, ((resource_a, 1), )),
        ConditionalResources(None, resource_a, ((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,
    }
def test_calculate_hud_text(order: Tuple[str, str], generic_item_category):
    # Setup
    resource_a = ItemResourceInfo(0, "A", "A", 10)
    resource_b = ItemResourceInfo(1, "B", "B", 10)

    pickup_x = PickupEntry("A", 1, generic_item_category, generic_item_category,
                           progression=(
                               ((resource_a, 1),)
                           ))
    pickup_y = PickupEntry("Y", 2, generic_item_category, generic_item_category,
                           progression=(
                               (resource_b, 1),
                               (resource_a, 5),
                           ))
    pickup_z = PickupEntry("Z", 2, generic_item_category, generic_item_category,
                           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"]
Esempio n. 17
0
def test_extra_resources_maximum(generic_item_category):
    item = ItemResourceInfo("Item", "Item", 2, None)
    msg = "Attempt to give 5 of Item, more than max capacity"

    with pytest.raises(ValueError, match=msg):
        PickupEntry(name="broken",
                    model=PickupModel(RandovaniaGame.METROID_PRIME_ECHOES,
                                      "Nothing"),
                    item_category=generic_item_category,
                    broad_category=generic_item_category,
                    progression=(),
                    extra_resources=((item, 5), ))
Esempio n. 18
0
def _database() -> ResourceDatabase:
    return ResourceDatabase(game_enum=RandovaniaGame.PRIME2,
                            item=[
                                ItemResourceInfo(0, "A", "A", 1, None),
                                ItemResourceInfo(1, "B", "B", 1, None),
                                ItemResourceInfo(2, "C", "C", 1, None),
                            ],
                            event=[],
                            trick=[],
                            damage=[],
                            version=[],
                            misc=[
                                SimpleResourceInfo(0, "Trivial", "Trivial",
                                                   ResourceType.MISC),
                                SimpleResourceInfo(1, "Impossible",
                                                   "Impossible",
                                                   ResourceType.MISC),
                            ],
                            requirement_template={},
                            energy_tank_item_index=0,
                            item_percentage_index=0,
                            multiworld_magic_item_index=0)
Esempio n. 19
0
def _database() -> ResourceDatabase:
    return ResourceDatabase(
        game_enum=RandovaniaGame.METROID_PRIME_ECHOES,
        item=[
            ItemResourceInfo("A", "A", 1),
            ItemResourceInfo("B", "B", 1),
            ItemResourceInfo("C", "C", 1),
        ],
        event=[],
        trick=[],
        damage=[],
        version=[],
        misc=[
            SimpleResourceInfo("Trivial", "Trivial", ResourceType.MISC),
            SimpleResourceInfo("Impossible", "Impossible", ResourceType.MISC),
        ],
        requirement_template={},
        damage_reductions={},
        energy_tank_item_index="",
        item_percentage_index=None,
        multiworld_magic_item_index=None,
    )
Esempio n. 20
0
def test_collected_pickup_indices(database, patches):
    # Setup
    resources = {
        ItemResourceInfo(1, "A", "A", 50, None): 5,
        PickupIndex(1): 1,
        PickupIndex(15): 1
    }
    s = state.State(resources, (), 99, None, patches, None, database, None)

    # Run
    indices = list(s.collected_pickup_indices)

    # Assert
    assert indices == [PickupIndex(1), PickupIndex(15)]
Esempio n. 21
0
def test_state_with_pickup(database, patches):
    # Setup
    starting = state.State({}, (), 99, None, patches, None, database, None)

    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    p = PickupEntry("A", 2, ItemCategory.SUIT, ItemCategory.LIFE_SUPPORT,
                    (ConditionalResources(None, None, ((resource_a, 1), )), ))

    # Run
    final = state.state_with_pickup(starting, p)

    # Assert
    assert final.previous_state is starting
    assert final.resources == {resource_a: 1}
Esempio n. 22
0
async def test_session_self_update(client: NetworkClient):
    client._emit_with_result = AsyncMock()
    client._current_game_session_meta = MagicMock()
    client._current_game_session_meta.id = 1234

    inventory: Inventory = {
        ItemResourceInfo(33, "None", "None", 1): InventoryItem(1, 1)
    }

    await client.session_self_update(inventory, GameConnectionStatus.InGame,
                                     MemoryExecutorChoice.DOLPHIN)

    client._emit_with_result.assert_awaited_once_with(
        "game_session_self_update",
        (1234, b'\x01None\x00\x01\x01', "In-game (Dolphin)"))
Esempio n. 23
0
def test_add_pickup_to_state(state_game_data, empty_patches):
    # Starting State
    s = 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("B",
                    2,
                    ItemCategory.SUIT,
                    ItemCategory.LIFE_SUPPORT,
                    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,
    }
Esempio n. 24
0
def test_sky_temple_key_distribution_logic_all_guardians_valid(
        echoes_resource_database):
    # Run
    results = sky_temple_keys.add_sky_temple_key_distribution_logic(
        echoes_resource_database, LayoutSkyTempleKeyMode.ALL_GUARDIANS)
    item_pool, pickup_assignment, initial_items = results

    # Assert
    assert item_pool == []
    assert initial_items == {
        ItemResourceInfo(f'Sky Temple Key {i}', f'TempleKey{i}', 1,
                         frozendict({"item_id": item_ids[i - 1]})): 1
        for i in range(4, 10)
    }
    assert list(pickup_assignment.keys()) == sky_temple_keys._GUARDIAN_INDICES
Esempio n. 25
0
def test_assign_pickup_to_starting_items(patches, database):
    # Setup

    starting = state.State({}, (), 99, None, patches, None, database, None)

    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,
                    resources=(ConditionalResources(None, None, (
                        (resource_a, 5),
                        (database.item_percentage, 1),
                    )), ),
                    convert_resources=(ResourceConversion(
                        resource_b, resource_a), ))

    # 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}
Esempio n. 26
0
def test_collected_pickup_indices(state_game_data, empty_patches):
    # Setup
    resources = {
        ItemResourceInfo("A", "A", 50, None): 5,
        PickupIndex(1): 1,
        PickupIndex(15): 1
    }
    s = state.State(resources, (), 99, None, empty_patches, None,
                    state_game_data)

    # Run
    indices = list(s.collected_pickup_indices)

    # Assert
    assert indices == [PickupIndex(1), PickupIndex(15)]
def test_sky_temple_key_distribution_logic_all_guardians_valid(
        echoes_resource_database):
    # Run
    results = sky_temple_keys.add_sky_temple_key_distribution_logic(
        echoes_resource_database, LayoutSkyTempleKeyMode.ALL_GUARDIANS)
    item_pool, pickup_assignment, initial_items = results

    # Assert
    assert item_pool == []
    assert initial_items == {
        ItemResourceInfo(
            randovania.games.prime.echoes_items.SKY_TEMPLE_KEY_ITEMS[i - 1],
            f'Sky Temple Key {i}', f'TempleKey{i}', 1, None): 1
        for i in range(4, 10)
    }
    assert list(pickup_assignment.keys()) == sky_temple_keys._GUARDIAN_INDICES
Esempio n. 28
0
def test_sort_resource_requirement():
    resources = [
        NodeIdentifier.create("World", "Area", "Node"),
        PickupIndex(10),
        _make_resource("Resource"),
        TrickResourceInfo("Trick", "Trick", "Long Description"),
        ItemResourceInfo("Item", "Item", 1),
    ]

    # Assert resources has an entry for every type of ResourceInfo
    assert {type(it) for it in resources} == set(ResourceInfo.__args__)
    assert len(resources) == len(ResourceInfo.__args__)

    requirements = [ResourceRequirement.simple(it) for it in resources]

    result = sorted(requirements)
    assert result == list(reversed(requirements))
Esempio n. 29
0
def test_state_with_pickup(state_game_data, empty_patches):
    # Setup
    starting = state.State({}, (), 99, None, empty_patches, None,
                           state_game_data)

    resource_a = ItemResourceInfo(1, "A", "A", 10, None)
    p = PickupEntry("A",
                    2,
                    ItemCategory.SUIT,
                    ItemCategory.LIFE_SUPPORT,
                    progression=((resource_a, 1), ))

    # Run
    final = state.state_with_pickup(starting, p)

    # Assert
    assert final.previous_state is starting
    assert final.resources == {resource_a: 1}
Esempio n. 30
0
def test_sky_temple_key_distribution_logic_with_quantity(
        echoes_resource_database, quantity: int):
    # Run
    results = sky_temple_keys.add_sky_temple_key_distribution_logic(
        echoes_resource_database, LayoutSkyTempleKeyMode(quantity))
    item_pool, pickup_assignment, initial_items = results

    # Assert
    assert item_pool == [
        pickup_creator.create_sky_temple_key(i, echoes_resource_database)
        for i in range(quantity)
    ]
    assert pickup_assignment == {}
    assert initial_items == {
        ItemResourceInfo(f'Sky Temple Key {i}', f'TempleKey{i}', 1,
                         frozendict({"item_id": item_ids[i - 1]})): 1
        for i in range(quantity + 1, 10)
    }