Starsector API
Loading...
Searching...
No Matches
AbyssalGlareEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.dweller;
2
3import java.awt.Color;
4
5import org.lwjgl.util.vector.Vector2f;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.combat.BeamAPI;
9import com.fs.starfarer.api.combat.BeamEffectPlugin;
10import com.fs.starfarer.api.combat.CollisionClass;
11import com.fs.starfarer.api.combat.CombatEngineAPI;
12import com.fs.starfarer.api.combat.DamageType;
13import com.fs.starfarer.api.combat.DamagingProjectileAPI;
14import com.fs.starfarer.api.combat.EmpArcEntityAPI;
15import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams;
16import com.fs.starfarer.api.combat.ShipAPI;
17import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual.NEParams;
18import com.fs.starfarer.api.impl.combat.RiftCascadeMineExplosion;
19import com.fs.starfarer.api.loading.DamagingExplosionSpec;
20import com.fs.starfarer.api.util.IntervalUtil;
21import com.fs.starfarer.api.util.Misc;
22
23public class AbyssalGlareEffect implements BeamEffectPlugin {
24
25 public static float RIFT_DAMAGE = 200f; // happens approximately every 1.25 seconds; ~160 dps per beam
26 public static float DAMAGE_MULT_NORMAL_WEAPON = 0.5f;
27
28 protected IntervalUtil fireInterval = new IntervalUtil(0.2f, 0.3f);
29 protected boolean hadDamageTargetPrev = false;
30 protected boolean lengthChangedPrev = false;
31 protected float sinceRiftSpawn = 0f;
32 protected Vector2f prevTo = null;
33 protected Vector2f prevFrom = null;
34
38
39 public void advance(float amount, CombatEngineAPI engine, BeamAPI beam) {
40 //if (true) return;
41
42 if (beam.getSource() == null || beam.getWeapon() == null) return;
43
44 boolean normalWeaponMode = !beam.getSource().hasTag(DarkenedGazeSystemScript.DARKENED_GAZE_SYSTEM_TAG);
45 //normalWeaponMode = true;
47 if (normalWeaponMode) primary = true;
48
49 sinceRiftSpawn += amount;
50
51 float maxRange = beam.getWeapon().getRange();
52 Vector2f from = beam.getFrom();
53 Vector2f to = beam.getRayEndPrevFrame();
54 Vector2f to2 = beam.getTo();
55 float dist = Misc.getDistance(from, to);
56 float dist2 = Misc.getDistance(from, to2);
57 if (dist2 < dist) {
58 to = to2;
59 dist = dist2;
60 }
61
62// if (beam.getDamageTarget() instanceof ShipAPI) {
63// ((ShipAPI)beam.getDamageTarget()).setSkipNextDamagedExplosion(true);
64// }
65
66 boolean hasDamageTarget = beam.getDamageTarget() != null;
67 boolean lengthChanged = prevTo == null ||
68 Math.abs(Misc.getDistance(prevFrom, prevTo) - Misc.getDistance(from, to)) > 2f;
69
70 boolean forceRiftSpawn = (hasDamageTarget && !hadDamageTargetPrev) ||
71 (!lengthChanged && lengthChangedPrev);
72 if (!primary) forceRiftSpawn = false;
73
74 lengthChangedPrev = lengthChanged;
75 hadDamageTargetPrev = hasDamageTarget;
76 prevFrom = new Vector2f(from);
77 prevTo = new Vector2f(to);
78
79// forceRiftSpawn = false;
80// if (forceRiftSpawn) {
81// System.out.println("efwfwefwe");
82// }
83 fireInterval.advance(amount);
84 if (fireInterval.intervalElapsed() || forceRiftSpawn) {
85
86 if (beam.getDamageTarget() == null && dist < maxRange * 0.9f) {
87 return;
88 }
89 if (beam.getBrightness() < 1) {
90 return;
91 }
92
93
95
96 boolean spawnedExplosion = false;
97 float maxTimeWithoutExplosion = 1f;
98 if (normalWeaponMode) {
99 maxTimeWithoutExplosion = 0.5f;
100 }
101 if ((float) Math.random() > 0.8f || forceRiftSpawn || (primary && sinceRiftSpawn > maxTimeWithoutExplosion)) {
103 createExplosionSpec(normalWeaponMode ? DAMAGE_MULT_NORMAL_WEAPON : 1f),
104 beam.getSource(), to);
105 //explosion.addDamagedAlready(target);
106 //color = new Color(255,75,75,255);
107
108 float distFactor = 0f;
109 if (dist > 500f) {
110 distFactor = (dist - 500f) / 1500f;
111 if (distFactor < 0f) distFactor = 0f;
112 if (distFactor > 1f) distFactor = 1f;
113 }
114
115 float sizeAdd = 5f * distFactor;
116 float baseSize = 15f;
117 if (normalWeaponMode) {
118 baseSize *= 0.5f;
119 sizeAdd = 0f; // beam is not getting wider at end, so don't increase explosion size
120 }
121
123 color, baseSize + sizeAdd);
124 //p.hitGlowSizeMult = 0.5f;
125 p.noiseMult = 6f;
126 p.thickness = 25f;
127 p.fadeOut = 0.5f;
128 p.spawnHitGlowAt = 1f;
129 p.additiveBlend = true;
130 p.blackColor = Color.white;
131 p.underglow = null;
132 p.withNegativeParticles = false;
133 p.withHitGlow = false;
134 p.fadeIn = 0f;
135 //p.numRiftsToSpawn = 1;
136
138
139 spawnedExplosion = true;
140 sinceRiftSpawn = 0f;
141 }
142
143 if (dist > 100f && ((float) Math.random() > 0.5f || (normalWeaponMode && spawnedExplosion))) {
144 //if (dist > 100f && spawnedExplosion) {
145 EmpArcParams params = new EmpArcParams();
146 params.segmentLengthMult = 8f;
147 params.zigZagReductionFactor = 0.15f;
148 params.fadeOutDist = 50f;
149 params.minFadeOutMult = 10f;
150 // params.flickerRateMult = 0.7f;
151 params.flickerRateMult = 0.3f;
152 // params.flickerRateMult = 0.05f;
153 // params.glowSizeMult = 3f;
154
155 float fraction = Math.min(0.33f, 300f / dist);
156 params.brightSpotFullFraction = fraction;
157 params.brightSpotFadeFraction = fraction;
158
160 params.movementDurOverride = Math.max(0.05f, dist / arcSpeed);
161
162 ShipAPI ship = beam.getSource();
163 //Color color = weapon.getSpec().getGlowColor();
164 EmpArcEntityAPI arc = (EmpArcEntityAPI)engine.spawnEmpArcVisual(from, ship, to, ship,
165 80f, // thickness
166 color,
167 new Color(255,255,255,255),
168 params
169 );
170 arc.setCoreWidthOverride(40f);
171
172 arc.setRenderGlowAtStart(false);
173 arc.setFadedOutAtStart(true);
174 arc.setSingleFlickerMode(true);
175
176 Vector2f pt = Vector2f.add(from, to, new Vector2f());
177 pt.scale(0.5f);
178
179 Global.getSoundPlayer().playSound("abyssal_glare_lightning", 1f, 1f, pt, new Vector2f());
180 }
181
182 }
183
184 if (normalWeaponMode) {
185 Vector2f pt = Vector2f.add(from, to, new Vector2f());
186 pt.scale(0.5f);
187 Global.getSoundPlayer().playLoop("abyssal_glare_loop",
188 beam.getSource(), 1f, beam.getBrightness(),
189 pt, beam.getSource().getVelocity());
190 } else if (primary) {
191 Vector2f pt = Vector2f.add(from, to, new Vector2f());
192 pt.scale(0.5f);
193 Global.getSoundPlayer().playLoop("darkened_gaze_loop",
194 beam.getSource(), 1f, beam.getBrightness(),
195 pt, beam.getSource().getVelocity());
196 }
197 }
198
199
200
202 float damage = RIFT_DAMAGE * damageMult;
204 0.1f, // duration
205 75f, // radius
206 50f, // coreRadius
207 damage, // maxDamage
208 damage / 2f, // minDamage
209 CollisionClass.PROJECTILE_FF, // collisionClass
210 CollisionClass.PROJECTILE_FIGHTER, // collisionClassByFighter
211 3f, // particleSizeMin
212 3f, // particleSizeRange
213 0.5f, // particleDuration
214 0, // particleCount
215 new Color(255,255,255,0), // particleColor
216 new Color(255,100,100,0) // explosionColor
217 );
218
220 spec.setUseDetailedExplosion(false);
221 spec.setSoundSetId("abyssal_glare_explosion");
222 spec.setSoundVolume(damageMult);
223 return spec;
224 }
225
226}
227
228
static SoundPlayerAPI getSoundPlayer()
Definition Global.java:49
static void spawnStandardRift(DamagingProjectileAPI explosion, NEParams params)
static NEParams createStandardRiftParams(String minelayerId, float baseRadius)
void advance(float amount, CombatEngineAPI engine, BeamAPI beam)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:599
void playLoop(String id, Object playingEntity, float pitch, float volume, Vector2f loc, Vector2f vel)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
EmpArcEntityAPI spawnEmpArcVisual(Vector2f from, CombatEntityAPI fromAnchor, Vector2f to, CombatEntityAPI toAnchor, float thickness, Color fringe, Color core)
DamagingProjectileAPI spawnDamagingExplosion(DamagingExplosionSpec spec, ShipAPI source, Vector2f location)
void setFadedOutAtStart(boolean fadedOutAtStart)
void setRenderGlowAtStart(boolean renderGlowAtStart)
void setCoreWidthOverride(float coreWidthOverride)