1package com.fs.starfarer.api.impl.campaign.terrain;
4import java.util.ArrayList;
5import java.util.EnumSet;
8import org.lwjgl.opengl.GL11;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.CampaignEngineLayers;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.CampaignTerrainAPI;
14import com.fs.starfarer.api.campaign.SectorEntityToken;
15import com.fs.starfarer.api.campaign.TerrainAIFlags;
16import com.fs.starfarer.api.combat.ViewportAPI;
17import com.fs.starfarer.api.impl.campaign.ids.Tags;
18import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
19import com.fs.starfarer.api.loading.Description.Type;
20import com.fs.starfarer.api.ui.Alignment;
21import com.fs.starfarer.api.ui.TooltipMakerAPI;
22import com.fs.starfarer.api.util.FaderUtil;
23import com.fs.starfarer.api.util.Misc;
24import com.fs.starfarer.api.util.WeightedRandomPicker;
33 float range = 100f + radius * 5f;
34 if (range > 2000) range = 2000;
38 public static enum DebrisFieldSource {
46 public static class DebrisFieldParams
extends RingParams {
48 public float baseDensity;
49 public float glowsDays;
50 public float lastsDays;
52 public float minSize = 4;
53 public float maxSize = 16;
54 public Color glowColor =
new Color(255,165,100,255);
57 public String defFaction =
null;
58 public float defenderProb = 0;
59 public int minStr = 0;
60 public int maxStr = 0;
61 public int maxDefenderSize = 4;
62 public long baseSalvageXP = 0;
63 public DebrisFieldSource source = DebrisFieldSource.MIXED;
65 public DebrisFieldParams(
float bandWidthInEngine,
float density,
66 float lastsDays,
float glowsDays) {
67 super(bandWidthInEngine, bandWidthInEngine / 2f,
null);
73 this.density = density;
75 this.baseDensity = 1f;
76 this.glowsDays = glowsDays;
77 this.lastsDays = lastsDays;
82 protected transient List<DebrisPiece>
pieces;
95 params = (DebrisFieldParams) param;
98 name =
"Debris Field";
104 float dur = params.bandWidthInEngine / 500f;
137 super.advance(amount);
166 float left = params.lastsDays -
elapsed;
169 params.density -= decr;
170 if (
params.density < 0) params.density = 0;
181 List<DebrisPiece>
remove =
new ArrayList<DebrisPiece>();
182 int withIndicator = 0;
185 if (piece.isDone()) {
188 if (piece.hasIndicator()) {
200 int withIndicatorGoal = (int) (
pieces.size() * 0.1f);
201 if (withIndicatorGoal < 3) withIndicatorGoal = 3;
203 int addIndicators = withIndicatorGoal - withIndicator;
204 if (addIndicators > 0) {
207 if (!piece.hasIndicator()) {
211 for (
int i = 0; i < addIndicators && !picker.
isEmpty(); i++) {
242 super.render(layer, viewport);
247 if (alphaMult <= 0)
return;
255 piece.render(alphaMult);
260 piece.renderIndicator(alphaMult);
269 float mult = params.bandWidthInEngine / 500f;
271 int baseMax = (int) (mult * 100f * (0.5f + 0.5f *
params.density));
273 if (baseMax < 7) baseMax = 7;
281 while (
pieces.size() < max) {
291 pieces =
new ArrayList<DebrisPiece>();
323 private String nameForTooltip =
null;
325 if (nameForTooltip ==
null)
return "Debris Field";
326 return nameForTooltip;
330 this.nameForTooltip = nameForTooltip;
344 float left = params.lastsDays -
elapsed;
346 tooltip.
addPara(
"This particular field appears stable and is unlikely to drift apart any time soon.", pad);
349 tooltip.
addPara(
"This particular field is unstable, but should not drift apart for " + atLeastTime +
".", pad);
364 tooltip.
addPara(
"Reduces the range at which stationary or slow-moving* fleets inside it can be detected by %s.", nextPad,
368 tooltip.
addPara(
"*Press and hold %s to stop; combine with holding the left mouse button down to move slowly.", nextPad,
373 tooltip.
addPara(
"Scavenging through the debris for anything useful is possible, but can be dangerous for the crew and equipment involved.", pad);
390 return "ringsystem-like";
411 return params.glowsDays -
elapsed;
416 if (glowLeft <= 0)
return 0;
417 if (
params.glowsDays <= 0)
return 0;
418 return glowLeft /
params.glowsDays;
422 return params.lastsDays -
elapsed;
static SettingsAPI getSettings()
static SectorAPI getSector()
transient EnumSet< CampaignEngineLayers > layers
SectorEntityToken getEntity()
static final float DISSIPATE_DAYS
boolean hasAIFlag(Object flag)
static float computeDetectionRange(float radius)
void setNameForTooltip(String nameForTooltip)
float getMaxRadiusForContains()
float getPieceGlowProbability()
transient boolean wasInNonCurrentLocation
DebrisFieldParams getParams()
void init(String terrainId, SectorEntityToken entity, Object param)
transient List< DebrisPiece > pieces
String getEffectCategory()
void render(CampaignEngineLayers layer, ViewportAPI viewport)
transient boolean initedDebris
void setScavenged(Boolean scavenged)
String getIconSpriteName()
boolean isTooltipExpandable()
void initDebrisIfNeeded()
float getMinRadiusForContains()
void applyEffect(SectorEntityToken entity, float days)
void createTooltip(TooltipMakerAPI tooltip, boolean expanded)
void advance(float amount)
String getNameForTooltip()
static float getVisibilityMult(CampaignFleetAPI fleet)
void advance(float amount)
static Color getNegativeHighlightColor()
static String getAtLeastStringForDays(int days)
static Color getGrayColor()
static Color getHighlightColor()
static boolean isSlowMoving(CampaignFleetAPI fleet)
Description getDescription(String id, Type type)
String getSpriteName(String category, String id)
String getControlStringForEnumName(String name)
Color getColor(String id)
float convertToDays(float realSeconds)
MutableFleetStatsAPI getStats()
CampaignFleetAPI getPlayerFleet()
CampaignClockAPI getClock()
float getSensorContactFaderBrightness()
boolean isInCurrentLocation()
void setDetectionRangeDetailsOverrideMult(Float detectionRangeDetailsOverrideMult)
void setExpired(boolean expired)
float getSensorFaderBrightness()
StatBonus getDetectedRangeMod()
void addTemporaryModMult(float durInDays, String source, String desc, float value, StatBonus stat)