def pickups_to_solve_list(pickup_pool: List[PickupEntry], requirement_list: RequirementList, state: State): pickups = [] resources = copy.copy(state.resources) pickups_for_this = list(pickup_pool) for individual in sorted(requirement_list.values()): if individual.satisfied(resources, state.energy): continue # FIXME: this picks Dark Beam to provide Dark Ammo # Create another copy of the list so we can remove elements while iterating for pickup in list(pickups_for_this): new_resources = resource_info.convert_resource_gain_to_current_resources( pickup.resource_gain(resources)) pickup_progression = resource_info.convert_resource_gain_to_current_resources( pickup.progression) if new_resources.get(individual.resource, 0) + pickup_progression.get( individual.resource, 0) > 0: pickups.append(pickup) pickups_for_this.remove(pickup) resource_info.add_resources_into_another( resources, new_resources) if individual.satisfied(resources, state.energy): break if not individual.satisfied(resources, state.energy): return None return pickups
def _replace(alternative: RequirementList) -> RequirementList: if alternative.get(resource) is not None: return RequirementList.without_misc_resources( database=database, items=[ (individual if individual.resource != database.difficulty_resource else IndividualRequirement(database.difficulty_resource, new_difficulty, False)) for individual in alternative.values() ] ) else: return alternative
def _has_trick(alternative: RequirementList) -> bool: return any(individual.resource.resource_type == ResourceType.TRICK for individual in alternative.values())
def write_requirement_list(requirement_list: RequirementList) -> list: return [ write_individual_requirement(individual) for individual in sorted(requirement_list.values()) ]