1package com.fs.starfarer.api.impl.campaign;
5import org.lwjgl.util.vector.Vector2f;
7import com.fs.starfarer.api.EveryFrameScript;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.SoundAPI;
10import com.fs.starfarer.api.campaign.CampaignEngineLayers;
11import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.CustomCampaignEntityAPI;
14import com.fs.starfarer.api.campaign.CustomEntitySpecAPI;
15import com.fs.starfarer.api.campaign.SectorEntityToken;
16import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
17import com.fs.starfarer.api.combat.ViewportAPI;
18import com.fs.starfarer.api.graphics.SpriteAPI;
19import com.fs.starfarer.api.impl.campaign.abilities.InterdictionPulseAbility;
20import com.fs.starfarer.api.impl.campaign.enc.EncounterManager;
21import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
22import com.fs.starfarer.api.impl.campaign.ids.Tags;
23import com.fs.starfarer.api.impl.campaign.intel.events.ht.HTPoints;
24import com.fs.starfarer.api.impl.campaign.terrain.HyperspaceTerrainPlugin;
25import com.fs.starfarer.api.util.FaderUtil;
26import com.fs.starfarer.api.util.FlickerUtilV2;
27import com.fs.starfarer.api.util.Misc;
31 public static enum DespawnType {
55 protected float elapsed = 0f;
56 protected String trigger;
57 protected boolean done =
false;
58 protected float triggerDelay;
62 this.trigger = trigger;
65 triggerDelay = 1f + (float) Math.random() * 1f;
68 public boolean isDone() {
71 public boolean runWhilePaused() {
74 public void advance(
float amount) {
96 if (elapsed > triggerDelay) {
100 fleet.
despawn(FleetDespawnReason.DESTROYED_BY_BATTLE, light);
103 plugin.
despawn(DespawnType.FADE_OUT);
112 protected transient SoundAPI sound =
null;
113 protected float elapsed = 0f;
114 public AbyssalLightSoundStopper(
SoundAPI sound) {
117 public boolean isDone() {
118 return sound ==
null;
120 public boolean runWhilePaused() {
123 public void advance(
float amount) {
125 if (sound ==
null)
return;
126 if (!sound.
isPlaying() && elapsed > 1f) {
131 if (Global.getSector().isPaused() && sound !=
null) {
137 public static class AbyssalLightParams {
138 public Color color =
new Color(200,200,255,255);
139 public float frequencyMultMin = 0.5f;
140 public float frequencyMultMax = 1.5f;
141 public float frequencyChangeMult = 1f;
143 public float detectedRange;
144 public float bonusMult;
145 public float durationDays;
146 public int pointsOverride = 0;
148 public AbyssalLightParams() {
151 public AbyssalLightParams(
float minSize,
float maxSize) {
152 frequencyMultMin = 0.5f;
153 frequencyMultMax = 1.5f;
155 float sizeRange = maxSize - minSize;
159 size = minSize + (float) Math.random() * sizeRange;
160 detectedRange = (size * 3f) / HyperspaceTerrainPlugin.ABYSS_SENSOR_RANGE_MULT;
162 bonusMult = size / avgSize;
167 public int getTopographyPoints() {
168 if (pointsOverride > 0)
return pointsOverride;
170 return Math.round(HTPoints.ABYSSAL_LIGHT_MIN +
171 (HTPoints.ABYSSAL_LIGHT_AVG - HTPoints.ABYSSAL_LIGHT_MIN) * bonusMult);
176 transient private SpriteAPI glow;
192 super.init(
entity, pluginParams);
193 params = (AbyssalLightParams) pluginParams;
195 float radiusMult =
params.bonusMult;
196 if (radiusMult > 1f) {
197 radiusMult = 1f + (radiusMult - 1f) * 0.33f;
198 }
else if (radiusMult < 1f) {
199 radiusMult = 1f - (1f - radiusMult) * 0.33f;
224 if (type == DespawnType.EXPAND) dur = 2f;
230 if (level == VisibilityLevel.COMPOSITION_DETAILS || level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS) {
245 if (level == VisibilityLevel.COMPOSITION_DETAILS || level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS) {
247 if (
params.bonusMult < 1f) {
248 volume = 1f - (1f -
params.bonusMult) * 0.6f;
250 if (volume > 1f) volume = 1f;
251 if (volume < 0f) volume = 0f;
253 float pitchMult = 1f;
261 flickerDur = 0.5f + 0.5f * (float) Math.random();
285 (float) Math.random() * (params.frequencyMultMax -
params.frequencyMultMin);
289 Object readResolve() {
309 if (level == VisibilityLevel.COMPOSITION_DETAILS || level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS) {
310 String soundId =
"abyssal_light_despawn_disrupted";
312 soundId =
"abyssal_light_despawn_expired";
325 params.durationDays -= days;
355 if (dist > range)
continue;
361 flickerDur = 0.5f + 0.5f * (float) Math.random();
373 if (fleet.isPlayerFleet()) {
390 if (dist > range)
continue;
396 flickerDur = 0.5f + 0.5f * (float) Math.random();
408 if (fleet.isPlayerFleet()) {
442 float glowAlpha = 0f;
444 if (
phase >= 0.5f) glowAlpha = (1f - (
phase - 0.5f) * 2f);
445 glowAlpha = 0.75f + glowAlpha * 0.25f;
447 if (glowAlpha < 0) glowAlpha = 0;
448 if (glowAlpha > 1) glowAlpha = 1;
471 if (alphaMult <= 0)
return;
480 alphaMult *= fadeOut;
484 if (level == VisibilityLevel.COMPOSITION_DETAILS || level == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS) {
505 if (spec ==
null)
return;
514 glow.setColor(
params.color);
519 float scale = 0.25f + alphaMult * 0.75f;
524 float fringeScale = 1f;
527 glow.setAdditiveBlend();
531 glow.setAlphaMult(alphaMult * glowAlpha * 0.5f);
532 glow.setSize(w * scale * fringeScale, h * scale * fringeScale);
534 glow.renderAtCenter(loc.x, loc.y);
539 float extra = 1f + f * 1.33f;
544 for (
int i = 0; i < 5; i++) {
549 glow.setSize(w * scale, h * scale);
550 glow.setAlphaMult(alphaMult * glowAlpha * 0.67f *
flicker);
551 glow.renderAtCenter(loc.x, loc.y);
562 if (player ==
null) {
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static SectorAPI getSector()
void modifyFlat(String source, float value)
void addSensorBonus(float bonus)
static AbyssalLightBonus get(CampaignFleetAPI fleet)
void addTopographyPoints(int points)
void addBurnBonus(float bonus)
static float getPlayerProximityBasedBrightnessFactor(SectorEntityToken entity)
void updateSoundDelayAndPlaySound(float amount)
static float MIN_DURATION
static float DESPAWN_POOF_THRESHOLD
static float PLAYER_PROXIMITY_MAX_BRIGHTNESS_AT
AbyssalLightParams getParams()
static float getProximityBasedBrightnessFactor(CampaignFleetAPI from, Vector2f loc)
static float getPlayerProximityBasedBrightnessFactor(Vector2f loc)
static float GLOW_FREQUENCY
static float MAX_DURATION
void despawn(DespawnType type)
AbyssalLightParams params
float getFlickerBasedMult()
static float DWELLER_TRIGGER_RANGE
void advance(float amount)
boolean playedDespawnSound
static float SENSOR_BURST_TRIGGER_RANGE
float abilityResponseFlickerTimeout
static float PLAYER_PROXIMITY_MIN_BRIGHTNESS_AT
static float PLAYER_PROXIMITY_MIN_BRIGHTNESS
void init(SectorEntityToken entity, Object pluginParams)
void updateFrequency(float amount)
void render(CampaignEngineLayers layer, ViewportAPI viewport)
float getDespawnProgress()
float untilFrequencyChange
static float getRange(CampaignFleetAPI fleet)
TimeoutTracker< String > getCreatorTimeout()
static EncounterManager getInstance()
static final String GLOBAL_INTERDICTION_PULSE_JUST_USED_IN_CURRENT_LOCATION
static final String GLOBAL_SENSOR_BURST_JUST_USED_IN_CURRENT_LOCATION
static final String JUST_DID_INTERDICTION_PULSE
static final String EXTRA_SENSOR_INDICATORS
static final String JUST_DID_SENSOR_BURST
void advance(float amount)
void advance(float amount)
static final Vector2f ZERO
static void fadeAndExpire(SectorEntityToken entity)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float getDays(float amount)
static float getAbyssalDepth(Vector2f loc)
static boolean showRuleDialog(SectorEntityToken entity, String initialTrigger)
SpriteAPI getSprite(String filename)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
LocationAPI getContainingLocation()
boolean isShowingDialog()
List< CampaignFleetAPI > getFleets()
CampaignFleetAPI getPlayerFleet()
void addScript(EveryFrameScript script)
CampaignUIAPI getCampaignUI()
MemoryAPI getMemoryWithoutUpdate()
LocationAPI getContainingLocation()
StatBonus getDetectedRangeMod()
CustomCampaignEntityPlugin getCustomPlugin()
boolean isInCurrentLocation()
void setDetectionRangeDetailsOverrideMult(Float detectionRangeDetailsOverrideMult)
void setExtendedDetectedAtRange(Float extendedDetectedAtRange)
void setSensorProfile(Float sensorProfile)
float getSensorFaderBrightness()
void setDiscoverable(Boolean discoverable)
VisibilityLevel getVisibilityLevelToPlayerFleet()
boolean hasTag(String tag)
MemoryAPI getMemoryWithoutUpdate()
CustomEntitySpecAPI getCustomEntitySpec()
void set(String key, Object value)
boolean getBoolean(String key)