001package com.fs.starfarer.api.impl.combat.dweller;
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.MutableShipStatsAPI;
009import com.fs.starfarer.api.combat.ShipAPI;
010import com.fs.starfarer.api.combat.ShipAPI.HullSize;
011import com.fs.starfarer.api.impl.campaign.ids.Tags;
012import com.fs.starfarer.api.impl.combat.RiftLanceEffect;
013import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams;
014import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.ShroudNegativeParticleFilter;
015import com.fs.starfarer.api.loading.HullModSpecAPI;
016import com.fs.starfarer.api.util.Misc;
017
018public class HumanShipShroudCreator extends BaseDwellerShipCreator {
019                @Override
020                public void initBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) {
021                }
022
023                @Override
024                public void initAfterShipCreation(ShipAPI ship, String id) {
025                }
026
027                @Override
028                public void initAfterShipAddedToCombatEngine(ShipAPI ship, String id) {
029                }
030                
031                @Override
032                public void initInCombat(ShipAPI ship) {
033                        DwellerShroud shroud = createShroud(ship);
034                        //setOverloadColorAndText(ship, shroud);
035                        Color color = Misc.setAlpha(Misc.setBrightness(shroud.getParams().flashFringeColor, 255), 255);
036                        ship.getFluxTracker().setOverloadColor(color);
037                }
038                
039                @Override
040                protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) {
041                        //params.maxOffset = ship.getCollisionRadius();
042                        float maxOffset = 100f;
043                        float scale = 1f;
044                        float overloadGlowScale = 1f;
045                        switch (ship.getHullSize()) {
046                        case CAPITAL_SHIP:
047                                maxOffset = 150f;
048                                scale = 1.75f;
049                                overloadGlowScale = 0.75f;
050                                break;
051                        case CRUISER:
052                                maxOffset = 120f;
053                                scale = 1.5f;
054                                overloadGlowScale = 0.75f;
055                                break;
056                        case DESTROYER:
057                                maxOffset = 100f;
058                                scale = 1.25f;
059                                overloadGlowScale = 0.5f;
060                                break;
061                        case FRIGATE:
062                        case FIGHTER:
063                                overloadGlowScale = 0.5f;
064                                maxOffset = 75f;
065                                break;
066                        }
067                        //params.maxOffset = ship.getCollisionRadius();
068                        params.maxOffset = maxOffset * 0.5f;
069                        params.initialMembers = 0;
070                        params.baseMembersToMaintain = params.initialMembers;
071                        
072                        params.spawnOffsetMult = 0.75f;
073                        
074                        int num = (int) (ship.getCollisionRadius() * ship.getCollisionRadius() / 800);
075                        if (num < 15) num = 15;
076                        if (ship.isDestroyer() && num < 22) num = 22;
077                        if (num > 150) num = 150;
078                        params.baseMembersToMaintain = num;
079                        params.initialMembers = num;
080//                      params.flashProbability = 0f;
081//                      params.flashFrequency = 0f;
082//                      params.alphaMult = 0.25f;
083//                      params.baseSpriteSize = 128f * 1.5f * 0.67f * 1.5f;
084                        
085                        //params.alphaMult = 0.25f;
086                        
087                        float numShroudMods = 0;
088                        for (String modId : ship.getVariant().getHullMods()) {
089                                HullModSpecAPI spec = Global.getSettings().getHullModSpec(modId);
090                                if (spec.hasTag(Tags.SHROUDED)) numShroudMods++;
091                        }
092                        
093                        params.alphaMult = 0.25f + (numShroudMods - 1f) * 0.1f;
094                        if (params.alphaMult > 0.75f) params.alphaMult = 0.75f;
095                        if (params.alphaMult < 0.25f) params.alphaMult = 0.25f;
096                        
097                        params.baseSpriteSize *= scale;
098                        
099                        //params.negativeParticleAlphaIntOverride = 100;
100                        params.negativeParticleSpeedCap = ship.getMaxSpeedWithoutBoost() + 100f;
101                        params.negativeParticleColorOverride = RiftLanceEffect.getColorForDarkening(ship.getSpriteAPI().getAverageColor());
102                        //params.negativeParticleSizeMult = 1.5f;
103                        params.negativeParticleSizeMult = scale;
104                        
105                        params.negativeParticleAreaMult = ship.getCollisionRadius() / params.maxOffset; 
106                        
107//                      params.negativeParticleAlphaIntOverride = 50;
108//                      params.negativeParticleSizeMult = 0.5f;
109//                      params.negativeParticleNumBase *= 3;
110                        
111                        params.overloadGlowSizeMult *= overloadGlowScale;
112                        params.overloadArcOffsetMult = params.negativeParticleAreaMult * 0.8f;
113                        
114//                      params.overloadArcThickness *= 2f;
115//                      params.overloadArcCoreThickness *= 2f;
116
117                        params.generateOffsetAroundAttachedEntityOval = true;
118//                      params.offsetModifier = new SwarmMemberOffsetModifier() {
119//                              @Override
120//                              public void modifyOffset(SwarmMember p) {
121//                                      p.offset.x *= 0.75f;
122//                              }
123//                      };
124                        
125                        params.negativeParticleFilter = new ShroudNegativeParticleFilter() {
126                                @Override
127                                public boolean isParticleOk(DwellerShroud shroud, Vector2f loc) {
128                                        if (shroud.getAttachedTo() instanceof ShipAPI) {
129                                                ShipAPI ship = (ShipAPI) shroud.getAttachedTo();
130                                                float targetingRadius = Misc.getTargetingRadius(loc, ship, false);
131                                                float dist = Misc.getDistance(ship.getLocation(), loc);
132                                                float pad = Math.max(50f, targetingRadius * 0.2f);
133                                                pad = params.maxOffset;
134                                                return dist < targetingRadius + pad && dist > targetingRadius * 0.75f;
135                                        }
136                                        return true;
137                                }
138                                
139                        };                      
140                }
141        }