001package com.fs.starfarer.api.impl.combat.dweller;
002
003import java.util.List;
004
005import java.awt.Color;
006
007import org.lwjgl.util.vector.Vector2f;
008
009import com.fs.starfarer.api.Global;
010import com.fs.starfarer.api.combat.CombatEngineAPI;
011import com.fs.starfarer.api.combat.CombatEngineLayers;
012import com.fs.starfarer.api.combat.EmpArcEntityAPI;
013import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams;
014import com.fs.starfarer.api.combat.MutableShipStatsAPI;
015import com.fs.starfarer.api.combat.ShipAPI;
016import com.fs.starfarer.api.combat.ShipAPI.HullSize;
017import com.fs.starfarer.api.combat.ViewportAPI;
018import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual;
019import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual.NEParams;
020import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.WobblyPart;
021import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams;
022import com.fs.starfarer.api.util.IntervalUtil;
023import com.fs.starfarer.api.util.Misc;
024
025public class ShroudedEyeShipCreator extends BaseDwellerShipCreator {
026
027        public static class PlasmaEyePart extends BaseDwellerShipPart {
028                public float radius;
029                public IntervalUtil interval = new IntervalUtil(0.75f, 1.25f);
030                public ShipAPI ship;
031                public NegativeExplosionVisual visual;
032
033                public PlasmaEyePart(Vector2f offset, float facingOffset, ShipAPI ship, float radius) {
034                        super(offset, facingOffset);
035                        this.ship = ship;
036                        this.radius = radius;
037                        
038                        NEParams p = new NEParams();
039                        p.hitGlowSizeMult = 0.75f;
040                        p.noiseMag = 1f;
041//                      p.radius = 35f;
042//                      p.noiseMult = 3f;
043                        p.radius = 15f;
044                        p.noiseMult = 2f;
045                        p.color = new Color(255,55,255,155);
046                        p.blackColor = new Color(255,155,255,255);
047                        p.color = new Color(255,55,55,155);
048                        p.blackColor = new Color(255,155,155,255);
049
050                        //p.thickness = 25f;
051                        p.underglow = null;
052                        p.spawnHitGlowAt = 0f;
053                        p.withHitGlow = false;
054                        //p.additiveBlend = true;
055                        
056                        
057                        visual = new NegativeExplosionVisual(p);
058                        visual.init(ship);
059                        visual.getFader().forceIn();
060                }
061
062                @Override
063                public void advance(float amount) {
064                        super.advance(amount);
065                        
066                        visual.getFader().fadeIn();
067                        visual.advance(amount * 0.5f);
068                        
069                        interval.advance(amount * 30f);
070                        if (interval.intervalElapsed() && !ship.getFluxTracker().isOverloadedOrVenting()) {
071                                EmpArcParams params = new EmpArcParams();
072                                params.segmentLengthMult = 4f;
073                                params.glowSizeMult = 2.5f;
074                                
075                                if ((float) Math.random() < 0.1f) {
076                                        params.glowSizeMult = 7f;
077                                }
078                                //params.glowSizeMult = 1.5f;
079                                //params.zigZagReductionFactor = 0f;
080                                //params.brightSpotFadeFraction = 0.33f;
081                                
082                                //params.brightSpotFullFraction = 0.33f;
083                                
084                                params.flickerRateMult = 0.5f + (float) Math.random() * 0.5f;
085                                
086                                params.fadeOutDist = 30f;
087                                params.minFadeOutMult = 5f;
088                                params.flickerRateMult *= 0.3f;
089                                params.movementDurOverride = 0.3f;
090                                
091                                Color fringe = DwellerShroud.SHROUD_OVERLOAD_FRINGE_COLOR;
092                                fringe = new Color(150, 30, 40, 255);
093                                Color core = Color.white;
094                                fringe = new Color(150, 30, 40, 255);
095                                core = new Color(255, 150, 190, 255);
096                                
097                                fringe = new Color(150, 30, 30, 255);
098                                core = new Color(255, 150, 150, 255);
099
100                                float thickness = 80f;
101                                thickness = 40f;
102                                
103                                Vector2f loc = ship.getLocation();
104                                float r = radius * 1.1f;
105                                r = r * 0.5f + r * 0.5f * (float) Math.random();
106                                Vector2f from = Misc.getPointAtRadius(loc, r);
107                                
108                                Vector2f to = new Vector2f(loc);
109                                to = Misc.getPointWithinRadius(to, radius * 0.1f);
110                                
111                                boolean goingOutside = false;
112                                if ((float) Math.random() < 0.4f && false) {
113                                        Vector2f temp = to;
114                                        to = from;
115                                        from = temp;
116                                        goingOutside = true;
117                                }
118                                
119                                CombatEngineAPI engine = Global.getCombatEngine();
120                                EmpArcEntityAPI arc = (EmpArcEntityAPI)engine.spawnEmpArcVisual(
121                                                from, ship, to, ship, thickness, fringe, core, params);
122                                
123                                arc.setCoreWidthOverride(60f);
124                                arc.setCoreWidthOverride(20f);
125                                arc.setCoreWidthOverride(25f);
126                                
127                                if (goingOutside) {
128                                        arc.setRenderGlowAtEnd(false);
129                                } else {
130                                        arc.setRenderGlowAtStart(false);
131                                        arc.setFadedOutAtStart(true);
132                                }
133                                
134                                arc.setSingleFlickerMode(true);
135                                
136//                              arc.setRenderGlowAtStart(false);
137//                              arc.setFadedOutAtStart(true);
138                                
139                                if (ship.getSystem() != null && ship.getSystem().getEffectLevel() > 0f) {
140                                        float level = ship.getSystem().getEffectLevel();
141                                        Vector2f pt = Misc.getPointWithinRadius(loc, 20f * level);
142                                        //engine.addHitParticle(pt, ship.getVelocity(), 75f, 0.5f, core);
143                                        engine.addNebulaParticle(pt, ship.getVelocity(), 35f + 30f * level, 2f,
144                                                        0f, 0f, 1f, core);
145                                }
146                        }
147                        
148                        if (!ship.getFluxTracker().isOverloadedOrVenting()) {
149                                Global.getSoundPlayer().playLoop("shrouded_eye_loop", 
150                                                ship, 1f, 0.5f + 0.5f * ship.getFluxLevel(),
151                                                ship.getLocation(), ship.getVelocity());
152                        }
153                }
154
155                @Override
156                protected void renderImpl(float x, float y, float alphaMult, float angle, CombatEngineLayers layer) {
157                        super.renderImpl(x, y, alphaMult, angle, layer);
158                        
159                        ViewportAPI viewport = Global.getCombatEngine().getViewport();
160                        float vAlpha = viewport.getAlphaMult();
161                        viewport.setAlphaMult(alphaMult);
162                        if (layer == CombatEngineLayers.BELOW_INDICATORS_LAYER) {
163                                visual.render(CombatEngineLayers.ABOVE_PARTICLES_LOWER, viewport);
164                                visual.render(CombatEngineLayers.ABOVE_PARTICLES, viewport);
165                        }
166//                      if (layer == CombatEngineLayers.ABOVE_PARTICLES_LOWER) {
167//                              visual.render(CombatEngineLayers.ABOVE_PARTICLES_LOWER, viewport);
168//                      }
169//                      if (layer == CombatEngineLayers.ABOVE_PARTICLES) {
170//                              visual.render(CombatEngineLayers.ABOVE_PARTICLES, viewport);
171//                      }
172                        viewport.setAlphaMult(vAlpha);
173                }
174                
175        }
176        
177        
178        public static float BEAM_RANGE_BONUS = 1200f;
179        public static float HARD_FLUX_DISSIPATION_PERCENT = 100f;
180        public static float DAMAGE_MULT = 0.75f;
181        
182        @Override
183        public void initBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) {
184                super.initBeforeShipCreation(hullSize, stats, id);
185                
186                stats.getBallisticWeaponFluxCostMod().modifyMult(id, 0);
187                stats.getEnergyWeaponFluxCostMod().modifyMult(id, 0);
188                stats.getMissileWeaponFluxCostMod().modifyMult(id, 0);
189                
190                stats.getBeamWeaponRangeBonus().modifyFlat(id, BEAM_RANGE_BONUS);
191                
192                stats.getBeamWeaponDamageMult().modifyMult(id, DAMAGE_MULT);
193                
194                // basically instant
195                stats.getShieldUnfoldRateMult().modifyPercent(id, 10000f);
196                // doesn't matter if unfold is instant
197                //stats.getShieldTurnRateMult().modifyPercent(id, SHIELD_BONUS_TURN);
198                
199                stats.getHardFluxDissipationFraction().modifyFlat(id, (float)HARD_FLUX_DISSIPATION_PERCENT * 0.01f);
200        }
201
202
203        @Override
204        protected DwellerCombatPlugin createPlugin(ShipAPI ship) {
205                DwellerCombatPlugin plugin = super.createPlugin(ship);
206                
207                List<DwellerShipPart> parts = plugin.getParts();
208                parts.clear();
209                
210                //WobblyPart part = new WobblyPart("shrouded_eye_base", 1f, 5, 5, 1f, new Vector2f(0, 0), 0f);
211                WobblyPart part = new WobblyPart("shrouded_eye_base_dark", 1f, 5, 5, 1f, new Vector2f(0, 0), 0f);
212                parts.add(part);
213                
214                Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR;
215                //glow = new Color(150, 30, 80, 255);
216                
217                part = new WobblyPart("shrouded_eye_iris", 0.6f, 3, 3, 1f, new Vector2f(0, 0), 0f);
218                part.color = glow;
219                part.additiveBlend = true;
220                part.alphaMult = 0.5f;
221                //part.setWeaponActivated();
222                parts.add(part);
223                
224                PlasmaEyePart eyePart = new PlasmaEyePart(new Vector2f(0, 0), 0f, ship, 110f);
225                parts.add(eyePart);
226                
227//              plugin.getActiveLayers().add(CombatEngineLayers.ABOVE_PARTICLES_LOWER);
228//              plugin.getActiveLayers().add(CombatEngineLayers.ABOVE_PARTICLES);
229                
230                return plugin;
231        }
232
233        @Override
234        protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) {
235//              params.maxOffset = 50f;
236//              params.initialMembers = 50;
237//              params.negativeParticleAreaMult = 1.5f;
238                
239                params.maxOffset = 130f;
240//              params.initialMembers = 2000;
241//              params.baseMembersToMaintain = params.initialMembers;
242//              params.numToRespawn = 100;
243                
244                //params.negativeParticleClearCenterAreaRadius = 150f;
245                params.negativeParticleClearCenterAreaRadius = 50f;
246                
247//              public static Color SHROUD_COLOR = new Color(100, 0, 25, 255);
248//              public static Color SHROUD_GLOW_COLOR = new Color(150, 0, 30, 255);
249//              params.color = new Color(100, 10, 10, 255);
250//              params.flashFringeColor = new Color(150, 12, 12, 255);
251//              params.color = new Color(100, 0, 0, 255);
252//              params.flashFringeColor = new Color(150, 0, 0, 255);
253//              params.flashCoreColor = Misc.setBrightness(params.color, 255);
254                
255                //params.negativeParticleHighContrastMode = true;
256//              params.negativeParticleNumBase = 4;
257//              params.negativeParticleNumOverloaded = 4;
258                //params.negativeParticleClearCenterAreaRadius = 200f;
259                //params.negativeParticleAreaMult = 0.75f;
260        }
261        
262}
263
264
265
266
267
268
269
270
271