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.getRayEndPrevFrame());
30 float pierceChance = ((ShipAPI)target).getHardFluxLevel() - 0.1f;
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;
41 beam.getSource(), point, beam.getDamageTarget(), beam.getDamageTarget(),
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)
EmpArcEntityAPI spawnEmpArcPierceShields(ShipAPI damageSource, Vector2f point, CombatEntityAPI pointAnchor, CombatEntityAPI empTargetEntity, DamageType damageType, float damAmount, float empDamAmount, float maxRange, String impactSoundId, float thickness, Color fringe, Color core)
boolean isWithinArc(Vector2f point)
MutableShipStatsAPI getMutableStats()