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