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
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)
void setCircularOrbit(SectorEntityToken focus, float angle, float orbitRadius, float orbitDays)