001package com.fs.starfarer.api.impl.combat;
002
003import java.awt.Color;
004
005import org.lwjgl.util.vector.Vector2f;
006
007import com.fs.starfarer.api.Global;
008import com.fs.starfarer.api.combat.CombatEngineAPI;
009import com.fs.starfarer.api.combat.CombatEntityAPI;
010import com.fs.starfarer.api.combat.DamagingProjectileAPI;
011import com.fs.starfarer.api.combat.ProximityExplosionEffect;
012import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual.NEParams;
013import com.fs.starfarer.api.loading.MissileSpecAPI;
014import com.fs.starfarer.api.util.Misc;
015
016public class RiftCascadeMineExplosion implements ProximityExplosionEffect {
017        
018        public static String SIZE_MULT_KEY = "core_sizeMultKey";
019        
020        public void onExplosion(DamagingProjectileAPI explosion, DamagingProjectileAPI originalProjectile) {
021                Float sizeMult = null;
022                if (originalProjectile.getCustomData() != null) {
023                        sizeMult = (Float) originalProjectile.getCustomData().get(SIZE_MULT_KEY);
024                }
025                if (sizeMult == null) sizeMult = 1f;
026                
027                NEParams p = createStandardRiftParams("riftcascade_minelayer", 25f * sizeMult);
028                p.fadeOut = 1f;
029                //p.hitGlowSizeMult = 0.5f;
030                spawnStandardRift(explosion, p);
031        }
032        
033//      public static void spawnStandardRift(DamagingProjectileAPI explosion, String minelayerId, float baseRadius) {
034//              NEParams p = createStandardRiftParams(minelayerId, baseRadius);
035//              spawnStandardRift(explosion, p); 
036//      }
037        
038        public static void spawnStandardRift(DamagingProjectileAPI explosion, NEParams params) {
039                CombatEngineAPI engine = Global.getCombatEngine();
040                explosion.addDamagedAlready(explosion.getSource());
041                
042                CombatEntityAPI prev = null;
043                for (int i = 0; i < params.numRiftsToSpawn; i++) { // 2 by default
044                        NEParams p = params.clone();
045                        p.radius *= 0.75f + 0.5f * (float) Math.random();
046
047                        p.withHitGlow = prev == null;
048                        
049                        Vector2f loc = new Vector2f(explosion.getLocation());
050                        //loc = Misc.getPointWithinRadius(loc, p.radius * 1f);
051                        loc = Misc.getPointAtRadius(loc, p.radius * 0.4f);
052                        
053                        CombatEntityAPI e = engine.addLayeredRenderingPlugin(new NegativeExplosionVisual(p));
054                        e.getLocation().set(loc);
055                        
056                        if (prev != null) {
057                                float dist = Misc.getDistance(prev.getLocation(), loc);
058                                Vector2f vel = Misc.getUnitVectorAtDegreeAngle(Misc.getAngleInDegrees(loc, prev.getLocation()));
059                                vel.scale(dist / (p.fadeIn + p.fadeOut) * 0.7f);
060                                e.getVelocity().set(vel);
061                        }
062                        
063                        prev = e;
064                }
065                
066        }
067        
068        
069        public static NEParams createStandardRiftParams(String minelayerId, float baseRadius) {
070                Color color = new Color(100,100,255,255);
071                Object o = Global.getSettings().getWeaponSpec(minelayerId).getProjectileSpec();
072                if (o instanceof MissileSpecAPI) {
073                        MissileSpecAPI spec = (MissileSpecAPI) o;
074                        color = spec.getGlowColor();
075                }
076                NEParams p = createStandardRiftParams(color, baseRadius);
077                return p;
078        }
079        
080        public static NEParams createStandardRiftParams(Color borderColor, float radius) {
081                NEParams p = new NEParams();
082                //p.radius = 50f;
083                p.hitGlowSizeMult = .75f;
084                //p.hitGlowSizeMult = .67f;
085                p.spawnHitGlowAt = 0f;
086                p.noiseMag = 1f;
087                //p.fadeIn = 0f;
088                //p.fadeOut = 0.25f;
089                
090                //p.color = new Color(175,100,255,255);
091                
092                //p.hitGlowSizeMult = .75f;
093                p.fadeIn = 0.1f;
094                //p.noisePeriod = 0.05f;
095                p.underglow = RiftCascadeEffect.EXPLOSION_UNDERCOLOR;
096                //p.withHitGlow = i == 0;
097                p.withHitGlow = true;
098                
099                //p.radius = 20f;
100                p.radius = radius;
101                //p.radius *= 0.75f + 0.5f * (float) Math.random();
102                
103                p.color = borderColor;
104                return p;
105        }
106        
107        
108}
109
110
111