Starsector API
Loading...
Searching...
No Matches
TachyonLanceEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat;
2
3import org.lwjgl.util.vector.Vector2f;
4
5import com.fs.starfarer.api.combat.BeamAPI;
6import com.fs.starfarer.api.combat.BeamEffectPlugin;
7import com.fs.starfarer.api.combat.CombatEngineAPI;
8import com.fs.starfarer.api.combat.CombatEntityAPI;
9import com.fs.starfarer.api.combat.DamageType;
10import com.fs.starfarer.api.combat.ShipAPI;
11import com.fs.starfarer.api.impl.campaign.ids.Stats;
12import com.fs.starfarer.api.util.IntervalUtil;
13
14public class TachyonLanceEffect implements BeamEffectPlugin {
15
16 private IntervalUtil fireInterval = new IntervalUtil(0.2f, 0.3f);
17 private boolean wasZero = true;
18
19 public void advance(float amount, CombatEngineAPI engine, BeamAPI beam) {
20 CombatEntityAPI target = beam.getDamageTarget();
21 if (target instanceof ShipAPI && beam.getBrightness() >= 1f) {
22 float dur = beam.getDamage().getDpsDuration();
23 // needed because when the ship is in fast-time, dpsDuration will not be reset every frame as it should be
24 if (!wasZero) dur = 0;
25 wasZero = beam.getDamage().getDpsDuration() <= 0;
26 fireInterval.advance(dur);
27 if (fireInterval.intervalElapsed()) {
28 ShipAPI ship = (ShipAPI) target;
29 boolean hitShield = target.getShield() != null && target.getShield().isWithinArc(beam.getTo());
30 float pierceChance = ((ShipAPI)target).getHardFluxLevel() - 0.1f;
31 pierceChance *= ship.getMutableStats().getDynamic().getValue(Stats.SHIELD_PIERCED_MULT);
32
33 boolean piercedShield = hitShield && (float) Math.random() < pierceChance;
34 //piercedShield = true;
35
36 if (!hitShield || piercedShield) {
37 Vector2f point = beam.getRayEndPrevFrame();
38 float emp = beam.getDamage().getFluxComponent() * 0.5f;
39 float dam = beam.getDamage().getDamage() * 0.25f;
40 engine.spawnEmpArcPierceShields(
41 beam.getSource(), point, beam.getDamageTarget(), beam.getDamageTarget(),
42 DamageType.ENERGY,
43 dam, // damage
44 emp, // emp
45 100000f, // max range
46 "tachyon_lance_emp_impact",
47 beam.getWidth() + 5f,
48 beam.getFringeColor(),
49 beam.getCoreColor()
50 );
51 }
52 }
53 }
54// Global.getSoundPlayer().playLoop("system_emp_emitter_loop",
55// beam.getDamageTarget(), 1.5f, beam.getBrightness() * 0.5f,
56// beam.getTo(), new Vector2f());
57 }
58}
void advance(float amount, CombatEngineAPI engine, BeamAPI beam)