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}