Starsector API
Loading...
Searching...
No Matches
DevouringSwarmMissileEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.threat;
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.CombatEngineAPI;
9import com.fs.starfarer.api.combat.CombatEntityAPI;
10import com.fs.starfarer.api.combat.DamageAPI;
11import com.fs.starfarer.api.combat.DamagingProjectileAPI;
12import com.fs.starfarer.api.combat.MissileAPI;
13import com.fs.starfarer.api.combat.OnHitEffectPlugin;
14import com.fs.starfarer.api.combat.ShipAPI;
15import com.fs.starfarer.api.combat.WeaponAPI;
16import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
17import com.fs.starfarer.api.combat.listeners.DamageDealtModifier;
18import com.fs.starfarer.api.impl.combat.DisintegratorEffect;
19import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.RoilingSwarmParams;
20import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
21import com.fs.starfarer.api.util.Misc;
22
24
25 public static String DISMANTLING_SWARM = "dismantling_swarm";
26
27 public static int NUM_TICKS = 11; // about 10 seconds (duration of damage over time effect)
28
29 public static class DismantlingFragmentBaseDamageNegator implements DamageDealtModifier {
30 @Override
31 public String modifyDamageDealt(Object param, CombatEntityAPI target, DamageAPI damage, Vector2f point,
32 boolean shieldHit) {
33 if (shieldHit) {
34 return null;
35 }
36 if (param instanceof MissileAPI) {
39 if (swarm != null && swarm.params.tags.contains(DISMANTLING_SWARM)) {
41 return DISMANTLING_SWARM;
42 }
43 }
44 return null;
45 }
46 }
47
48
49
51 super.onFire(projectile, weapon, engine);
52 if (weapon.getShip() != null &&
53 !weapon.getShip().hasListenerOfClass(DismantlingFragmentBaseDamageNegator.class)) {
54 weapon.getShip().addListener(new DismantlingFragmentBaseDamageNegator());
55 }
56 }
57
58 protected void configureMissileSwarmParams(RoilingSwarmParams params) {
59// params.flashFringeColor = new Color(183,65,13,255);
60// params.flashCoreColor = Color.white;
61// params.flashRadius = 40f;
62// params.flashCoreRadiusMult = 0.75f;
63
64 params.tags.add(DISMANTLING_SWARM);
65
66// params.flashFringeColor = new Color(183,65,13,80);
67// params.flashCoreColor = new Color(183,65,13,127);
68 params.flashFringeColor = new Color(130,165,50,50);
69 params.flashCoreColor = new Color(130,165,50,127);
70 //params.flashCoreColor = new Color(50,165,50,127);
71
72// params.flashFringeColor = new Color(100,165,100,127);
73// params.flashCoreColor = Color.white;
74
75
76 //params.flashCoreColor = new Color(183,65,13,127);
77 params.flashCoreRadiusMult = 0f;
78 params.renderFlashOnSameLayer = true;
79 params.flashRadius = 40f;
80 params.preFlashDelay = 0.5f * (float) Math.random();
81
82 params.flashFrequency = 40f;
83 params.flashProbability = 1f;
84 }
85
87 return 5;
88 //return 0;
89 }
90
91 @Override
92 protected int getNumOtherMembersToAdd() {
93 return 0;
94 //return 5;
95 }
96
97 protected int getEMPResistance() {
98 return 1;
99 }
100
101 protected boolean explodeOnFizzling() {
102 return false;
103 }
104
105 @Override
106 protected FragmentBehaviorOnImpact getOtherFragmentBehaviorOnImpact() {
107 return FragmentBehaviorOnImpact.STOP_AND_FADE;
108 }
109
110 protected void reportFragmentHit(MissileAPI missile, SwarmMember p, RoilingSwarmEffect swarm, CombatEntityAPI target) {
112 Color color = swarm.params.flashFringeColor;
113 color = Misc.setAlpha(color, 255);
114 float size = swarm.params.flashRadius * 2f;
115 engine.addHitParticle(p.loc, new Vector2f(), size, 0.5f, color);
116 engine.addHitParticle(p.loc, new Vector2f(), size * 0.25f, 1f, Color.white);
117 }
118
119 @Override
120 public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit,
122 if (shieldHit) return;
123 if (projectile.getDamageAmount() <= 0f) return;
124 //if (projectile.isFading()) return;
125 if (!(target instanceof ShipAPI)) return;
126
127 ShipAPI source = projectile.getSource();
129
130 Vector2f offset = Vector2f.sub(point, target.getLocation(), new Vector2f());
131 offset = Misc.rotateAroundOrigin(offset, -target.getFacing());
132 DisintegratorEffect effect = new DisintegratorEffect(projectile, (ShipAPI) target, offset) {
133 protected float getTotalDamage() {
135 }
136 protected int getNumTicks() {
137 return NUM_TICKS;
138 }
139 protected boolean canDamageHull() {
140 return true;
141 }
142 protected int getNumParticlesPerTick() {
143 return 5;
144 }
145 protected String getSoundLoopId() {
146 return "devouring_swarm_loop";
147 }
148 protected void addParticle() {
149 ParticleData p = new ParticleData(25f, 3f + (float) Math.random() * 2f, 1f);
150 p.color = new Color(125,100,200,25);
151// p.color = RiftLanceEffect.getColorForDarkening(VoltaicDischargeOnFireEffect.EMP_FRINGE_COLOR);
152// p.color = Misc.setAlpha(p.color, 25);
153 particles.add(p);
154 p.offset = Misc.getPointWithinRadius(p.offset, 10f);
155 }
156 protected void damageDealt(Vector2f loc, float hullDamage, float armorDamage) {
157 if (sourceSwarm == null || source == null || !source.isAlive()) return;
158 if (source.isFighter()) return;
159
160 if ((float) Math.random() < 0.25f) return;
161 if (hullDamage > 0 || armorDamage > 0) {
162 SwarmMember p = sourceSwarm.addMember();
163 p.loc.set(loc);
164 p.fader.setDurationIn(0.3f);
165 }
166 }
167 };
170
171 if (projectile instanceof MissileAPI) {
173 missile.setDidDamage(true);
174 Global.getSoundPlayer().playSound("devouring_swarm_hit_ship", 1f, 1f, point,
176 }
177 }
178
179 protected boolean withEMPArc() {
180 return super.withEMPArc();
181 }
182
183 protected Color getEMPFringeColor() {
184 Color c = weapon.getSpec().getGlowColor();
185 c = Misc.scaleColorOnly(c, 0.5f);
186 return c;
187 //return super.getEMPFringeColor();
188 }
189
190 protected Color getEMPCoreColor() {
191 Color c = Color.white;
192 c = Misc.scaleColorOnly(c, 0.5f);
193 return c;
194 //return super.getEMPCoreColor();
195 }
196
197// protected String getExplosionSoundId() {
198// return "devastator_explosion";
199// }
200
201}
202
203
204
205
206
207
208
209
static SoundPlayerAPI getSoundPlayer()
Definition Global.java:49
static CombatEngineAPI getCombatEngine()
Definition Global.java:69
void modifyMult(String source, float value)
void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine)
void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
void reportFragmentHit(MissileAPI missile, SwarmMember p, RoilingSwarmEffect swarm, CombatEntityAPI target)
static RoilingSwarmEffect getSwarmFor(CombatEntityAPI entity)
void setDurationIn(float durationIn)
static Color setAlpha(Color color, int alpha)
Definition Misc.java:1316
static Vector2f rotateAroundOrigin(Vector2f v, float angle)
Definition Misc.java:1205
static Color scaleColorOnly(Color color, float factor)
Definition Misc.java:1302
static Vector2f getPointWithinRadius(Vector2f from, float r)
Definition Misc.java:711
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
void addHitParticle(Vector2f loc, Vector2f vel, float size, float brightness, float duration, Color color)
CombatEntityAPI addLayeredRenderingPlugin(CombatLayeredRenderingPlugin plugin)
void setDidDamage(boolean didDamage)
void addListener(Object listener)
boolean hasListenerOfClass(Class<?> c)