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