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