def log_planets(): universe = fo.get_universe() planets_table = Table( [Text('id'), Text('name'), Text('system'), Text('type'), Sequence('specials'), Text('species'), Sequence('buildings')], table_name='Planets summary') # group planets by system for sid in fo.get_systems(): for pid in fo.sys_get_planets(sid): planet = universe.getPlanet(pid) planet_type = fo.planet_get_type(pid).name planet_size = fo.planet_get_size(pid).name if planet_type != planet_size: planet_type = '%s %s' % (planet_type, planet_size) buildings = [universe.getBuilding(x).name for x in planet.buildingIDs] planets_table.add_row([ pid, planet.name, planet.systemID, planet_type, list(planet.specials), planet.speciesName, buildings ]) # Printing too much info at once will lead to truncation of text for line in planets_table.get_table().split('\n'): print line
def log_planets(): universe = fo.get_universe() planets_table = Table([ Text('id'), Text('name'), Text('system'), Text('type'), Sequence('specials'), Text('species'), Sequence('buildings') ], table_name='Planets summary') # group planets by system for sid in fo.get_systems(): for pid in fo.sys_get_planets(sid): planet = universe.getPlanet(pid) planet_type = fo.planet_get_type(pid).name planet_size = fo.planet_get_size(pid).name if planet_type != planet_size: planet_type = '%s %s' % (planet_type, planet_size) buildings = [ universe.getBuilding(x).name for x in planet.buildingIDs ] planets_table.add_row([ pid, planet.name, planet.systemID, planet_type, list(planet.specials), planet.speciesName, buildings ]) # Printing too much info at once will lead to truncation of text for line in planets_table.get_table().split('\n'): print line
def log_planet_type_summary(sys_list): planet_type_summary = {k: 0 for k in planets.planet_types} for system in sys_list: for planet in fo.sys_get_planets(system): planet_type_summary[fo.planet_get_type(planet)] += 1 planet_total = sum(planet_type_summary.values()) print "Planet Type Summary for a total of %d placed planets" % planet_total for planet_type, planet_count in planet_type_summary.items(): print "%-12s %4.1f%%" % (planet_type.name, 100.0 * planet_count / planet_total)
def count_planets_in_systems(systems, planet_types_filter=HS_ACCEPTABLE_PLANET_TYPES): """ Return the total number of planets in the specified group of systems, only count the planet types specified in planet_types_filter. """ num_planets = 0 for system in systems: num_planets += len([p for p in fo.sys_get_planets(system) if fo.planet_get_type(p) in planet_types_filter]) return num_planets
def log_planet_type_summary(sys_list): planet_type_summary_table = {k: 0 for k in planets.planet_types} for system in sys_list: for planet in fo.sys_get_planets(system): planet_type_summary_table[fo.planet_get_type(planet)] += 1 planet_total = sum(planet_type_summary_table.values()) type_summary_table = Table( [Text('planet type', align='<'), Float('% of planets', precession=1)], table_name='Planet Type Summary for a total of %d placed planets' % planet_total ) for planet_type, planet_count in sorted(planet_type_summary_table.items()): type_summary_table.add_row((planet_type.name, 100.0 * planet_count / planet_total)) print(type_summary_table) print()
def log_planet_type_summary(sys_list): planet_type_summary_table = {k: 0 for k in planets.planet_types} for system in sys_list: for planet in fo.sys_get_planets(system): planet_type_summary_table[fo.planet_get_type(planet)] += 1 planet_total = sum(planet_type_summary_table.values()) type_summary_table = Table( [Text('planet type', align='<'), Float('% of planets', precession=1)], table_name='Planet Type Summary for a total of %d placed planets' % planet_total ) for planet_type, planet_count in sorted(planet_type_summary_table.items()): type_summary_table.add_row((planet_type.name, 100.0 * planet_count / planet_total)) print type_summary_table print
def log_planet_type_summary(sys_list): planet_type_summary_table = {k: 0 for k in planets.planet_types} for system in sys_list: for planet in fo.sys_get_planets(system): planet_type_summary_table[fo.planet_get_type(planet)] += 1 planet_total = sum(planet_type_summary_table.values()) type_summary_table = Table( Text("planet type", align="<"), Number("% of planets", precession=1), table_name="Planet Type Summary for a total of %d placed planets" % planet_total, ) for planet_type, planet_count in sorted(planet_type_summary_table.items()): type_summary_table.add_row( planet_type.name, 100.0 * planet_count / planet_total, ) type_summary_table.print_table(print) print()
def name_planets(system): """ Sets the names of the planets of the specified system. Planet name is system name + planet number (as roman number) unless it's an asteroid belt, in that case name is system name + 'asteroid belt' (localized). """ planet_number = 1 # iterate over all planets in the system for planet in fo.sys_get_planets(system): # use different naming methods for "normal" planets and asteroid belts if fo.planet_get_type(planet) == fo.planetType.asteroids: # get localized text from stringtable name = fo.user_string("PL_ASTEROID_BELT_OF_SYSTEM") # %1% parameter in the localized string is the system name name = name.replace("%1%", fo.get_name(system)) else: # set name to system name + planet number as roman number... name = fo.get_name(system) + " " + fo.roman_number(planet_number) # ...and increase planet number planet_number += 1 # do the actual renaming fo.set_name(planet, name)
def log_planets(): universe = fo.get_universe() planets_table = Table( Text("id"), Text("name"), Text("system"), Text("type"), Sequence("specials"), Text("species"), Sequence("buildings"), table_name="Planets summary", ) # group planets by system for sid in fo.get_systems(): for pid in fo.sys_get_planets(sid): planet = universe.getPlanet(pid) planet_type = fo.planet_get_type(pid).name planet_size = fo.planet_get_size(pid).name if planet_type != planet_size: planet_type = "%s %s" % (planet_type, planet_size) buildings = [ universe.getBuilding(x).name for x in planet.buildingIDs ] planets_table.add_row( pid, planet.name, planet.systemID, planet_type, list(planet.specials), planet.speciesName, buildings, ) planets_table.print_table(print)
def generate_natives(native_freq, systems, empire_home_systems): """ Adds non-empire-affiliated native populations to planets. """ # first, calculate the chance for natives on a planet based on the native frequency that has been passed # get the corresponding value for the specified natives frequency from the universe tables inverse_native_chance = fo.native_frequency(native_freq) # as the value in the universe table is higher for a lower frequency, we have to invert it # exception: a value of 0 means no natives, in this case return immediately if inverse_native_chance <= 0: return native_chance = 1.0 / float(inverse_native_chance) # compile a list of planets where natives can be placed # select only planets sufficiently far away from player home systems native_safe_planets = [] # list of planets safe for natives for candidate in systems: if not is_too_close_to_empire_home_systems(candidate, empire_home_systems): # this system is sufficiently far away from all player homeworlds, so add it's planets to our list native_safe_planets += fo.sys_get_planets(candidate) print "Number of planets far enough from players for natives to be allowed:", len(native_safe_planets) # if there are no "native safe" planets at all, we can stop here if not native_safe_planets: return # get all native species native_species = fo.get_native_species() print "Species that can be added as natives:" print "... " + "\n... ".join(native_species) # create a map with a list for each planet type containing the species # for which this planet type is a good environment # we will need this afterwards when picking natives for a planet natives_for_planet_type.clear() # just to be safe natives_for_planet_type.update( {planet_type: [] for planet_type in planets.planet_types} ) planet_types_for_natives.clear() planet_types_for_natives.update( {species: set() for species in native_species} ) # iterate over all native species we got for species in native_species: # check the planet environment for all planet types for this species for planet_type in planets.planet_types: # if this planet type is a good environment for the species, add it to the list for this planet type if fo.species_get_planet_environment(species, planet_type) == fo.planetEnvironment.good: natives_for_planet_type[planet_type].append(species) planet_types_for_natives[species].add(planet_type) # randomly add species to planets # iterate over the list of "native safe" planets we compiled earlier for candidate in native_safe_planets: # select a native species to put on this planet planet_type = fo.planet_get_type(candidate) # check if we have any native species that like this planet type if not natives_for_planet_type[planet_type]: # no, continue with next planet continue statistics.potential_native_planet_summary[planet_type] += 1 # make a "roll" against the chance for natives to determine if we shall place natives on this planet if random.random() > native_chance: # no, continue with next planet continue statistics.settled_native_planet_summary[planet_type] += 1 # randomly pick one of the native species available for this planet type natives = random.choice(natives_for_planet_type[planet_type]) # put the selected natives on the planet fo.planet_set_species(candidate, natives) # set planet as homeworld for that species fo.species_add_homeworld(natives, candidate) # set planet focus # check if the preferred focus for the native species is among the foci available on this planet available_foci = fo.planet_available_foci(candidate) preferred_focus = fo.species_preferred_focus(natives) if preferred_focus in available_foci: # if yes, set the planet focus to the preferred focus fo.planet_set_focus(candidate, preferred_focus) elif available_foci: # if no, and there is at least one available focus, just take the first of the list # otherwise don't set any focus fo.planet_set_focus(candidate, available_foci[0]) print "Added native", natives, "to planet", fo.get_name(candidate) # increase the statistics counter for this native species, so a species summary can be dumped to the log later statistics.species_summary[natives] += 1
def generate_natives(native_freq, systems, empire_home_systems): """ Adds non-empire-affiliated native populations to planets. """ # first, calculate the chance for natives on a planet based on the native frequency that has been passed # get the corresponding value for the specified natives frequency from the universe tables native_chance = universe_tables.NATIVE_FREQUENCY[native_freq] # a value of 0 means no natives, in this case return immediately if native_chance <= 0: return # compile a list of planets where natives can be placed # select only planets sufficiently far away from player home systems # list of planets safe for natives EMPIRE_TO_NATIVE_MIN_DIST = 2 empire_exclusions = set( itertools.chain.from_iterable( fo.systems_within_jumps_unordered(EMPIRE_TO_NATIVE_MIN_DIST, [e]) for e in empire_home_systems)) native_safe_planets = set( itertools.chain.from_iterable([ fo.sys_get_planets(s) for s in systems if s not in empire_exclusions ])) print( "Number of planets far enough from players for natives to be allowed:", len(native_safe_planets)) # if there are no "native safe" planets at all, we can stop here if not native_safe_planets: return # get all native species native_species = fo.get_native_species() print("Species that can be added as natives:") print("... " + "\n... ".join(native_species)) # create a map with a list for each planet type containing the species # for which this planet type is a good environment # we will need this afterwards when picking natives for a planet natives_for_planet_type.clear() # just to be safe natives_for_planet_type.update( {planet_type: [] for planet_type in planets.planet_types}) planet_types_for_natives.clear() planet_types_for_natives.update( {species: set() for species in native_species}) # iterate over all native species we got for species in native_species: # check the planet environment for all planet types for this species for planet_type in planets.planet_types: # if this planet type is a good environment for the species, add it to the list for this planet type if fo.species_get_planet_environment( species, planet_type) == fo.planetEnvironment.good: natives_for_planet_type[planet_type].append(species) planet_types_for_natives[species].add(planet_type) # randomly add species to planets # iterate over the list of "native safe" planets we compiled earlier for candidate in native_safe_planets: # select a native species to put on this planet planet_type = fo.planet_get_type(candidate) # check if we have any native species that like this planet type if not natives_for_planet_type[planet_type]: # no, continue with next planet continue universe_statistics.potential_native_planet_summary[planet_type] += 1 # make a "roll" against the chance for natives to determine if we shall place natives on this planet if random.random() > native_chance: # no, continue with next planet continue universe_statistics.settled_native_planet_summary[planet_type] += 1 # randomly pick one of the native species available for this planet type natives = random.choice(natives_for_planet_type[planet_type]) # put the selected natives on the planet fo.planet_set_species(candidate, natives) # set planet as homeworld for that species fo.species_add_homeworld(natives, candidate) # set planet focus # check if the preferred focus for the native species is among the foci available on this planet available_foci = fo.planet_available_foci(candidate) preferred_focus = fo.species_preferred_focus(natives) if preferred_focus in available_foci: # if yes, set the planet focus to the preferred focus fo.planet_set_focus(candidate, preferred_focus) elif available_foci: # if no, and there is at least one available focus, just take the first of the list # otherwise don't set any focus fo.planet_set_focus(candidate, available_foci[0]) print("Added native", natives, "to planet", fo.get_name(candidate)) # increase the statistics counter for this native species, so a species summary can be dumped to the log later universe_statistics.species_summary[natives] += 1