Starsector API
Loading...
Searching...
No Matches
AsteroidFieldGenPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.procgen;
2
3import com.fs.starfarer.api.campaign.SectorEntityToken;
4import com.fs.starfarer.api.campaign.StarSystemAPI;
5import com.fs.starfarer.api.impl.campaign.ids.Terrain;
6import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenContext;
7import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenResult;
8import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.LagrangePointType;
9import com.fs.starfarer.api.impl.campaign.terrain.AsteroidFieldTerrainPlugin.AsteroidFieldParams;
10import com.fs.starfarer.api.util.WeightedRandomPicker;
11
13
14 public static final float WIDTH_PLANET = 200f;
15 public static final float WIDTH_STAR = 400f;
16
17 public GenResult generate(TerrainGenDataSpec terrainData, GenContext context) {
18 if (context.lagrangeParent == null || context.lagrangePointType == null) return null;
19
20 //System.out.println("GENERATING L-POINT NEBULA AT " + context.star.getId());
21
22 SectorEntityToken parent = context.center;
23 if (context.parent != null) parent = context.parent;
24 if (context.lagrangeParent != null) parent = context.center;
25
26 if (parent == null) return null;
27
28 WeightedRandomPicker<Integer> sizePicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random);
29 for (int i = 5; i <= 11; i++) {
30 sizePicker.add(i, 20 - i);
31 }
32
33 int size = sizePicker.pick();
34 float radius = size * 100f;
35
36 float maxRadius = (context.currentRadius - parent.getRadius()) * 0.5f;
37 if (radius > maxRadius) radius = maxRadius;
38 if (radius < 400) radius = 400;
39
40 float area = radius * radius * 3.14f;
41 int count = (int) (area / 80000f);
42 if (count < 10) count = 10;
43 if (count > 100) count = 100;
44
45
46 StarSystemAPI system = context.system;
47 float orbitRadius = context.currentRadius + radius;
48
49 float orbitDays = orbitRadius / (20f + StarSystemGenerator.random.nextFloat() * 5f);
50 float angle = StarSystemGenerator.random.nextFloat() * 360f;
51 if (context.lagrangeParent != null) {
52 orbitRadius = context.lagrangeParent.orbitRadius;
53 orbitDays = context.lagrangeParent.orbitDays;
54 float angleOffset = -StarSystemGenerator.LAGRANGE_OFFSET;
55 if (context.lagrangePointType == LagrangePointType.L5) angleOffset = StarSystemGenerator.LAGRANGE_OFFSET;
56 angle = context.lagrangeParent.orbitAngle + angleOffset;
57 }
58
59 SectorEntityToken field = system.addTerrain(Terrain.ASTEROID_FIELD,
60 new AsteroidFieldParams(
61 radius, // min radius
62 radius + 100f, // max radius
63 count, // min asteroid count
64 count, // max asteroid count
65 4f, // min asteroid radius
66 16f, // max asteroid radius
67 null)); // null for default name
68
69 field.setCircularOrbit(parent, angle, orbitRadius, orbitDays);
70
71 CategoryGenDataSpec cat = context.gen.pickCategory(context, StarSystemGenerator.COL_IN_ASTEROIDS, true);
72 if (cat != null) {
73 float prevRadius = context.currentRadius;
74 WeightedRandomPicker<EntityGenDataSpec> picker = context.gen.getPickerForCategory(cat, context,
77 picker.print(" Picking from category " + cat.getCategory() +
78 ", orbit index " + (context.parent != null ? context.parentOrbitIndex : context.orbitIndex));
79 }
80 EntityGenDataSpec pick = picker.pick();
82 if (pick == null) {
83 System.out.println(" Nothing to pick");
84 System.out.println();
85 } else {
86 System.out.println(" Picked: " + pick.getId());
87 System.out.println();
88 }
89 }
90 if (pick instanceof PlanetGenDataSpec) {
91 PlanetGenDataSpec planetData = (PlanetGenDataSpec) pick;
92 //context.currentRadius = prevRadius + width * 0.1f + i * (width * 0.8f) / maxPlanets;
93 context.currentRadius = orbitRadius;
94 context.parentRadiusOverride = 100f / StarSystemGenerator.MOON_RADIUS_MAX_FRACTION_OF_PARENT;
95 GenResult result = context.gen.addPlanet(context, planetData, true, false);
96 if (result != null && !result.entities.isEmpty()) {
97 context.gen.getAllEntitiesAdded().put(result.entities.get(0), result.entities);
98 if (context.lagrangeParent != null && !result.entities.isEmpty()) {
99 context.gen.getLagrangeParentMap().put(result.entities.get(0), context.lagrangeParent.planet);
100 }
101 }
102
103 // not necessary to set orbit, as the lagrangeParent is set in the context so
104 // addPlanet() does it correctly
105// if (!context.generatedPlanets.isEmpty()) {
106// GeneratedPlanet last = context.generatedPlanets.get(context.generatedPlanets.size() - 1);
107// //last.planet.setRadius(last.planet.getRadius() * 0.75f);
108// last.planet.setCircularOrbit(parent, angle, orbitRadius, orbitDays);
109// }
110 }
111 context.parentRadiusOverride = -1;
112 context.currentRadius = prevRadius;
113 }
114
115
116 GenResult result = new GenResult();
117 result.onlyIncrementByWidth = false;
118 result.orbitalWidth = radius * 2f;
119 result.entities.add(field);
120 return result;
121 }
122
123 public boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context) {
124 return terrainData != null && terrainData.getId().equals("asteroid_field");
125 }
126
127}
GenResult generate(TerrainGenDataSpec terrainData, GenContext context)
boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context)