Starsector API
Loading...
Searching...
No Matches
NebulaSmallGenPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.procgen;
2
3import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
4import com.fs.starfarer.api.campaign.SectorEntityToken;
5import com.fs.starfarer.api.campaign.StarSystemAPI;
6import com.fs.starfarer.api.impl.campaign.ids.Terrain;
7import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenContext;
8import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenResult;
9import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.LagrangePointType;
10import com.fs.starfarer.api.impl.campaign.terrain.BaseTiledTerrain;
11import com.fs.starfarer.api.impl.campaign.terrain.NebulaTerrainPlugin;
12import com.fs.starfarer.api.util.WeightedRandomPicker;
13
14public class NebulaSmallGenPlugin implements TerrainGenPlugin {
15
16 public static final float WIDTH_PLANET = 200f;
17 public static final float WIDTH_STAR = 400f;
18
19 public GenResult generate(TerrainGenDataSpec terrainData, GenContext context) {
20 if (context.lagrangeParent == null || context.lagrangePointType == null) return null;
21
22 //System.out.println("GENERATING L-POINT NEBULA AT " + context.star.getId());
23
24 SectorEntityToken parent = context.center;
25 if (context.parent != null) parent = context.parent;
26 if (context.lagrangeParent != null) parent = context.center;
27
28
29 WeightedRandomPicker<Integer> sizePicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random);
30 for (int i = 5; i <= 15; i++) {
31 sizePicker.add(i, 20 - i);
32 }
33
34 int size = sizePicker.pick();
35 //size = 100;
36 float radius = NebulaTerrainPlugin.TILE_SIZE * (float) size / 2f;
37
38 StarSystemAPI system = context.system;
39 float orbitRadius = context.currentRadius + radius;
40
41 float orbitDays = orbitRadius / (20f + StarSystemGenerator.random.nextFloat() * 5f);
42 float angle = StarSystemGenerator.random.nextFloat() * 360f;
43 if (context.lagrangeParent != null) {
44 orbitRadius = context.lagrangeParent.orbitRadius;
45 orbitDays = context.lagrangeParent.orbitDays;
46 float angleOffset = -StarSystemGenerator.LAGRANGE_OFFSET;
47 if (context.lagrangePointType == LagrangePointType.L5) angleOffset = StarSystemGenerator.LAGRANGE_OFFSET;
48 angle = context.lagrangeParent.orbitAngle + angleOffset;
49 }
50
51 if (radius > orbitRadius * 0.5f) {
52 radius = orbitRadius * 0.5f;
53 }
54
55 StringBuilder sb = new StringBuilder();
56 for (int i = 0; i < size * size; i++) {
57 sb.append("x");
58 }
59 String initStr = sb.toString();
60
61 String nebulaType = StarSystemGenerator.nebulaTypes.get(context.gen.getStarAge());
62
63 SectorEntityToken nebula = system.addTerrain(Terrain.NEBULA, new BaseTiledTerrain.TileParams(
64 initStr,
65 size, size, // size of the nebula grid, should match above string
66 "terrain", nebulaType, 4, 4, null));
67 nebula.setCircularOrbit(parent, angle, orbitRadius, orbitDays);
68
69 NebulaTerrainPlugin nebulaPlugin = (NebulaTerrainPlugin)((CampaignTerrainAPI)nebula).getPlugin();
70 NebulaEditor editor = new NebulaEditor(nebulaPlugin);
71
72 editor.noisePrune(0.75f);
73 editor.clearArc(nebula.getLocation().x, nebula.getLocation().y, radius * 0.8f, radius * 3f, 0, 360f);
74
75 GenResult result = new GenResult();
76 result.onlyIncrementByWidth = false;
77 result.orbitalWidth = radius * 2f;
78 result.entities.add(nebula);
79 return result;
80 }
81
82 public boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context) {
83 return terrainData != null && terrainData.getId().equals("nebula_small");
84 }
85
86}
void clearArc(float x, float y, float innerRadius, float outerRadius, float startAngle, float endAngle)
GenResult generate(TerrainGenDataSpec terrainData, GenContext context)
boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context)