1package com.fs.starfarer.api.impl.campaign.abilities;
3import java.util.ArrayList;
4import java.util.Iterator;
6import java.util.Random;
8import org.lwjgl.util.vector.Vector2f;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.CampaignFleetAPI;
12import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
13import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
14import com.fs.starfarer.api.campaign.LocationAPI;
15import com.fs.starfarer.api.campaign.OrbitalStationAPI;
16import com.fs.starfarer.api.campaign.PlanetAPI;
17import com.fs.starfarer.api.campaign.SectorEntityToken;
18import com.fs.starfarer.api.impl.campaign.ids.Tags;
19import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2;
20import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2.SlipstreamSegment;
21import com.fs.starfarer.api.util.FaderUtil;
22import com.fs.starfarer.api.util.IntervalUtil;
23import com.fs.starfarer.api.util.Misc;
27 public static class GSPing {
32 public boolean withSound =
false;
33 public GSPing(
float angle,
float arc,
float grav,
float in,
float out) {
37 fader =
new FaderUtil(0, in, out,
false,
true);
41 public void advance(
float days) {
45 float dist = 1000f + (1f - Math.min(1f, grav / 200f)) * 1450f;
53 public boolean isDone() {
63 private int resolution = 360;
64 transient private float [] data;
67 private List<GSPing> pings =
new ArrayList<GSPing>();
75 this.ability = ability;
86 Iterator<GSPing> iter = pings.iterator();
87 while (iter.hasNext()) {
88 GSPing ping = iter.next();
121 if (planetInterval.intervalElapsed()) {
126 if (specialInterval.intervalElapsed()) {
140 data =
new float[resolution];
144 float incr = 360f / (float) resolution;
145 for (GSPing ping : pings) {
147 float b = ping.fader.getBrightness();
148 if (b <= 0)
continue;
153 float arc = ping.arc;
154 float mid = ping.angle;
155 float half = (float) Math.ceil(0.5f * arc / incr);
156 for (
float i = -half; i <= half; i++) {
157 float curr = mid + incr * i;
160 float intensity = 1f - Math.abs(i / half);
161 intensity *= intensity;
162 float value = ping.grav * intensity * b;
163 data[index] += value;
173 if (data ==
null)
return 0f;
180 int index = (int)Math.floor(resolution * angle/360f);
184 private int initialCount = 0;
185 private List<SectorEntityToken> special =
new ArrayList<SectorEntityToken>();
198 float neutrinoLowSkipProb = 0.8f;
199 if (special.isEmpty()) {
208 if (neutrinoHigh)
continue;
218 if (!neutrino && !neutrinoLow && !station)
continue;
219 if (neutrinoLow && (
float) Math.random() < neutrinoLowSkipProb)
continue;
231 if (fleet == curr)
continue;
234 if (neutrinoHigh)
continue;
238 if ((
float) Math.random() < neutrinoLowSkipProb)
continue;
242 initialCount = special.size();
245 int batch = (int) Math.ceil(initialCount / 1f);
246 for (
int i = 0; i < batch; i++) {
247 if (special.isEmpty())
break;
255 if (arc < 15) arc = 15;
256 if (arc > 150f) arc = 150f;
263 float in = 0.05f + 0.1f * (float) Math.random();
267 GSPing ping =
new GSPing(angle, arc, g, in, out);
268 ping.withSound =
true;
273 long seed = (long) (location.
getLocation().x * 1300000 + location.
getLocation().y * 3700000 + 1213324234234L);
274 Random random =
new Random(seed);
276 int numFalse = random.nextInt(5);
279 for (
int i = 0; i < numFalse; i++) {
281 boolean constant = random.nextFloat() > 0.25f;
282 if (!constant && (
float) Math.random() < neutrinoLowSkipProb) {
289 float angle = random.nextFloat() * 360f;
290 float in = 0.05f + 0.1f * (float) Math.random();
295 float g = 80 + random.nextFloat() * 60;
297 GSPing ping =
new GSPing(angle, arc, g, in, out);
298 ping.withSound =
true;
307 if (range < 0) range = 0;
310 if (range > max) range = max;
313 return 1f - 0.85f * range / max;
330 List<SlipstreamSegment> inRange =
new ArrayList<SlipstreamSegment>();
333 for (SlipstreamSegment curr : near) {
338 if (curr.bMult <= 0)
continue;
345 if (!inRange.isEmpty()) {
346 for (SlipstreamSegment curr : inRange) {
351 if (arc > 150f) arc = 150f;
352 if (arc < 20) arc = 20;
360 GSPing ping =
new GSPing(angle, arc, g, in, out);
385 List<SectorEntityToken> all =
new ArrayList<SectorEntityToken>(location.
getPlanets());
398 if (fleet == curr)
continue;
428 if (entity.getRadius() <= 0)
continue;
434 if (arc > 150f) arc = 150f;
435 if (arc < 20) arc = 20;
457 GSPing ping =
new GSPing(angle, arc, g, in, out);
508 if (g > 200) g = 200;
513 if (g > 200) g = 200;
518 if (g > 200) g = 200;
static SoundPlayerAPI getSoundPlayer()
static SectorAPI getSector()
CampaignFleetAPI getFleet()
static float SLIPSTREAM_DETECTION_RANGE
int getIndex(float angle)
void maintainHighSourcePings()
GraviticScanData(GraviticScanAbility ability)
float getGravity(SectorEntityToken entity)
float getDataAt(float angle)
float getRangeGMult(float range)
void maintainSlipstreamPings()
boolean containsEntity(SectorEntityToken other)
List< SlipstreamSegment > getSegmentsNear(Vector2f loc, float range)
void advance(float amount)
float getIntervalDuration()
void advance(float amount)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static boolean isInAbyss(Vector2f loc)
static boolean isInsideSlipstream(Vector2f loc, float radius)
static float computeAngleSpan(float radius, float range)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float normalizeAngle(float angleDeg)
static float getAngleInDegrees(Vector2f v)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
LocationAPI getContainingLocation()
List getEntities(Class implementedClassOrInterface)
List< SectorEntityToken > getJumpPoints()
List< PlanetAPI > getPlanets()
List< CampaignTerrainAPI > getTerrainCopy()
List< CampaignFleetAPI > getFleets()
CampaignFleetAPI getPlayerFleet()
boolean hasTag(String tag)