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();
28 WeightedRandomPicker<Integer> indexPicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random);
29
30 WeightedRandomPicker<String> ringSet = new WeightedRandomPicker<String>(StarSystemGenerator.random);
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));
97 ring.addTag(Tags.ACCRETION_DISK);
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)