001package com.fs.starfarer.api.impl.combat.dweller;
002
003import java.awt.Color;
004import java.util.List;
005
006import org.lwjgl.util.vector.Vector2f;
007
008import com.fs.starfarer.api.combat.CombatEntityAPI;
009import com.fs.starfarer.api.combat.MutableShipStatsAPI;
010import com.fs.starfarer.api.combat.ShipAPI;
011import com.fs.starfarer.api.combat.ShipAPI.HullSize;
012import com.fs.starfarer.api.combat.WeaponAPI;
013import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.DCPPlugin;
014import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.WobblyPart;
015import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams;
016import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
017import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMemberOffsetModifier;
018import com.fs.starfarer.api.loading.ProjectileWeaponSpecAPI;
019import com.fs.starfarer.api.util.ListMap;
020
021public class ShroudedMaelstromShipCreator extends BaseDwellerShipCreator {
022
023        public static float FLUX_COST_MULT = 1f;
024        public static float RANGE_BONUS = 200f;
025        
026//      public static float RL_DELAY = 0.33f;
027//      public static float IE_DELAY = 0.25f;
028        
029        @Override
030        public void initBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) {
031                super.initBeforeShipCreation(hullSize, stats, id);
032                
033//              stats.getEnergyWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT);
034//              stats.getBallisticWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT);
035//              stats.getMissileWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT);
036                
037                stats.getBallisticWeaponRangeBonus().modifyPercent(id, RANGE_BONUS);
038                stats.getEnergyWeaponRangeBonus().modifyPercent(id, RANGE_BONUS);
039        }
040
041        
042        @Override
043        protected DwellerCombatPlugin createPlugin(ShipAPI ship) {
044                DwellerCombatPlugin plugin = super.createPlugin(ship);
045                plugin.setPlugin(new DCPPlugin() {
046                        ListMap<WeaponAPI> weapons = new ListMap<>();
047                        int [] currIndex = new int[10];
048                        float [] currElapsed = new float [10];
049                        @Override
050                        public void advance(DwellerCombatPlugin plugin, float amount) {
051                                CombatEntityAPI attachedTo = plugin.getAttachedTo();
052                                if (attachedTo instanceof ShipAPI) {
053                                        ShipAPI ship = (ShipAPI) attachedTo;
054
055                                        if (weapons.isEmpty()) {
056                                                for (WeaponAPI w : ship.getAllWeapons()) {
057                                                        if (w.isDecorative()) continue;
058                                                        weapons.add(w.getId(), w);
059                                                }
060                                        }
061                                        
062                                        int i = 0;
063                                        for (List<WeaponAPI> list : weapons.values()) {
064                                                
065                                                WeaponAPI w = list.get(0);
066                                                float delay = ((ProjectileWeaponSpecAPI)w.getSpec()).getRefireDelay() / (float) list.size();
067                                                
068                                                currElapsed[i] += amount;
069                                                while (currElapsed[i] > delay) {
070                                                        currElapsed[i] -= delay;
071                                                        currIndex[i]++;
072                                                        currIndex[i] %= list.size();
073                                                }
074
075                                                int index = 0;
076                                                for (WeaponAPI curr : list) {   
077                                                        if (index != currIndex[i]) {
078                                                                curr.setForceDisabled(true);
079                                                        } else {
080                                                                curr.setForceDisabled(false);
081                                                        }
082                                                        index++;
083                                                }
084                                                
085                                                i++;
086                                        }
087                                }
088                        }
089                });
090                
091                
092                List<DwellerShipPart> parts = plugin.getParts();
093                
094                float scale = 1f;
095                scale = 1.33f;
096                
097                //scale = 1.5f;
098                
099                float spinMult = 1f;
100                spinMult = 0.5f;
101                spinMult = 0.125f;
102                
103                
104                
105                
106                /*part = new WobblyPart("shrouded_maelstrom_base", 2f * scale, 1f, new Vector2f(0, 0), 0f);
107                part.setSpin(360f * 2f * spinMult, 360f * 2f * spinMult, 360f * spinMult);
108                part.alphaMult = 0.5f;
109                parts.add(part);
110                */
111                
112                
113                WobblyPart  part = new WobblyPart("shrouded_vortex_base2", 3f * scale, 3, 3, 1f, new Vector2f(0, 0), 0f);
114                part.setSpin(270f * 2f * spinMult, 360f * 2f * spinMult, 270f * spinMult);
115                part.alphaMult = 0.5f;
116                parts.add(part);
117                
118                part = new WobblyPart("shrouded_vortex_base2", 2f * scale, 3, 3, 1f, new Vector2f(0, 0), 180f);
119                part.setSpin(270f * 2f * spinMult, 360f * 2f * spinMult, 270f * spinMult);
120                part.alphaMult = 0.4f;
121                parts.add(part);
122                
123                //WobblyPart part = new WobblyPart("shrouded_vortex_base", 3f * scale, 1f, new Vector2f(0, 0), 0f);
124
125                
126                Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR;
127                // eye spot clusters
128                part = new WobblyPart("shrouded_eye_cluster1", 1.2f * scale, 5, 5, 1f, new Vector2f(0, 0), 0f);
129                part.setSpin(50f * 2f * spinMult, 90f * 2f * spinMult, 320f * spinMult);
130                part.color = glow;
131                part.additiveBlend = true;
132                parts.add(part);
133                
134                part = new WobblyPart("shrouded_eye_cluster2", 1.2f * scale, 5, 5, 1f, new Vector2f(0, 0), 0f);
135                part.setSpin(60f * 2f * spinMult, 100f * 2f * spinMult, 320f * spinMult);
136                part.color = glow;
137                part.additiveBlend = true;
138                parts.add(part);
139                
140                part = new WobblyPart("shrouded_eye_cluster3", 1.2f * scale, 5, 5, 1f, new Vector2f(0, 0), 0f);
141                part.setSpin(70f * 2f * spinMult, 110f * 2f * spinMult, 320f * spinMult);
142                part.color = glow;
143                part.additiveBlend = true;
144                parts.add(part);
145                
146                
147                part = new WobblyPart("shrouded_maelstrom_base", 1.8f * scale, 1f, new Vector2f(0, 0), 0f);
148                part.setSpin(300f * 2f * spinMult, 340f * 2f * spinMult, 320f * spinMult);
149                parts.add(part);
150                
151                
152
153                
154                
155//              WobblyPart part = new WobblyPart("shrouded_maelstrom", 0.3f * scale, 1f, new Vector2f(0, 0), 0f);
156//              parts.add(part);
157//              Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR;
158//              part = new WobblyPart("clusterA", 1f * scale, 3, 3, 2f, new Vector2f(70f * scale, 0), 0f);
159//              part.color = glow;
160//              part.additiveBlend = true;
161//              //part.setWeaponActivated();
162//              parts.add(part);
163//              
164//              part = new WobblyPart("clusterB", 1f * scale, 3, 3, 2f, new Vector2f(-10f * scale, 0), 0f);
165//              part.color = glow;
166//              part.additiveBlend = true;
167//              //part.setFluxActivated();
168//              parts.add(part);
169//              
170//              part = new WobblyPart("coronet_stalks", 0.5f * scale, 3, 3, 2f, new Vector2f(100f * scale, 0), 0f);
171//              part.color = glow;
172//              part.additiveBlend = true;
173//              //part.setShieldActivated();
174//              parts.add(part);
175                
176                return plugin;
177        }
178
179        @Override
180        protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) {
181//              numMembers = 100;
182//              radius = 150f;
183                
184                params.maxOffset = 200f;
185                params.initialMembers = 200;
186                params.baseMembersToMaintain = params.initialMembers;
187                
188                params.numToRespawn = 2;
189                params.numToFlash = 3;
190                
191                params.maxOffset = 250f;
192                params.numToFlash = 4;
193                params.baseSpriteSize *= 1.33f;
194                
195                params.spawnOffsetMult = 0.67f;
196                params.spawnOffsetMultForInitialSpawn = params.spawnOffsetMult;
197                
198                
199                params.offsetModifier = new SwarmMemberOffsetModifier() {
200                        @Override
201                        public void modifyOffset(SwarmMember p) {
202                                p.offset.x *= 0.85f;
203                                p.offset.y *= 1.25f;
204                        }
205                };
206                
207        }
208        
209        
210}
211
212
213
214
215
216
217
218
219