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