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 setup_empire(empire, empire_name, home_system, starting_species, player_name): """ Sets up various aspects of an empire, like empire name, homeworld, etc. """ # set empire name, if no one is given, pick one randomly if not empire_name: print "No empire name set for player", player_name, ", picking one randomly" empire_name = next(empire_name_generator) fo.empire_set_name(empire, empire_name) print "Empire name for player", player_name, "is", empire_name # check starting species, if no one is given, pick one randomly if starting_species == "RANDOM" or not starting_species: print "Picking random starting species for player", player_name starting_species = next(starting_species_pool) print "Starting species for player", player_name, "is", starting_species statistics.empire_species[starting_species] += 1 # pick a planet from the specified home system as homeworld planet_list = fo.sys_get_planets(home_system) # if the system is empty, report an error and return false, indicating failure if not planet_list: report_error("Python setup_empire: got home system with no planets") return False homeworld = random.choice(planet_list) # set selected planet as empire homeworld with selected starting species fo.empire_set_homeworld(empire, homeworld, starting_species) # set homeworld focus # check if the preferred focus for the starting species is among # the foci available on the homeworld planet available_foci = fo.planet_available_foci(homeworld) preferred_focus = fo.species_preferred_focus(starting_species) if preferred_focus in available_foci: # if yes, set the homeworld focus to the preferred focus print "Player", player_name, ": setting preferred focus", preferred_focus, "on homeworld" fo.planet_set_focus(homeworld, preferred_focus) elif len(available_foci) > 0: # if no, and there is at least one available focus, # just take the first of the list if preferred_focus == "": print "Player", player_name, ": starting species", starting_species, "has no preferred focus, using",\ available_foci[0], "instead" else: print "Player", player_name, ": preferred focus", preferred_focus, "for starting species",\ starting_species, "not available on homeworld, using", available_foci[0], "instead" fo.planet_set_focus(homeworld, available_foci[0]) else: # if no focus is available on the homeworld, don't set any focus print "Player", player_name, ": no available foci on homeworld for starting species", starting_species # give homeworld starting buildings # use the list provided in scripting/starting_unlocks/buildings.inf print "Player", player_name, ": add starting buildings to homeworld" for building in load_string_list(os.path.join(fo.get_resource_dir(), "scripting/starting_unlocks/buildings.inf")): fo.create_building(building, homeworld, empire) # unlock starting techs, buildings, hulls, ship parts, etc. # use default content file print "Player", player_name, ": add unlocked items" for item in fo.load_item_spec_list(): fo.empire_unlock_item(empire, item.type, item.name) # add premade ship designs to empire print "Player", player_name, ": add premade ship designs" for ship_design in fo.design_get_premade_list(): fo.empire_add_ship_design(empire, ship_design) # add starting fleets to empire # use default content file print "Player", player_name, ": add starting fleets" fleet_plans = fo.load_fleet_plan_list() for fleet_plan in fleet_plans: # first, create the fleet fleet = fo.create_fleet(fleet_plan.name(), home_system, empire) # if the fleet couldn't be created, report an error and try to continue with the next fleet plan if fleet == fo.invalid_object(): report_error("Python setup empire: couldn't create fleet %s" % fleet_plan.name()) continue # second, iterate over the list of ship design names in the fleet plan for ship_design in fleet_plan.ship_designs(): # create a ship in the fleet # if the ship couldn't be created, report an error and try to continue with the next ship design if fo.create_ship("", ship_design, starting_species, fleet) == fo.invalid_object(): report_error("Python setup empire: couldn't create ship %s for fleet %s" % (ship_design, fleet_plan.name())) return True
def setup_empire(empire, empire_name, home_system, starting_species, player_name): """ Sets up various aspects of an empire, like empire name, homeworld, etc. """ # set empire name, if no one is given, pick one randomly if not empire_name: print "No empire name set for player", player_name, ", picking one randomly" empire_name = next(empire_name_generator) fo.empire_set_name(empire, empire_name) print "Empire name for player", player_name, "is", empire_name # check starting species, if no one is given, pick one randomly if starting_species == "RANDOM" or not starting_species: print "Picking random starting species for player", player_name starting_species = next(starting_species_pool) print "Starting species for player", player_name, "is", starting_species universe_statistics.empire_species[starting_species] += 1 # pick a planet from the specified home system as homeworld planet_list = fo.sys_get_planets(home_system) # if the system is empty, report an error and return false, indicating failure if not planet_list: report_error("Python setup_empire: got home system with no planets") return False homeworld = random.choice(planet_list) # set selected planet as empire homeworld with selected starting species fo.empire_set_homeworld(empire, homeworld, starting_species) # set homeworld focus # check if the preferred focus for the starting species is among # the foci available on the homeworld planet available_foci = fo.planet_available_foci(homeworld) preferred_focus = fo.species_preferred_focus(starting_species) if preferred_focus in available_foci: # if yes, set the homeworld focus to the preferred focus print "Player", player_name, ": setting preferred focus", preferred_focus, "on homeworld" fo.planet_set_focus(homeworld, preferred_focus) elif len(available_foci) > 0: # if no, and there is at least one available focus, # just take the first of the list if preferred_focus == "": print "Player", player_name, ": starting species", starting_species, "has no preferred focus, using",\ available_foci[0], "instead" else: print "Player", player_name, ": preferred focus", preferred_focus, "for starting species",\ starting_species, "not available on homeworld, using", available_foci[0], "instead" fo.planet_set_focus(homeworld, available_foci[0]) else: # if no focus is available on the homeworld, don't set any focus print "Player", player_name, ": no available foci on homeworld for starting species", starting_species # give homeworld starting buildings print "Player", player_name, ": add starting buildings to homeworld" for item in fo.load_starting_buildings(): fo.create_building(item.name, homeworld, empire) # unlock starting techs, buildings, hulls, ship parts, etc. # use default content file print "Player", player_name, ": add unlocked items" for item in fo.load_item_spec_list(): fo.empire_unlock_item(empire, item.type, item.name) # add premade ship designs to empire print "Player", player_name, ": add premade ship designs" for ship_design in fo.design_get_premade_list(): fo.empire_add_ship_design(empire, ship_design) # add starting fleets to empire # use default content file print "Player", player_name, ": add starting fleets" fleet_plans = fo.load_fleet_plan_list() for fleet_plan in fleet_plans: # first, create the fleet fleet = fo.create_fleet(fleet_plan.name(), home_system, empire) # if the fleet couldn't be created, report an error and try to continue with the next fleet plan if fleet == fo.invalid_object(): report_error("Python setup empire: couldn't create fleet %s" % fleet_plan.name()) continue # second, iterate over the list of ship design names in the fleet plan for ship_design in fleet_plan.ship_designs(): # create a ship in the fleet # if the ship couldn't be created, report an error and try to continue with the next ship design if fo.create_ship("", ship_design, starting_species, fleet) == fo.invalid_object(): report_error( "Python setup empire: couldn't create ship %s for fleet %s" % (ship_design, fleet_plan.name())) return True
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