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)
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
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
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
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)