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
56 WeightedRandomPicker<Integer> indexPicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random);
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
65 indexPicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random);
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++) {
77 CategoryGenDataSpec cat = context.gen.pickCategory(context, StarSystemGenerator.COL_IN_ASTEROIDS, true);
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)