def can_travel_to_system_and_return_to_resupply(fleet_id, from_system_target, to_system_target): """ Filter systems where fleet can travel from starting system. # TODO rename function :param fleet_id: :type fleet_id: int :param from_system_target: :type from_system_target: universe_object.System :param to_system_target: :type to_system_target: universe_object.System :return: :rtype: list """ system_targets = [] if not from_system_target.id == to_system_target.id: fleet_supplyable_system_ids = fo.getEmpire().fleetSupplyableSystemIDs fuel = int(FleetUtilsAI.get_fuel(fleet_id)) # int to get actual number of jumps max_fuel = int(FleetUtilsAI.get_max_fuel(fleet_id)) # try to find path without going resupply first supply_system_target = get_nearest_supplied_system(to_system_target.id) system_targets = __find_path_with_fuel_to_system_with_possible_return(from_system_target, to_system_target, system_targets, fleet_supplyable_system_ids, max_fuel, fuel, supply_system_target) # resupply in system first is required to find path if from_system_target.id not in fleet_supplyable_system_ids and not system_targets: # add supply system to visit from_system_target = get_nearest_supplied_system(from_system_target.id) system_targets.append(from_system_target) # find path from supplied system to wanted system system_targets = __find_path_with_fuel_to_system_with_possible_return(from_system_target, to_system_target, system_targets, fleet_supplyable_system_ids, max_fuel, max_fuel, supply_system_target) return system_targets
def can_travel_to_system_and_return_to_resupply(fleet_id, from_system_target, to_system_target): """ Filter systems where fleet can travel from starting system. # TODO rename function :param fleet_id: :type fleet_id: int :param from_system_target: :type from_system_target: universe_object.System :param to_system_target: :type to_system_target: universe_object.System :return: :rtype: list """ system_targets = [] if not from_system_target.id == to_system_target.id: fleet_supplyable_system_ids = fo.getEmpire().fleetSupplyableSystemIDs fuel = int(FleetUtilsAI.get_fuel(fleet_id)) # int to get actual number of jumps max_fuel = int(FleetUtilsAI.get_max_fuel(fleet_id)) # try to find path without going resupply first supply_system_target = get_nearest_supplied_system(to_system_target.id) system_targets = __find_path_with_fuel_to_system_with_possible_return(from_system_target, to_system_target, system_targets, fleet_supplyable_system_ids, max_fuel, fuel, supply_system_target) # resupply in system first is required to find path if from_system_target.id not in fleet_supplyable_system_ids and not system_targets: # add supply system to visit from_system_target = get_nearest_supplied_system(from_system_target.id) system_targets.append(from_system_target) # find path from supplied system to wanted system system_targets = __find_path_with_fuel_to_system_with_possible_return(from_system_target, to_system_target, system_targets, fleet_supplyable_system_ids, max_fuel, max_fuel, supply_system_target) return system_targets
def can_travel_to_system(fleet_id, from_system_target, to_system_target, ensure_return=False): """ Return list systems to be visited. :param fleet_id: :type fleet_id: int :param from_system_target: :type from_system_target: universe_object.System :param to_system_target: :type to_system_target: universe_object.System :param ensure_return: :type ensure_return: bool :return: :rtype: list """ empire = fo.getEmpire() empire_id = empire.empireID fleet_supplyable_system_ids = set(empire.fleetSupplyableSystemIDs) # get current fuel and max fuel universe = fo.getUniverse() fuel = int(FleetUtilsAI.get_fuel(fleet_id)) # round down to get actually number of jumps if fuel < 1.0 or from_system_target.id == to_system_target.id: return [] if True: # TODO: sort out if shortestPath leaves off some intermediate destinations path_func = universe.leastJumpsPath else: path_func = universe.shortestPath start_sys_id = from_system_target.id target_sys_id = to_system_target.id if start_sys_id != INVALID_ID and target_sys_id != INVALID_ID: short_path = list(path_func(start_sys_id, target_sys_id, empire_id)) else: short_path = [] legs = zip(short_path[:-1], short_path[1:]) # suppliedStops = [ sid for sid in short_path if sid in fleet_supplyable_system_ids ] # unsupplied_stops = [sid for sid in short_path if sid not in suppliedStops ] unsupplied_stops = [sys_b for sys_a, sys_b in legs if ((sys_a not in fleet_supplyable_system_ids) and (sys_b not in fleet_supplyable_system_ids))] # print "getting path from %s to %s "%(ppstring(PlanetUtilsAI.sys_name_ids([ start_sys_id ])), ppstring(PlanetUtilsAI.sys_name_ids([ target_sys_id ])) ), # print " ::: found initial path %s having suppliedStops %s and unsupplied_stops %s ; tot fuel available is %.1f"%( ppstring(PlanetUtilsAI.sys_name_ids( short_path[:])), suppliedStops, unsupplied_stops, fuel) if False: if target_sys_id in fleet_supplyable_system_ids: print "target has FleetSupply" elif target_sys_id in ColonisationAI.annexable_ring1: print "target in Ring 1" elif target_sys_id in ColonisationAI.annexable_ring2 and foAI.foAIstate.character.may_travel_beyond_supply(2): print "target in Ring 2, has enough aggression" elif target_sys_id in ColonisationAI.annexable_ring3 and foAI.foAIstate.character.may_travel_beyond_supply(3): print "target in Ring 2, has enough aggression" if (not unsupplied_stops or not ensure_return or target_sys_id in fleet_supplyable_system_ids and len(unsupplied_stops) <= fuel or target_sys_id in ColonisationAI.annexable_ring1 and len(unsupplied_stops) < fuel or target_sys_id in ColonisationAI.annexable_ring2 and foAI.foAIstate.character.may_travel_beyond_supply(2) and len(unsupplied_stops) < fuel - 1 or target_sys_id in ColonisationAI.annexable_ring3 and foAI.foAIstate.character.may_travel_beyond_supply(3) and len(unsupplied_stops) < fuel - 2): return [universe_object.System(sid) for sid in short_path] else: # print " getting path from 'can_travel_to_system_and_return_to_resupply' ", return can_travel_to_system_and_return_to_resupply(fleet_id, from_system_target, to_system_target)
def can_travel_to_system(fleet_id, from_system_target, to_system_target, ensure_return=False): """ Return list systems to be visited. :param fleet_id: :type fleet_id: int :param from_system_target: :type from_system_target: universe_object.System :param to_system_target: :type to_system_target: universe_object.System :param ensure_return: :type ensure_return: bool :return: :rtype: list """ empire = fo.getEmpire() empire_id = empire.empireID fleet_supplyable_system_ids = set(empire.fleetSupplyableSystemIDs) # get current fuel and max fuel universe = fo.getUniverse() fuel = int(FleetUtilsAI.get_fuel(fleet_id)) # round down to get actually number of jumps if fuel < 1.0 or from_system_target.id == to_system_target.id: return [] if True: # TODO: sort out if shortestPath leaves off some intermediate destinations path_func = universe.leastJumpsPath else: path_func = universe.shortestPath start_sys_id = from_system_target.id target_sys_id = to_system_target.id if start_sys_id != INVALID_ID and target_sys_id != INVALID_ID: short_path = list(path_func(start_sys_id, target_sys_id, empire_id)) else: short_path = [] legs = zip(short_path[:-1], short_path[1:]) # suppliedStops = [ sid for sid in short_path if sid in fleet_supplyable_system_ids ] # unsupplied_stops = [sid for sid in short_path if sid not in suppliedStops ] unsupplied_stops = [sys_b for sys_a, sys_b in legs if ((sys_a not in fleet_supplyable_system_ids) and (sys_b not in fleet_supplyable_system_ids))] # print "getting path from %s to %s "%(ppstring(PlanetUtilsAI.sys_name_ids([ start_sys_id ])), ppstring(PlanetUtilsAI.sys_name_ids([ target_sys_id ])) ), # print " ::: found initial path %s having suppliedStops %s and unsupplied_stops %s ; tot fuel available is %.1f"%( ppstring(PlanetUtilsAI.sys_name_ids( short_path[:])), suppliedStops, unsupplied_stops, fuel) if False: if target_sys_id in fleet_supplyable_system_ids: print "target has FleetSupply" elif target_sys_id in ColonisationAI.annexable_ring1: print "target in Ring 1" elif target_sys_id in ColonisationAI.annexable_ring2 and foAI.foAIstate.character.may_travel_beyond_supply(2): print "target in Ring 2, has enough aggression" elif target_sys_id in ColonisationAI.annexable_ring3 and foAI.foAIstate.character.may_travel_beyond_supply(3): print "target in Ring 2, has enough aggression" if (not unsupplied_stops or not ensure_return or target_sys_id in fleet_supplyable_system_ids and len(unsupplied_stops) <= fuel or target_sys_id in ColonisationAI.annexable_ring1 and len(unsupplied_stops) < fuel or target_sys_id in ColonisationAI.annexable_ring2 and foAI.foAIstate.character.may_travel_beyond_supply(2) and len(unsupplied_stops) < fuel - 1 or target_sys_id in ColonisationAI.annexable_ring3 and foAI.foAIstate.character.may_travel_beyond_supply(3) and len(unsupplied_stops) < fuel - 2): return [universe_object.System(sid) for sid in short_path] else: # print " getting path from 'can_travel_to_system_and_return_to_resupply' ", return can_travel_to_system_and_return_to_resupply(fleet_id, from_system_target, to_system_target)