1package com.fs.starfarer.api.impl.campaign.terrain;
4import java.util.Random;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.AsteroidAPI;
8import com.fs.starfarer.api.campaign.CampaignEngineLayers;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.campaign.LocationAPI;
11import com.fs.starfarer.api.campaign.SectorEntityToken;
12import com.fs.starfarer.api.campaign.TerrainAIFlags;
13import com.fs.starfarer.api.campaign.rules.MemoryAPI;
14import com.fs.starfarer.api.combat.ViewportAPI;
15import com.fs.starfarer.api.loading.Description.Type;
16import com.fs.starfarer.api.ui.Alignment;
17import com.fs.starfarer.api.ui.TooltipMakerAPI;
18import com.fs.starfarer.api.util.Misc;
25 public static class AsteroidBeltParams
extends RingParams {
26 public int numAsteroids;
29 public float minOrbitDays;
30 public float maxOrbitDays;
33 public AsteroidBeltParams(
int numAsteroids,
float orbitRadius,
34 float width,
float minOrbitDays,
float maxOrbitDays,
35 float minSize,
float maxSize, String name) {
36 super(width, orbitRadius,
null, name);
37 this.numAsteroids = numAsteroids;
40 this.minOrbitDays = minOrbitDays;
41 this.maxOrbitDays = maxOrbitDays;
42 this.minSize = minSize;
43 this.maxSize = maxSize;
56 if (
params ==
null)
return;
61 float bandWidth =
params.bandWidthInEngine;
64 params.middleRadius - bandWidth * 0.5f,
65 params.middleRadius + bandWidth * 0.5f,
67 false, factor, alphaMult);
76 if (!(
params instanceof AsteroidBeltParams))
return;
81 for (
int i = 0; i <
params.numAsteroids; i++) {
83 float size = params.minSize + rand.nextFloat() * (params.maxSize -
params.minSize);
86 asteroid.
setFacing(rand.nextFloat() * 360f);
87 float currRadius = params.middleRadius -
params.bandWidthInEngine/2f + rand.nextFloat() *
params.bandWidthInEngine;
88 float angle = rand.nextFloat() * 360f;
89 float orbitDays = params.minOrbitDays + rand.nextFloat() * (params.maxOrbitDays -
params.minOrbitDays);
100 super.advance(amount);
132 if (param instanceof AsteroidBeltParams) {
133 params = (AsteroidBeltParams) param;
136 name =
"Asteroid Belt";
143 super.render(layer, viewport);
165 String key =
"$asteroidImpactTimeout";
166 String sKey =
"$skippedImpacts";
167 String recentKey =
"$recentImpact";
168 float probPerSkip = 0.15f;
170 float maxSkipsToTrack = 7;
171 float durPerSkip = 0.2f;
175 if (expire < 0) expire = 0;
181 hitProb = expire / durPerSkip * probPerSkip;
182 if (hitProb > maxProb) hitProb = maxProb;
183 if ((
float) Math.random() < hitProb) {
184 boolean hadRecent = mem.
is(recentKey,
true);
185 hadRecent &= (float) Math.random() > 0.5f;
187 mem.
set(sKey,
true, 0);
188 mem.
set(recentKey,
true, 0.5f + 1f * (
float) Math.random());
190 mem.
set(sKey,
true, Math.min(expire + durPerSkip, maxSkipsToTrack * durPerSkip));
192 mem.
set(key,
true, (
float) (0.05f + 0.1f * Math.random()));
239 return "Asteroid Belt";
280 tooltip.
addPara(
"Chance of asteroid impacts that briefly knock the fleet off course and " +
281 "may occasionally impact ships directly, dealing moderate damage.", nextPad);
287 tooltip.
addPara(
"Smaller fleets are usually able to avoid the heavier impacts, " +
288 "and slow-moving fleets do not risk impacts at all.", pad,
299 tooltip.
addPara(
"Reduces the range at which stationary or slow-moving* fleets inside it can be detected by %s.", nextPad,
303 tooltip.
addPara(
"*Press and hold %s to stop; combine with holding the left mouse button down to move slowly. " +
304 "A slow-moving fleet moves at a burn level of half that of its slowest ship.", nextPad,
319 tooltip.
addPara(
"Numerous asteroids present on the battlefield. Large enough to be an in-combat navigational hazard.", small);
334 return "asteroid_belt";
338 return flag == TerrainAIFlags.REDUCES_SPEED_LARGE || flag == TerrainAIFlags.DANGEROUS_UNLESS_GO_SLOW ||
static SettingsAPI getSettings()
static SectorAPI getSector()
AsteroidBeltParams params
void renderOnMap(float factor, float alphaMult)
void createTooltip(TooltipMakerAPI tooltip, boolean expanded)
String getNameForTooltip()
void applyEffect(SectorEntityToken entity, float days)
boolean isTooltipExpandable()
void regenerateAsteroids()
void init(String terrainId, SectorEntityToken entity, Object param)
void reportAsteroidPersisted(SectorEntityToken asteroid)
void render(CampaignEngineLayers layer, ViewportAPI viewport)
void advance(float amount)
String getEffectCategory()
boolean needToCreateAsteroids
boolean hasAIFlag(Object flag)
void render(Vector2f loc, float minR, float maxR, Color color, boolean spiral, float factor, float alphaMult)
static float getVisibilityMult(CampaignFleetAPI fleet)
static void setAsteroidSource(SectorEntityToken asteroid, AsteroidSource source)
static Color getNegativeHighlightColor()
static Color getGrayColor()
static AsteroidSource getAsteroidSource(SectorEntityToken asteroid)
static float getFleetRadiusTerrainEffectMult(CampaignFleetAPI fleet)
static Color getHighlightColor()
static boolean isSlowMoving(CampaignFleetAPI fleet)
NOT_SUPER_DANGEROUS_UNLESS_GO_SLOW
Description getDescription(String id, Type type)
String getControlStringForEnumName(String name)
Color getColor(String id)
MutableFleetStatsAPI getStats()
boolean isInHyperspaceTransition()
AsteroidAPI addAsteroid(float radius)
CampaignFleetAPI getPlayerFleet()
CampaignClockAPI getClock()
LocationAPI getContainingLocation()
void setCircularOrbit(SectorEntityToken focus, float angle, float orbitRadius, float orbitDays)
void addScript(EveryFrameScript script)
void setFacing(float facing)
MemoryAPI getMemoryWithoutUpdate()
float getExpire(String key)
boolean contains(String key)
void set(String key, Object value)
boolean is(String key, Object value)
StatBonus getDetectedRangeMod()
void addTemporaryModMult(float durInDays, String source, String desc, float value, StatBonus stat)