001package com.fs.starfarer.api.impl.combat.threat; 002 003import java.util.List; 004 005import java.awt.Color; 006 007import com.fs.starfarer.api.Global; 008import com.fs.starfarer.api.combat.BaseEveryFrameCombatPlugin; 009import com.fs.starfarer.api.combat.CombatEngineAPI; 010import com.fs.starfarer.api.combat.ShipAPI; 011import com.fs.starfarer.api.combat.WeaponAPI; 012import com.fs.starfarer.api.impl.campaign.ids.Tags; 013import com.fs.starfarer.api.input.InputEventAPI; 014import com.fs.starfarer.api.util.Misc; 015 016public class AttackSwarmPhaseModeScript extends BaseEveryFrameCombatPlugin { 017 018 public static float DURATION = 20f; 019 020 021 protected float timeLeft = 0f; 022 protected ShipAPI ship; 023 protected Color origColor = Misc.setAlpha(VoltaicDischargeOnFireEffect.EMP_FRINGE_COLOR, 60); 024 protected float origRadius = 120f; 025 protected float origFlashFrequency = 1f; 026 protected float origFlashRateMult= 1f; 027 protected float glowFadeDelay = 2f; 028 029 public AttackSwarmPhaseModeScript(ShipAPI ship) { 030 this(ship, DURATION); 031 } 032 public AttackSwarmPhaseModeScript(ShipAPI ship, float dur) { 033 this.ship = ship; 034 this.timeLeft = dur; 035 036 turnOnPhaseMode(); 037 038 Global.getCombatEngine().addPlugin(this); 039 } 040 041 public void turnOnPhaseMode() { 042 RoilingSwarmEffect swarm = RoilingSwarmEffect.getSwarmFor(ship); 043 if (swarm == null) return; 044 045 origColor = swarm.params.flashFringeColor; 046 origRadius = swarm.params.flashRadius; 047 origFlashFrequency = swarm.params.flashFrequency; 048 origFlashRateMult = swarm.params.flashRateMult; 049 050 Color color = Misc.setAlpha(VoltaicDischargeOnFireEffect.PHASE_FRINGE_COLOR, 60); 051 swarm.params.flashFringeColor = color; 052 swarm.params.flashRadius = 180f; 053 swarm.params.tags.add(VoltaicDischargeOnFireEffect.SWARM_TAG_PHASE_MODE); 054 055 for (WeaponAPI w : ship.getAllWeapons()) { 056 if (w.usesAmmo() && w.getSpec().hasTag(Tags.FRAGMENT_GLOW)) { 057 //w.setAmmo(Integer.MAX_VALUE); 058 w.setAmmo(1000); 059 //w.setMaxAmmo(Integer.MAX_VALUE); 060 } 061 if (w.getSpec().hasTag(Tags.OVERSEER_CHARGE) || 062 (ship.isFighter() && w.getSpec().hasTag(Tags.OVERSEER_CHARGE_FIGHTER))) { 063 w.setAmmo(w.getMaxAmmo()); 064 } 065 } 066 } 067 068 public void turnOffPhaseMode() { 069 RoilingSwarmEffect swarm = RoilingSwarmEffect.getSwarmFor(ship); 070 if (swarm == null) return; 071 072 swarm.params.flashFringeColor = origColor; 073 swarm.params.flashRadius = origRadius; 074 swarm.params.flashFrequency = origFlashFrequency; 075 swarm.params.flashRateMult = origFlashRateMult; 076 swarm.params.tags.remove(VoltaicDischargeOnFireEffect.SWARM_TAG_PHASE_MODE); 077 078 for (WeaponAPI w : ship.getAllWeapons()) { 079 if (w.usesAmmo() && w.getSpec().hasTag(Tags.FRAGMENT_GLOW)) { 080 w.setAmmo(w.getMaxAmmo()); 081 } 082 } 083 } 084 085 public void suppressGlow() { 086 RoilingSwarmEffect swarm = RoilingSwarmEffect.getSwarmFor(ship); 087 if (swarm != null) { 088 swarm.params.flashFrequency = 0f; 089 swarm.params.flashRateMult = 1f; 090 } 091 for (WeaponAPI w : ship.getAllWeapons()) { 092 if (w.usesAmmo() && w.getSpec().hasTag(Tags.FRAGMENT_GLOW)) { 093 w.setAmmo(0); 094 } 095 } 096 } 097 098 099 @Override 100 public void advance(float amount, List<InputEventAPI> events) { 101 if (Global.getCombatEngine().isPaused()) return; 102 103 timeLeft -= amount; 104 105 if (timeLeft <= 0f) { 106 glowFadeDelay -= amount; 107 suppressGlow(); 108 109 if (glowFadeDelay <= 0f) { 110 turnOffPhaseMode(); 111 CombatEngineAPI engine = Global.getCombatEngine(); 112 engine.removePlugin(this); 113 } 114 } 115 } 116} 117 118 119 120 121 122 123 124 125 126 127