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.combat.CombatEntityAPI;
010import com.fs.starfarer.api.combat.MutableShipStatsAPI;
011import com.fs.starfarer.api.combat.ShipAPI;
012import com.fs.starfarer.api.combat.ShipAPI.HullSize;
013import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
014import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.DCPPlugin;
015import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.WobblyPart;
016import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams;
017import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.ShroudNegativeParticleFilter;
018import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
019import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMemberOffsetModifier;
020import com.fs.starfarer.api.util.Misc;
021
022public class ShroudedMawShipCreator extends BaseDwellerShipCreator implements DCPPlugin {
023
024        @Override
025        protected DwellerCombatPlugin createPlugin(ShipAPI ship) {
026                DwellerCombatPlugin plugin = super.createPlugin(ship);
027                plugin.setPlugin(this);
028                
029                List<DwellerShipPart> parts = plugin.getParts();
030                parts.clear();
031                
032                float scale = 2f;
033                
034                float xOff = 40f * scale;
035                xOff = 0f;
036                //WobblyPart part = new WobblyPart("shrouded_maw_base", 1f * scale, 1f, new Vector2f(50f * scale, 0), 0f);
037                WobblyPart part = new WobblyPart("shrouded_maw_base", 1f * scale, 0.7f, new Vector2f(xOff, 0f), 0f);
038                //part.alphaMult = 0.5f;
039                parts.add(part);
040                
041                Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR;
042                
043                //branching_structureA
044                //teeth1 (glow)
045                //teeth2
046                //teeth3
047                //
048                
049                xOff = 30f * scale;
050                //part = new WobblyPart("shrouded_maw_glow", 1f * scale, 5, 5, 1f, new Vector2f(-50f * scale, 0), 0f);
051                part = new WobblyPart("shrouded_maw_glow", 0.5f * scale, 5, 5, 0.5f, new Vector2f(xOff, 0f), 0f);
052                part.color = glow;
053                part.additiveBlend = true;
054                //part.alphaMult = 0.5f;
055                parts.add(part);
056                
057                // eye spot cluster
058                part = new WobblyPart("shrouded_spot_cluster", 1f * scale, 5, 5, 1f, new Vector2f(-25f * scale + xOff, 0f), 0f);
059                part.color = glow;
060                part.additiveBlend = true;
061                //part.alphaMult = 0.5f;
062                parts.add(part);
063                
064                
065                //part = new WobblyPart("shrouded_maw_tail1", 1f * scale, 5, 5, 0.5f, new Vector2f(-100f * scale, 0f), 0f);
066                //part.alphaMult = 0.5f;
067                //parts.add(part);
068                
069//              part = new WobblyPart("teeth1", 1f * scale, 3, 3, 2f, new Vector2f(100f * scale, 0), 0f);
070//              part.color = glow;
071//              part.additiveBlend = true;
072//              parts.add(part);
073                
074//              part = new WobblyPart("coronet_stalks", 0.5f * scale, 3, 3, 2f, new Vector2f(100f * scale, 0), 0f);
075//              part.color = glow;
076//              part.additiveBlend = true;
077//              //part.setShieldActivated();
078//              parts.add(part);
079                
080                return plugin;
081        }
082        
083        @Override
084        public void initBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) {
085                super.initBeforeShipCreation(hullSize, stats, id);
086                
087                //stats.getEnergyWeaponRangeBonus().modifyFlat(id, 500f);
088                stats.getEnergyWeaponRangeBonus().modifyPercent(id, 100f);
089                stats.getMissileWeaponRangeBonus().modifyFlat(id, 400f);
090        }
091
092        @Override
093        protected DwellerShroud createShroud(ShipAPI ship) {
094                DwellerShroud shroud = super.createShroud(ship);
095                shroud.getShroudParams().negativeParticleFilter = new ShroudNegativeParticleFilter() {
096                        @Override
097                        public boolean isParticleOk(DwellerShroud shroud, Vector2f loc) {
098                                float facing = shroud.getAttachedTo().getFacing();
099                                Vector2f diff = Vector2f.sub(loc, shroud.getAttachedTo().getLocation(), new Vector2f());
100                                diff = Misc.rotateAroundOrigin(diff, -facing);
101                                return Math.abs(diff.x) < shroud.getParams().maxOffset * 0.75f;
102                        }
103                        
104                };
105                return shroud;
106        }
107
108
109
110        @Override
111        protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) {
112                params.maxOffset = 400f;
113                params.initialMembers = 250;
114                //params.initialMembers = 0;
115                params.baseMembersToMaintain = params.initialMembers;
116                params.numToRespawn = 5;
117                params.numToFlash *= 3;
118                
119                params.spawnOffsetMult = 0.67f;
120                params.spawnOffsetMultForInitialSpawn = params.spawnOffsetMult;
121                
122                params.baseSpriteSize *= 2f;
123                
124                //params.flashFrequency /= 2f;
125                //params.flashFrequency = 17f;
126                //params.numToFlash = 2;
127                
128                params.negativeParticleAreaMult = 0.9f;
129                //params.negativeParticleSizeMult = 0.81f;
130                params.negativeParticleSizeMult = 0.9f;
131                //params.negativeParticleGenRate = 0f;
132                
133//              params.negativeParticleNumBase = 3;
134//              params.negativeParticleNumOverloaded = 2;
135                
136                params.overloadGlowSizeMult *= 2f;
137                params.overloadArcThickness *= 2f;
138                params.overloadArcCoreThickness *= 2f;
139                
140//              params.maxSpeed += 500f;
141//              params.springStretchMult = 30f;
142//              params.baseFriction *= 10f;
143//              params.frictionRange *= 1f;
144                
145                params.offsetModifier = new SwarmMemberOffsetModifier() {
146                        @Override
147                        public void modifyOffset(SwarmMember p) {
148                                p.offset.x *= 0.75f;
149                        }
150                };
151        }
152
153        @Override
154        public void advance(DwellerCombatPlugin plugin, float amount) {
155                CombatEntityAPI attachedTo = plugin.getAttachedTo();
156                if (attachedTo instanceof ShipAPI) {
157                        ShipAPI ship = (ShipAPI) attachedTo;
158                        ship.getAIFlags().setFlag(AIFlags.DO_NOT_BACK_OFF, 1f);
159                }
160        }
161        
162}
163
164
165
166
167
168
169
170
171