001package com.fs.starfarer.api.impl.campaign.procgen;
002
003import java.awt.Color;
004
005import com.fs.starfarer.api.campaign.SectorEntityToken;
006import com.fs.starfarer.api.campaign.StarSystemAPI;
007import com.fs.starfarer.api.impl.campaign.ids.Terrain;
008import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenContext;
009import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GenResult;
010import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator.GeneratedPlanet;
011import com.fs.starfarer.api.util.WeightedRandomPicker;
012
013public class AsteroidBeltGenPlugin implements TerrainGenPlugin {
014        
015        public GenResult generate(TerrainGenDataSpec terrainData, GenContext context) {
016                StarSystemAPI system = context.system;
017                SectorEntityToken parent = context.center;
018                if (context.parent != null) parent = context.parent;
019                
020                //float width = StarSystemGenerator.getRadius(terrainData.getMinRadius(), terrainData.getMaxRadius());
021                float width = 200f;
022                
023                float countMult = 1f;
024                float maxPlanets = 1;
025                if (context.currentRadius > 2000f && StarSystemGenerator.random.nextFloat() > 0.5f) {
026                        width += 100f;
027                        countMult += 0.1f;
028                        maxPlanets++;
029                }
030                if (context.currentRadius > 4000f && StarSystemGenerator.random.nextFloat() > 0.5f) {
031                        width += 100f;
032                        countMult += 0.1f;
033                        maxPlanets++;
034                }
035                if (context.currentRadius > 6000f && StarSystemGenerator.random.nextFloat() > 0.5f) {
036                        width += 100f;
037                        countMult += 0.1f;
038                        maxPlanets++;
039                }
040                
041                //if (maxPlanets > 3) maxPlanets = 3;
042                if (maxPlanets > 1) maxPlanets = 1;
043                
044                
045                float orbitRadius = context.currentRadius + width / 2f;
046                float orbitDays = orbitRadius / (15f + 5f * StarSystemGenerator.random.nextFloat());
047
048                int count = (int) (orbitDays * (0.25f + 0.5f * StarSystemGenerator.random.nextFloat()) * countMult);
049                if (count > 100) {
050                        count = (int) (100f + (count - 100f) * 0.25f); 
051                }
052                if (count > 250) count = 250;
053                
054                SectorEntityToken belt = system.addAsteroidBelt(parent, count, orbitRadius, width, orbitDays * .75f, orbitDays * 1.5f, Terrain.ASTEROID_BELT,  null);
055                
056                WeightedRandomPicker<Integer> indexPicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random);
057                indexPicker.add(0);
058                indexPicker.add(1);
059                //indexPicker.add(2);
060                //indexPicker.add(3);
061                
062                system.addRingBand(parent, "misc", "rings_asteroids0", 256f, indexPicker.pickAndRemove(), Color.white, 256f, orbitRadius - width * 0.25f, orbitDays * 1.05f, null, null);
063                
064                
065                indexPicker = new WeightedRandomPicker<Integer>(StarSystemGenerator.random);
066                indexPicker.add(0);
067                indexPicker.add(1);
068                indexPicker.add(2);
069                indexPicker.add(3);
070                system.addRingBand(parent, "misc", "rings_asteroids0", 256f, indexPicker.pickAndRemove(), Color.white, 256f, orbitRadius + width * 0.25f, orbitDays, null, null);
071
072                
073                float prevRadius = context.currentRadius;
074                //float [] offsets = new float [] {0.5f, 0.15f, 0.85f};
075                //float [] offsets = new float [] {0.25f};
076                for (int i = 0; i < maxPlanets; i++) {
077                        CategoryGenDataSpec cat = context.gen.pickCategory(context, StarSystemGenerator.COL_IN_ASTEROIDS, true);
078                        if (cat != null) {
079                                WeightedRandomPicker<EntityGenDataSpec> picker = context.gen.getPickerForCategory(cat, context,
080                                                                                                                                                StarSystemGenerator.COL_IN_ASTEROIDS);
081                                if (StarSystemGenerator.DEBUG) {
082                                        picker.print("  Picking from category " + cat.getCategory() + 
083                                                        ", orbit index " + (context.parent != null ? context.parentOrbitIndex : context.orbitIndex));
084                                }
085                                EntityGenDataSpec pick = picker.pick();
086                                if (StarSystemGenerator.DEBUG) {
087                                        if (pick == null) {
088                                                System.out.println("  Nothing to pick");
089                                                System.out.println();
090                                        } else {
091                                                System.out.println("  Picked: " + pick.getId());
092                                                System.out.println();
093                                        }
094                                }
095                                
096                                if (pick instanceof PlanetGenDataSpec) {
097                                        PlanetGenDataSpec planetData = (PlanetGenDataSpec) pick;
098                                        //context.currentRadius = prevRadius + width * 0.1f + i * (width * 0.8f) / maxPlanets;
099                                        //context.currentRadius = prevRadius + width * offsets[i];
100                                        context.currentRadius = prevRadius - width * 0.6f;
101                                        //context.parentRadiusOverride = width * 0.75f / maxPlanets / StarSystemGenerator.MOON_RADIUS_MAX_FRACTION_OF_PARENT;
102                                        context.parentRadiusOverride = 200f;
103                                        GenResult result = context.gen.addPlanet(context, planetData, true, false);
104                                        if (result != null && !result.entities.isEmpty()) {
105                                                context.gen.getAllEntitiesAdded().put(result.entities.get(0), result.entities);
106                                        }
107                                        
108                                        if (!context.generatedPlanets.isEmpty()) {
109                                                GeneratedPlanet last = context.generatedPlanets.get(context.generatedPlanets.size() - 1);
110                                                last.planet.setRadius(last.planet.getRadius() * 0.75f);
111                                        }
112                                }
113                        }
114                }
115                context.parentRadiusOverride = -1;
116                context.currentRadius = prevRadius;
117                
118                
119                GenResult result = new GenResult();
120                result.onlyIncrementByWidth = false;
121                result.orbitalWidth = width;
122                result.entities.add(belt); 
123                return result;
124        }
125
126        public boolean wantsToHandle(TerrainGenDataSpec terrainData, GenContext context) {
127                return terrainData != null && terrainData.getId().equals("asteroid_belt");
128        }
129
130}