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}