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