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}