001package com.fs.starfarer.api.impl.combat; 002 003import org.lwjgl.util.vector.Vector2f; 004 005import com.fs.starfarer.api.combat.BeamAPI; 006import com.fs.starfarer.api.combat.BeamEffectPlugin; 007import com.fs.starfarer.api.combat.CombatEngineAPI; 008import com.fs.starfarer.api.combat.CombatEntityAPI; 009import com.fs.starfarer.api.combat.DamageType; 010import com.fs.starfarer.api.combat.ShipAPI; 011import com.fs.starfarer.api.impl.campaign.ids.Stats; 012import com.fs.starfarer.api.util.IntervalUtil; 013 014public class TachyonLanceEffect implements BeamEffectPlugin { 015 016 private IntervalUtil fireInterval = new IntervalUtil(0.2f, 0.3f); 017 private boolean wasZero = true; 018 019 public void advance(float amount, CombatEngineAPI engine, BeamAPI beam) { 020 CombatEntityAPI target = beam.getDamageTarget(); 021 if (target instanceof ShipAPI && beam.getBrightness() >= 1f) { 022 float dur = beam.getDamage().getDpsDuration(); 023 // needed because when the ship is in fast-time, dpsDuration will not be reset every frame as it should be 024 if (!wasZero) dur = 0; 025 wasZero = beam.getDamage().getDpsDuration() <= 0; 026 fireInterval.advance(dur); 027 if (fireInterval.intervalElapsed()) { 028 ShipAPI ship = (ShipAPI) target; 029 boolean hitShield = target.getShield() != null && target.getShield().isWithinArc(beam.getRayEndPrevFrame()); 030 float pierceChance = ((ShipAPI)target).getHardFluxLevel() - 0.1f; 031 pierceChance *= ship.getMutableStats().getDynamic().getValue(Stats.SHIELD_PIERCED_MULT); 032 033 boolean piercedShield = hitShield && (float) Math.random() < pierceChance; 034 //piercedShield = true; 035 036 if (!hitShield || piercedShield) { 037 Vector2f point = beam.getRayEndPrevFrame(); 038 float emp = beam.getDamage().getFluxComponent() * 0.5f; 039 float dam = beam.getDamage().getDamage() * 0.25f; 040 engine.spawnEmpArcPierceShields( 041 beam.getSource(), point, beam.getDamageTarget(), beam.getDamageTarget(), 042 DamageType.ENERGY, 043 dam, // damage 044 emp, // emp 045 100000f, // max range 046 "tachyon_lance_emp_impact", 047 beam.getWidth() + 5f, 048 beam.getFringeColor(), 049 beam.getCoreColor() 050 ); 051 } 052 } 053 } 054// Global.getSoundPlayer().playLoop("system_emp_emitter_loop", 055// beam.getDamageTarget(), 1.5f, beam.getBrightness() * 0.5f, 056// beam.getTo(), new Vector2f()); 057 } 058}