001package com.fs.starfarer.api.impl.campaign.terrain;
002
003import java.util.Random;
004
005import com.fs.starfarer.api.Global;
006import com.fs.starfarer.api.campaign.AsteroidAPI;
007import com.fs.starfarer.api.campaign.LocationAPI;
008import com.fs.starfarer.api.campaign.SectorEntityToken;
009import com.fs.starfarer.api.graphics.SpriteAPI;
010import com.fs.starfarer.api.util.Misc;
011
012public class AsteroidFieldTerrainPlugin extends AsteroidBeltTerrainPlugin {
013        
014        public static class AsteroidFieldParams extends RingParams {
015                public float minRadius;
016                public float maxRadius;
017                public int minAsteroids;
018                public int maxAsteroids;
019                public float minSize;
020                public float maxSize;
021                public int numAsteroids;
022                public AsteroidFieldParams(float minRadius, float maxRadius,
023                                int minAsteroids, int maxAsteroids, float minSize,
024                                float maxSize, String name) {
025                        super(maxRadius, maxRadius/2f, null, name);
026                        this.minRadius = minRadius;
027                        this.maxRadius = maxRadius;
028                        this.minAsteroids = minAsteroids;
029                        this.maxAsteroids = maxAsteroids;
030                        this.minSize = minSize;
031                        this.maxSize = maxSize;
032                }
033        }
034        
035        //float size = 8f + (float) Math.random() * 25f;
036        public AsteroidFieldParams params;
037        public void init(String terrainId, SectorEntityToken entity, Object param) {
038                super.init(terrainId, entity, param);
039                params = (AsteroidFieldParams) param;
040                name = params.name;
041                if (name == null) {
042                        name = "Asteroid Field";
043                }
044                params.numAsteroids = params.minAsteroids;
045                if (params.maxAsteroids > params.minAsteroids) {
046                        params.numAsteroids += new Random().nextInt(params.maxAsteroids - params.minAsteroids);
047                }
048        }
049        
050        
051        private transient SpriteAPI icon = null;
052        @Override
053        public void renderOnMap(float factor, float alphaMult) {
054//              if (params == null) return;
055//              if (icon == null) {
056//                      icon = Global.getSettings().getSprite("systemMap", "asteroid_field");
057//              }
058//              
059//              float size = 64;
060//              icon.setSize(size, size);
061//              icon.setAlphaMult(alphaMult);
062//              Vector2f loc = entity.getLocation();
063//              icon.renderAtCenter(loc.x * factor, loc.y * factor);
064        }
065
066
067
068        public void regenerateAsteroids() {
069                createAsteroidField();
070        }
071        
072        //protected boolean needToCreateAsteroidField = true;
073        protected void createAsteroidField() {
074                if (!(params instanceof AsteroidFieldParams)) return;
075                
076                Random rand = new Random(Global.getSector().getClock().getTimestamp() + entity.getId().hashCode());
077                
078                float fieldRadius = params.minRadius + (params.maxRadius - params.minRadius) * rand.nextFloat();
079                params.bandWidthInEngine = fieldRadius;
080                params.middleRadius = fieldRadius / 2f;
081                
082                
083                LocationAPI location = entity.getContainingLocation();
084                if (location == null) return;
085                for (int i = 0; i < params.numAsteroids; i++) {
086                        float size = params.minSize + (params.maxSize - params.minSize) * rand.nextFloat();
087                        AsteroidAPI asteroid = location.addAsteroid(size);
088                        asteroid.setFacing(rand.nextFloat() * 360f);
089                        
090                        float r = rand.nextFloat();
091                        r = 1f - r * r;
092                        
093                        float currRadius = fieldRadius * r;
094                        
095                        float minOrbitDays = Math.max(1f, currRadius * 0.05f);
096                        float maxOrbitDays = Math.max(2f, currRadius * 2f * 0.05f);
097                        float orbitDays = minOrbitDays + rand.nextFloat() * (maxOrbitDays - minOrbitDays);
098                        
099                        float angle = rand.nextFloat() * 360f;
100                        asteroid.setCircularOrbit(this.entity, angle, currRadius, orbitDays);
101                        Misc.setAsteroidSource(asteroid, this);
102                }
103                needToCreateAsteroids = false;
104        }
105        
106        public void advance(float amount) {
107                if (needToCreateAsteroids) {
108                        createAsteroidField();
109                }
110                super.advance(amount);
111        }
112                
113        public String getNameForTooltip() {
114                return "Asteroid Field";
115                //return params.name;
116        }
117
118        @Override
119        public void reportAsteroidPersisted(SectorEntityToken asteroid) {
120                if (Misc.getAsteroidSource(asteroid) == this) {
121                        params.numAsteroids--;
122                }
123        }
124        
125        
126}
127
128
129