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);
71 this.density = 0.1f + StarSystemGenerator.random.nextFloat() * 0.9f;
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;
105 expander =
new FaderUtil(0, dur, dur);
108 ((CampaignTerrainAPI)
entity).setRadius(
params.bandWidthInEngine);
110 entity.setDetectionRangeDetailsOverrideMult(0.4f);
111 entity.addTag(Tags.DEBRIS_FIELD);
130 layers = EnumSet.of(CampaignEngineLayers.TERRAIN_7A);
137 super.advance(amount);
147 if (!
entity.isInCurrentLocation()) {
160 ((CampaignTerrainAPI)
entity).setRadius(
params.bandWidthInEngine);
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) {
205 WeightedRandomPicker<DebrisPiece> picker =
new WeightedRandomPicker<DebrisPiece>();
207 if (!piece.hasIndicator()) {
211 for (
int i = 0; i < addIndicators && !picker.isEmpty(); i++) {
232 return super.getMaxRadiusForContains() *
expander.getBrightness();
237 return super.getMinRadiusForContains() *
expander.getBrightness();
240 public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
242 super.render(layer, viewport);
244 float alphaMult = viewport.getAlphaMult();
245 alphaMult *=
entity.getSensorFaderBrightness();
246 alphaMult *=
entity.getSensorContactFaderBrightness();
247 if (alphaMult <= 0)
return;
251 GL11.glTranslatef(
entity.getLocation().x,
entity.getLocation().y, 0);
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;
277 int max = (int) (baseMax *
expander.getBrightness() *
expander.getBrightness());
281 while (
pieces.size() < max) {
291 pieces =
new ArrayList<DebrisPiece>();
298 piece.advance(1f *
expander.getBrightness());
308 if (
entity instanceof CampaignFleetAPI) {
309 CampaignFleetAPI fleet = (CampaignFleetAPI)
entity;
311 if (Misc.isSlowMoving(fleet)) {
312 fleet.getStats().addTemporaryModMult(0.1f,
getModId() +
"_1",
314 fleet.getStats().getDetectedRangeMod());
323 private String nameForTooltip =
null;
325 if (nameForTooltip ==
null)
return "Debris Field";
326 return nameForTooltip;
330 this.nameForTooltip = nameForTooltip;
336 Color gray = Misc.getGrayColor();
337 Color highlight = Misc.getHighlightColor();
339 Color bad = Misc.getNegativeHighlightColor();
344 float left = params.lastsDays -
elapsed;
346 tooltip.addPara(
"This particular field appears stable and is unlikely to drift apart any time soon.", pad);
348 String atLeastTime = Misc.getAtLeastStringForDays((
int) left);
349 tooltip.addPara(
"This particular field is unstable, but should not drift apart for " + atLeastTime +
".", pad);
355 tooltip.addSectionHeading(
"Travel", Alignment.MID, 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,
369 Misc.getGrayColor(), highlight,
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";
394 return flag == TerrainAIFlags.HIDING_STATIONARY;
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)
Description getDescription(String id, Type type)
String getSpriteName(String category, String id)
String getControlStringForEnumName(String name)
Color getColor(String id)