001package com.fs.starfarer.api.impl.combat;
002
003import java.util.HashMap;
004import java.util.LinkedHashMap;
005
006import java.awt.Color;
007
008import org.lwjgl.util.vector.Vector2f;
009
010import com.fs.starfarer.api.Global;
011import com.fs.starfarer.api.combat.CombatEngineAPI;
012import com.fs.starfarer.api.combat.DamagingProjectileAPI;
013import com.fs.starfarer.api.combat.OnFireEffectPlugin;
014import com.fs.starfarer.api.combat.ShipAPI;
015import com.fs.starfarer.api.combat.WeaponAPI;
016import com.fs.starfarer.api.loading.MuzzleFlashSpec;
017import com.fs.starfarer.api.loading.ProjectileWeaponSpecAPI;
018import com.fs.starfarer.api.util.Misc;
019
020public class HeavyAdjudicatorEffect implements OnFireEffectPlugin {
021
022        /**
023         * Key is <hullId>_<slot id>.
024         */
025        public static HashMap<String, Vector2f> SECOND_MUZZLE_FLASH_OFFSET_MAP = new LinkedHashMap<>();
026        
027        static {
028                SECOND_MUZZLE_FLASH_OFFSET_MAP.put("onslaught_mk1_WS 016", new Vector2f(-39, 17));
029                SECOND_MUZZLE_FLASH_OFFSET_MAP.put("onslaught_mk1_WS 017", new Vector2f(-39, -18));
030        }
031        
032        
033        public HeavyAdjudicatorEffect() {
034        }
035
036        public void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine) {
037                ShipAPI ship = projectile.getSource();
038                if (ship == null) return;
039                
040                MuzzleFlashSpec spec = ((ProjectileWeaponSpecAPI)weapon.getSpec()).getMuzzleFlashSpec().clone();
041                
042                spec.setLength(30f);
043                spec.setParticleCount(30);
044                spec.setSpread(90f);
045//              spec.setParticleSizeMin(3);
046//              spec.setParticleSizeRange(0f);
047                
048                Vector2f p = projectile.getLocation();
049                float angle = weapon.getCurrAngle();
050                
051                spawnMuzzleFlash(((ProjectileWeaponSpecAPI)weapon.getSpec()).getMuzzleFlashSpec(), p, angle, ship.getVelocity(), 1f, 0f);
052                
053                String slotId = weapon.getSlot().getId();
054                String id = ship.getHullSpec().getBaseHullId() + "_" + slotId;
055                
056                Vector2f offset = SECOND_MUZZLE_FLASH_OFFSET_MAP.get(id);
057                if (offset != null) {
058                        float sign = Math.signum(offset.y);
059                        offset = new Vector2f(offset);
060                        offset = Misc.rotateAroundOrigin(offset, angle);
061                        Vector2f.add(offset, p, offset);
062                        spawnMuzzleFlash(spec, offset, angle + sign * 90f, ship.getVelocity(), 2f, 20f);
063                }
064                
065        }
066
067        public static void spawnMuzzleFlash(MuzzleFlashSpec spec, Vector2f point, float angle, Vector2f shipVel,
068                                                                float velMult, float velAdd) {
069                if (spec == null) return;
070                
071                CombatEngineAPI engine = Global.getCombatEngine();
072                
073                Color color = spec.getParticleColor();
074                float min = spec.getParticleSizeMin();
075                float range = spec.getParticleSizeRange();
076                float spread = spec.getSpread();
077                float length = spec.getLength();
078                for (int i = 0; i < spec.getParticleCount(); i++) {
079                        float size = range * (float) Math.random() + min;
080                        float theta = (float) (Math.random() * Math.toRadians(spread) + Math.toRadians(angle - spread/2f));
081                        float r = (float) (Math.random() * length);
082                        Vector2f dir = new Vector2f((float)Math.cos(theta), (float)Math.sin(theta));
083                        float x = dir.x * r;
084                        float y = dir.y * r;
085                        Vector2f loc = new Vector2f(point.x + x, point.y + y);
086                        Vector2f vel = new Vector2f(x * velMult + shipVel.x + dir.x * velAdd,
087                                                                                y * velMult + shipVel.y + dir.y * velAdd);
088                        if (velAdd > 0 || true) {
089                                Vector2f rand = Misc.getPointWithinRadius(new Vector2f(), spec.getLength() * 0.5f);
090                                Vector2f.add(vel, rand, vel);
091                        }
092                        //engine.addSmoothParticle(loc, vel, size, 1f, spec.getParticleDuration(), color);
093                        float dur = spec.getParticleDuration();
094                        dur *= 0.75f + (float) Math.random() * 0.5f;
095                        size *= 1.25f;
096                        engine.addNebulaParticle(loc, vel, size, 
097                                        0.67f, // end size
098                                        //2f, // end size
099                                        0f, // ramp up
100                                        0f, // full brightness
101                                        dur, color);
102                }
103        }
104        
105}
106
107
108
109