Starsector API
Loading...
Searching...
No Matches
AccretionDiskGenPlugin.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.CampaignTerrainAPI;
8import com.fs.starfarer.api.campaign.RingBandAPI;
9import com.fs.starfarer.api.campaign.SectorEntityToken;
10import com.fs.starfarer.api.campaign.StarSystemAPI;
11import com.fs.starfarer.api.impl.campaign.ids.Tags;
12import com.fs.starfarer.api.impl.campaign.ids.Terrain;
13import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenContext;
14import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenResult;
15import com.fs.starfarer.api.impl.campaign.terrain.RingSystemTerrainPlugin;
16import com.fs.starfarer.api.impl.campaign.terrain.BaseRingTerrain.RingParams;
17import com.fs.starfarer.api.util.WeightedRandomPicker;
18
20
21 public static class TexAndIndex {
22 public String tex;
23 public int index;
24 }
25
26 protected TexAndIndex getTexAndIndex(TerrainGenDataSpec data) {
27 TexAndIndex result = new TexAndIndex();
29
31 ringSet.add("ring_ice", 10f);
32 ringSet.add("ring_dust", 10f);
33 //ringSet.add("ring_special", 1f);
34
35 String set = ringSet.pick();
36
37 if (set.equals("ring_ice")) {
38 result.tex = "rings_ice0";
39 indexPicker.add(0);
40 indexPicker.add(1);
41 } else if (set.equals("ring_dust")) {
42 result.tex = "rings_dust0";
43 indexPicker.add(0);
44 indexPicker.add(1);
45 }
46
47 result.index = indexPicker.pick();
48
49 return result;
50 }
51
52
53 public GenResult generate(TerrainGenDataSpec terrainData, GenContext context) {
54 StarSystemAPI system = context.system;
55 SectorEntityToken parent = context.center;
56 if (context.parent != null) parent = context.parent;
57
58 //float orbitRadius = context.currentRadius * (2f + 2f * StarSystemGenerator.random.nextFloat());
60 float orbitRadius = context.currentRadius * (2f + 1f * StarSystemGenerator.random.nextFloat());
61
62 float bandWidth = 256f;
63
64 //int numBands = (int) (2f + StarSystemGenerator.random.nextFloat() * 5f);
65 int numBands = 8;
66
67 float spiralFactor = 3f + StarSystemGenerator.random.nextFloat() * 2f;
68 numBands += (int) spiralFactor;
69
70 numBands = 12;
71// boolean leaveRoomInMiddle = context.system.getStar() != null &&
72// parent == context.system.getCenter() &&
73// Misc.getDistance(context.system.getStar().getLocation(), parent.getLocation()) > 100;
74 for (float i = 0; i < numBands; i++) {
75// float radiusMult = 0.25f + 0.75f * (i + 1f) / (numBands);
76// radiusMult = 1f;
77 //float radius = orbitRadius * radiusMult;
78 float radius = orbitRadius - i * bandWidth * 0.25f - i * bandWidth * 0.1f;
79 //float radius = orbitRadius - i * bandWidth / 2;
80
81 TexAndIndex tex = getTexAndIndex(terrainData);
82 float orbitDays = radius / (30f + 10f * StarSystemGenerator.random.nextFloat());
83 Color color = StarSystemGenerator.getColor(terrainData.getMinColor(), terrainData.getMaxColor());
84 //color = Color.white;
85 RingBandAPI visual = system.addRingBand(parent, "misc", tex.tex, 256f, tex.index, color, bandWidth,
86 radius + bandWidth / 2f, -orbitDays);
87
88 spiralFactor = 2f + StarSystemGenerator.random.nextFloat() * 5f;
89 visual.setSpiral(true);
90 visual.setMinSpiralRadius(0);
91 visual.setSpiralFactor(spiralFactor);
92 }
93
94
95 List<SectorEntityToken> rings = new ArrayList<SectorEntityToken>();
96 SectorEntityToken ring = system.addTerrain(Terrain.RING, new RingParams(orbitRadius, orbitRadius / 2f, parent, null));
98 if (((CampaignTerrainAPI)ring).getPlugin() instanceof RingSystemTerrainPlugin) {
99 ((RingSystemTerrainPlugin)((CampaignTerrainAPI)ring).getPlugin()).setNameForTooltip("Accretion Disk");
100 }
101
102 ring.setCircularOrbit(parent, 0, 0, -100);
103
104 rings.add(ring);
105
106 GenResult result = new GenResult();
107 result.onlyIncrementByWidth = false;
108 result.orbitalWidth = orbitRadius;
109 result.entities.addAll(rings);
110 return result;
111 }
112
113 public boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context) {
114 return terrainData != null && (terrainData.getId().equals("accretion_disk"));
115 }
116
117}
boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context)
GenResult generate(TerrainGenDataSpec terrainData, GenContext context)
RingBandAPI addRingBand(SectorEntityToken focus, String category, String key, float bandWidthInTexture, int bandIndex, Color color, float bandWidthInEngine, float middleRadius, float orbitDays)
SectorEntityToken addTerrain(String terrainId, Object param)
void setSpiralFactor(float spiralFactor)
void setMinSpiralRadius(float minSpiralRadius)
void setCircularOrbit(SectorEntityToken focus, float angle, float orbitRadius, float orbitDays)