Starsector API
Loading...
Searching...
No Matches
AsteroidBeltGenPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.procgen;
2
3import java.awt.Color;
4
5import com.fs.starfarer.api.campaign.SectorEntityToken;
6import com.fs.starfarer.api.campaign.StarSystemAPI;
7import com.fs.starfarer.api.impl.campaign.ids.Terrain;
8import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenContext;
9import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenResult;
10import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GeneratedPlanet;
11import com.fs.starfarer.api.util.WeightedRandomPicker;
12
13public class AsteroidBeltGenPlugin implements TerrainGenPlugin {
14
15 public GenResult generate(TerrainGenDataSpec terrainData, GenContext context) {
16 StarSystemAPI system = context.system;
17 SectorEntityToken parent = context.center;
18 if (context.parent != null) parent = context.parent;
19
20 //float width = StarSystemGenerator.getRadius(terrainData.getMinRadius(), terrainData.getMaxRadius());
21 float width = 200f;
22
23 float countMult = 1f;
24 float maxPlanets = 1;
25 if (context.currentRadius > 2000f && StarSystemGenerator.random.nextFloat() > 0.5f) {
26 width += 100f;
27 countMult += 0.1f;
28 maxPlanets++;
29 }
30 if (context.currentRadius > 4000f && StarSystemGenerator.random.nextFloat() > 0.5f) {
31 width += 100f;
32 countMult += 0.1f;
33 maxPlanets++;
34 }
35 if (context.currentRadius > 6000f && StarSystemGenerator.random.nextFloat() > 0.5f) {
36 width += 100f;
37 countMult += 0.1f;
38 maxPlanets++;
39 }
40
41 //if (maxPlanets > 3) maxPlanets = 3;
42 if (maxPlanets > 1) maxPlanets = 1;
43
44
45 float orbitRadius = context.currentRadius + width / 2f;
46 float orbitDays = orbitRadius / (15f + 5f * StarSystemGenerator.random.nextFloat());
47
48 int count = (int) (orbitDays * (0.25f + 0.5f * StarSystemGenerator.random.nextFloat()) * countMult);
49 if (count > 100) {
50 count = (int) (100f + (count - 100f) * 0.25f);
51 }
52 if (count > 250) count = 250;
53
54 SectorEntityToken belt = system.addAsteroidBelt(parent, count, orbitRadius, width, orbitDays * .75f, orbitDays * 1.5f, Terrain.ASTEROID_BELT, null);
55
57 indexPicker.add(0);
58 indexPicker.add(1);
59 //indexPicker.add(2);
60 //indexPicker.add(3);
61
62 system.addRingBand(parent, "misc", "rings_asteroids0", 256f, indexPicker.pickAndRemove(), Color.white, 256f, orbitRadius - width * 0.25f, orbitDays * 1.05f, null, null);
63
64
66 indexPicker.add(0);
67 indexPicker.add(1);
68 indexPicker.add(2);
69 indexPicker.add(3);
70 system.addRingBand(parent, "misc", "rings_asteroids0", 256f, indexPicker.pickAndRemove(), Color.white, 256f, orbitRadius + width * 0.25f, orbitDays, null, null);
71
72
73 float prevRadius = context.currentRadius;
74 //float [] offsets = new float [] {0.5f, 0.15f, 0.85f};
75 //float [] offsets = new float [] {0.25f};
76 for (int i = 0; i < maxPlanets; i++) {
78 if (cat != null) {
79 WeightedRandomPicker<EntityGenDataSpec> picker = context.gen.getPickerForCategory(cat, context,
82 picker.print(" Picking from category " + cat.getCategory() +
83 ", orbit index " + (context.parent != null ? context.parentOrbitIndex : context.orbitIndex));
84 }
85 EntityGenDataSpec pick = picker.pick();
87 if (pick == null) {
88 System.out.println(" Nothing to pick");
89 System.out.println();
90 } else {
91 System.out.println(" Picked: " + pick.getId());
92 System.out.println();
93 }
94 }
95
96 if (pick instanceof PlanetGenDataSpec) {
97 PlanetGenDataSpec planetData = (PlanetGenDataSpec) pick;
98 //context.currentRadius = prevRadius + width * 0.1f + i * (width * 0.8f) / maxPlanets;
99 //context.currentRadius = prevRadius + width * offsets[i];
100 context.currentRadius = prevRadius - width * 0.6f;
101 //context.parentRadiusOverride = width * 0.75f / maxPlanets / StarSystemGenerator.MOON_RADIUS_MAX_FRACTION_OF_PARENT;
102 context.parentRadiusOverride = 200f;
103 GenResult result = context.gen.addPlanet(context, planetData, true, false);
104 if (result != null && !result.entities.isEmpty()) {
105 context.gen.getAllEntitiesAdded().put(result.entities.get(0), result.entities);
106 }
107
108 if (!context.generatedPlanets.isEmpty()) {
109 GeneratedPlanet last = context.generatedPlanets.get(context.generatedPlanets.size() - 1);
110 last.planet.setRadius(last.planet.getRadius() * 0.75f);
111 }
112 }
113 }
114 }
115 context.parentRadiusOverride = -1;
116 context.currentRadius = prevRadius;
117
118
119 GenResult result = new GenResult();
120 result.onlyIncrementByWidth = false;
121 result.orbitalWidth = width;
122 result.entities.add(belt);
123 return result;
124 }
125
126 public boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context) {
127 return terrainData != null && terrainData.getId().equals("asteroid_belt");
128 }
129
130}
boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context)
GenResult generate(TerrainGenDataSpec terrainData, GenContext context)
CategoryGenDataSpec pickCategory(GenContext context, String extraMult, boolean nothingOk)
GenResult addPlanet(GenContext context, PlanetGenDataSpec planetData, boolean isMoon, boolean addMoons)
Map< SectorEntityToken, List< SectorEntityToken > > getAllEntitiesAdded()
WeightedRandomPicker< EntityGenDataSpec > getPickerForCategory(CategoryGenDataSpec categoryData, GenContext context, String extraMult)
RingBandAPI addRingBand(SectorEntityToken focus, String category, String key, float bandWidthInTexture, int bandIndex, Color color, float bandWidthInEngine, float middleRadius, float orbitDays)
SectorEntityToken addAsteroidBelt(SectorEntityToken focus, int numAsteroids, float orbitRadius, float width, float minOrbitDays, float maxOrbitDays)