001package com.fs.starfarer.api.impl.combat.threat;
002
003import java.awt.Color;
004
005import org.lwjgl.util.vector.Vector2f;
006
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.DamagingProjectileAPI;
011import com.fs.starfarer.api.combat.EmpArcEntityAPI;
012import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams;
013import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin;
014import com.fs.starfarer.api.combat.OnFireEffectPlugin;
015import com.fs.starfarer.api.combat.OnHitEffectPlugin;
016import com.fs.starfarer.api.combat.ShipAPI;
017import com.fs.starfarer.api.combat.WeaponAPI;
018import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
019import com.fs.starfarer.api.impl.campaign.ids.Stats;
020import com.fs.starfarer.api.util.Misc;
021
022public class VoltaicCannonEffect implements OnHitEffectPlugin, OnFireEffectPlugin, EveryFrameWeaponEffectPlugin {
023
024        public int MIN_NUM_ARCS = 10;
025        public int MAX_NUM_ARCS = 14;
026        
027        @Override
028        public void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon) {
029                
030        }
031        
032        @Override
033        public void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine) {
034                
035        }
036        
037        public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target,
038                                          Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine) {
039                int numArcs = MIN_NUM_ARCS + Misc.random.nextInt(MAX_NUM_ARCS - MIN_NUM_ARCS + 1);
040                float pierceChance = 0f;
041                if (target instanceof ShipAPI) {
042                        pierceChance = ((ShipAPI)target).getHardFluxLevel() - 0.1f;
043                        pierceChance *= ((ShipAPI)target).getMutableStats().getDynamic().getValue(Stats.SHIELD_PIERCED_MULT);
044                }
045                
046                float emp = projectile.getEmpAmount();
047                float dam = 0;
048                
049                EmpArcParams params = new EmpArcParams();
050                params.segmentLengthMult = 8f;
051                params.zigZagReductionFactor = 0.5f;
052                params.flickerRateMult = 1f;
053                params.fadeOutDist = 1000f;
054                params.minFadeOutMult = 1f;
055                params.glowSizeMult = 0.5f;
056                params.glowAlphaMult = 0.75f;
057                
058                for (int i = 0; i < numArcs; i++) {
059                        boolean piercedShield = shieldHit && (float) Math.random() < pierceChance;
060                        //piercedShield = true;
061                        
062                        if (!shieldHit || piercedShield) {
063                                EmpArcEntityAPI arc = engine.spawnEmpArcPierceShields(
064                                                                   projectile.getSource(), point, target, target,
065                                                                   DamageType.ENERGY, 
066                                                                   dam, // damage
067                                                                   emp, // emp 
068                                                                   100000f, // max range 
069                                                                   "voltaic_discharge_emp_impact",
070                                                                   20f,
071                                                                   projectile.getProjectileSpec().getFringeColor(),
072                                                                   Color.white,
073                                                                   params);
074                                arc.setRenderGlowAtStart(false);
075                                //arc.setFadedOutAtStart(true);
076                        }
077                }
078        }
079        
080}
081
082
083
084
085
086
087