001package com.fs.starfarer.api.impl.campaign.procgen; 002 003import com.fs.starfarer.api.campaign.CampaignTerrainAPI; 004import com.fs.starfarer.api.campaign.SectorEntityToken; 005import com.fs.starfarer.api.campaign.StarSystemAPI; 006import com.fs.starfarer.api.impl.campaign.ids.Terrain; 007import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenContext; 008import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenResult; 009import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.LagrangePointType; 010import com.fs.starfarer.api.impl.campaign.terrain.BaseTiledTerrain; 011import com.fs.starfarer.api.impl.campaign.terrain.NebulaTerrainPlugin; 012import com.fs.starfarer.api.util.WeightedRandomPicker; 013 014public class NebulaSmallGenPlugin implements TerrainGenPlugin { 015 016 public static final float WIDTH_PLANET = 200f; 017 public static final float WIDTH_STAR = 400f; 018 019 public GenResult generate(TerrainGenDataSpec terrainData, GenContext context) { 020 if (context.lagrangeParent == null || context.lagrangePointType == null) return null; 021 022 //System.out.println("GENERATING L-POINT NEBULA AT " + context.star.getId()); 023 024 SectorEntityToken parent = context.center; 025 if (context.parent != null) parent = context.parent; 026 if (context.lagrangeParent != null) parent = context.center; 027 028 029 WeightedRandomPicker<Integer> sizePicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random); 030 for (int i = 5; i <= 15; i++) { 031 sizePicker.add(i, 20 - i); 032 } 033 034 int size = sizePicker.pick(); 035 //size = 100; 036 float radius = NebulaTerrainPlugin.TILE_SIZE * (float) size / 2f; 037 038 StarSystemAPI system = context.system; 039 float orbitRadius = context.currentRadius + radius; 040 041 float orbitDays = orbitRadius / (20f + StarSystemGenerator.random.nextFloat() * 5f); 042 float angle = StarSystemGenerator.random.nextFloat() * 360f; 043 if (context.lagrangeParent != null) { 044 orbitRadius = context.lagrangeParent.orbitRadius; 045 orbitDays = context.lagrangeParent.orbitDays; 046 float angleOffset = -StarSystemGenerator.LAGRANGE_OFFSET; 047 if (context.lagrangePointType == LagrangePointType.L5) angleOffset = StarSystemGenerator.LAGRANGE_OFFSET; 048 angle = context.lagrangeParent.orbitAngle + angleOffset; 049 } 050 051 if (radius > orbitRadius * 0.5f) { 052 radius = orbitRadius * 0.5f; 053 } 054 055 StringBuilder sb = new StringBuilder(); 056 for (int i = 0; i < size * size; i++) { 057 sb.append("x"); 058 } 059 String initStr = sb.toString(); 060 061 String nebulaType = StarSystemGenerator.nebulaTypes.get(context.gen.getStarAge()); 062 063 SectorEntityToken nebula = system.addTerrain(Terrain.NEBULA, new BaseTiledTerrain.TileParams( 064 initStr, 065 size, size, // size of the nebula grid, should match above string 066 "terrain", nebulaType, 4, 4, null)); 067 nebula.setCircularOrbit(parent, angle, orbitRadius, orbitDays); 068 069 NebulaTerrainPlugin nebulaPlugin = (NebulaTerrainPlugin)((CampaignTerrainAPI)nebula).getPlugin(); 070 NebulaEditor editor = new NebulaEditor(nebulaPlugin); 071 072 editor.noisePrune(0.75f); 073 editor.clearArc(nebula.getLocation().x, nebula.getLocation().y, radius * 0.8f, radius * 3f, 0, 360f); 074 075 GenResult result = new GenResult(); 076 result.onlyIncrementByWidth = false; 077 result.orbitalWidth = radius * 2f; 078 result.entities.add(nebula); 079 return result; 080 } 081 082 public boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context) { 083 return terrainData != null && terrainData.getId().equals("nebula_small"); 084 } 085 086}