1package com.fs.starfarer.api.impl.campaign.procgen;
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.Collections;
6import java.util.Comparator;
7import java.util.HashMap;
8import java.util.HashSet;
9import java.util.LinkedHashMap;
14import com.fs.starfarer.api.Global;
15import com.fs.starfarer.api.campaign.PlanetAPI;
16import com.fs.starfarer.api.campaign.StarSystemAPI;
17import com.fs.starfarer.api.campaign.econ.MarketAPI;
18import com.fs.starfarer.api.campaign.econ.MarketConditionAPI;
19import com.fs.starfarer.api.impl.campaign.ids.Factions;
20import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.CustomConstellationParams;
21import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenContext;
22import com.fs.starfarer.api.util.Misc;
23import com.fs.starfarer.api.util.WeightedRandomPicker;
27 public static interface ConditionGenerator {
28 void addConditions(Set<String> conditionsSoFar, GenContext context,
PlanetAPI planet);
35 public static Map<String, ConditionGenerator>
generators =
new HashMap<String, ConditionGenerator>();
57 if (context ==
null) {
65 List<ConditionGenDataSpec> specs =
new ArrayList<ConditionGenDataSpec>();
70 Collections.sort(specs,
new Comparator<ConditionGenDataSpec>() {
76 Map<String, List<String>> groupsInOrder =
new LinkedHashMap<String, List<String>>();
77 float prevGroup = -100000;
78 List<String> currList =
null;
80 float currGroup = spec.getOrder();
81 if (prevGroup != currGroup) {
82 currList =
new ArrayList<String>();
83 groupsInOrder.put(spec.getGroup(), currList);
85 prevGroup = currGroup;
87 if (!currList.contains(spec.getGroup())) {
88 currList.add(spec.getGroup());
105 Set<String> conditionsSoFar =
new HashSet<String>();
112 for (String key : groupsInOrder.keySet()) {
113 List<String> groups = groupsInOrder.get(key);
114 for (String group : groups) {
116 String pick = picker.
pick();
118 conditionsSoFar.add(pick);
122 for (String group : groups) {
123 ConditionGenerator generator =
generators.get(group);
124 if (generator !=
null) {
125 generator.addConditions(conditionsSoFar, context, planet);
133 if (market ==
null) {
142 for (String cid : conditionsSoFar) {
174 if (data.hasMultiplier(planetType)) {
175 weight = data.getMultiplier(planetType);
176 }
else if (data.hasMultiplier(category)) {
177 weight = data.getMultiplier(category);
182 for (String cid : conditionsSoFar) {
183 if (data.hasMultiplier(cid)) {
184 weight *= data.getMultiplier(cid);
188 if (weight <= 0)
continue;
192 picker.
add(data.getId(), weight);
202 boolean foundAll =
true;
204 if (!conditionsSoFar.contains(cid)) {
209 if (!foundAll)
return false;
212 boolean foundOne =
false;
214 if (conditionsSoFar.contains(cid)) {
224 if (conditionsSoFar.contains(cid)) {
229 if (foundOne)
return false;
236 List<ConditionGenDataSpec> result =
new ArrayList<ConditionGenDataSpec>();
239 if (group.equals(spec.getGroup())) {
253 CustomConstellationParams p =
new CustomConstellationParams(age);
258 gen.constellationAge = age;
278 if (p2 !=
null && p2.
isStar()) {
290 if (parentStar !=
null) {
293 if (parentPlanet !=
null) {
297 int parentOrbitIndex = -1;
301 if (parentPlanet ==
null) {
303 parentOrbitIndex = -1;
322 GenContext context =
new GenContext(gen, system, gen.
systemCenter, starData,
324 planetData !=
null ? planetData.
getCategory() :
null, parentOrbitIndex);
325 context.orbitIndex = orbitIndex;
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static final String NEUTRAL
Set< String > getRequiresAny()
boolean isRequiresSurvey()
Set< String > getRequiresAll()
Set< String > getRequiresNotAny()
static String NO_PICK_SUFFIX
static void generateConditionsForPlanet(PlanetAPI planet, StarAge age)
static boolean preconditionsMet(String conditionId, Set< String > conditionsSoFar)
static List< ConditionGenDataSpec > getDataForGroup(String group)
static void generateConditionsForPlanet(GenContext context, PlanetAPI planet)
static WeightedRandomPicker< String > getGroupPicker(String group, Set< String > conditionsSoFar, GenContext context, PlanetAPI planet)
static void generateConditionsForPlanet(GenContext context, PlanetAPI planet, StarAge age)
static GenContext createContext(PlanetAPI planet, StarAge age)
static Map< String, ConditionGenerator > generators
static final float MAX_ORBIT_RADIUS
void pickNebulaAndBackground()
SectorEntityToken systemCenter
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static int getEstimatedOrbitIndex(PlanetAPI planet)
MarketAPI createMarket(String id, String name, int size)
< T > Collection< T > getAllSpecs(Class< T > c)
Object getSpec(Class c, String id, boolean nullOnNotFound)
LocationAPI getContainingLocation()
SectorEntityToken getOrbitFocus()
void setMarket(MarketAPI market)
SectorEntityToken getCenter()
void setFactionId(String factionId)
void setPlanetConditionMarketOnly(boolean isPlanetConditionMarketOnly)
void setPrimaryEntity(SectorEntityToken primaryEntity)
MarketConditionAPI getSpecificCondition(String token)
String addCondition(String id)
void setSurveyed(boolean wasSurveyed)