Пример #1
0
def interesting_resources_for_reach(
        reach: GeneratorReach) -> FrozenSet[ResourceInfo]:
    satisfiable_requirements: FrozenSet[RequirementList] = frozenset(
        itertools.chain.from_iterable(
            requirements.alternatives for requirements in
            reach.unreachable_nodes_with_requirements().values()))
    return game_description.calculate_interesting_resources(
        satisfiable_requirements, reach.state.resources, reach.state.energy,
        reach.state.resource_database)
Пример #2
0
    def satisfiable_actions(self, state: State) -> Iterator[ResourceNode]:

        if self._satisfiable_requirements:
            # print(" > interesting_resources from {} satisfiable_requirements".format(len(satisfiable_requirements)))
            interesting_resources = calculate_interesting_resources(
                self._satisfiable_requirements, state.resources,
                state.resource_database)

            # print(" > satisfiable actions, with {} interesting resources".format(len(interesting_resources)))
            for action in self.possible_actions(state):
                for resource, amount in action.resource_gain_on_collect(
                        state.patches):
                    if resource in interesting_resources:
                        yield action
                        break
Пример #3
0
def _calculate_progression_pickups(
    pickups_left: Dict[str, PickupEntry],
    reach: GeneratorReach,
) -> Tuple[PickupEntry, ...]:
    satisfiable_requirements: FrozenSet[RequirementList] = frozenset(
        itertools.chain.from_iterable(
            requirements.alternatives for requirements in
            reach.unreachable_nodes_with_requirements().values()))
    interesting_resources = calculate_interesting_resources(
        satisfiable_requirements, reach.state.resources,
        reach.state.resource_database)
    progression_pickups = tuple(
        pickup for pickup in pickups_left.values()
        if _resources_in_resource_gain(pickup.resource_gain()).intersection(
            interesting_resources))
    return progression_pickups
Пример #4
0
    def satisfiable_actions(self,
                            state: State,
                            victory_condition: Requirement,
                            ) -> Iterator[Tuple[ResourceNode, int]]:

        interesting_resources = calculate_interesting_resources(
            self._satisfiable_requirements.union(victory_condition.as_set(state.resource_database).alternatives),
            state.resources,
            state.energy,
            state.resource_database)

        # print(" > satisfiable actions, with {} interesting resources".format(len(interesting_resources)))
        for action, energy in self.possible_actions(state):
            for resource, amount in action.resource_gain_on_collect(state.node_context()):
                if resource in interesting_resources:
                    yield action, energy
                    break
Пример #5
0
def _calculate_progression_pickups(pickups_left: Iterator[PickupEntry],
                                   reach: GeneratorReach,
                                   ) -> Tuple[PickupEntry, ...]:
    satisfiable_requirements: FrozenSet[RequirementList] = frozenset(itertools.chain.from_iterable(
        requirements.alternatives
        for requirements in reach.unreachable_nodes_with_requirements().values()
    ))
    interesting_resources = calculate_interesting_resources(
        satisfiable_requirements,
        reach.state.resources,
        reach.state.energy,
        reach.state.resource_database
    )

    progression_pickups = []

    for pickup in pickups_left:
        if pickup in progression_pickups:
            continue
        if _resources_in_pickup(pickup, reach.state.resources).intersection(interesting_resources):
            progression_pickups.append(pickup)

    return tuple(progression_pickups)