def _compare_actions(
    first_reach: GeneratorReach,
    second_reach: GeneratorReach,
) -> Tuple[List[ResourceNode], List[ResourceNode]]:
    first_actions = get_collectable_resource_nodes_of_reach(first_reach)
    second_actions = get_collectable_resource_nodes_of_reach(second_reach)
    assert set(first_actions) == set(second_actions)

    return first_actions, second_actions
Beispiel #2
0
    def _calculate_potential_actions(self):
        progression_pickups = _calculate_progression_pickups(self.pickups_left, self.reach)
        print_retcon_loop_start(self.game, self.pickups_left, self.reach, self.index)

        uncollected_resource_nodes = get_collectable_resource_nodes_of_reach(self.reach)
        self._unfiltered_potential_actions = list(progression_pickups)
        self._unfiltered_potential_actions.extend(uncollected_resource_nodes)
Beispiel #3
0
def print_actions_of_reach(reach: GeneratorReach):
    if _DEBUG_LEVEL <= 1:
        return

    game = reach.game
    actions = get_collectable_resource_nodes_of_reach(reach)

    for action in actions:
        print("++ Safe? {1} -- {0} -- Dangerous? {2}".format(
            game.world_list.node_name(action), reach.is_safe_node(action),
            action.resource() in game.dangerous_resources))
Beispiel #4
0
    def _calculate_potential_actions(self):
        uncollected_resource_nodes = get_collectable_resource_nodes_of_reach(
            self.reach)
        if self.configuration.multi_pickup_placement:
            get_pickups = get_pickups_that_solves_unreachable
        else:
            get_pickups = get_pickups_with_interesting_resources
        pickups = get_pickups(self.pickups_left, self.reach,
                              uncollected_resource_nodes)
        print_retcon_loop_start(self.game, self.pickups_left, self.reach,
                                self.index)

        self._unfiltered_potential_actions = list(pickups)
        self._unfiltered_potential_actions.extend(uncollected_resource_nodes)
Beispiel #5
0
def _calculate_potential_actions(reach: GeneratorReach,
                                 progression_pickups: Tuple[PickupEntry, ...],
                                 current_uncollected: UncollectedState,
                                 free_starting_items_spots: int,
                                 status_update: Callable[[str], None]):
    actions_weights: Dict[Action, float] = {}
    uncollected_resource_nodes = get_collectable_resource_nodes_of_reach(reach)
    total_options = len(uncollected_resource_nodes)
    options_considered = 0

    def update_for_option():
        nonlocal options_considered
        options_considered += 1
        status_update("Checked {} of {} options.".format(
            options_considered, total_options))

    usable_progression_pickups = [
        progression for progression in progression_pickups
        if _items_for_pickup(progression) <= len(current_uncollected.indices)
        or (not uncollected_resource_nodes
            and _items_for_pickup(progression) <= free_starting_items_spots)
    ]

    total_options += len(usable_progression_pickups)

    for progression in usable_progression_pickups:
        actions_weights[progression] = _calculate_weights_for(
            _calculate_reach_for_progression(reach,
                                             progression), current_uncollected,
            progression.name) + progression.probability_offset
        update_for_option()

    for resource in uncollected_resource_nodes:
        actions_weights[resource] = _calculate_weights_for(
            advance_to_with_reach_copy(reach,
                                       reach.state.act_on_node(resource)),
            current_uncollected, resource.name)
        update_for_option()

    if debug.debug_level() > 1:
        for action, weight in actions_weights.items():
            print("{} - {}".format(action.name, weight))

    return actions_weights
Beispiel #6
0
    def _calculate_potential_actions(self):
        current_uncollected = UncollectedState.from_reach(self.reach)
        progression_pickups = _calculate_progression_pickups(
            self.pickups_left, self.reach)

        print_retcon_loop_start(current_uncollected, self.game,
                                self.pickups_left, self.reach, self.index)

        free_starting_items_spots = (
            self.configuration.maximum_random_starting_items -
            self.num_random_starting_items_placed)

        uncollected_resource_nodes = get_collectable_resource_nodes_of_reach(
            self.reach)
        result: List[Action] = [
            progression for progression in progression_pickups if
            _items_for_pickup(progression) <= len(current_uncollected.indices)
            or (not uncollected_resource_nodes and
                _items_for_pickup(progression) <= free_starting_items_spots)
        ]
        result.extend(uncollected_resource_nodes)
        self.potential_actions = result