def test_database_collectable(preset_manager, game_enum, preset_name, ignore_events, ignore_pickups): game, initial_state, permalink = run_bootstrap( preset_manager.included_preset_with(game_enum, preset_name).get_preset()) all_pickups = set(filter_pickup_nodes(game.world_list.all_nodes)) pool_results = pool_creator.calculate_pool_results( permalink.get_preset(0).configuration, game.resource_database) add_resources_into_another(initial_state.resources, pool_results.initial_resources) for pickup in pool_results.pickups: add_pickup_to_state(initial_state, pickup) for pickup in pool_results.assignment.values(): add_pickup_to_state(initial_state, pickup) for trick in game.resource_database.trick: initial_state.resources[trick] = LayoutTrickLevel.maximum().as_number expected_events = [ event for event in game.resource_database.event if event.index not in ignore_events ] expected_pickups = sorted(it.pickup_index for it in all_pickups if it.pickup_index.index not in ignore_pickups) reach = _create_reach_with_unsafe(game, initial_state.heal()) while list(collectable_resource_nodes(reach.nodes, reach)): reach.act_on(next(iter(collectable_resource_nodes(reach.nodes, reach)))) reach = advance_reach_with_possible_unsafe_resources(reach) # print("\nCurrent reach:") # for world in game.world_list.worlds: # print(f"\n>> {world.name}") # for node in world.all_nodes: # print("[{!s:>5}, {!s:>5}, {!s:>5}] {}".format( # reach.is_reachable_node(node), reach.is_safe_node(node), # reach.state.resources.get(node.resource(), 0) > 0 if isinstance(node, ResourceNode) else "", # game.world_list.node_name(node))) collected_indices = { resource for resource, quantity in reach.state.resources.items() if quantity > 0 and isinstance(resource, PickupIndex) } collected_events = { resource for resource, quantity in reach.state.resources.items() if quantity > 0 and resource.resource_type == ResourceType.EVENT } assert list(collectable_resource_nodes(reach.nodes, reach)) == [] assert sorted(collected_indices) == expected_pickups assert sorted(collected_events, key=lambda it: it.index) == expected_events
def from_reach(cls, reach: GeneratorReach) -> "UncollectedState": return UncollectedState( set(_filter_not_in_dict(reach.state.collected_pickup_indices, reach.state.patches.pickup_assignment)), set(_filter_not_in_dict(reach.state.collected_scan_assets, reach.state.patches.hints)), set(collectable_resource_nodes(reach.connected_nodes, reach)) )