1package com.fs.starfarer.api.impl.campaign.procgen.themes;
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.EnumSet;
7import java.util.HashSet;
8import java.util.LinkedHashMap;
9import 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.CampaignTerrainPlugin;
19import com.fs.starfarer.api.campaign.CargoAPI;
20import com.fs.starfarer.api.campaign.CircularOrbitWithSpinAPI;
21import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
22import com.fs.starfarer.api.campaign.LocationAPI;
23import com.fs.starfarer.api.campaign.OrbitAPI;
24import com.fs.starfarer.api.campaign.PlanetAPI;
25import com.fs.starfarer.api.campaign.SectorEntityToken;
26import com.fs.starfarer.api.campaign.StarSystemAPI;
27import com.fs.starfarer.api.campaign.econ.MarketAPI;
28import com.fs.starfarer.api.campaign.rules.MemoryAPI;
29import com.fs.starfarer.api.impl.campaign.DerelictShipEntityPlugin;
30import com.fs.starfarer.api.impl.campaign.DerelictShipEntityPlugin.DerelictShipData;
31import com.fs.starfarer.api.impl.campaign.ids.Conditions;
32import com.fs.starfarer.api.impl.campaign.ids.Entities;
33import com.fs.starfarer.api.impl.campaign.ids.Factions;
34import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
35import com.fs.starfarer.api.impl.campaign.ids.Tags;
36import com.fs.starfarer.api.impl.campaign.procgen.Constellation;
37import com.fs.starfarer.api.impl.campaign.procgen.ObjectiveGenDataSpec;
38import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec;
39import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec.DropData;
40import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
41import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.LagrangePointType;
42import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.StarSystemType;
43import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageEntity;
44import com.fs.starfarer.api.impl.campaign.terrain.AsteroidBeltTerrainPlugin;
45import com.fs.starfarer.api.impl.campaign.terrain.AsteroidFieldTerrainPlugin;
46import com.fs.starfarer.api.impl.campaign.terrain.BaseRingTerrain;
47import com.fs.starfarer.api.impl.campaign.terrain.BaseTiledTerrain;
48import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin;
49import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldParams;
50import com.fs.starfarer.api.impl.campaign.terrain.DebrisFieldTerrainPlugin.DebrisFieldSource;
51import com.fs.starfarer.api.impl.campaign.terrain.MagneticFieldTerrainPlugin;
52import com.fs.starfarer.api.impl.campaign.terrain.NebulaTerrainPlugin;
53import com.fs.starfarer.api.impl.campaign.terrain.PulsarBeamTerrainPlugin;
54import com.fs.starfarer.api.impl.campaign.terrain.RadioChatterTerrainPlugin;
55import com.fs.starfarer.api.impl.campaign.terrain.RingSystemTerrainPlugin;
56import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin;
57import com.fs.starfarer.api.util.Misc;
58import com.fs.starfarer.api.util.WeightedRandomPicker;
62 public static enum HabitationLevel {
68 public static class StarSystemData {
69 public StarSystemAPI system;
70 public List<PlanetAPI> stars =
new ArrayList<PlanetAPI>();
71 public List<PlanetAPI> planets =
new ArrayList<PlanetAPI>();
72 public List<PlanetAPI> habitable =
new ArrayList<PlanetAPI>();
73 public List<PlanetAPI> gasGiants =
new ArrayList<PlanetAPI>();
74 public List<PlanetAPI> resourceRich =
new ArrayList<PlanetAPI>();
76 public Set<SectorEntityToken> alreadyUsed =
new LinkedHashSet<SectorEntityToken>();
78 public Set<AddedEntity> generated =
new LinkedHashSet<AddedEntity>();
80 public boolean isBlackHole() {
81 return system.getStar() !=
null && system.getStar().getSpec().isBlackHole();
84 public boolean isPulsar() {
86 return system.hasPulsar();
89 public boolean isNebula() {
90 return system.isNebula();
94 public String toString() {
95 return String.format(system.getName() +
" %d %d %d %d %d", stars.size(), planets.size(), habitable.size(),
107 public static class AddedEntity {
108 public SectorEntityToken entity;
109 public EntityLocation location;
110 public String entityType;
111 public AddedEntity(SectorEntityToken entity, EntityLocation location, String entityType) {
112 this.entity = entity;
113 this.location = location;
114 this.entityType = entityType;
119 public static enum LocationType {
135 public static class EntityLocation {
136 public LocationType type;
137 public Vector2f location =
null;
138 public OrbitAPI orbit =
null;
142 public String toString() {
143 return String.format(
"Type: %s, orbitPeriod: %s", type.name(), orbit ==
null ?
"null" :
"" + orbit.getOrbitalPeriod());
165 public void addShipGraveyard(StarSystemData data,
float chanceToAddAny,
int min,
int max, WeightedRandomPicker<String> factions) {
166 if (
random.nextFloat() >= chanceToAddAny)
return;
167 int num = min +
random.nextInt(max - min + 1);
169 for (
int i = 0; i < num; i++) {
170 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
178 weights.put(LocationType.STAR_ORBIT, 5f);
179 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, data.system,
null, 1000f, weights);
180 EntityLocation loc = locs.pick();
183 SectorEntityToken token = data.system.createToken(0, 0);
184 data.system.addEntity(token);
192 public void addShipGraveyard(StarSystemData data, SectorEntityToken focus, WeightedRandomPicker<String> factions) {
195 public void addShipGraveyard(StarSystemData data, SectorEntityToken focus, WeightedRandomPicker<String> factions,
196 WeightedRandomPicker<String> hulls) {
197 int numShips =
random.nextInt(9) + 3;
199 if (
DEBUG) System.out.println(
" Adding ship graveyard (" + numShips +
" ships)");
201 WeightedRandomPicker<Float> bands =
new WeightedRandomPicker<Float>(
random);
202 for (
int i = 0; i < numShips + 5; i++) {
203 bands.add(
new Float(140 + i * 20), (i + 1) * (i + 1));
211 for (
int i = 0; i < numShips; i++) {
212 float radius = bands.pickAndRemove();
215 if (hulls !=
null && !hulls.isEmpty()) {
218 if (params !=
null) {
220 focus.getContainingLocation(),
221 Entities.WRECK, Factions.NEUTRAL, params);
222 entity.setDiscoverable(
true);
223 float orbitDays = radius / (5f +
random.nextFloat() * 10f);
224 entity.setCircularOrbit(focus,
random.nextFloat() * 360f, radius, orbitDays);
225 if (
DEBUG) System.out.println(
" Added ship: " +
228 AddedEntity added =
new AddedEntity(entity,
null, Entities.WRECK);
229 data.generated.add(added);
234 public void addDerelictShips(StarSystemData data,
float chanceToAddAny,
int min,
int max, WeightedRandomPicker<String> factions) {
235 if (
random.nextFloat() >= chanceToAddAny)
return;
239 int num = min +
random.nextInt(max - min + 1);
240 for (
int i = 0; i < num; i++) {
247 public void addMiningStations(StarSystemData data,
float chanceToAddAny,
int min,
int max, WeightedRandomPicker<String> stationTypes) {
248 if (
random.nextFloat() >= chanceToAddAny)
return;
250 int num = min +
random.nextInt(max - min + 1);
251 if (
DEBUG) System.out.println(
" Adding " + num +
" mining stations");
252 for (
int i = 0; i < num; i++) {
253 List<PlanetAPI> miningCandidates =
new ArrayList<PlanetAPI>();
254 miningCandidates.addAll(data.gasGiants);
255 miningCandidates.addAll(data.resourceRich);
257 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
258 weights.put(LocationType.IN_ASTEROID_BELT, 10f);
259 weights.put(LocationType.IN_ASTEROID_FIELD, 10f);
260 weights.put(LocationType.IN_RING, 10f);
261 weights.put(LocationType.IN_SMALL_NEBULA, 10f);
262 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, data.system,
null, 100f, weights);
263 EntityLocation loc = locs.pick();
265 String type = stationTypes.pick();
266 if (loc !=
null || !miningCandidates.isEmpty()) {
267 if ((
random.nextFloat() > 0.5f && loc !=
null) || miningCandidates.isEmpty()) {
268 addStation(loc, data, type, Factions.NEUTRAL);
270 PlanetAPI planet = miningCandidates.get(
random.nextInt(miningCandidates.size()));
272 addStation(planetOrbitLoc, data, type, Factions.NEUTRAL);
273 data.alreadyUsed.add(planet);
283 public void addHabCenters(StarSystemData data,
float chanceToAddAny,
int min,
int max, WeightedRandomPicker<String> stationTypes) {
284 if (
random.nextFloat() >= chanceToAddAny)
return;
286 WeightedRandomPicker<PlanetAPI> habPlanets =
new WeightedRandomPicker<PlanetAPI>(
random);
287 for (PlanetAPI planet : data.habitable) {
288 float h = planet.getMarket().getHazardValue();
290 if (h < 0.1f) h = 0.1f;
292 habPlanets.add(planet, w);
295 WeightedRandomPicker<PlanetAPI> otherPlanets =
new WeightedRandomPicker<PlanetAPI>(
random);
296 for (PlanetAPI planet : data.planets) {
297 if (data.habitable.contains(planet))
continue;
298 otherPlanets.add(planet);
301 int num = min +
random.nextInt(max - min + 1);
302 if (
DEBUG) System.out.println(
" Adding up to " + num +
" hab centers on planets/in orbit");
303 for (
int i = 0; i < num; i++) {
316 PlanetAPI planet = habPlanets.pickAndRemove();
318 data.alreadyUsed.add(planet);
319 }
else if (option == 1) {
320 PlanetAPI planet = otherPlanets.pickAndRemove();
322 data.alreadyUsed.add(planet);
323 }
else if (option == 2) {
324 String type = stationTypes.pick();
326 addStation(loc, data, type, Factions.NEUTRAL);
332 public void addResearchStations(StarSystemData data,
float chanceToAddAny,
int min,
int max, WeightedRandomPicker<String> stationTypes) {
333 if (
random.nextFloat() >= chanceToAddAny)
return;
335 int num = min +
random.nextInt(max - min + 1);
336 if (
DEBUG) System.out.println(
" Adding " + num +
" research stations");
337 for (
int i = 0; i < num; i++) {
338 String type = stationTypes.pick();
340 List<PlanetAPI> researchCandidates =
new ArrayList<PlanetAPI>();
341 researchCandidates.addAll(data.gasGiants);
343 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
344 weights.put(LocationType.IN_SMALL_NEBULA, 5f);
345 weights.put(LocationType.GAS_GIANT_ORBIT, 10f);
346 weights.put(LocationType.NEAR_STAR, 5f);
347 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, data.system, data.alreadyUsed, 100f, weights);
348 EntityLocation loc = locs.pick();
351 AddedEntity added =
addStation(loc, data, type, Factions.NEUTRAL);
352 if (loc.orbit !=
null && loc.orbit.getFocus() instanceof PlanetAPI) {
353 PlanetAPI planet = (PlanetAPI) loc.orbit.getFocus();
354 if (!planet.isStar()) {
355 data.alreadyUsed.add(planet);
364 if (planet ==
null)
return;
366 MarketAPI market = planet.getMarket();
370 if (
DEBUG) System.out.println(
" Added " + ruins +
" to " + market.getName());
371 market.addCondition(ruins);
373 if (
DEBUG) System.out.println(
" Added decivilized to " + market.getName());
374 market.addCondition(Conditions.DECIVILIZED);
379 float chance = 0.25f;
381 if (planet.getMarket().hasCondition(Conditions.HABITABLE)) {
385 if (ruins !=
null && ruins.equals(Conditions.RUINS_EXTENSIVE)) {
388 if (ruins !=
null && ruins.equals(Conditions.RUINS_VAST)) {
392 return random.nextFloat() < chance;
397 List<AddedEntity> result =
new ArrayList<AddedEntity>();
399 Set<String> used =
new HashSet<String>();
402 for (SectorEntityToken loc : data.system.getEntitiesWithTag(Tags.STABLE_LOCATION)) {
404 if (
random.nextFloat() >= prob * mult)
continue;
406 WeightedRandomPicker<ObjectiveGenDataSpec> picker =
new WeightedRandomPicker<ObjectiveGenDataSpec>(
random);
414 if (pick ==
null)
break;
418 SectorEntityToken built = data.system.addCustomEntity(
null,
422 built.getMemoryWithoutUpdate().set(MemFlags.OBJECTIVE_NON_FUNCTIONAL,
true);
423 if (loc.getOrbit() !=
null) {
424 built.setOrbit(loc.getOrbit().makeCopy());
426 built.setLocation(loc.getLocation().x, loc.getLocation().y);
427 data.system.removeEntity(loc);
429 AddedEntity e =
new AddedEntity(built,
null, pick.
getId());
443 if (
random.nextFloat() >= prob)
return null;
445 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
446 weights.put(LocationType.STAR_ORBIT, 10f);
447 weights.put(LocationType.OUTER_SYSTEM, 10f);
448 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, data.system,
null, 100f, weights);
449 EntityLocation loc = locs.pick();
451 AddedEntity added =
addNonSalvageEntity(data.system, loc, Entities.COMM_RELAY, Factions.NEUTRAL);
452 if (
DEBUG && added !=
null) System.out.println(
" Added comm relay");
456 added.entity.getMemoryWithoutUpdate().set(MemFlags.OBJECTIVE_NON_FUNCTIONAL,
true);
463 public AddedEntity
addInactiveGate(StarSystemData data,
float prob,
float probDebris,
float probShips, WeightedRandomPicker<String> factions) {
464 if (
random.nextFloat() >= prob)
return null;
472 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
473 weights.put(LocationType.STAR_ORBIT, 10f);
474 weights.put(LocationType.OUTER_SYSTEM, 10f);
475 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, data.system,
null, 100f, weights);
476 EntityLocation loc = locs.pick();
478 AddedEntity added =
addNonSalvageEntity(data.system, loc, Entities.INACTIVE_GATE, Factions.NEUTRAL);
479 if (
DEBUG && added !=
null) System.out.println(
" Added inactive gate to " + data.system.getNameWithLowercaseTypeShort());
484 if (
random.nextFloat() < probDebris) {
485 if (
DEBUG && added !=
null) System.out.println(
" Added debris field around gate");
487 if (
random.nextFloat() < probShips) {
488 if (
DEBUG && added !=
null) System.out.println(
" Added ship graveyard around gate");
499 WeightedRandomPicker<String> picker =
new WeightedRandomPicker<String>(
random);
501 float hazard = planet.getMarket().getHazardValue();
503 float add1 = 0, add2 = 0;
508 }
else if (hazard <= 1.25f) {
513 picker.add(Conditions.RUINS_SCATTERED, 10f);
514 picker.add(Conditions.RUINS_WIDESPREAD, 10f);
515 picker.add(Conditions.RUINS_EXTENSIVE, 3f + add1);
516 picker.add(Conditions.RUINS_VAST, 1f + add2);
518 return picker.pick();
522 public AddedEntity
addStation(EntityLocation loc, StarSystemData data, String customEntityId, String factionId) {
523 if (loc ==
null)
return null;
525 AddedEntity station =
addEntity(
random, data.system, loc, customEntityId, factionId);
526 if (station !=
null) {
527 data.generated.add(station);
529 SectorEntityToken focus = station.entity.getOrbitFocus();
530 if (
DEBUG) System.out.println(
" Added " + customEntityId);
531 if (focus instanceof PlanetAPI) {
532 PlanetAPI planet = (PlanetAPI) focus;
533 data.alreadyUsed.add(planet);
535 boolean nearStar = planet.isStar() && station.entity.getOrbit() !=
null && station.entity.getCircularOrbitRadius() < 5000;
537 if (planet.isStar() && !nearStar) {
552 public void addCaches(StarSystemData data,
float chanceToAddAny,
int min,
int max, WeightedRandomPicker<String> cacheTypes) {
553 if (
random.nextFloat() >= chanceToAddAny)
return;
555 int num = min +
random.nextInt(max - min + 1);
556 if (
DEBUG) System.out.println(
" Adding " + num +
" resource caches");
557 for (
int i = 0; i < num; i++) {
559 String type = cacheTypes.pick();
560 AddedEntity added =
addEntity(
random, data.system, loc, type, Factions.NEUTRAL);
562 data.generated.add(added);
565 if (
DEBUG && added !=
null) System.out.println(
" Added resource cache: " + type);
569 public void addDebrisFields(StarSystemData data,
float chanceToAddAny,
int min,
int max) {
572 public void addDebrisFields(StarSystemData data,
float chanceToAddAny,
int min,
int max, String defFaction,
float defProb,
int minStr,
int maxStr) {
573 if (
random.nextFloat() >= chanceToAddAny)
return;
575 int numDebrisFields = min +
random.nextInt(max - min + 1);
576 if (
DEBUG) System.out.println(
" Adding up to " + numDebrisFields +
" debris fields");
577 for (
int i = 0; i < numDebrisFields; i++) {
580 float radius = 150f +
random.nextFloat() * 300f;
582 if (loc ==
null)
continue;
584 DebrisFieldParams params =
new DebrisFieldParams(
590 if (defFaction !=
null) {
591 params.defFaction = defFaction;
592 params.defenderProb = defProb;
593 params.minStr = minStr;
594 params.maxStr = maxStr;
597 params.source = DebrisFieldSource.GEN;
598 SectorEntityToken debris = Misc.addDebrisField(data.system, params,
random);
601 AddedEntity added =
new AddedEntity(debris, loc, Entities.DEBRIS_FIELD_SHARED);
602 data.generated.add(added);
604 if (
DEBUG) System.out.println(
" Added debris field");
608 public AddedEntity
addDebrisField(StarSystemData data, SectorEntityToken focus,
float radius) {
609 DebrisFieldParams params =
new DebrisFieldParams(
615 params.source = DebrisFieldSource.GEN;
616 SectorEntityToken debris = Misc.addDebrisField(focus.getContainingLocation(), params,
random);
617 debris.setCircularOrbit(focus, 0, 0, 100f);
618 if (
DEBUG) System.out.println(
" Added debris field");
620 EntityLocation loc =
new EntityLocation();
621 loc.type = LocationType.OUTER_SYSTEM;
622 AddedEntity added =
new AddedEntity(debris, loc, Entities.DEBRIS_FIELD_SHARED);
623 data.generated.add(added);
635 WeightedRandomPicker<String> picker =
new WeightedRandomPicker<String>(
random);
636 for (
int i = 0; i < params.length; i += 2) {
637 String item = (String) params[i];
639 if (params[i+1] instanceof Float) {
640 weight = (Float) params[i+1];
641 }
else if (params[i+1] instanceof Integer) {
642 weight = (Integer) params[i+1];
644 picker.add(item, weight);
650 public void addDerelictShip(StarSystemData data, EntityLocation loc, WeightedRandomPicker<String> factions) {
651 if (loc ==
null)
return;
657 String faction = factions.pick();
659 if (params !=
null) {
661 Entities.WRECK, Factions.NEUTRAL, params);
662 entity.setDiscoverable(
true);
664 if (
DEBUG) System.out.println(
" Added ship: " +
667 AddedEntity added =
new AddedEntity(entity,
null, Entities.WRECK);
668 data.generated.add(added);
673 public AddedEntity
addDerelictShip(StarSystemData data, EntityLocation loc, String variantId) {
674 if (loc ==
null)
return null;
677 if (params !=
null) {
679 Entities.WRECK, Factions.NEUTRAL, params);
680 entity.setDiscoverable(
true);
682 if (
DEBUG) System.out.println(
" Added ship: " +
685 AddedEntity added =
new AddedEntity(entity,
null, Entities.WRECK);
686 data.generated.add(added);
694 public static EntityLocation
pickCommonLocation(Random
random, StarSystemAPI system,
float gap,
boolean allowStarOrbit, Set<SectorEntityToken> exclude) {
696 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
697 weights.put(LocationType.PLANET_ORBIT, 10f);
698 if (allowStarOrbit) {
699 weights.put(LocationType.STAR_ORBIT, 10f);
701 weights.put(LocationType.GAS_GIANT_ORBIT, 5f);
702 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, system, exclude, gap, weights);
703 if (locs.isEmpty()) {
711 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
712 weights.put(LocationType.IN_ASTEROID_BELT, 5f);
713 weights.put(LocationType.IN_ASTEROID_FIELD, 5f);
714 weights.put(LocationType.IN_RING, 5f);
715 weights.put(LocationType.IN_SMALL_NEBULA, 5f);
716 weights.put(LocationType.L_POINT, 5f);
717 weights.put(LocationType.GAS_GIANT_ORBIT, 5f);
718 weights.put(LocationType.JUMP_ORBIT, 5f);
719 weights.put(LocationType.NEAR_STAR, 5f);
720 weights.put(LocationType.OUTER_SYSTEM, 5f);
721 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, system, exclude, gap, weights);
722 if (locs.isEmpty()) {
728 public static EntityLocation
pickAnyLocation(Random
random, StarSystemAPI system,
float gap, Set<SectorEntityToken> exclude) {
730 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
731 weights.put(LocationType.PLANET_ORBIT, 10f);
732 weights.put(LocationType.STAR_ORBIT, 10f);
733 weights.put(LocationType.IN_ASTEROID_BELT, 5f);
734 weights.put(LocationType.IN_ASTEROID_FIELD, 5f);
735 weights.put(LocationType.IN_RING, 5f);
736 weights.put(LocationType.IN_SMALL_NEBULA, 5f);
737 weights.put(LocationType.L_POINT, 5f);
738 weights.put(LocationType.GAS_GIANT_ORBIT, 5f);
739 weights.put(LocationType.JUMP_ORBIT, 5f);
740 weights.put(LocationType.NEAR_STAR, 5f);
741 weights.put(LocationType.OUTER_SYSTEM, 5f);
742 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, system, exclude, gap, weights);
748 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
749 weights.put(LocationType.IN_ASTEROID_BELT, 5f);
750 weights.put(LocationType.IN_ASTEROID_FIELD, 5f);
751 weights.put(LocationType.IN_RING, 5f);
752 weights.put(LocationType.IN_SMALL_NEBULA, 5f);
753 weights.put(LocationType.L_POINT, 5f);
754 weights.put(LocationType.GAS_GIANT_ORBIT, 5f);
755 weights.put(LocationType.NEAR_STAR, 5f);
756 weights.put(LocationType.OUTER_SYSTEM, 5f);
757 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, system, exclude, gap, weights);
758 if (locs.isEmpty()) {
766 LinkedHashMap<LocationType, Float> weights =
new LinkedHashMap<LocationType, Float>();
767 weights.put(LocationType.IN_ASTEROID_BELT, 5f);
768 weights.put(LocationType.IN_ASTEROID_FIELD, 5f);
769 weights.put(LocationType.IN_RING, 5f);
770 weights.put(LocationType.IN_SMALL_NEBULA, 5f);
771 weights.put(LocationType.L_POINT, 5f);
772 weights.put(LocationType.GAS_GIANT_ORBIT, 5f);
773 weights.put(LocationType.OUTER_SYSTEM, 5f);
774 WeightedRandomPicker<EntityLocation> locs =
getLocations(
random, system, exclude, gap, weights);
775 if (locs.isEmpty()) {
786 float minGap, LinkedHashMap<LocationType, Float> weights) {
789 public static WeightedRandomPicker<EntityLocation>
getLocations(Random
random, StarSystemAPI system, Set<SectorEntityToken> exclude,
790 float minGap, LinkedHashMap<LocationType, Float> weights) {
792 WeightedRandomPicker<EntityLocation> result =
new WeightedRandomPicker<EntityLocation>(
random);
794 system.updateAllOrbits();
803 if (outer < 3000) outer = 3000;
804 if (outer > 25000) outer = 25000;
806 StarSystemType systemType = system.getType();
808 for (LocationType type : weights.keySet()) {
809 float weight = weights.get(type);
810 List<EntityLocation> locs =
new ArrayList<EntityLocation>();
813 for (PlanetAPI planet : system.getPlanets()) {
815 if (planet.isGasGiant())
continue;
816 if (planet.isStar())
continue;
817 if (exclude !=
null && exclude.contains(planet))
continue;
820 List<OrbitGap> gaps =
findGaps(planet, 100f, 100f + ow + minGap, minGap);
822 if (loc !=
null) locs.add(loc);
826 for (PlanetAPI planet : system.getPlanets()) {
827 if (planet.isStar())
continue;
828 if (planet.isMoon())
continue;
829 if (planet.getRadius() < 100)
continue;
830 if (planet.getOrbit() ==
null || planet.getOrbit().getFocus() ==
null)
continue;
831 if (planet.getCircularOrbitRadius() <= 0)
continue;
832 for (LagrangePointType lpt : EnumSet.of(LagrangePointType.L4, LagrangePointType.L5)) {
833 float orbitRadius = planet.getCircularOrbitRadius();
834 float angleOffset = -StarSystemGenerator.LAGRANGE_OFFSET * 0.5f;
835 if (lpt == LagrangePointType.L5) angleOffset = StarSystemGenerator.LAGRANGE_OFFSET * 0.5f;
836 float angle = planet.getCircularOrbitAngle() + angleOffset;
837 Vector2f location = Misc.getUnitVectorAtDegreeAngle(angle);
838 location.scale(orbitRadius);
839 Vector2f.add(location, planet.getOrbit().getFocus().getLocation(), location);
843 EntityLocation loc =
new EntityLocation();
845 float orbitDays = planet.getCircularOrbitPeriod();
849 angle, orbitRadius, orbitDays,
random.nextFloat() * 10f + 1f);
855 case GAS_GIANT_ORBIT:
856 for (PlanetAPI planet : system.getPlanets()) {
857 if (planet.isStar())
continue;
858 if (!planet.isGasGiant())
continue;
859 if (exclude !=
null && exclude.contains(planet))
continue;
862 List<OrbitGap> gaps =
findGaps(planet, 100f, 100f + ow + minGap, minGap);
864 if (loc !=
null) locs.add(loc);
868 List<SectorEntityToken> jumpPoints = system.getEntitiesWithTag(Tags.JUMP_POINT);
869 for (SectorEntityToken point : jumpPoints) {
870 if (exclude !=
null && exclude.contains(point))
continue;
871 List<OrbitGap> gaps =
findGaps(point, 200f, 200f + point.getRadius() + minGap, minGap);
873 if (loc !=
null) locs.add(loc);
877 if (systemType != StarSystemType.NEBULA) {
878 float r = system.getStar().getRadius();
881 List<OrbitGap> gaps =
findGaps(system.getStar(), 200f, 200f + r + minGap, minGap);
883 if (loc !=
null) locs.add(loc);
885 if (system.getSecondary() !=
null) {
886 r = system.getSecondary().getRadius();
887 gaps =
findGaps(system.getSecondary(), 200f, 200f + r + minGap, minGap);
889 if (loc !=
null) locs.add(loc);
891 if (system.getTertiary() !=
null) {
892 r = system.getTertiary().getRadius();
893 gaps =
findGaps(system.getTertiary(), 200f, 200f + r + minGap, minGap);
895 if (loc !=
null) locs.add(loc);
900 for (CampaignTerrainAPI terrain : system.getTerrainCopy()) {
901 if (exclude !=
null && exclude.contains(terrain))
continue;
902 if (terrain.hasTag(Tags.ACCRETION_DISK))
continue;
903 CampaignTerrainPlugin plugin = terrain.getPlugin();
904 if (plugin instanceof RingSystemTerrainPlugin) {
905 RingSystemTerrainPlugin ring = (RingSystemTerrainPlugin) plugin;
906 float start = ring.params.middleRadius - ring.params.bandWidthInEngine / 2f;
907 List<OrbitGap> gaps =
findGaps(terrain,
908 start - 100f, start + ring.params.bandWidthInEngine + 100f, minGap);
910 if (loc !=
null) locs.add(loc);
914 case IN_SMALL_NEBULA:
915 for (CampaignTerrainAPI terrain : system.getTerrainCopy()) {
916 if (exclude !=
null && exclude.contains(terrain))
continue;
917 CampaignTerrainPlugin plugin = terrain.getPlugin();
918 if (plugin instanceof NebulaTerrainPlugin) {
919 NebulaTerrainPlugin nebula = (NebulaTerrainPlugin) plugin;
920 float tilesHigh = nebula.getTiles()[0].length;
921 float tilesWide = nebula.getTiles().length;
922 float ts = nebula.getTileSize();
923 float w = ts * tilesWide;
924 float h = ts * tilesHigh;
926 float r = (float) Math.sqrt(w * w + h * h);
927 if (terrain.getOrbit() ==
null) {
928 Vector2f point = Misc.getPointWithinRadius(terrain.getLocation(), r * 0.5f,
random);
929 EntityLocation loc =
new EntityLocation();
931 loc.location = point;
935 float min = Math.min(100f, r * 0.25f);
937 EntityLocation loc =
new EntityLocation();
939 float orbitRadius = min + (max - min) * (0.75f *
random.nextFloat());
940 float orbitDays = orbitRadius / (20f +
random.nextFloat() * 5f);
942 random.nextFloat() * 360f, orbitRadius, orbitDays,
random.nextFloat() * 10f + 1f);
949 case IN_ASTEROID_BELT:
950 for (CampaignTerrainAPI terrain : system.getTerrainCopy()) {
951 if (exclude !=
null && exclude.contains(terrain))
continue;
952 CampaignTerrainPlugin plugin = terrain.getPlugin();
953 if (plugin instanceof AsteroidBeltTerrainPlugin && !(plugin instanceof AsteroidFieldTerrainPlugin)) {
954 AsteroidBeltTerrainPlugin ring = (AsteroidBeltTerrainPlugin) plugin;
955 if (ring.params !=
null) {
956 float start = ring.params.middleRadius - ring.params.bandWidthInEngine / 2f;
957 List<OrbitGap> gaps =
findGaps(terrain,
958 start - 100f, start + ring.params.bandWidthInEngine + 100f, minGap);
960 if (loc !=
null) locs.add(loc);
967 case IN_ASTEROID_FIELD:
968 for (CampaignTerrainAPI terrain : system.getTerrainCopy()) {
969 if (exclude !=
null && exclude.contains(terrain))
continue;
970 CampaignTerrainPlugin plugin = terrain.getPlugin();
971 if (plugin instanceof AsteroidFieldTerrainPlugin) {
972 AsteroidFieldTerrainPlugin ring = (AsteroidFieldTerrainPlugin) plugin;
974 float min = Math.min(100f, ring.params.bandWidthInEngine * 0.25f);
975 float max = ring.params.bandWidthInEngine;
976 EntityLocation loc =
new EntityLocation();
978 float orbitRadius = min + (max - min) * (0.75f *
random.nextFloat());
979 float orbitDays = orbitRadius / (20f +
random.nextFloat() * 5f);
983 random.nextFloat() * 360f, orbitRadius, orbitDays,
random.nextFloat() * 10f + 1f);
1001 if (near !=
null && near.getCircularOrbitRadius() > 0) {
1002 EntityLocation loc =
new EntityLocation();
1010 float orbitRadius = near.getCircularOrbitRadius() + 1000f + 1500f *
random.nextFloat();
1011 float orbitDays = near.getCircularOrbitPeriod();
1013 near.getCircularOrbitAngle() + 15f - 30f *
random.nextFloat(),
1014 orbitRadius, orbitDays,
random.nextFloat() * 10f + 1f);
1016 }
else if (near !=
null) {
1017 EntityLocation loc =
new EntityLocation();
1019 float orbitRadius = outer + 500f + 500f *
random.nextFloat();
1020 float orbitDays = orbitRadius / (20f +
random.nextFloat() * 5f);
1022 random.nextFloat() * 360f, orbitRadius, orbitDays,
random.nextFloat() * 10f + 1f);
1032 SectorEntityToken main = system.getCenter();
1033 List<SectorEntityToken> secondary =
new ArrayList<SectorEntityToken>();
1034 switch (system.getType()) {
1036 secondary.add(system.getSecondary());
1038 case TRINARY_1CLOSE_1FAR:
1039 secondary.add(system.getTertiary());
1042 secondary.add(system.getSecondary());
1043 secondary.add(system.getTertiary());
1048 List<OrbitGap> gaps =
findGaps(main, inner, outer + minGap, minGap);
1050 for (OrbitGap gap : gaps) {
1051 loc = createLocationAtGap(
random, main, gap, type);
1052 if (loc !=
null) locs.add(loc);
1056 for (SectorEntityToken star : secondary) {
1058 if (ow < 3000) ow = 3000;
1059 float r = star.getRadius();
1060 List<OrbitGap> gaps =
findGaps(star, r, ow + r + minGap, minGap);
1062 for (OrbitGap gap : gaps) {
1063 loc = createLocationAtGap(
random, star, gap, type);
1064 if (loc !=
null) locs.add(loc);
1072 if (system.getType() == StarSystemType.NEBULA) {
1073 for (EntityLocation loc : locs) {
1074 if (loc.orbit !=
null && loc.orbit.getFocus() == system.getCenter()) {
1075 loc.location = loc.orbit.computeCurrentLocation();
1081 if (!locs.isEmpty()) {
1082 float weightPer = weight / (float) locs.size();
1083 for (EntityLocation loc : locs) {
1084 result.add(loc, weightPer);
1096 List<OrbitGap> gaps =
findGaps(center, 100f, 100f + ow + minGap, minGap);
1103 if (gaps.isEmpty())
return null;
1105 WeightedRandomPicker<OrbitGap> picker =
new WeightedRandomPicker<OrbitGap>(
random);
1106 picker.addAll(gaps);
1107 OrbitGap gap = picker.pick();
1108 return createLocationAtGap(
random, center, gap, type);
1111 private static EntityLocation createLocationAtGap(Random
random, SectorEntityToken center, OrbitGap gap, LocationType type) {
1114 EntityLocation loc =
new EntityLocation();
1116 float orbitRadius = gap.start + (gap.end - gap.start) * (0.25f + 0.5f *
random.nextFloat());
1117 float orbitDays = orbitRadius / (20f +
random.nextFloat() * 5f);
1121 random.nextFloat() * 360f, orbitRadius, orbitDays,
random.nextFloat() * 10f + 1f);
1128 public static class OrbitGap {
1133 public static class OrbitItem {
1134 public SectorEntityToken item;
1135 public float orbitRadius;
1136 public float orbitalWidth;
1139 public static List<OrbitGap>
findGaps(SectorEntityToken center,
float minPad,
float maxDist,
float minGap) {
1140 List<OrbitGap> gaps =
new ArrayList<OrbitGap>();
1142 LocationAPI loc = center.getContainingLocation();
1143 if (loc ==
null)
return gaps;
1145 List<OrbitItem> items =
new ArrayList<OrbitItem>();
1146 for (PlanetAPI planet : loc.getPlanets()) {
1147 if (planet.getOrbitFocus() != center)
continue;
1149 OrbitItem item =
new OrbitItem();
1151 item.orbitRadius = planet.getCircularOrbitRadius();
1152 if (item.orbitRadius > maxDist)
continue;
1158 for (CampaignTerrainAPI terrain : loc.getTerrainCopy()) {
1159 if (terrain.getOrbitFocus() != center)
continue;
1161 CampaignTerrainPlugin plugin = terrain.getPlugin();
1162 if (plugin instanceof StarCoronaTerrainPlugin)
continue;
1163 if (plugin instanceof MagneticFieldTerrainPlugin)
continue;
1164 if (plugin instanceof PulsarBeamTerrainPlugin)
continue;
1166 if (plugin instanceof BaseRingTerrain) {
1167 BaseRingTerrain ring = (BaseRingTerrain) plugin;
1169 OrbitItem item =
new OrbitItem();
1170 item.item = terrain;
1171 item.orbitRadius = ring.params.middleRadius;
1172 if (item.orbitRadius > maxDist)
continue;
1174 item.orbitalWidth = ring.params.bandWidthInEngine;
1179 List<CustomCampaignEntityAPI> entities = loc.getEntities(CustomCampaignEntityAPI.class);
1180 for (SectorEntityToken custom : entities) {
1181 if (custom.getOrbitFocus() != center)
continue;
1183 OrbitItem item =
new OrbitItem();
1185 item.orbitRadius = custom.getCircularOrbitRadius();
1186 if (item.orbitRadius > maxDist)
continue;
1188 item.orbitalWidth = custom.getRadius() * 2f;
1193 List<SectorEntityToken> jumpPoints = loc.getJumpPoints();
1194 for (SectorEntityToken point : jumpPoints) {
1195 if (point.getOrbitFocus() != center)
continue;
1197 OrbitItem item =
new OrbitItem();
1199 item.orbitRadius = point.getCircularOrbitRadius();
1200 if (item.orbitRadius > maxDist)
continue;
1202 item.orbitalWidth = point.getRadius() * 2f;
1206 Collections.sort(items,
new Comparator<OrbitItem>() {
1207 public int compare(OrbitItem o1, OrbitItem o2) {
1208 return (
int)Math.signum(o1.orbitRadius - o2.orbitRadius);
1212 float prev = center.getRadius() + minPad;
1213 for (OrbitItem item : items) {
1214 float next = item.orbitRadius - item.orbitalWidth / 2f;
1215 if (next - prev >= minGap) {
1216 OrbitGap gap =
new OrbitGap();
1221 prev = Math.max(prev, item.orbitRadius + item.orbitalWidth / 2f);
1224 if (maxDist - prev >= minGap) {
1225 OrbitGap gap =
new OrbitGap();
1236 switch (system.getType()) {
1244 if (system.getStar() ==
null)
return 0;
1245 return system.getStar().getRadius();
1247 case TRINARY_1CLOSE_1FAR:
1248 return Math.max(system.getStar().getCircularOrbitRadius() + system.getStar().getRadius(),
1249 system.getSecondary().getCircularOrbitRadius() + system.getSecondary().getRadius());
1250 case TRINARY_2CLOSE:
1251 float max = Math.max(system.getStar().getCircularOrbitRadius() + system.getStar().getRadius(),
1252 system.getSecondary().getCircularOrbitRadius() + system.getSecondary().getRadius());
1254 system.getTertiary().getCircularOrbitRadius() + system.getTertiary().getRadius());
1264 WeightedRandomPicker<SectorEntityToken> picker =
new WeightedRandomPicker<SectorEntityToken>(
random);
1266 float threshold = max * 0.75f;
1268 for (PlanetAPI planet : system.getPlanets()) {
1270 if (r > threshold) {
1296 List<SectorEntityToken> jumpPoints = system.getEntitiesWithTag(Tags.JUMP_POINT);
1297 for (SectorEntityToken point : jumpPoints) {
1298 float r = Misc.getDistance(system.getCenter().getLocation(), point.getLocation());
1299 r += point.getRadius();
1300 if (r > threshold) {
1305 return picker.pick();
1312 for (PlanetAPI planet : system.getPlanets()) {
1315 if (r > max) max = r;
1318 for (CampaignTerrainAPI terrain : system.getTerrainCopy()) {
1319 CampaignTerrainPlugin plugin = terrain.getPlugin();
1321 if (plugin instanceof BaseRingTerrain && !(plugin instanceof PulsarBeamTerrainPlugin)) {
1322 BaseRingTerrain ring = (BaseRingTerrain) plugin;
1323 float r = ring.params.middleRadius + ring.params.bandWidthInEngine * 0.5f;
1324 r += Misc.getDistance(system.getCenter().getLocation(), terrain.getLocation());
1325 if (r > max) max = r;
1326 }
else if (plugin instanceof BaseTiledTerrain) {
1327 if (plugin instanceof NebulaTerrainPlugin)
continue;
1329 BaseTiledTerrain tiles = (BaseTiledTerrain) plugin;
1330 float r = tiles.getRenderRange();
1331 r += Misc.getDistance(system.getCenter().getLocation(), terrain.getLocation());
1332 if (r > max) max = r;
1344 List<SectorEntityToken> jumpPoints = system.getEntitiesWithTag(Tags.JUMP_POINT);
1345 for (SectorEntityToken point : jumpPoints) {
1346 float r = Misc.getDistance(system.getCenter().getLocation(), point.getLocation());
1347 r += point.getRadius();
1348 if (r > max) max = r;
1358 for (PlanetAPI planet : loc.getPlanets()) {
1359 float dist = Misc.getDistance(planet.getLocation(), coords);
1360 if (dist < range + planet.getRadius())
return false;
1363 List<CustomCampaignEntityAPI> entities = loc.getEntities(CustomCampaignEntityAPI.class);
1364 for (SectorEntityToken custom : entities) {
1365 float dist = Misc.getDistance(custom.getLocation(), coords);
1366 if (dist < range + custom.getRadius()) {
1371 for (CampaignTerrainAPI terrain : loc.getTerrainCopy()) {
1372 CampaignTerrainPlugin plugin = terrain.getPlugin();
1377 if (plugin instanceof DebrisFieldTerrainPlugin) {
1378 DebrisFieldTerrainPlugin ring = (DebrisFieldTerrainPlugin) plugin;
1379 float r = ring.params.middleRadius + ring.params.bandWidthInEngine * 0.5f;
1380 float dist = Misc.getDistance(terrain.getLocation(), coords);
1381 if (dist < range + r)
return false;
1389 LocationAPI loc = center.getContainingLocation();
1390 if (loc ==
null)
return center.getRadius();
1392 float max = center.getRadius();
1393 for (PlanetAPI planet : loc.getPlanets()) {
1394 if (planet.getOrbitFocus() != center)
continue;
1396 if (r > max) max = r;
1399 for (CampaignTerrainAPI terrain : loc.getTerrainCopy()) {
1400 if (terrain.getOrbitFocus() != center)
continue;
1401 CampaignTerrainPlugin plugin = terrain.getPlugin();
1403 if (plugin instanceof PulsarBeamTerrainPlugin)
continue;
1404 if (plugin instanceof RadioChatterTerrainPlugin)
continue;
1406 if (plugin instanceof BaseRingTerrain) {
1407 BaseRingTerrain ring = (BaseRingTerrain) plugin;
1408 float r = ring.params.middleRadius + ring.params.bandWidthInEngine * 0.5f;
1409 if (r > max) max = r;
1413 List<CustomCampaignEntityAPI> entities = loc.getEntities(CustomCampaignEntityAPI.class);
1414 for (SectorEntityToken custom : entities) {
1415 if (custom.getOrbitFocus() != center)
continue;
1416 float r = custom.getCircularOrbitRadius() + custom.getRadius();
1417 if (r > max) max = r;
1423 public static AddedEntity
addEntity(Random
random, StarSystemAPI system, WeightedRandomPicker<EntityLocation> locs, String type, String faction) {
1424 EntityLocation loc = locs.pickAndRemove();
1428 public static AddedEntity
addNonSalvageEntity(LocationAPI system, EntityLocation loc, String type, String faction) {
1430 SectorEntityToken entity = system.addCustomEntity(
null,
null, type, faction);
1431 if (loc.orbit !=
null) {
1432 entity.setOrbit(loc.orbit);
1433 loc.orbit.setEntity(entity);
1435 entity.setOrbit(
null);
1436 entity.getLocation().set(loc.location);
1438 AddedEntity data =
new AddedEntity(entity, loc, type);
1452 public static AddedEntity
addEntity(Random
random, LocationAPI system, EntityLocation loc, String type, String faction) {
1456 if (loc.orbit !=
null) {
1457 entity.setOrbit(loc.orbit);
1458 loc.orbit.setEntity(entity);
1460 entity.setOrbit(
null);
1461 entity.getLocation().set(loc.location);
1463 AddedEntity data =
new AddedEntity(entity, loc, type);
1469 public static AddedEntity
setEntityLocation(SectorEntityToken entity, EntityLocation loc, String type) {
1471 if (loc.orbit !=
null) {
1472 entity.setOrbit(loc.orbit);
1473 loc.orbit.setEntity(entity);
1475 entity.setOrbit(
null);
1476 entity.getLocation().set(loc.location);
1478 AddedEntity data =
new AddedEntity(entity, loc, type);
1484 public static SectorEntityToken
addSalvageEntity(LocationAPI location, String
id, String faction) {
1490 public static SectorEntityToken
addSalvageEntity(LocationAPI location, String
id, String faction, Object pluginParams) {
1493 public static SectorEntityToken
addSalvageEntity(Random
random, LocationAPI location, String
id, String faction, Object pluginParams) {
1497 CustomCampaignEntityAPI entity = location.addCustomEntity(
null, spec.
getNameOverride(),
id, faction, pluginParams);
1504 case ALWAYS_VISIBLE:
1505 entity.setSensorProfile(
null);
1506 entity.setDiscoverable(
null);
1509 entity.setSensorProfile(1f);
1510 entity.setDiscoverable(
true);
1512 case NOT_DISCOVERABLE:
1513 entity.setSensorProfile(1f);
1514 entity.setDiscoverable(
false);
1518 long seed =
random.nextLong();
1519 entity.getMemoryWithoutUpdate().set(MemFlags.SALVAGE_SEED, seed);
1528 MemoryAPI memory = entity.getMemoryWithoutUpdate();
1529 long seed = memory.getLong(MemFlags.SALVAGE_SEED);
1530 Random
random = Misc.getRandom(seed, 1);
1532 List<DropData> dropValue =
new ArrayList<DropData>(entity.getDropValue());
1533 List<DropData> dropRandom =
new ArrayList<DropData>(entity.getDropRandom());
1542 CargoAPI salvage = SalvageEntity.generateSalvage(
random, 1f, 1f, 1f, 1f, dropValue, dropRandom);
1548 StarSystemData data =
new StarSystemData();
1549 data.system = system;
1551 for (PlanetAPI planet : system.getPlanets()) {
1552 if (planet.isStar()) {
1553 data.stars.add(planet);
1555 data.planets.add(planet);
1558 if (planet.isGasGiant()) {
1559 data.gasGiants.add(planet);
1562 if (planet.getMarket() !=
null && planet.getMarket().isPlanetConditionMarketOnly()) {
1563 MarketAPI market = planet.getMarket();
1564 if (market.hasCondition(Conditions.HABITABLE)) {
1565 data.habitable.add(planet);
1569 if (market.hasCondition(conditionId)) {
1570 data.resourceRich.add(planet);
1582 if (market ==
null)
return;
1584 market.removeCondition(Conditions.RUINS_EXTENSIVE);
1585 market.removeCondition(Conditions.RUINS_SCATTERED);
1586 market.removeCondition(Conditions.RUINS_VAST);
1587 market.removeCondition(Conditions.RUINS_WIDESPREAD);
1588 market.removeCondition(Conditions.DECIVILIZED);
1592 SectorEntityToken focus = entity.getOrbitFocus();
1593 if (focus !=
null) {
1594 float angle = entity.getCircularOrbitAngle();
1595 float period = entity.getCircularOrbitPeriod();
1596 float radius = entity.getCircularOrbitRadius();
1597 entity.setCircularOrbitPointingDown(focus, angle, radius, period);
1605 SectorEntityToken focus = entity.getOrbitFocus();
1606 if (focus !=
null) {
1607 float angle = entity.getCircularOrbitAngle();
1608 float period = entity.getCircularOrbitPeriod();
1609 float radius = entity.getCircularOrbitRadius();
1610 entity.setCircularOrbit(focus, angle, radius, period);
1611 entity.setFacing(facing);
1616 SectorEntityToken focus = entity.getOrbitFocus();
1617 if (focus !=
null) {
1618 float angle = entity.getCircularOrbitAngle();
1619 float period = entity.getCircularOrbitPeriod();
1620 float radius = entity.getCircularOrbitRadius();
1621 entity.setCircularOrbitWithSpin(focus, angle, radius, period, spin, spin);
1622 ((CircularOrbitWithSpinAPI) entity.getOrbit()).setSpinVel(spin);
1642 List<Constellation> constellations =
new ArrayList<Constellation>();
1647 constellations.add(c);
1650 if (exclude !=
null) {
1651 constellations.removeAll(exclude);
1654 Collections.sort(constellations,
new Comparator<Constellation>() {
1656 float d1 = Misc.getDistance(o1.
getLocation(), sortFrom);
1657 float d2 = Misc.getDistance(o2.
getLocation(), sortFrom);
1658 return (
int) Math.signum(d2 - d1);
1661 return constellations;
1671 for (PlanetAPI p : system.getPlanets()) {
1672 if (!p.isStar())
return false;
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static float getDefaultSModProb()
static DerelictShipData createRandom(String factionId, DerelictType type, Random random)
static DerelictShipData createVariant(String variantId, Random random, float sModProb)
static DerelictShipData createHull(String hullId, Random random, float sModProb)
List< StarSystemAPI > getSystems()
float getDetectionRange()
DiscoverabilityType getType()
float getRadiusOverride()
List< DropData > getDropValue()
List< DropData > getDropRandom()
static EntityLocation pickHiddenLocationNotNearStar(Random random, StarSystemAPI system, float gap, Set< SectorEntityToken > exclude)
static AddedEntity addEntityAutoDetermineType(Random random, LocationAPI system, EntityLocation loc, String type, String faction)
List< Constellation > getSortedAvailableConstellations(ThemeGenContext context, boolean emptyOk, final Vector2f sortFrom, List< Constellation > exclude)
static SectorEntityToken addSalvageEntity(Random random, LocationAPI location, String id, String faction)
void addShipGraveyard(StarSystemData data, float chanceToAddAny, int min, int max, WeightedRandomPicker< String > factions)
void addRuins(PlanetAPI planet)
static StarSystemData computeSystemData(StarSystemAPI system)
static SectorEntityToken addSalvageEntity(LocationAPI location, String id, String faction, Object pluginParams)
static SectorEntityToken pickOuterEntityToSpawnNear(Random random, StarSystemAPI system)
AddedEntity addDerelictShip(StarSystemData data, EntityLocation loc, String variantId)
static AddedEntity setEntityLocation(SectorEntityToken entity, EntityLocation loc, String type)
static void convertOrbitNoSpin(SectorEntityToken entity)
void addDerelictShip(StarSystemData data, EntityLocation loc, WeightedRandomPicker< String > factions)
static AddedEntity addEntity(Random random, StarSystemAPI system, WeightedRandomPicker< EntityLocation > locs, String type, String faction)
void setRandom(Random random)
static EntityLocation pickHiddenLocation(Random random, StarSystemAPI system, float gap, Set< SectorEntityToken > exclude)
static EntityLocation pickCommonLocation(Random random, StarSystemAPI system, float gap, boolean allowStarOrbit, Set< SectorEntityToken > exclude)
static WeightedRandomPicker< EntityLocation > getLocations(Random random, StarSystemAPI system, float minGap, LinkedHashMap< LocationType, Float > weights)
static float getOuterRadius(StarSystemAPI system)
void addResearchStations(StarSystemData data, float chanceToAddAny, int min, int max, WeightedRandomPicker< String > stationTypes)
static float getOrbitalRadius(SectorEntityToken center)
boolean shouldHaveDecivilized(PlanetAPI planet, String ruins)
static boolean isAreaEmpty(LocationAPI loc, Vector2f coords)
List< AddedEntity > addObjectives(StarSystemData data, float prob)
static EntityLocation pickAnyLocation(Random random, StarSystemAPI system, float gap, Set< SectorEntityToken > exclude)
static EntityLocation pickUncommonLocation(Random random, StarSystemAPI system, float gap, Set< SectorEntityToken > exclude)
static List< OrbitGap > findGaps(SectorEntityToken center, float minPad, float maxDist, float minGap)
abstract String getThemeId()
void addCaches(StarSystemData data, float chanceToAddAny, int min, int max, WeightedRandomPicker< String > cacheTypes)
static float getInnerRadius(StarSystemAPI system)
static EntityLocation createLocationAtRandomGap(Random random, SectorEntityToken center, float minGap)
abstract void generateForSector(ThemeGenContext context, float allowedSectorFraction)
void addDerelictShips(StarSystemData data, float chanceToAddAny, int min, int max, WeightedRandomPicker< String > factions)
static void clearRuins(MarketAPI market)
static SectorEntityToken addSalvageEntity(Random random, LocationAPI location, String id, String faction, Object pluginParams)
static SectorEntityToken addSalvageEntity(LocationAPI location, String id, String faction)
AddedEntity addCommRelay(StarSystemData data, float prob)
static AddedEntity addEntity(Random random, LocationAPI system, EntityLocation loc, String type, String faction)
static WeightedRandomPicker< EntityLocation > getLocations(Random random, StarSystemAPI system, Set< SectorEntityToken > exclude, float minGap, LinkedHashMap< LocationType, Float > weights)
static void convertOrbitWithSpin(SectorEntityToken entity, float spin)
AddedEntity addInactiveGate(StarSystemData data, float prob, float probDebris, float probShips, WeightedRandomPicker< String > factions)
static void convertOrbitNoSpin(SectorEntityToken entity, float facing)
WeightedRandomPicker< String > createStringPicker(Object ... params)
void addHabCenters(StarSystemData data, float chanceToAddAny, int min, int max, WeightedRandomPicker< String > stationTypes)
void addDebrisFields(StarSystemData data, float chanceToAddAny, int min, int max)
AddedEntity addDebrisField(StarSystemData data, SectorEntityToken focus, float radius)
static ObjectiveGenDataSpec getObjectiveSpec(String id)
void addDebrisFields(StarSystemData data, float chanceToAddAny, int min, int max, String defFaction, float defProb, int minStr, int maxStr)
static AddedEntity addNonSalvageEntity(LocationAPI system, EntityLocation loc, String type, String faction)
static boolean constellationIsEmpty(Constellation c)
String pickRuinsType(PlanetAPI planet)
static CargoAPI genCargoFromDrop(SectorEntityToken entity)
static WeightedRandomPicker< String > createStringPicker(Random random, Object ... params)
void addShipGraveyard(StarSystemData data, SectorEntityToken focus, WeightedRandomPicker< String > factions, WeightedRandomPicker< String > hulls)
static void convertOrbitPointingDown(SectorEntityToken entity)
static boolean systemIsEmpty(StarSystemAPI system)
AddedEntity addStation(EntityLocation loc, StarSystemData data, String customEntityId, String factionId)
void addShipGraveyard(StarSystemData data, SectorEntityToken focus, WeightedRandomPicker< String > factions)
void addMiningStations(StarSystemData data, float chanceToAddAny, int min, int max, WeightedRandomPicker< String > stationTypes)
static float ORBITAL_HABITAT_PROB
static float NOT_HABITABLE_PLANET_PROB
static Set< String > interestingConditionsWithoutHabitable
static SalvageEntityGenDataSpec getSalvageSpec(String id)
static boolean hasSalvageSpec(String id)
List< Constellation > constellations
Map< Constellation, String > majorThemes
OrbitAPI createCircularOrbitWithSpin(SectorEntityToken focus, float angle, float orbitRadius, float orbitDays, float spin)
< T > Collection< T > getAllSpecs(Class< T > c)
Object getSpec(Class c, String id, boolean nullOnNotFound)