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.CollisionClass;
011import com.fs.starfarer.api.combat.DamageType;
012import com.fs.starfarer.api.combat.DamagingProjectileAPI;
013import com.fs.starfarer.api.combat.ShipAPI;
014import com.fs.starfarer.api.impl.combat.RiftLanceEffect;
015import com.fs.starfarer.api.impl.combat.RiftTrailEffect;
016import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.DCPPlugin;
017import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.WobblyPart;
018import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams;
019import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
020import com.fs.starfarer.api.loading.DamagingExplosionSpec;
021
022public class ShroudedVortexShipCreator extends BaseDwellerShipCreator implements DCPPlugin {
023
024        public static float EXPLOSION_DAMAGE = 2000f;
025        public static DamageType EXPLOSION_DAMAGE_TYPE = DamageType.ENERGY;
026        
027        public static String ID_BODY_ONE = "id_body_one";
028        public static String ID_BODY_TWO = "id_body_two";
029        
030        public static String TAG_MIRRORED_VORTEX = "tag_mirrored_vortex";
031        
032        @Override
033        protected DwellerCombatPlugin createPlugin(ShipAPI ship) {
034                //DwellerCombatPlugin plugin = super.createPlugin(ship);
035                
036                DwellerCombatPlugin plugin = DwellerCombatPlugin.getDwellerPluginFor(ship);
037                if (plugin == null) {
038                        plugin = new DwellerCombatPlugin(ship) {
039                                protected boolean exploded = false;
040                                @Override
041                                public boolean notifyAboutToTakeHullDamage(Object param, ShipAPI ship, Vector2f point, float damageAmount) {
042                                        if (damageAmount >= ship.getHitpoints() && !exploded) {
043                                                DwellerShroud shroud = DwellerShroud.getShroudFor(ship);
044                                                if (shroud != null) {
045                                                        for (SwarmMember p : shroud.getMembers()) {
046                                                                Vector2f.sub(p.vel, ship.getVelocity(), p.vel);
047                                                        }
048                                                }
049                                                
050                                                DamagingProjectileAPI explosion = Global.getCombatEngine().spawnDamagingExplosion(
051                                                                createExplosionSpec(ship), ship, ship.getLocation());
052                                                exploded = true;
053                                                //ship.getVelocity().set(0, 0);
054                                                ship.getVelocity().scale(0.1f);
055                                        }
056                                        
057                                        return super.notifyAboutToTakeHullDamage(param, ship, point, damageAmount);
058                                }
059                                
060                        };
061                }
062                
063                //plugin.setPlugin(this);
064                
065                List<DwellerShipPart> parts = plugin.getParts();
066                parts.clear();
067                
068                float scale = 1f;
069                scale = 0.5f;
070                
071                float spinMult = 1f;
072                
073                boolean mirror = (float) Math.random() > 0.5f;
074                //mirror = true;
075                if (mirror) {
076                        ship.addTag(TAG_MIRRORED_VORTEX);
077                }
078                
079                WobblyPart part = new WobblyPart("shrouded_vortex_base", 2f * scale, 1f, new Vector2f(0, 0), 0f);
080                part.setId(ID_BODY_ONE);
081                part.renderer.setMirror(mirror);
082                //part.setSpin(360f * spinMult, 360f * 2f * spinMult, 360f * spinMult);
083                parts.add(part);
084                
085                part = new WobblyPart("shrouded_vortex_base2", 3f * scale, 3, 3, 1f, new Vector2f(0, 0), 0f);
086                //part.setSpin(270f * spinMult, 360f * spinMult, 270f * spinMult);
087                part.setId(ID_BODY_TWO);
088                part.renderer.setMirror(mirror);
089                part.alphaMult = 0.5f;
090                parts.add(part);
091                
092//              Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR;
093//              
094//              part = new WobblyPart("clusterA", 1f * scale, 3, 3, 2f, new Vector2f(70f * scale, 0), 0f);
095//              part.color = glow;
096//              part.additiveBlend = true;
097//              //part.setWeaponActivated();
098//              //parts.add(part);
099//              
100//              part = new WobblyPart("clusterB", 1f * scale, 3, 3, 2f, new Vector2f(30f * scale, 0), 0f);
101//              part.color = glow;
102//              part.additiveBlend = true;
103//              //part.setFluxActivated();
104////            part.setWeaponActivated();
105////            part.setShieldActivated();
106////            part.setSystemActivated();
107//              parts.add(part);
108//              
109//              part = new WobblyPart("coronet_stalks", 0.5f * scale, 3, 3, 2f, new Vector2f(100f * scale, 0), 0f);
110//              part.color = glow;
111//              part.additiveBlend = true;
112                //part.setShieldActivated();
113                //parts.add(part);
114                
115                return plugin;
116        }
117
118        @Override
119        protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) {
120                params.maxOffset = 50f;
121                params.initialMembers = 30;
122                params.baseMembersToMaintain = params.initialMembers;
123                
124                params.baseSpriteSize *= 0.65f;
125                //params.baseSpriteSize *= 0.75f;
126                
127                params.flashFrequency /= 3f;
128                //params.numToFlash = 1;
129                //params.flashFrequency = 17f;
130                //params.numToFlash = 2;
131                
132                params.negativeParticleAreaMult = 1.25f;
133                params.negativeParticleDurMult *= 0.5f;
134                params.negativeParticleSizeMult *= 1.4f;
135                //params.negativeParticleGenRate *= 1f;
136                
137//              params.negativeParticleGenRate = 0f;
138                params.negativeParticleGenRate *= 0.5f;
139                
140                params.overloadGlowSizeMult *= 0.5f;
141                
142//              params.overloadArcThickness *= 0.5f;
143//              params.overloadArcCoreThickness *= 0.5f;
144                
145//              params.maxSpeed += 500f;
146//              params.springStretchMult = 30f;
147//              params.baseFriction *= 10f;
148//              params.frictionRange *= 1f;
149        }
150        
151        
152
153        @Override
154        public void initInCombat(ShipAPI ship) {
155                super.initInCombat(ship);
156                
157                RiftTrailEffect trail = new RiftTrailEffect(ship, null) {
158                        @Override
159                        protected Color getUndercolor() {
160                                //return super.getUndercolor();
161                                return DwellerShroud.SHROUD_COLOR;
162                                //return new Color(125, 0, 25, 255);
163                        }
164                        @Override
165                        protected Color getDarkeningColor() {
166                                //return super.getDarkeningColor();
167                                return RiftLanceEffect.getColorForDarkening(getUndercolor());
168                        }
169                        @Override
170                        protected float getBaseParticleSize() {
171                                return ship.getCollisionRadius() * 1f;
172                        }
173                        @Override
174                        protected float getBaseParticleDuration() {
175                                return 1.5f;
176                        }
177                        
178                };
179                Global.getCombatEngine().addPlugin(trail);
180        }
181
182        @Override
183        public void advance(DwellerCombatPlugin plugin, float amount) {
184//              CombatEntityAPI attachedTo = plugin.getAttachedTo();
185//              if (attachedTo instanceof ShipAPI) {
186//                      ShipAPI ship = (ShipAPI) attachedTo;
187//                      float hullLevel = ship.getHullLevel();
188//                      float mult = 1f - hullLevel;
189//                      if (mult < 0f) mult = 0f;
190//                      if (mult > 1f) mult = 1f;
191//                      
192//                      mult *= 3f;
193//                      
194//                      DwellerShipPart part = plugin.getPart(ID_BODY_ONE);
195//                      if (part != null) {
196//                              ((WobblyPart)part).getSpin().setValueMult(mult);
197//                      }
198//                      part = plugin.getPart(ID_BODY_TWO);
199//                      if (part != null) {
200//                              ((WobblyPart)part).getSpin().setValueMult(mult);
201//                      }
202                        
203//                      CombatEngineAPI engine = Global.getCombatEngine();
204//                      engine.applyDamage(ship, ship.getLocation(), 100f, DamageType.ENERGY, 0f, true, false, ship, false);
205//                      //ship.setCollisionClass(CollisionClass.SHIP);
206//                      //ship.getAIFlags().setFlag(AIFlags.DO_NOT_BACK_OFF, 1f);
207//              }
208        }
209        
210        public DamagingExplosionSpec createExplosionSpec(ShipAPI ship) {
211                float damage = EXPLOSION_DAMAGE;
212                
213                float radius = DamagingExplosionSpec.getShipExplosionRadius(ship);
214                float coreRadius = ship.getCollisionRadius();
215                
216                DamagingExplosionSpec spec = new DamagingExplosionSpec(
217                                0.1f, // duration
218                                radius, // radius
219                                coreRadius, // coreRadius
220                                damage, // maxDamage
221                                0f, // minDamage
222                                CollisionClass.PROJECTILE_NO_FF, // collisionClass - no friendly fire damage!
223                                CollisionClass.PROJECTILE_NO_FF, // collisionClassByFighter
224                                3f, // particleSizeMin
225                                3f, // particleSizeRange
226                                0.5f, // particleDuration
227                                0, // particleCount
228                                new Color(255,255,255,0), // particleColor
229                                new Color(255,100,100,0)  // explosionColor
230                                );
231
232                spec.setDamageType(DamageType.ENERGY);
233                spec.setUseDetailedExplosion(false);
234                spec.setSoundSetId(null);
235                //spec.setSoundVolume(1f);
236                return spec;            
237        }
238}
239
240
241
242
243
244
245
246
247