Starsector API
Loading...
Searching...
No Matches
RingGenPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.procgen;
2
3import java.awt.Color;
4import java.util.ArrayList;
5import java.util.List;
6
7import com.fs.starfarer.api.campaign.SectorEntityToken;
8import com.fs.starfarer.api.campaign.StarSystemAPI;
9import com.fs.starfarer.api.impl.campaign.ids.Terrain;
10import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenContext;
11import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenResult;
12import com.fs.starfarer.api.util.WeightedRandomPicker;
13
14public class RingGenPlugin implements TerrainGenPlugin {
15
16 public static class TexAndIndex {
17 public String tex;
18 public int index;
19 }
20
21 public static final String RING_GEN_DATA_KEY = "rgd_key";
22 public static class RingGenData {
23 public int lastOrbitAddedAt = -1;
24 public float endOfLastRingRadius = -1;
25 public List<SectorEntityToken> lastBatch = null;
26 }
27
28
29
30 protected TexAndIndex getTexAndIndex(TerrainGenDataSpec data) {
31 TexAndIndex result = new TexAndIndex();
32 WeightedRandomPicker<Integer> indexPicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random);
33
34 if (data.getId().equals("ring_ice")) {
35 result.tex = "rings_ice0";
36 indexPicker.add(0);
37 indexPicker.add(1);
38 indexPicker.add(2);
39 indexPicker.add(3);
40 } else if (data.getId().equals("ring_dust")) {
41 result.tex = "rings_dust0";
42 indexPicker.add(0);
43 indexPicker.add(1);
44 indexPicker.add(2);
45 indexPicker.add(3);
46 } else if (data.getId().equals("ring_special")) {
47 result.tex = "rings_special0";
48 indexPicker.add(1);
49 }
50
51 result.index = indexPicker.pick();
52
53 return result;
54 }
55
56 public RingGenData getData(GenContext context) {
57 RingGenData data = null;
58 if (context.customData.get(RING_GEN_DATA_KEY) instanceof RingGenData) {
59 data = (RingGenData) context.customData.get(RING_GEN_DATA_KEY);
60 }
61 if (data == null) {
62 data = new RingGenData();
63 context.customData.put(RING_GEN_DATA_KEY, data);
64 }
65 return data;
66 }
67
68
69 public GenResult generate(TerrainGenDataSpec terrainData, GenContext context) {
70 StarSystemAPI system = context.system;
71 SectorEntityToken parent = context.center;
72 if (context.parent != null) parent = context.parent;
73
74 float orbitRadius = context.currentRadius;
75
76// if (context.parent != null) {
77// System.out.println("RING RADIUS " + orbitRadius + " INDEX " + context.orbitIndex);
78// }
79
80 float bandWidth = 256f;
81
82 RingGenData data = getData(context);
83 TexAndIndex tex;
84
85 Color color = StarSystemGenerator.getColor(terrainData.getMinColor(), terrainData.getMaxColor());
86
87 List<SectorEntityToken> rings = new ArrayList<SectorEntityToken>();
88 float totalWidth = 0f;
89 if (StarSystemGenerator.random.nextFloat() < 0.25f) {
90 // two singles, set apart a bit
91 float spacing = 175f;
92 totalWidth = bandWidth * 2f + spacing;
93
94 float orbitDays = (orbitRadius + totalWidth / 2f) / (15f + 5f * StarSystemGenerator.random.nextFloat());
95 tex = getTexAndIndex(terrainData);
96 rings.add(system.addRingBand(parent, "misc", tex.tex, 256f, tex.index, color, bandWidth,
97 orbitRadius + bandWidth / 2f, orbitDays, Terrain.RING, null));
98
99 orbitDays = (orbitRadius + bandWidth / 2f + spacing + bandWidth / 2f) / (15f + 5f * StarSystemGenerator.random.nextFloat());
100 tex = getTexAndIndex(terrainData);
101 rings.add(system.addRingBand(parent, "misc", tex.tex, 256f, tex.index, color, bandWidth,
102 orbitRadius + bandWidth / 2f + spacing + bandWidth / 2f, orbitDays * 1.2f, Terrain.RING, null));
103 } else {
104 float numBands = 1;
105 //float pExtraBand = 0.5f;
106 if (orbitRadius > 2000f && StarSystemGenerator.random.nextFloat() > 0.5f) numBands++;
107 if (orbitRadius > 4000f && StarSystemGenerator.random.nextFloat() > 0.5f) numBands++;
108 if (orbitRadius > 6000f && StarSystemGenerator.random.nextFloat() > 0.5f) numBands++;
109
110 //numBands = 3;
111
112 float startingRadius = orbitRadius + bandWidth/2f;
113 float spacing = bandWidth * 0.5f;
114 for (float i = 0; i < numBands; i++) {
115 float currentRadius = startingRadius + i * spacing;
116 float orbitDays = (currentRadius) / (15f + 5f * StarSystemGenerator.random.nextFloat());
117 tex = getTexAndIndex(terrainData);
118 if (StarSystemGenerator.random.nextFloat() > 0.5f) {
119 if (StarSystemGenerator.random.nextFloat() > 0.5f) {
120 tex = getTexAndIndex(terrainData);
121 }
122 rings.add(system.addRingBand(parent, "misc", tex.tex, 256f, tex.index, color, bandWidth,
123 currentRadius, orbitDays * 1.2f, Terrain.RING, null));
124
125 if (StarSystemGenerator.random.nextFloat() > 0.5f) {
126 if (StarSystemGenerator.random.nextFloat() > 0.5f) {
127 tex = getTexAndIndex(terrainData);
128 }
129 rings.add(system.addRingBand(parent, "misc", tex.tex, 256f, tex.index, color, bandWidth,
130 currentRadius, orbitDays * 1.4f, Terrain.RING, null));
131 }
132 }
133 }
134 totalWidth = (numBands - 1f) * spacing + bandWidth;
135 }
136
137
138 if (context.orbitIndex > 0 && data.lastOrbitAddedAt == context.orbitIndex - 1) {
139 float spacing = bandWidth * 0.5f;
140 for (float currRadius = data.endOfLastRingRadius; currRadius <= orbitRadius; currRadius += spacing) {
141 float orbitDays = currRadius / (15f + 5f * StarSystemGenerator.random.nextFloat());
142 tex = getTexAndIndex(terrainData);
143 rings.add(system.addRingBand(parent, "misc", tex.tex, 256f, tex.index, color, bandWidth,
144 currRadius, orbitDays, Terrain.RING, null));
145 }
146
147 if (data.lastBatch != null) {
148 rings.addAll(data.lastBatch);
149 // will be re-added after this method returns, pointing to the full set of rings
150 // as being part of one nameable entity
151 for (SectorEntityToken ring : rings) {
152 context.gen.getAllEntitiesAdded().remove(ring);
153 }
154 }
155 }
156
157 data.lastOrbitAddedAt = context.orbitIndex;
158 data.endOfLastRingRadius = orbitRadius + bandWidth;
159 data.lastBatch = new ArrayList<SectorEntityToken>(rings);
160
161
162 GenResult result = new GenResult();
163 result.onlyIncrementByWidth = false;
164 result.orbitalWidth = totalWidth;
165 result.entities.addAll(rings);
166 return result;
167 }
168
169 public boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context) {
170 return terrainData != null &&
171 (terrainData.getId().equals("ring_ice") ||
172 terrainData.getId().equals("ring_dust") ||
173 terrainData.getId().equals("ring_special"));
174 }
175
176}
TexAndIndex getTexAndIndex(TerrainGenDataSpec data)
boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context)
GenResult generate(TerrainGenDataSpec terrainData, GenContext context)