1package com.fs.starfarer.api.impl.campaign.procgen;
4import java.util.ArrayList;
5import java.util.Collection;
6import java.util.EnumSet;
7import java.util.LinkedHashMap;
8import java.util.LinkedHashSet;
11import java.util.Random;
14import org.lwjgl.util.vector.Vector2f;
16import com.fs.starfarer.api.Global;
17import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
18import com.fs.starfarer.api.campaign.JumpPointAPI;
19import com.fs.starfarer.api.campaign.LocationAPI;
20import com.fs.starfarer.api.campaign.PlanetAPI;
21import com.fs.starfarer.api.campaign.PlanetSpecAPI;
22import com.fs.starfarer.api.campaign.SectorAPI;
23import com.fs.starfarer.api.campaign.SectorEntityToken;
24import com.fs.starfarer.api.campaign.StarSystemAPI;
25import com.fs.starfarer.api.characters.FullName.Gender;
26import com.fs.starfarer.api.impl.campaign.ids.Entities;
27import com.fs.starfarer.api.impl.campaign.ids.Factions;
28import com.fs.starfarer.api.impl.campaign.ids.Tags;
29import com.fs.starfarer.api.impl.campaign.ids.Terrain;
30import com.fs.starfarer.api.impl.campaign.procgen.Constellation.ConstellationType;
31import com.fs.starfarer.api.impl.campaign.procgen.ConstellationGen.SpringConnection;
32import com.fs.starfarer.api.impl.campaign.procgen.ConstellationGen.SpringSystem;
33import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator;
34import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.AddedEntity;
35import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.EntityLocation;
36import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.LocationType;
37import com.fs.starfarer.api.impl.campaign.terrain.BaseTiledTerrain.TileParams;
38import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin;
39import com.fs.starfarer.api.impl.campaign.terrain.NebulaTerrainPlugin;
40import com.fs.starfarer.api.impl.campaign.terrain.PulsarBeamTerrainPlugin;
41import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin;
42import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin.CoronaParams;
43import com.fs.starfarer.api.util.Misc;
44import com.fs.starfarer.api.util.WeightedRandomPicker;
49 public static class CustomConstellationParams
implements Cloneable {
50 public String name =
null;
51 public String secondaryName =
null;
53 public int minStars = 0;
54 public int maxStars = 0;
55 public int numStars = 0;
56 public boolean forceNebula =
false;
57 public List<StarSystemType> systemTypes =
new ArrayList<StarSystemType>();
58 public List<String> starTypes =
new ArrayList<String>();
59 public Vector2f location =
null;
61 public CustomConstellationParams(
StarAge age) {
66 public CustomConstellationParams clone() {
68 return (CustomConstellationParams) super.clone();
69 }
catch (CloneNotSupportedException e) {
78 public static enum StarSystemType {
88 @Deprecated DEEP_SPACE_GAS_GIANT,
150 public static Map<StarAge, String>
nebulaTypes =
new LinkedHashMap<StarAge, String>();
151 public static Map<String, WeightedRandomPicker<String>>
backgroundsByNebulaType =
new LinkedHashMap<String, WeightedRandomPicker<String>>();
154 public static List<TerrainGenPlugin>
terrainPlugins =
new ArrayList<TerrainGenPlugin>();
161 public static Random
random =
new Random();
184 WeightedRandomPicker<String> picker;
185 picker =
new WeightedRandomPicker<String>(
random);
186 picker.add(
"graphics/backgrounds/background2.jpg", 10);
187 picker.add(
"graphics/backgrounds/background4.jpg", 10);
190 picker =
new WeightedRandomPicker<String>(
random);
191 picker.add(
"graphics/backgrounds/background5.jpg", 10);
194 picker =
new WeightedRandomPicker<String>(
random);
195 picker.add(
"graphics/backgrounds/background6.jpg", 10);
198 picker =
new WeightedRandomPicker<String>(
random);
199 picker.add(
"graphics/backgrounds/background1.jpg", 10);
200 picker.add(
"graphics/backgrounds/background2.jpg", 10);
208 if (plugin.wantsToHandle(terrainData, context))
return plugin;
214 public static class GeneratedPlanet {
215 public SectorEntityToken parent;
216 public PlanetAPI planet;
217 public float orbitDays;
218 public float orbitRadius;
219 public float orbitAngle;
220 public boolean isMoon;
221 public GeneratedPlanet(SectorEntityToken parent, PlanetAPI planet,
boolean isMoon,
float orbitDays,
float orbitRadius,
float orbitAngle) {
222 this.parent = parent;
223 this.planet = planet;
224 this.isMoon = isMoon;
225 this.orbitDays = orbitDays;
226 this.orbitRadius = orbitRadius;
227 this.orbitAngle = orbitAngle;
231 public static enum LagrangePointType {
240 public static class LagrangePoint {
241 public GeneratedPlanet parent;
242 public LagrangePointType type;
243 public LagrangePoint(GeneratedPlanet parent, LagrangePointType type) {
244 this.parent = parent;
250 public static class GenResult {
251 public float orbitalWidth;
252 public boolean onlyIncrementByWidth =
false;
253 public List<SectorEntityToken> entities =
new ArrayList<SectorEntityToken>();
254 public GenContext context;
261 public static class GenContext {
262 public StarSystemGenerator gen;
263 public List<GeneratedPlanet> generatedPlanets =
new ArrayList<GeneratedPlanet>();
265 public Set<String> excludeCategories =
new LinkedHashSet<String>();
268 public StarSystemAPI system;
269 public SectorEntityToken center;
270 public StarGenDataSpec starData;
271 public PlanetAPI parent;
272 public int orbitIndex = -1;
274 public int startingOrbitIndex = 0;
277 public float currentRadius;
278 public String parentCategory;
279 public int parentOrbitIndex;
280 public float parentRadiusOverride = -1;
282 public GeneratedPlanet lagrangeParent =
null;
283 public LagrangePointType lagrangePointType =
null;
285 public List<String> multipliers =
new ArrayList<String>();
286 public float maxOrbitRadius;
288 public Map<Object, Object> customData =
new LinkedHashMap<Object, Object>();
290 public GenContext(StarSystemGenerator gen, StarSystemAPI system, SectorEntityToken center,
291 StarGenDataSpec starData, PlanetAPI parent,
294 String age,
float currentRadius,
float maxOrbitRadius, String parentCategory,
int parentOrbitIndex) {
297 this.maxOrbitRadius = maxOrbitRadius;
299 this.system = system;
300 this.center = center;
301 this.starData = starData;
302 this.parent = parent;
303 this.startingOrbitIndex = orbitIndex;
306 this.currentRadius = currentRadius;
307 this.parentCategory = parentCategory;
308 this.parentOrbitIndex = parentOrbitIndex;
339 protected Map<SectorEntityToken, PlanetAPI>
lagrangeParentMap =
new LinkedHashMap<SectorEntityToken, PlanetAPI>();
340 protected Map<SectorEntityToken, List<SectorEntityToken>>
allNameableEntitiesAdded =
new LinkedHashMap<SectorEntityToken, List<SectorEntityToken>>();
341 protected CustomConstellationParams
params;
346 this.constellationAge =
params.age;
349 WeightedRandomPicker<StarAge> picker =
new WeightedRandomPicker<StarAge>(
random);
353 this.constellationAge = picker.pick();
365 if (
params !=
null &&
params.forceNebula) hasNebula =
true;
402 Vector2f loc =
new Vector2f();
404 loc =
new Vector2f(
params.location);
406 loc =
new Vector2f(
sector.getPlayerFleet().getLocation());
414 List<StarSystemAPI> systems =
new ArrayList<StarSystemAPI>();
426 for (
int i = 0; i < stars; i++) {
437 HyperspaceTerrainPlugin plugin = (HyperspaceTerrainPlugin) Misc.getHyperspaceTerrain().getPlugin();
440 float minRadius = plugin.getTileSize() * 2f;
441 for (StarSystemAPI curr : systems) {
442 float radius = curr.getMaxRadiusInHyperspace();
443 editor.
clearArc(curr.getLocation().x, curr.getLocation().y, 0, radius + minRadius * 0.5f, 0, 360f);
444 editor.
clearArc(curr.getLocation().x, curr.getLocation().y, 0, radius + minRadius, 0, 360f, 0.25f);
447 for (SpringConnection conn : springs.connections) {
448 if (!conn.pull)
continue;
449 float r1 = ((StarSystemAPI)conn.from.custom).getMaxRadiusInHyperspace();
450 float r2 = ((StarSystemAPI)conn.to.custom).getMaxRadiusInHyperspace();
451 float dist = Misc.getDistance(conn.from.loc, conn.to.loc);
453 float radius = Math.max(0, dist * 0.67f - r1 - r2);
460 Vector2f diff = Vector2f.sub(conn.to.loc, conn.from.loc,
new Vector2f());
461 float x = conn.from.loc.x + diff.x * 0.33f;
462 float y = conn.from.loc.y + diff.y * 0.33f;
463 editor.
clearArc(x, y, 0, radius + minRadius * 1f, 0, 360f);
464 editor.
clearArc(x, y, 0, radius + minRadius * 2f, 0, 360f, 0.25f);
466 x = conn.from.loc.x + diff.x * 0.67f;
467 y = conn.from.loc.y + diff.y * 0.67f;
468 editor.
clearArc(x, y, 0, radius + minRadius * 1f, 0, 360f);
469 editor.
clearArc(x, y, 0, radius + minRadius * 2f, 0, 360f, 0.25f);
472 ConstellationType type = ConstellationType.NORMAL;
474 type = ConstellationType.NEBULA;
493 if (entity instanceof PlanetAPI && entity.getMarket() !=
null) {
494 entity.getMarket().setName(entity.getName());
499 for (StarSystemAPI
system : systems) {
500 system.setConstellation(c);
517 String uuid = Misc.genUID();
522 String
id =
"system_" + uuid;
523 String name =
"System " + uuid;
560 float binaryPad = 1500f;
563 if (
systemType == StarSystemType.BINARY_FAR ||
564 systemType == StarSystemType.TRINARY_1CLOSE_1FAR ||
570 float primaryOrbitalRadius =
star.getRadius();
571 if (result !=
null) {
572 primaryOrbitalRadius = result.orbitalWidth * 0.5f;
576 float orbitAngle =
random.nextFloat() * 360f;
577 float baseOrbitRadius = primaryOrbitalRadius + binaryPad;
578 float orbitDays = baseOrbitRadius / (3f +
random.nextFloat() * 2f);
583 }
else if (
systemType == StarSystemType.TRINARY_2FAR) {
590 star.setSkipForJumpPointAutoGen(
true);
597 StarCoronaTerrainPlugin coronaPlugin = Misc.getCoronaFor(
star);
598 if (coronaPlugin !=
null) {
599 system.removeEntity(coronaPlugin.getEntity());
602 system.initNonStarCenter();
603 for (SectorEntityToken entity :
system.getAllEntities()) {
604 if (entity.getOrbitFocus() ==
star ||
605 entity.getOrbitFocus() ==
system.getCenter()) {
606 entity.setOrbit(
null);
609 system.getCenter().addTag(Tags.AMBIENT_LS);
612 system.autogenerateHyperspaceJumpPoints(
true,
false);
627 protected void addFarStar(PlanetAPI farStar,
float orbitAngle,
float baseOrbitRadius,
float orbitPeriod) {
631 GenResult resultFar =
null;
642 GenContext context =
new GenContext(
this,
system, farStar, farData,
647 resultFar.context = context;
650 if (resultFar !=
null) {
651 baseOrbitRadius += resultFar.orbitalWidth * 0.5f;
654 SectorEntityToken center =
star;
655 if (
systemType == StarSystemType.TRINARY_1CLOSE_1FAR) {
658 farStar.setCircularOrbit(center, orbitAngle, baseOrbitRadius, orbitPeriod);
660 if (resultFar !=
null) {
673 return params.systemTypes.remove(0);
677 WeightedRandomPicker<StarSystemType> picker =
new WeightedRandomPicker<StarSystemType>(
random);
678 for (StarSystemType type : EnumSet.allOf(StarSystemType.class)) {
679 if (type == StarSystemType.DEEP_SPACE || type == StarSystemType.DEEP_SPACE_GAS_GIANT)
continue;
682 if (test ==
null)
continue;
688 if (!nebulaStatusOk)
continue;
702 picker.add(type, freq);
705 return picker.pick();
717 if (
systemType == StarSystemType.BINARY_CLOSE ||
718 systemType == StarSystemType.TRINARY_1CLOSE_1FAR ||
719 systemType == StarSystemType.TRINARY_2CLOSE) {
720 system.initNonStarCenter();
731 if (starSpec ==
null)
return false;
742 starSpec.getPlanetType(),
751 star.addTag(Tags.AMBIENT_LS);
761 if (
systemType == StarSystemType.BINARY_CLOSE) {
765 }
else if (
systemType == StarSystemType.BINARY_FAR) {
773 }
else if (
systemType == StarSystemType.TRINARY_2CLOSE ||
774 systemType == StarSystemType.TRINARY_1CLOSE_1FAR ||
784 if (
systemType == StarSystemType.TRINARY_1CLOSE_1FAR) {
786 }
else if (
systemType == StarSystemType.TRINARY_2FAR) {
793 if (
systemType == StarSystemType.BINARY_CLOSE ||
systemType == StarSystemType.TRINARY_1CLOSE_1FAR) {
796 float r1 =
star.getRadius();
798 if (
star.getSpec().getPlanetType().equals(
"black_hole")) r1 *= 5f;
799 if (
secondary.getSpec().getPlanetType().equals(
"black_hole")) r2 *= 5f;
801 float totalRadius = r1 + r2;
804 float orbitPrimary = dist * r2 / totalRadius;
805 float orbitSecondary = dist * r1 / totalRadius;
809 float anglePrimary =
random.nextFloat() * 360f;
810 float orbitDays = dist / (30f +
random.nextFloat() * 50f);
812 star.setCircularOrbit(
system.getCenter(), anglePrimary, orbitPrimary, orbitDays);
813 secondary.setCircularOrbit(
system.getCenter(), anglePrimary + 180f, orbitSecondary, orbitDays);
821 }
else if (
systemType == StarSystemType.TRINARY_2CLOSE) {
823 dist +=
star.getRadius();
825 float anglePrimary =
random.nextFloat() * 360f;
826 float orbitDays = dist / (20f +
random.nextFloat() * 80f);
830 star.setCircularOrbit(
system.getCenter(), anglePrimary, dist - 10, orbitDays);
831 secondary.setCircularOrbit(
system.getCenter(), anglePrimary + 120f, dist - 5, orbitDays);
832 tertiary.setCircularOrbit(
system.getCenter(), anglePrimary + 240f, dist, orbitDays);
836 star.getLocation().set(0, 0);
852 ArrayList<SectorEntityToken> list =
new ArrayList<SectorEntityToken>();
858 ArrayList<SectorEntityToken> list =
new ArrayList<SectorEntityToken>();
864 ArrayList<SectorEntityToken> list =
new ArrayList<SectorEntityToken>();
882 if (
star ==
null)
return;
884 if (
star.getSpec().getPlanetType().equals(
"black_hole")) {
885 StarCoronaTerrainPlugin coronaPlugin = Misc.getCoronaFor(
star);
886 if (coronaPlugin !=
null) {
887 system.removeEntity(coronaPlugin.getEntity());
894 SectorEntityToken eventHorizon =
system.addTerrain(Terrain.EVENT_HORIZON,
895 new CoronaParams(
star.getRadius() + corona, (
star.getRadius() + corona) / 2f,
899 eventHorizon.setCircularOrbit(
star, 0, 0, 100);
904 if (
star ==
null)
return;
906 if (
star.getSpec().getPlanetType().equals(
"star_neutron")) {
907 StarCoronaTerrainPlugin coronaPlugin = Misc.getCoronaFor(
star);
908 if (coronaPlugin !=
null) {
909 system.removeEntity(coronaPlugin.getEntity());
923 SectorEntityToken eventHorizon =
system.addTerrain(Terrain.PULSAR_BEAM,
924 new CoronaParams(
star.getRadius() + corona, (
star.getRadius() + corona) / 2f,
928 eventHorizon.setCircularOrbit(
star, 0, 0, 100);
940 String temp =
star.getName();
948 if (sizeDownSmaller) {
967 String temp =
star.getName();
975 if (sizeDownSmaller) {
997 int num =
random.nextInt(max + 1 - min) + min;
999 if (num == min &&
random.nextFloat() < 0.25f) {
1006 for (
int i = 0; i < num; i++) {
1007 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
1008 weights.put(LocationType.STAR_ORBIT, 10f);
1009 weights.put(LocationType.OUTER_SYSTEM, 10f);
1010 weights.put(LocationType.L_POINT, 10f);
1011 weights.put(LocationType.IN_SMALL_NEBULA, 2f);
1012 WeightedRandomPicker<EntityLocation> locs = BaseThemeGenerator.getLocations(
random,
system,
null, 100f, weights);
1013 EntityLocation loc = locs.pick();
1015 AddedEntity added = BaseThemeGenerator.addNonSalvageEntity(
system, loc, Entities.STABLE_LOCATION, Factions.NEUTRAL);
1018 if (added !=
null) {
1019 BaseThemeGenerator.convertOrbitPointingDown(added.entity);
1029 if (result !=
null) {
1030 outerRadius = result.orbitalWidth / 2f + 500f;
1035 if (result.context.orbitIndex < 0 &&
random.nextFloat() < 0.5f) {
1038 SectorEntityToken farStar = result.context.center;
1039 String name =
"Omega Jump-point";
1040 if (result.context.center ==
tertiary) {
1041 name =
"Omicron Jump-point";
1044 point.setStandardWormholeToHyperspaceVisual();
1045 float orbitDays = outerRadius / (15f +
random.nextFloat() * 5f);
1047 point.setCircularOrbit(farStar,
random.nextFloat() * 360f, outerRadius, orbitDays);
1056 point.setStandardWormholeToHyperspaceVisual();
1057 float orbitDays = outerRadius / (15f +
random.nextFloat() * 5f);
1059 point.setCircularOrbit(
systemCenter,
random.nextFloat() * 360f, outerRadius, orbitDays);
1064 system.updateAllOrbits();
1067 if (result !=
null) {
1068 float halfway = outerRadius * 0.5f;
1070 WeightedRandomPicker<LagrangePoint> inner =
new WeightedRandomPicker<LagrangePoint>(
random);
1071 WeightedRandomPicker<LagrangePoint> outer =
new WeightedRandomPicker<LagrangePoint>(
random);
1074 for (GeneratedPlanet planet : result.context.generatedPlanets) {
1075 if (planet.isMoon)
continue;
1076 if (planet.planet.getOrbit() ==
null || planet.planet.getOrbit().getFocus() ==
null)
continue;
1079 for (LagrangePointType type : EnumSet.of(LagrangePointType.L4, LagrangePointType.L5)) {
1080 float orbitRadius = planet.orbitRadius;
1082 if (type == LagrangePointType.L5) angleOffset =
LAGRANGE_OFFSET * 0.5f;
1083 float angle = planet.orbitAngle + angleOffset;
1084 Vector2f location = Misc.getUnitVectorAtDegreeAngle(angle + angleOffset);
1085 location.scale(orbitRadius);
1086 Vector2f.add(location, planet.planet.getOrbit().getFocus().getLocation(), location);
1088 boolean clear =
true;
1089 for (PlanetAPI curr :
system.getPlanets()) {
1090 float dist = Misc.getDistance(curr.getLocation(), location);
1098 if (planet.orbitRadius < halfway || planet.orbitRadius < 5000f) {
1099 inner.add(
new LagrangePoint(planet, type), 10f);
1101 outer.add(
new LagrangePoint(planet, type), 10f);
1108 if (outerRadius > 2000f + 5000f *
random.nextFloat()) {
1109 boolean addedOne =
false;
1110 if (!inner.isEmpty()) {
1111 LagrangePoint p = inner.pick();
1113 String name =
"Inner System Jump-point";
1114 if (
systemType == StarSystemType.NEBULA) name =
"Inner Jump-point";
1120 if (!outer.isEmpty() && (
random.nextFloat() < outer.getItems().size() * 0.2f || !addedOne)) {
1121 LagrangePoint p = outer.pick();
1122 String name =
"Outer System Jump-point";
1123 if (
systemType == StarSystemType.NEBULA) name =
"Outer Jump-point";
1146 float orbitRadius = p.parent.orbitRadius;
1147 float orbitDays = p.parent.orbitDays;
1149 if (p.type == LagrangePointType.L5) angleOffset =
LAGRANGE_OFFSET * 0.5f;
1150 float angle = p.parent.orbitAngle + angleOffset;
1152 SectorEntityToken focus = p.parent.planet.getOrbitFocus();
1156 point.setStandardWormholeToHyperspaceVisual();
1157 if (!p.parent.planet.isGasGiant()) {
1158 point.setRelatedPlanet(p.parent.planet);
1162 point.setCircularOrbit(focus, angle + angleOffset, orbitRadius, orbitDays);
1167 int min,
int max,
float startingRadius,
1168 int nameOffset,
boolean withSpecialNames) {
1173 int min,
int max,
float startingRadius,
1174 int nameOffset,
boolean withSpecialNames,
1175 boolean allowHabitable) {
1176 CustomConstellationParams p =
new CustomConstellationParams(age);
1177 p.forceNebula =
true;
1183 gen.constellationAge = age;
1185 gen.star =
system.getStar();
1191 gen.systemCenter =
system.getCenter();
1195 PlanetAPI parentPlanet =
null;
1196 if (parentStar instanceof PlanetAPI) {
1197 PlanetAPI planet = (PlanetAPI) parentStar;
1198 if (planet.isStar()) {
1202 parentPlanet = planet;
1206 int parentOrbitIndex = -1;
1207 int startingOrbitIndex = 0;
1209 boolean addingAroundStar = parentPlanet ==
null;
1211 if (parentStar !=
null) {
1212 r = parentStar.getRadius();
1215 float approximateExtraRadiusPerOrbit = 400f;
1216 if (addingAroundStar) {
1217 parentOrbitIndex = -1;
1219 (
BASE_INCR * 1.25f + approximateExtraRadiusPerOrbit));
1221 if (startingOrbitIndex < 0) startingOrbitIndex = 0;
1224 if (parentPlanet.getOrbitFocus() !=
null) {
1225 dist = Misc.getDistance(parentPlanet.getLocation(), parentPlanet.getOrbitFocus().getLocation());
1228 (
BASE_INCR * 1.25f + approximateExtraRadiusPerOrbit));
1232 if (parentOrbitIndex < 0) parentOrbitIndex = 0;
1233 if (startingOrbitIndex < 0) startingOrbitIndex = 0;
1239 parentPlanet, startingOrbitIndex, age.name(), startingRadius,
MAX_ORBIT_RADIUS,
1240 planetData !=
null ? planetData.
getCategory() :
null, parentOrbitIndex);
1242 if (!allowHabitable) {
1243 context.excludeCategories.add(
CAT_HAB5);
1244 context.excludeCategories.add(
CAT_HAB4);
1245 context.excludeCategories.add(
CAT_HAB3);
1246 context.excludeCategories.add(
CAT_HAB2);
1249 GenResult result = gen.
addOrbitingEntities(context, num,
false, addingAroundStar,
false,
false);
1258 if (withSpecialNames) {
1268 if (entity instanceof PlanetAPI && entity.getMarket() !=
null) {
1269 entity.getMarket().setName(entity.getName());
1273 return result.orbitalWidth * 0.5f;
1278 CustomConstellationParams p =
new CustomConstellationParams(age);
1279 p.forceNebula =
true;
1285 gen.constellationAge = age;
1293 system.setHasSystemwideNebula(
true);
1304 StringBuilder
string =
new StringBuilder();
1305 for (
int y = h - 1; y >= 0; y--) {
1306 for (
int x = 0; x < w; x++) {
1310 SectorEntityToken nebula =
system.addTerrain(Terrain.NEBULA,
new TileParams(
string.toString(),
1313 nebula.getLocation().set(0, 0);
1315 NebulaTerrainPlugin nebulaPlugin = (NebulaTerrainPlugin)((CampaignTerrainAPI)nebula).getPlugin();
1336 for (PlanetAPI planet :
system.getPlanets()) {
1338 if (planet.getOrbit() !=
null && planet.getOrbit().getFocus() !=
null &&
1339 planet.getOrbit().getFocus().getOrbit() !=
null) {
1346 float clearThreshold = 0f;
1347 float clearInnerRadius = 0f;
1348 float clearOuterRadius = 0f;
1349 Vector2f clearLoc =
null;
1352 if (!planet.isStar() && !planet.isGasGiant()) {
1353 clearThreshold = 1f - Math.min(0f, planet.getRadius() / 300f);
1354 if (clearThreshold > 0.5f) clearThreshold = 0.5f;
1357 Vector2f loc = planet.getLocation();
1358 if (planet.getOrbit() !=
null && planet.getOrbit().getFocus() !=
null) {
1359 Vector2f focusLoc = planet.getOrbit().getFocus().getLocation();
1360 float dist = Misc.getDistance(planet.getOrbit().getFocus().getLocation(), loc);
1361 float width = planet.getRadius() * 4f + 100f;
1362 if (planet.isStar()) {
1363 StarCoronaTerrainPlugin corona = Misc.getCoronaFor(planet);
1364 if (corona !=
null) {
1365 width = corona.getParams().bandWidthInEngine * 4f;
1367 PulsarBeamTerrainPlugin pulsar = Misc.getPulsarFor(planet);
1368 if (pulsar !=
null) {
1369 width = Math.max(width, pulsar.getParams().bandWidthInEngine * 0.5f);
1372 clearLoc = focusLoc;
1373 clearInnerRadius = dist - width / 2f;
1374 clearOuterRadius = dist + width / 2f;
1375 }
else if (planet.getOrbit() ==
null) {
1376 float width = planet.getRadius() * 4f + 100f;
1377 if (planet.isStar()) {
1378 StarCoronaTerrainPlugin corona = Misc.getCoronaFor(planet);
1379 if (corona !=
null) {
1380 width = corona.getParams().bandWidthInEngine * 4f;
1382 PulsarBeamTerrainPlugin pulsar = Misc.getPulsarFor(planet);
1383 if (pulsar !=
null) {
1384 width = Math.max(width, pulsar.getParams().bandWidthInEngine * 0.5f);
1388 clearInnerRadius = 0f;
1389 clearOuterRadius = width;
1392 if (clearLoc !=
null) {
1393 float min = nebulaPlugin.getTileSize() * 2f;
1394 if (clearOuterRadius - clearInnerRadius < min) {
1395 clearOuterRadius = clearInnerRadius + min;
1397 editor.
clearArc(clearLoc.x, clearLoc.y, clearInnerRadius, clearOuterRadius, 0, 360f, clearThreshold);
1403 float angleOffset =
random.nextFloat() * 360f;
1404 editor.
clearArc(0f, 0f, 30000, 31000 + 1000f *
random.nextFloat(),
1405 angleOffset + 0f, angleOffset + 360f * (2f +
random.nextFloat() * 2f), 0.01f, 0f);
1408 int numArcs = (int) (8f + 6f *
random.nextFloat());
1411 for (
int i = 0; i < numArcs; i++) {
1413 float dist = 15000f + 15000f *
random.nextFloat();
1414 float angle =
random.nextFloat() * 360f;
1416 Vector2f dir = Misc.getUnitVectorAtDegreeAngle(angle);
1417 dir.scale(dist - (2000f + 8000f *
random.nextFloat()));
1421 float width = 800f * (1f + 2f *
random.nextFloat());
1423 float clearThreshold = 0f + 0.5f *
random.nextFloat();
1426 editor.
clearArc(dir.x, dir.y, dist - width/2f, dist + width/2f, 0, 360f, clearThreshold);
1433 if (!hasOrbits)
return null;
1439 if (numOrbits <= 0)
return null;
1447 null, 0,
starAge.name(), currentRadius, maxOrbitRadius,
null, -1);
1449 if (
systemType == StarSystemType.BINARY_CLOSE ||
systemType == StarSystemType.TRINARY_1CLOSE_1FAR) {
1452 if (
systemType == StarSystemType.TRINARY_2CLOSE) {
1458 result.context = context;
1462 protected GenResult
addOrbitingEntities(GenContext context,
int numOrbits,
boolean addingMoons,
boolean addMoons,
boolean parentIsMoon,
boolean nothingOk) {
1464 if (
DEBUG && context.starData !=
null) {
1465 if (addingMoons && context.parent !=
null) {
1466 System.out.println(
" Adding " + numOrbits +
" moon orbits around " + context.parent.getSpec().getPlanetType());
1468 System.out.println(
"Adding " + numOrbits +
" orbits around " + context.starData.getId());
1472 float currentRadius = context.currentRadius;
1473 float lastIncrementExtra = 0f;
1475 String extraMult =
null;
1479 for (
int i = 0; i < numOrbits; i++) {
1481 context.orbitIndex = i + context.startingOrbitIndex + extra;
1503 GenResult result =
null;
1504 float incrMult = 1f;
1508 WeightedRandomPicker<EntityGenDataSpec> picker =
getPickerForCategory(categoryData, context, extraMult);
1510 picker.print(
" Picking from category " + categoryData.
getCategory() +
1511 ", orbit index " + (context.parent !=
null ? context.parentOrbitIndex : context.orbitIndex));
1515 if (entityData ==
null) {
1516 System.out.println(
" Nothing to pick");
1517 System.out.println();
1519 System.out.println(
" Picked: " + entityData.
getId());
1520 System.out.println();
1524 context.currentRadius = currentRadius;
1529 result =
addPlanet(context, planetData, addingMoons, addMoons);
1536 if (result !=
null) {
1538 for (SectorEntityToken curr : result.entities) {
1539 if (context.lagrangeParent !=
null && !result.entities.isEmpty()) {
1555 baseIncr *= incrMult;
1557 float increment = baseIncr + baseIncr * 0.5f *
random.nextFloat();
1558 if (result !=
null) {
1559 if (result.orbitalWidth > 1000) extra++;
1562 increment = Math.max(increment + Math.min(result.orbitalWidth, 300f),
1563 result.orbitalWidth + increment * 0.5f);
1564 if (result.onlyIncrementByWidth) {
1565 increment = result.orbitalWidth;
1567 lastIncrementExtra = Math.max(increment * 0.1f, increment - result.orbitalWidth);
1569 lastIncrementExtra = increment;
1571 currentRadius += increment;
1573 if (currentRadius >= context.maxOrbitRadius) {
1578 GenResult result =
new GenResult();
1579 result.onlyIncrementByWidth =
false;
1580 result.orbitalWidth = (currentRadius - lastIncrementExtra) * 2f;
1586 if (plugin ==
null )
return null;
1587 GenResult result = plugin.
generate(terrainData, context);
1605 float parentRadius = 100000f;
1606 if (context.parent !=
null || context.lagrangeParent !=
null) {
1607 PlanetAPI parent = context.parent;
1608 if (context.lagrangeParent !=
null) {
1609 parent = context.lagrangeParent.planet;
1611 parentRadius = parent.getRadius();
1613 if (context.parentRadiusOverride > 0) {
1614 parentRadius = context.parentRadiusOverride;
1625 float orbitRadius = context.currentRadius + radius;
1626 float orbitDays = orbitRadius / (20f +
random.nextFloat() * 5f);
1629 String planetId = context.center.getId() +
":planet_" + context.orbitIndex;
1630 String planetName =
"Planet " + context.orbitIndex;
1631 if (context.parent !=
null) {
1632 planetId =
system.getId() +
"_moon_" + context.center.getId() +
"_" + context.parent.getId() +
"_" + context.orbitIndex;
1633 planetName = context.parent.getName() +
" moon " + context.orbitIndex;
1635 String planetType = planetData.
getId();
1636 SectorEntityToken parent = context.center;
1637 if (context.parent !=
null) parent = context.parent;
1639 float angle =
random.nextFloat() * 360f;
1643 if (context.parentCategory ==
null) {
1644 if (context.lagrangeParent !=
null && context.lagrangePointType !=
null) {
1645 orbitRadius = context.lagrangeParent.orbitRadius;
1646 orbitDays = context.lagrangeParent.orbitDays;
1648 if (context.lagrangePointType == LagrangePointType.L5) angleOffset =
LAGRANGE_OFFSET;
1649 angle = context.lagrangeParent.orbitAngle + angleOffset;
1650 planetName +=
" " + context.lagrangePointType.name();
1651 planetId +=
"_" + context.lagrangePointType.name();
1655 PlanetAPI planet =
system.addPlanet(planetId, parent, planetName, planetType, angle, radius, orbitRadius, orbitDays);
1656 if (planet.isGasGiant()) {
1658 planet.setAutogenJumpPointNameInHyper(
system.getBaseName() +
", " + planetName +
" Gravity Well");
1662 float radiusWithMoons = planet.getRadius();
1679 if (hasOrbits && numOrbits > 0) {
1684 GenContext moonContext =
new GenContext(
this, context.system, context.center, context.starData, planet, 0,
starAge.name(),
1685 startingRadius, context.maxOrbitRadius, planetData.
getCategory(), context.orbitIndex);
1686 moonContext.excludeCategories.addAll(context.excludeCategories);
1687 moonContext.multipliers.addAll(context.multipliers);
1689 GenResult moonResult =
addOrbitingEntities(moonContext, numOrbits,
true,
false,
false,
false);
1691 context.generatedPlanets.addAll(moonContext.generatedPlanets);
1694 radius = moonResult.orbitalWidth * 0.5f;
1695 orbitRadius = context.currentRadius + radius;
1696 orbitDays = orbitRadius / (20f +
random.nextFloat() * 5f);
1698 radiusWithMoons = radius;
1702 }
else if (isMoon) {
1704 GenContext moonContext =
new GenContext(
this, context.system, context.center, context.starData, planet, 0,
starAge.name(),
1705 startingRadius, context.maxOrbitRadius, planetData.
getCategory(), context.orbitIndex);
1706 moonContext.excludeCategories.addAll(context.excludeCategories);
1707 moonContext.multipliers.addAll(context.multipliers);
1709 context.generatedPlanets.addAll(moonContext.generatedPlanets);
1716 planet.getSpec().setPlanetColor(color);
1717 if (planet.getSpec().getAtmosphereThickness() > 0) {
1718 Color atmosphereColor = Misc.interpolateColor(planet.getSpec().getAtmosphereColor(), color, 0.25f);
1719 atmosphereColor = Misc.setAlpha(atmosphereColor, planet.getSpec().getAtmosphereColor().getAlpha());
1720 planet.getSpec().setAtmosphereColor(atmosphereColor);
1722 if (planet.getSpec().getCloudTexture() !=
null) {
1723 Color cloudColor = Misc.interpolateColor(planet.getSpec().getCloudColor(), color, 0.25f);
1724 cloudColor = Misc.setAlpha(cloudColor, planet.getSpec().getCloudColor().getAlpha());
1725 planet.getSpec().setAtmosphereColor(atmosphereColor);
1729 float tilt = planet.getSpec().getTilt();
1730 float pitch = planet.getSpec().getPitch();
1734 float sign = (float) Math.signum(
random.nextFloat() - 0.5f);
1735 double r =
random.nextFloat();
1743 sign = (float) Math.signum(
random.nextFloat() - 0.5f);
1751 planet.getSpec().setTilt(tilt);
1752 planet.getSpec().setPitch(pitch);
1755 if (context.orbitIndex == 0 && context.parent ==
null && context.orbitIndex < context.starData.getHabZoneStart() &&
1756 orbitRadius < 2500f + context.starData.getHabZoneStart() * 200f) {
1758 if (planet.getSpec().getAtmosphereThickness() > 0) {
1759 WeightedRandomPicker<String> glowPicker =
new WeightedRandomPicker<String>(
random);
1760 glowPicker.add(
"banded", 10f);
1761 glowPicker.add(
"aurorae", 10f);
1763 String glow = glowPicker.pick();
1767 if (context.center instanceof PlanetAPI) {
1768 planet.getSpec().setGlowColor(((PlanetAPI)context.center).getSpec().getCoronaColor());
1770 planet.getSpec().setUseReverseLightForGlow(
true);
1771 planet.getSpec().setAtmosphereThickness(0.5f);
1772 planet.getSpec().setCloudRotation(planet.getSpec().getCloudRotation() * (-1f - 2f *
random.nextFloat()));
1774 if (planet.isGasGiant()) {
1775 system.addCorona(planet, Terrain.CORONA_AKA_MAINYU,
1776 300f + 200f *
random.nextFloat(),
1785 planet.applySpecChanges();
1790 GeneratedPlanet generatedPlanetData =
new GeneratedPlanet(parent, planet, isMoon, orbitDays, orbitRadius, angle);
1791 context.generatedPlanets.add(generatedPlanetData);
1795 if (!isMoon && context.lagrangeParent ==
null) {
1799 GenResult result =
new GenResult();
1800 result.orbitalWidth = radius * 2f;
1801 result.onlyIncrementByWidth =
false;
1802 result.entities.add(planet);
1807 float radius = planet.planet.getRadius();
1808 float probability = radius / 500f;
1809 if (radius < 150f) probability = 0f;
1810 if (planet.planet.isGasGiant()) probability = 1f;
1811 if (
random.nextFloat() > probability) {
1823 Set<LagrangePointType> points = EnumSet.of(LagrangePointType.L4, LagrangePointType.L5);
1824 for (LagrangePointType point : points) {
1831 picker.print(
" Picking from category " + categoryData.
getCategory() +
1832 ", orbit index " + (context.parent !=
null ? context.parentOrbitIndex : context.orbitIndex +
", for lagrange point"));
1836 if (entityData ==
null) {
1837 System.out.println(
" Nothing to pick");
1838 System.out.println();
1840 System.out.println(
" Picked: " + entityData.
getId());
1841 System.out.println();
1845 context.lagrangeParent = planet;
1846 context.lagrangePointType = point;
1848 GenResult result =
null;
1851 result =
addPlanet(context, planetData,
true,
true);
1857 if (result !=
null) {
1858 for (SectorEntityToken curr : result.entities) {
1859 if (context.lagrangeParent !=
null && !result.entities.isEmpty()) {
1867 context.lagrangeParent =
null;
1868 context.lagrangePointType =
null;
1880 String age = context.age;
1882 String starType =
star !=
null ?
star.getTypeId() :
null;
1883 if (context.center instanceof PlanetAPI) {
1884 PlanetAPI
star = (PlanetAPI) context.center;
1885 if (
star.isStar()) starType =
star.getTypeId();
1888 String parentCategory = context.parentCategory;
1890 WeightedRandomPicker<CategoryGenDataSpec> picker =
new WeightedRandomPicker<CategoryGenDataSpec>(
random);
1893 if (context.excludeCategories.contains(categoryData.getCategory()))
continue;
1895 boolean catNothing = categoryData.getCategory().equals(
CAT_NOTHING);
1896 if (!nothingOk && catNothing)
continue;
1900 float weight = categoryData.getFrequency();
1901 if (age !=
null) weight *= categoryData.getMultiplier(age);
1902 if (starType !=
null) weight *= categoryData.getMultiplier(starType);
1903 if (parentCategory !=
null) weight *= categoryData.getMultiplier(parentCategory);
1904 for (String col : context.multipliers) {
1905 weight *= categoryData.getMultiplier(col);
1907 if (extraMult !=
null) weight *= categoryData.getMultiplier(extraMult);
1910 if (weight > 0 && (catNothing || !
isCategoryEmpty(categoryData, context, extraMult, nothingOk))) {
1911 picker.add(categoryData, weight);
1916 boolean withParent = context.parent !=
null;
1917 int orbitIndex = context.orbitIndex;
1918 String parentType =
"";
1920 parentType = context.parent.getSpec().getPlanetType();
1921 orbitIndex = context.parentOrbitIndex;
1928 int habDiff = orbitIndex - (int) context.starData.getHabZoneStart();
1930 picker.print(
" Picking category for moon of " + parentType +
1931 ", orbit from star: " + orbitIndex +
" (" + habDiff +
")" +
", extra: " + extraMult);
1933 picker.print(
" Picking category for entity orbiting star " + starType +
1934 ", orbit from star: " + orbitIndex +
" (" + habDiff +
")" +
", extra: " + extraMult);
1940 System.out.println(
" Picked: " + pick.
getCategory());
1941 System.out.println();
1967 GenContext context, String extraMult) {
1971 GenContext context, String extraMult,
boolean nothingOk) {
1972 int orbitIndex = context.orbitIndex;
1973 if (context.parentOrbitIndex >= 0) {
1974 orbitIndex = context.parentOrbitIndex;
1976 int fromParentOrbitIndex = context.orbitIndex;
1977 String age = context.age;
1979 String starType =
star !=
null ?
star.getTypeId() :
null;
1980 if (context.center instanceof PlanetAPI) {
1981 PlanetAPI
star = (PlanetAPI) context.center;
1982 if (
star.isStar()) starType =
star.getTypeId();
1985 String parentCategory = context.parentCategory;
1988 WeightedRandomPicker<EntityGenDataSpec> picker =
new WeightedRandomPicker<EntityGenDataSpec>(
random);
1992 if (!planetData.getCategory().equals(categoryData.
getCategory()))
continue;
1995 float minIndex = context.starData.getHabZoneStart() + planetData.getHabOffsetMin() + offset;
1996 float maxIndex = context.starData.getHabZoneStart() + planetData.getHabOffsetMax() + offset;
1997 boolean inRightRange = orbitIndex >= minIndex && orbitIndex <= maxIndex;
1998 boolean giantMoonException =
CAT_GIANT.equals(parentCategory) &&
1999 (planetData.hasTag(
TAG_GIANT_MOON) && context.parent !=
null && context.parent.isGasGiant());
2000 if (!inRightRange && !giantMoonException)
continue;
2007 if (!orbitIndexOk)
continue;
2010 if (!lagrangeStatusOk)
continue;
2015 if (!nebulaStatusOk)
continue;
2017 float weight = planetData.getFrequency();
2018 if (age !=
null) weight *= planetData.getMultiplier(age);
2019 if (starType !=
null) weight *= planetData.getMultiplier(starType);
2020 if (parentCategory !=
null) weight *= planetData.getMultiplier(parentCategory);
2021 for (String col : context.multipliers) {
2022 weight *= planetData.getMultiplier(col);
2024 if (extraMult !=
null) weight *= planetData.getMultiplier(extraMult);
2025 if (weight > 0) picker.add(planetData, weight);
2030 if (!terrainData.getCategory().equals(categoryData.
getCategory()))
continue;
2032 if (!nothingOk && terrainData.getId().equals(
"rings_nothing"))
continue;
2035 float minIndex = context.starData.getHabZoneStart() + terrainData.getHabOffsetMin() + offset;
2036 float maxIndex = context.starData.getHabZoneStart() + terrainData.getHabOffsetMax() + offset;
2037 boolean inRightRange = orbitIndex >= minIndex && orbitIndex <= maxIndex;
2038 boolean giantMoonException =
CAT_GIANT.equals(parentCategory) &&
2039 (terrainData.hasTag(
TAG_GIANT_MOON) && context.parent !=
null && context.parent.isGasGiant());
2040 if (!inRightRange && !giantMoonException)
continue;
2043 if (!orbitIndexOk)
continue;
2046 if (!lagrangeStatusOk)
continue;
2051 if (!nebulaStatusOk)
continue;
2053 float weight = terrainData.getFrequency();
2054 if (age !=
null) weight *= terrainData.getMultiplier(age);
2055 if (starType !=
null) weight *= terrainData.getMultiplier(starType);
2056 if (parentCategory !=
null) weight *= terrainData.getMultiplier(parentCategory);
2057 for (String col : context.multipliers) {
2058 weight *= terrainData.getMultiplier(col);
2060 if (extraMult !=
null) weight *= terrainData.getMultiplier(extraMult);
2061 if (weight > 0) picker.add(terrainData, weight);
2070 Color one = Color.white, two =
null, three =
null;
2080 case TRINARY_1CLOSE_1FAR:
2084 case TRINARY_2CLOSE:
2092 if (two !=
null && three ==
null) {
2093 result = Misc.interpolateColor(one, two, 0.5f);
2094 }
else if (two !=
null && three !=
null) {
2095 result = Misc.interpolateColor(one, two, 0.5f);
2096 result = Misc.interpolateColor(result, three, 0.5f);
2098 system.setLightColor(result);
2106 Color lightColor = Misc.interpolateColor(min, max,
random.nextFloat());
2122 if (starSpec ==
null)
return null;
2133 starSpec.getPlanetType(),
2162 system.getLocation().set(loc);
2200 String
id =
params.starTypes.remove(0);
2203 if (spec.getPlanetType().equals(
id)) {
2205 if (test ==
null)
continue;
2207 boolean hasTag = data.
hasTag(StarSystemType.NEBULA.name());
2208 boolean nebType =
systemType == StarSystemType.NEBULA;
2209 boolean nebulaStatusOk = hasTag == nebType;
2210 if (nebulaStatusOk) {
2220 WeightedRandomPicker<PlanetSpecAPI> picker =
new WeightedRandomPicker<PlanetSpecAPI>(
random);
2222 if (!spec.isStar())
continue;
2224 String
id = spec.getPlanetType();
2226 if (test ==
null)
continue;
2236 boolean hasTag = data.
hasTag(StarSystemType.NEBULA.name());
2237 boolean nebType =
systemType == StarSystemType.NEBULA;
2238 boolean nebulaStatusOk = hasTag == nebType;
2240 if (!nebulaStatusOk)
continue;
2257 picker.add(spec, freq);
2262 return picker.pick();
2267 Color color =
new Color((
int) (min.getRed() + (max.getRed() - min.getRed()) *
random.nextDouble()),
2268 (
int) (min.getGreen() + (max.getGreen() - min.getGreen()) *
random.nextDouble()),
2269 (
int) (min.getBlue() + (max.getBlue() - min.getBlue()) *
random.nextDouble()),
2282 double r =
random.nextGaussian();
2291 return min + (float) r * (max - min);
2295 float radius = (float) (min + (max - min) *
random.nextFloat());
2300 float radius = (float) (min + (max - min) *
random.nextFloat());
2312 if (
random.nextBoolean()) {
2315 return Gender.FEMALE;
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
float getMaxExtraOrbits()
float getMinExtraOrbits()
static SpringSystem doConstellationLayout(List< StarSystemAPI > systems, Random random, Vector2f centerPoint)
List< StarSystemAPI > getSystems()
void setAllEntitiesAdded(Map< SectorEntityToken, List< SectorEntityToken > > allEntitiesAdded)
void setLagrangeParentMap(Map< SectorEntityToken, PlanetAPI > lagrangeParentMap)
void setLeavePickedNameUnused(boolean leavePickedNameUnused)
boolean hasTag(String tag)
void setSpecialNamesProbability(float specialNamesProbability)
void assignNames(String name, String secondary)
void setStructuralNameOffset(int structuralNameOffset)
void setRenameSystem(boolean renameStar)
void noisePrune(float fractionKeep)
void clearArc(float x, float y, float innerRadius, float outerRadius, float startAngle, float endAngle)
static void generateConditionsForPlanet(GenContext context, PlanetAPI planet)
boolean hasTag(String tag)
static final String TAG_GIANT_MOON
void addStuffAtLagrangePoints(GenContext context, GeneratedPlanet planet)
static final float LAGRANGE_OFFSET
static final float MOON_RADIUS_MAX_FRACTION_OF_NORMAL
Map< SectorEntityToken, PlanetAPI > lagrangeParentMap
void switchPrimaryAndTertiaryIfNeeded(boolean sizeDownSmaller)
static final float STARTING_RADIUS_STAR_RANGE
static float addOrbitingEntities(StarSystemAPI system, SectorEntityToken parentStar, StarAge age, int min, int max, float startingRadius, int nameOffset, boolean withSpecialNames, boolean allowHabitable)
static TerrainGenPlugin pickTerrainGenPlugin(TerrainGenDataSpec terrainData, GenContext context)
static Color getColor(Color min, Color max)
static final float MAX_STAR_DIST
static final String CAT_GIANT
static float getRadius(float min, float max)
StarAge getConstellationAge()
StarSystemType pickSystemType(StarAge constellationAge)
static final float STARTING_RADIUS_MOON_BASE
GenResult addTerrain(GenContext context, TerrainGenDataSpec terrainData)
Map< SectorEntityToken, List< SectorEntityToken > > allNameableEntitiesAdded
static final String CAT_HAB1
static final String NEBULA_DEFAULT
static final float MAX_ORBIT_RADIUS
static final float MOON_RADIUS_MIN_FRACTION_OF_NORMAL
static final float TILT_MAX
static final String CAT_HAB5
static void addStableLocations(StarSystemAPI system, int num)
void init(StarSystemAPI system, StarAge age)
static final String CAT_HAB4
static final float FAR_MAX_ORBIT_RADIUS
static final String NEBULA_BLUE
static void addSystemwideNebula(StarSystemAPI system, StarAge age)
static final float TILT_MIN
static final float STARTING_RADIUS_STAR_BASE
static Map< String, WeightedRandomPicker< String > > backgroundsByNebulaType
static final String NEBULA_AMBER
static final String CAT_HAB3
boolean addStars(String id)
static final String TAG_FIRST_ORBIT_ONLY
boolean isCategoryEmpty(CategoryGenDataSpec categoryData, GenContext context, String extraMult, boolean nothingOk)
static Gender pickGender()
void setDefaultLightColorBasedOnStars()
AgeGenDataSpec constellationAgeData
static final float MIN_MOON_RADIUS
AgeGenDataSpec starAgeData
static final String COL_LAGRANGE
void addStableLocations()
float getHabOffset(EntityGenDataSpec data)
static final float STARTING_RADIUS_MOON_RANGE
CategoryGenDataSpec pickCategory(GenContext context, String extraMult, boolean nothingOk)
static final float PITCH_MIN
static final String TAG_NOT_IN_NEBULA
void addJumpPoint(LagrangePoint p, String name)
void generateSystem(Vector2f loc)
GenResult addPlanet(GenContext context, PlanetGenDataSpec planetData, boolean isMoon, boolean addMoons)
static final String COL_TRINARY
void addFarStar(PlanetAPI farStar, float orbitAngle, float baseOrbitRadius, float orbitPeriod)
static void removeTerrainGenPlugin(TerrainGenPlugin plugin)
static final String COL_IN_ASTEROIDS
StarSystemType systemType
static void updateBackgroundPickers()
static final String NEBULA_NONE
static final String COL_BINARY
static final String TAG_NOT_NEBULA_UNLESS_MOON
static final float MOON_RADIUS_MAX_FRACTION_OF_PARENT
void setPulsarIfNeutron(PlanetAPI star)
static final float MIN_STAR_DIST
WeightedRandomPicker< EntityGenDataSpec > getPickerForCategory(CategoryGenDataSpec categoryData, GenContext context, String extraMult, boolean nothingOk)
static final String COL_IS_MOON
boolean initSystem(String name, Vector2f loc)
static float getRandom(float min, float max)
void addSystemwideNebula()
void pickNebulaAndBackground()
PlanetSpecAPI pickStar(StarAge age)
static List< TerrainGenPlugin > terrainPlugins
static final String CAT_HAB2
void setBlackHoleIfBlackHole(PlanetAPI star)
static final String CAT_NOTHING
SectorEntityToken systemCenter
static Map< StarAge, String > nebulaTypes
static float getNormalRandom(float min, float max)
CustomConstellationParams params
static void addTerrainGenPlugin(TerrainGenPlugin plugin)
void addJumpPoints(GenResult result, boolean farStarMode)
static final float BASE_INCR
void updateAgeAfterPickingStar()
static float addOrbitingEntities(StarSystemAPI system, SectorEntityToken parentStar, StarAge age, int min, int max, float startingRadius, int nameOffset, boolean withSpecialNames)
Map< SectorEntityToken, List< SectorEntityToken > > getAllEntitiesAdded()
static final float PITCH_MAX
static final String TAG_LAGRANGE_ONLY
static final float BASE_INCR_MOON
PlanetAPI addRandomStar(String id, String name)
GenResult addPlanetsAndTerrain(float maxOrbitRadius)
void switchPrimaryAndSecondaryIfNeeded(boolean sizeDownSmaller)
Color pickLightColorForStar(PlanetAPI star)
WeightedRandomPicker< EntityGenDataSpec > getPickerForCategory(CategoryGenDataSpec categoryData, GenContext context, String extraMult)
Map< SectorEntityToken, PlanetAPI > getLagrangeParentMap()
static float getNormalRandom(Random random, float min, float max)
GenResult addOrbitingEntities(GenContext context, int numOrbits, boolean addingMoons, boolean addMoons, boolean parentIsMoon, boolean nothingOk)
static final String TAG_REQUIRES_NEBULA
StarSystemGenerator(CustomConstellationParams params)
OrbitAPI createCircularOrbit(SectorEntityToken focus, float angle, float orbitRadius, float orbitDays)
JumpPointAPI createJumpPoint(String id, String name)
< T > Collection< T > getAllSpecs(Class< T > c)
String getSpriteName(String category, String id)
Object getSpec(Class c, String id, boolean nullOnNotFound)
List< PlanetSpecAPI > getAllPlanetSpecs()
float getHabOffsetYOUNG()
float getHabOffsetAVERAGE()
GenResult generate(TerrainGenDataSpec terrainData, GenContext context)