Starsector API
Loading...
Searching...
No Matches
AsteroidFieldTerrainPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.terrain;
2
3import java.util.Random;
4
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.campaign.AsteroidAPI;
7import com.fs.starfarer.api.campaign.LocationAPI;
8import com.fs.starfarer.api.campaign.SectorEntityToken;
9import com.fs.starfarer.api.graphics.SpriteAPI;
10import com.fs.starfarer.api.util.Misc;
11
13
14 public static class AsteroidFieldParams extends RingParams {
15 public float minRadius;
16 public float maxRadius;
17 public int minAsteroids;
18 public int maxAsteroids;
19 public float minSize;
20 public float maxSize;
21 public int numAsteroids;
22 public AsteroidFieldParams(float minRadius, float maxRadius,
23 int minAsteroids, int maxAsteroids, float minSize,
24 float maxSize, String name) {
25 super(maxRadius, maxRadius/2f, null, name);
26 this.minRadius = minRadius;
27 this.maxRadius = maxRadius;
28 this.minAsteroids = minAsteroids;
29 this.maxAsteroids = maxAsteroids;
30 this.minSize = minSize;
31 this.maxSize = maxSize;
32 }
33 }
34
35 //float size = 8f + (float) Math.random() * 25f;
36 public AsteroidFieldParams params;
37 public void init(String terrainId, SectorEntityToken entity, Object param) {
38 super.init(terrainId, entity, param);
39 params = (AsteroidFieldParams) param;
40 name = params.name;
41 if (name == null) {
42 name = "Asteroid Field";
43 }
44 params.numAsteroids = params.minAsteroids;
45 if (params.maxAsteroids > params.minAsteroids) {
46 params.numAsteroids += new Random().nextInt(params.maxAsteroids - params.minAsteroids);
47 }
48 }
49
50
51 private transient SpriteAPI icon = null;
52 @Override
53 public void renderOnMap(float factor, float alphaMult) {
54// if (params == null) return;
55// if (icon == null) {
56// icon = Global.getSettings().getSprite("systemMap", "asteroid_field");
57// }
58//
59// float size = 64;
60// icon.setSize(size, size);
61// icon.setAlphaMult(alphaMult);
62// Vector2f loc = entity.getLocation();
63// icon.renderAtCenter(loc.x * factor, loc.y * factor);
64 }
65
66
67
68 public void regenerateAsteroids() {
70 }
71
72 //protected boolean needToCreateAsteroidField = true;
73 protected void createAsteroidField() {
74 if (!(params instanceof AsteroidFieldParams)) return;
75
76 Random rand = new Random(Global.getSector().getClock().getTimestamp() + entity.getId().hashCode());
77
78 float fieldRadius = params.minRadius + (params.maxRadius - params.minRadius) * rand.nextFloat();
79 params.bandWidthInEngine = fieldRadius;
80 params.middleRadius = fieldRadius / 2f;
81
82
83 LocationAPI location = entity.getContainingLocation();
84 if (location == null) return;
85 for (int i = 0; i < params.numAsteroids; i++) {
86 float size = params.minSize + (params.maxSize - params.minSize) * rand.nextFloat();
87 AsteroidAPI asteroid = location.addAsteroid(size);
88 asteroid.setFacing(rand.nextFloat() * 360f);
89
90 float r = rand.nextFloat();
91 r = 1f - r * r;
92
93 float currRadius = fieldRadius * r;
94
95 float minOrbitDays = Math.max(1f, currRadius * 0.05f);
96 float maxOrbitDays = Math.max(2f, currRadius * 2f * 0.05f);
97 float orbitDays = minOrbitDays + rand.nextFloat() * (maxOrbitDays - minOrbitDays);
98
99 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) {
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
static SectorAPI getSector()
Definition Global.java:59
void init(String terrainId, SectorEntityToken entity, Object param)