1package com.fs.starfarer.api.impl.campaign.terrain;
3import java.util.ArrayList;
4import java.util.EnumSet;
9import org.lwjgl.util.vector.Vector2f;
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.campaign.CampaignEngineLayers;
13import com.fs.starfarer.api.campaign.CampaignFleetAPI;
14import com.fs.starfarer.api.campaign.PlanetAPI;
15import com.fs.starfarer.api.campaign.SectorEntityToken;
16import com.fs.starfarer.api.campaign.TerrainAIFlags;
17import com.fs.starfarer.api.combat.ViewportAPI;
18import com.fs.starfarer.api.fleet.FleetMemberAPI;
19import com.fs.starfarer.api.fleet.FleetMemberViewAPI;
20import com.fs.starfarer.api.graphics.SpriteAPI;
21import com.fs.starfarer.api.impl.campaign.ids.Stats;
22import com.fs.starfarer.api.impl.campaign.ids.Tags;
23import com.fs.starfarer.api.impl.campaign.terrain.AuroraRenderer.AuroraRendererDelegate;
24import com.fs.starfarer.api.impl.campaign.terrain.FlareManager.Flare;
25import com.fs.starfarer.api.impl.campaign.terrain.FlareManager.FlareManagerDelegate;
26import com.fs.starfarer.api.loading.Description.Type;
27import com.fs.starfarer.api.ui.Alignment;
28import com.fs.starfarer.api.ui.TooltipMakerAPI;
29import com.fs.starfarer.api.util.Misc;
35 public static class CoronaParams
extends RingParams {
36 public float windBurnLevel;
37 public float flareProbability;
38 public float crLossMult;
40 public CoronaParams(
float bandWidthInEngine,
float middleRadius,
42 float windBurnLevel,
float flareProbability,
float crLossMult) {
43 super(bandWidthInEngine, middleRadius, relatedEntity);
44 this.windBurnLevel = windBurnLevel;
45 this.flareProbability = flareProbability;
46 this.crLossMult = crLossMult;
51 transient protected Color
color;
61 params = (CoronaParams) param;
89 Object writeReplace() {
115 super.advance(amount);
119 if (amount > 0 &&
blocker !=
null) {
137 return outerRadiusWithFlare + 200f;
139 return super.getRenderRange();
148 if (dist > max)
return false;
154 if (dist > outerRadiusWithFlare + radius)
return false;
155 if (dist + radius <
params.middleRadius -
params.bandWidthInEngine / 2f)
return false;
158 return super.containsPoint(point, radius);
163 float outer = params.middleRadius + params.bandWidthInEngine * 0.5f;
164 float thickness = outer - inner;
166 thickness *= flare.extraLengthMult;
167 thickness += flare.extraLengthFlat;
169 return inner + thickness;
174 float base = super.getExtraSoundRadius();
198 boolean inFlare =
false;
204 if (intensity <= 0)
return;
209 float buffDur = 0.1f;
211 boolean protectedFromCorona =
false;
216 if (dist < curr.getRadius() + fleet.
getRadius() + 10f) {
217 protectedFromCorona =
true;
225 float recoveryRate = member.getStats().getBaseCRRecoveryRatePercentPerDay().getModifiedValue();
226 float lossRate = member.getStats().getBaseCRRecoveryRatePercentPerDay().getBaseValue();
229 if (protectedFromCorona) resistance = 0f;
232 if (inFlare) lossMult = 2f;
233 float adjustedLossMult = (0f + params.crLossMult * intensity * resistance * lossMult *
CR_LOSS_MULT_GLOBAL);
235 float loss = (-1f * recoveryRate + -1f * lossRate * adjustedLossMult) * days * 0.01f;
236 float curr = member.getRepairTracker().getBaseCR();
237 if (loss > curr) loss = curr;
238 if (resistance > 0) {
240 member.getRepairTracker().applyCREvent(loss,
"flare",
"Solar flare effect");
242 member.getRepairTracker().applyCREvent(loss,
"corona",
"Star corona effect");
247 float peakFraction = 1f / Math.max(1.3333f, 1f +
params.crLossMult * intensity);
248 float peakLost = 1f - peakFraction;
249 peakLost *= resistance;
250 float degradationMult = 1f + (params.crLossMult * intensity * resistance) / 2f;
251 member.getBuffManager().addBuffOnlyUpdateStat(
new PeakPerformanceBuff(buffId +
"_1", 1f - peakLost, buffDur));
252 member.getBuffManager().addBuffOnlyUpdateStat(
new CRLossPerSecondBuff(buffId +
"_2", degradationMult, buffDur));
259 float maxWindBurn =
params.windBurnLevel;
265 float currWindBurn = intensity * maxWindBurn;
266 float maxFleetBurnIntoWind = maxFleetBurn - Math.abs(currWindBurn);
270 if (currWindBurn < 0) {
275 velDir.scale(currFleetBurn);
277 float fleetBurnAgainstWind = -1f * Vector2f.dot(windDir, velDir);
279 float accelMult = 0.5f;
280 if (fleetBurnAgainstWind > maxFleetBurnIntoWind) {
281 accelMult += 0.75f + 0.25f * (fleetBurnAgainstWind - maxFleetBurnIntoWind);
284 if (fleetAccelMult > 0) {
285 accelMult /= fleetAccelMult;
292 fleet.
setVelocity(vel.x + windDir.x, vel.y + windDir.y);
295 int alpha = glowColor.getAlpha();
309 float sizeNormal = 5f + 10f * intensity;
310 float sizeFlare = 10f + 15f * intensity;
313 view.getWindEffectDirX().shift(
getModId() +
"_flare", windDir.x * sizeFlare, durIn, durOut, 1f);
314 view.getWindEffectDirY().shift(
getModId() +
"_flare", windDir.y * sizeFlare, durIn, durOut, 1f);
315 view.getWindEffectColor().shift(
getModId() +
"_flare", glowColor, durIn, durOut, intensity);
317 view.getWindEffectDirX().shift(
getModId(), windDir.x * sizeNormal, durIn, durOut, 1f);
318 view.getWindEffectDirY().shift(
getModId(), windDir.y * sizeNormal, durIn, durOut, 1f);
319 view.getWindEffectColor().shift(
getModId(), glowColor, durIn, durOut, intensity);
328 float maxDist =
params.bandWidthInEngine;
335 if (dist > maxDist)
return 0f;
337 float intensity = 1f;
338 if (minDist < maxDist) {
339 intensity = 1f - (dist - minDist) / (maxDist - minDist);
341 if (intensity < 0) intensity = 0;
342 if (intensity > 1) intensity = 1;
353 Color base = super.getNameColor();
378 tooltip.
addPara(
"Reduces the combat readiness of " +
379 "all ships in the corona at a steady pace.", nextPad);
380 tooltip.
addPara(
"The heavy solar wind also makes the star difficult to approach.", pad);
381 tooltip.
addPara(
"Occasional solar flare activity takes these effects to even more dangerous levels.", pad);
385 tooltip.
addPara(
"Reduces the peak performance time of ships and increases the rate of combat readiness degradation in protracted engagements.", small);
401 return "Solar Flare";
403 return super.getTerrainName();
450 return params.middleRadius + params.bandWidthInEngine * 0.5f;
492 List<Color> result =
new ArrayList<Color>();
498 result.add(Color.white);
553 return params.flareProbability;
629 return flag == TerrainAIFlags.CR_DRAIN ||
630 flag == TerrainAIFlags.BREAK_OTHER_ORBITS ||
636 float maxDist =
params.bandWidthInEngine;
static SettingsAPI getSettings()
static SectorAPI getSector()
static final String CORONA_EFFECT_MULT
void render(float alphaMult)
void advance(float amount)
float getExtraLengthFlat(float angle)
float getExtraLengthMult(float angle)
float getInnerOffsetMult(float angle)
void advance(float amount)
float getShortenMod(float angle)
Color getColorForAngle(Color baseColor, float angle)
boolean isInActiveFlareArc(Vector2f point)
void advance(float amount, float minApproachSpeed, float diffMult)
void updateLimits(SectorEntityToken entity, SectorEntityToken exclude, float diffMult)
void updateAndSync(SectorEntityToken entity, SectorEntityToken exclude, float diffMult)
float getCurrMaxAt(float angle)
float getFlareExtraLengthFlatMin()
boolean canPlayerHoldStationIn()
float getAuroraBandWidthInTexture()
List< Color > getFlareColorRange()
float getFlareSmallShortenFlatModMax()
float getFlareOccurrenceArc()
float getAuroraAlphaMultForAngle(float angle)
float getFlareSmallFadeOutMin()
EnumSet< CampaignEngineLayers > getActiveLayers()
boolean hasAIFlag(Object flag)
String getNameForTooltip()
FlareManager getFlareManager()
void createTooltip(TooltipMakerAPI tooltip, boolean expanded)
float getFlareProbability()
float getFlareShortenFlatModMin()
void render(CampaignEngineLayers layer, ViewportAPI viewport)
float getFlareFadeOutMax()
float getFlareSmallExtraLengthFlatMax()
float getAuroraInnerOffsetMult(float angle)
float getExtraSoundRadius()
float getAuroraOuterRadius()
float getAuroraInnerRadius()
float getFlareSmallExtraLengthMultMin()
float getFlareSmallExtraLengthFlatMin()
void applyEffect(SectorEntityToken entity, float days)
RangeBlockerUtil getAuroraBlocker()
float getFlareFadeInMax()
float getFlareSmallShortenFlatModMin()
float getFlareSmallArcMax()
float getFlareSmallFadeInMin()
FlareManager flareManager
float getFlareFadeInMin()
SpriteAPI getAuroraTexture()
float getFlareShortenFlatModMax()
float getMinEffectRadius(Vector2f locFrom)
float getFlareSmallArcMin()
float getFlareExtraLengthFlatMax()
void advance(float amount)
float getFlareSmallFadeInMax()
static final float CR_LOSS_MULT_GLOBAL
int getFlareMinSmallCount()
float getIntensityAtPoint(Vector2f point)
float getFlareSmallFadeOutMax()
float getAuroraThicknessMult(float angle)
float getAuroraThicknessFlat(float angle)
float getAuroraTexPerSegmentMult()
boolean shouldPlayLoopOne()
transient SpriteAPI texture
transient RangeBlockerUtil blocker
void init(String terrainId, SectorEntityToken entity, Object param)
float getFlareExtraLengthMultMax()
Vector2f getAuroraCenterLoc()
float getMaxEffectRadius(Vector2f locFrom)
float getFlareOccurrenceAngle()
boolean shouldPlayLoopTwo()
String getEffectCategory()
float getFlareSkipLargeProbability()
SectorEntityToken getFlareCenterEntity()
float getFlareFadeOutMin()
boolean isTooltipExpandable()
float getFlareSmallExtraLengthMultMax()
float getAuroraShortenMult(float angle)
float getFlareExtraLengthMultMin()
float getOptimalEffectRadius(Vector2f locFrom)
float computeRadiusWithFlare(Flare flare)
Color getAuroraColorForAngle(float angle)
boolean containsPoint(Vector2f point, float radius)
int getFlareMaxSmallCount()
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static Color getNegativeHighlightColor()
static Color setAlpha(Color color, int alpha)
static Color getGrayColor()
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static Color getHighlightColor()
static Color interpolateColor(Color from, Color to, float progress)
static float getAngleInDegreesStrict(Vector2f v)
static float getAngleInDegrees(Vector2f v)
static Vector2f normalise(Vector2f v)
EFFECT_DIMINISHED_WITH_RANGE
Description getDescription(String id, Type type)
SpriteAPI getSprite(String filename)
Color getColor(String id)
LocationAPI getContainingLocation()
void setVelocity(float x, float y)
List< FleetMemberViewAPI > getViews()
FleetDataAPI getFleetData()
MutableFleetStatsAPI getStats()
boolean isInCurrentLocation()
FaderUtil getSharedFader()
List< FleetMemberAPI > getMembersListCopy()
List< CustomCampaignEntityAPI > getCustomEntitiesWithTag(String tag)
CampaignFleetAPI getPlayerFleet()
CampaignClockAPI getClock()
CampaignUIAPI getCampaignUI()
boolean isInCurrentLocation()
boolean hasTag(String tag)
MutableStat getAccelerationMult()