1package com.fs.starfarer.api.impl.campaign.terrain;
4import java.util.EnumSet;
6import org.lwjgl.util.vector.Vector2f;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.CampaignEngineLayers;
10import com.fs.starfarer.api.campaign.CampaignFleetAPI;
11import com.fs.starfarer.api.campaign.PlanetAPI;
12import com.fs.starfarer.api.campaign.SectorEntityToken;
13import com.fs.starfarer.api.campaign.TerrainAIFlags;
14import com.fs.starfarer.api.combat.ViewportAPI;
15import com.fs.starfarer.api.fleet.FleetMemberAPI;
16import com.fs.starfarer.api.fleet.FleetMemberViewAPI;
17import com.fs.starfarer.api.graphics.SpriteAPI;
18import com.fs.starfarer.api.impl.campaign.ids.Stats;
19import com.fs.starfarer.api.impl.campaign.terrain.PulsarRenderer.PulsarRendererDelegate;
20import com.fs.starfarer.api.impl.campaign.terrain.StarCoronaTerrainPlugin.CoronaParams;
21import com.fs.starfarer.api.loading.Description.Type;
22import com.fs.starfarer.api.ui.Alignment;
23import com.fs.starfarer.api.ui.TooltipMakerAPI;
24import com.fs.starfarer.api.util.Misc;
29 public static float PULSAR_ARC = 1f / ((float) Math.PI * 2f) * 360f;
33 transient Color color =
null;
44 params = (CoronaParams) param;
72 Object writeReplace() {
109 super.advance(amount);
131 if (amount > 0 &&
blocker !=
null) {
168 float length = distFar - distClose;
169 float incr = (float) Math.ceil((distFar - distClose) / 2000f);
171 for (
float dist = wClose; dist < distFar; dist += incr) {
176 float testDist = wClose + (wFar - wClose) * (dist - distClose) / length;
197 if (dist > max)
return false;
208 return super.containsPoint(point, radius);
219 if (intensity <= 0)
return;
222 float buffDur = 0.1f;
226 float recoveryRate = member.getStats().getBaseCRRecoveryRatePercentPerDay().getModifiedValue();
227 float lossRate = member.getStats().getBaseCRRecoveryRatePercentPerDay().getBaseValue();
234 float loss = (-1f * recoveryRate + -1f * lossRate * adjustedLossMult) * days * 0.01f;
235 float curr = member.getRepairTracker().getBaseCR();
236 if (loss > curr) loss = curr;
238 if (resistance > 0) {
239 member.getRepairTracker().applyCREvent(loss,
"corona",
"Pulsar beam effect");
242 float peakFraction = 1f / Math.max(1.3333f, 1f +
params.crLossMult * intensity);
243 float peakLost = 1f - peakFraction;
244 peakLost *= resistance;
246 float degradationMult = 1f + (params.crLossMult * intensity * resistance) / 2f;
248 member.getBuffManager().addBuffOnlyUpdateStat(
new PeakPerformanceBuff(buffId +
"_1", 1f - peakLost, buffDur));
249 member.getBuffManager().addBuffOnlyUpdateStat(
new CRLossPerSecondBuff(buffId +
"_2", degradationMult, buffDur));
256 float maxWindBurn =
params.windBurnLevel;
259 float currWindBurn = intensity * maxWindBurn;
260 float maxFleetBurnIntoWind = maxFleetBurn - Math.abs(currWindBurn);
264 if (currWindBurn < 0) {
269 velDir.scale(currFleetBurn);
271 float fleetBurnAgainstWind = -1f * Vector2f.dot(windDir, velDir);
273 float accelMult = 0.5f;
274 if (fleetBurnAgainstWind > maxFleetBurnIntoWind) {
275 accelMult += 0.75f + 0.25f * (fleetBurnAgainstWind - maxFleetBurnIntoWind);
282 fleet.
setVelocity(vel.x + windDir.x, vel.y + windDir.y);
289 int alpha = glowColor.getAlpha();
298 float sizeNormal = 10f + 25f * intensity;
300 view.getWindEffectDirX().shift(
getModId(), windDir.x * sizeNormal, durIn, durOut, 1f);
301 view.getWindEffectDirY().shift(
getModId(), windDir.y * sizeNormal, durIn, durOut, 1f);
302 view.getWindEffectColor().shift(
getModId(), glowColor, durIn, durOut, intensity);
310 float maxDist =
params.bandWidthInEngine;
314 if (dist > maxDist)
return 0f;
316 float intensity = 1f;
317 if (minDist < maxDist) {
318 intensity = 1f - (dist - minDist) / (maxDist - minDist);
320 if (intensity < 0) intensity = 0;
321 if (intensity > 1) intensity = 1;
328 if (diff > maxDiff) diff = maxDiff;
330 if (diff > maxDiff * 0.5f) {
331 intensity *= 0.25f + 0.75f * (1f - (diff - maxDiff * 0.5f) / (maxDiff * 0.5f));
342 Color base = super.getNameColor();
367 tooltip.
addPara(
"Reduces the combat readiness of " +
368 "all ships caught in the pulsar beam at a rapid pace, and blows the fleet off-course.", nextPad);
369 tooltip.
addPara(
"The magnitude of the effect drops off rapidly with distance from the source.", pad);
373 tooltip.
addPara(
"Reduces the peak performance time of ships and increases the rate of combat readiness degradation in protracted engagements.", small);
388 return super.getTerrainName();
404 return flag == TerrainAIFlags.CR_DRAIN ||
405 flag == TerrainAIFlags.BREAK_OTHER_ORBITS ||
411 float maxDist =
params.bandWidthInEngine;
438 Color c = Color.white;
459 return params.middleRadius + params.bandWidthInEngine * 0.5f;
static SettingsAPI getSettings()
static SectorAPI getSector()
static final String CORONA_EFFECT_MULT
boolean containsEntity(SectorEntityToken other)
boolean hasAIFlag(Object flag)
float getIntensityAtPoint(Vector2f point)
boolean canPlayerHoldStationIn()
float getPulsarOuterWidth()
String getEffectCategory()
float getPulsarScrollSpeed()
void render(CampaignEngineLayers layer, ViewportAPI viewport)
float getMinEffectRadius(Vector2f locFrom)
void advance(float amount)
float getPulsarInnerWidth()
transient RangeBlockerUtil blocker
transient PulsarRenderer flare1
boolean hasAIFlag(Object flag, CampaignFleetAPI fleet)
float getMaxEffectRadius(Vector2f locFrom)
transient SpriteAPI flareTexture
void applyEffect(SectorEntityToken entity, float days)
boolean containsPoint(Vector2f point, float radius)
float getOptimalEffectRadius(Vector2f locFrom)
float getExtraSoundRadius()
void createTooltip(TooltipMakerAPI tooltip, boolean expanded)
boolean shouldPlayLoopOne()
RangeBlockerUtil getPulsarBlocker()
Color getPulsarColorForAngle(float angle)
float getPulsarInnerRadius()
transient PulsarRenderer flare2
Vector2f getPulsarCenterLoc()
String getNameForTooltip()
void init(String terrainId, SectorEntityToken entity, Object param)
float getPulsarOuterRadius()
SpriteAPI getPulsarTexture()
boolean isTooltipExpandable()
EnumSet< CampaignEngineLayers > getActiveLayers()
boolean isNearViewport(float angle, ViewportAPI viewport)
void render(float alphaMult)
void setCurrAngle(float currAngle)
void advance(float amount)
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)
static final float CR_LOSS_MULT_GLOBAL
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static Color getNegativeHighlightColor()
static Color setAlpha(Color color, int alpha)
static Color getGrayColor()
static float getAngleDiff(float from, float to)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static Color getHighlightColor()
static float normalizeAngle(float angleDeg)
static Color interpolateColor(Color from, Color to, float progress)
static float getAngleInDegreesStrict(Vector2f v)
static boolean isInArc(float direction, float arc, Vector2f from, Vector2f to)
static Vector2f normalise(Vector2f v)
EFFECT_DIMINISHED_WITH_RANGE
Description getDescription(String id, Type type)
SpriteAPI getSprite(String filename)
Color getColor(String id)
float convertToDays(float realSeconds)
void setVelocity(float x, float y)
List< FleetMemberViewAPI > getViews()
FleetDataAPI getFleetData()
FaderUtil getSharedFader()
List< FleetMemberAPI > getMembersListCopy()
CampaignFleetAPI getPlayerFleet()
CampaignClockAPI getClock()
CampaignUIAPI getCampaignUI()
boolean isNearViewport(Vector2f loc, float nearDistance)