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.CombatEngineAPI; 011import com.fs.starfarer.api.combat.CombatEngineLayers; 012import com.fs.starfarer.api.combat.EmpArcEntityAPI; 013import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams; 014import com.fs.starfarer.api.combat.MutableShipStatsAPI; 015import com.fs.starfarer.api.combat.ShipAPI; 016import com.fs.starfarer.api.combat.ShipAPI.HullSize; 017import com.fs.starfarer.api.combat.ViewportAPI; 018import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual; 019import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual.NEParams; 020import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.WobblyPart; 021import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams; 022import com.fs.starfarer.api.util.IntervalUtil; 023import com.fs.starfarer.api.util.Misc; 024 025public class ShroudedEyeShipCreator extends BaseDwellerShipCreator { 026 027 public static class PlasmaEyePart extends BaseDwellerShipPart { 028 public float radius; 029 public IntervalUtil interval = new IntervalUtil(0.75f, 1.25f); 030 public ShipAPI ship; 031 public NegativeExplosionVisual visual; 032 033 public PlasmaEyePart(Vector2f offset, float facingOffset, ShipAPI ship, float radius) { 034 super(offset, facingOffset); 035 this.ship = ship; 036 this.radius = radius; 037 038 NEParams p = new NEParams(); 039 p.hitGlowSizeMult = 0.75f; 040 p.noiseMag = 1f; 041// p.radius = 35f; 042// p.noiseMult = 3f; 043 p.radius = 15f; 044 p.noiseMult = 2f; 045 p.color = new Color(255,55,255,155); 046 p.blackColor = new Color(255,155,255,255); 047 p.color = new Color(255,55,55,155); 048 p.blackColor = new Color(255,155,155,255); 049 050 //p.thickness = 25f; 051 p.underglow = null; 052 p.spawnHitGlowAt = 0f; 053 p.withHitGlow = false; 054 //p.additiveBlend = true; 055 056 057 visual = new NegativeExplosionVisual(p); 058 visual.init(ship); 059 visual.getFader().forceIn(); 060 } 061 062 @Override 063 public void advance(float amount) { 064 super.advance(amount); 065 066 visual.getFader().fadeIn(); 067 visual.advance(amount * 0.5f); 068 069 interval.advance(amount * 30f); 070 if (interval.intervalElapsed() && !ship.getFluxTracker().isOverloadedOrVenting()) { 071 EmpArcParams params = new EmpArcParams(); 072 params.segmentLengthMult = 4f; 073 params.glowSizeMult = 2.5f; 074 075 if ((float) Math.random() < 0.1f) { 076 params.glowSizeMult = 7f; 077 } 078 //params.glowSizeMult = 1.5f; 079 //params.zigZagReductionFactor = 0f; 080 //params.brightSpotFadeFraction = 0.33f; 081 082 //params.brightSpotFullFraction = 0.33f; 083 084 params.flickerRateMult = 0.5f + (float) Math.random() * 0.5f; 085 086 params.fadeOutDist = 30f; 087 params.minFadeOutMult = 5f; 088 params.flickerRateMult *= 0.3f; 089 params.movementDurOverride = 0.3f; 090 091 Color fringe = DwellerShroud.SHROUD_OVERLOAD_FRINGE_COLOR; 092 fringe = new Color(150, 30, 40, 255); 093 Color core = Color.white; 094 fringe = new Color(150, 30, 40, 255); 095 core = new Color(255, 150, 190, 255); 096 097 fringe = new Color(150, 30, 30, 255); 098 core = new Color(255, 150, 150, 255); 099 100 float thickness = 80f; 101 thickness = 40f; 102 103 Vector2f loc = ship.getLocation(); 104 float r = radius * 1.1f; 105 r = r * 0.5f + r * 0.5f * (float) Math.random(); 106 Vector2f from = Misc.getPointAtRadius(loc, r); 107 108 Vector2f to = new Vector2f(loc); 109 to = Misc.getPointWithinRadius(to, radius * 0.1f); 110 111 boolean goingOutside = false; 112 if ((float) Math.random() < 0.4f && false) { 113 Vector2f temp = to; 114 to = from; 115 from = temp; 116 goingOutside = true; 117 } 118 119 CombatEngineAPI engine = Global.getCombatEngine(); 120 EmpArcEntityAPI arc = (EmpArcEntityAPI)engine.spawnEmpArcVisual( 121 from, ship, to, ship, thickness, fringe, core, params); 122 123 arc.setCoreWidthOverride(60f); 124 arc.setCoreWidthOverride(20f); 125 arc.setCoreWidthOverride(25f); 126 127 if (goingOutside) { 128 arc.setRenderGlowAtEnd(false); 129 } else { 130 arc.setRenderGlowAtStart(false); 131 arc.setFadedOutAtStart(true); 132 } 133 134 arc.setSingleFlickerMode(true); 135 136// arc.setRenderGlowAtStart(false); 137// arc.setFadedOutAtStart(true); 138 139 if (ship.getSystem() != null && ship.getSystem().getEffectLevel() > 0f) { 140 float level = ship.getSystem().getEffectLevel(); 141 Vector2f pt = Misc.getPointWithinRadius(loc, 20f * level); 142 //engine.addHitParticle(pt, ship.getVelocity(), 75f, 0.5f, core); 143 engine.addNebulaParticle(pt, ship.getVelocity(), 35f + 30f * level, 2f, 144 0f, 0f, 1f, core); 145 } 146 } 147 148 if (!ship.getFluxTracker().isOverloadedOrVenting()) { 149 Global.getSoundPlayer().playLoop("shrouded_eye_loop", 150 ship, 1f, 0.5f + 0.5f * ship.getFluxLevel(), 151 ship.getLocation(), ship.getVelocity()); 152 } 153 } 154 155 @Override 156 protected void renderImpl(float x, float y, float alphaMult, float angle, CombatEngineLayers layer) { 157 super.renderImpl(x, y, alphaMult, angle, layer); 158 159 ViewportAPI viewport = Global.getCombatEngine().getViewport(); 160 float vAlpha = viewport.getAlphaMult(); 161 viewport.setAlphaMult(alphaMult); 162 if (layer == CombatEngineLayers.BELOW_INDICATORS_LAYER) { 163 visual.render(CombatEngineLayers.ABOVE_PARTICLES_LOWER, viewport); 164 visual.render(CombatEngineLayers.ABOVE_PARTICLES, viewport); 165 } 166// if (layer == CombatEngineLayers.ABOVE_PARTICLES_LOWER) { 167// visual.render(CombatEngineLayers.ABOVE_PARTICLES_LOWER, viewport); 168// } 169// if (layer == CombatEngineLayers.ABOVE_PARTICLES) { 170// visual.render(CombatEngineLayers.ABOVE_PARTICLES, viewport); 171// } 172 viewport.setAlphaMult(vAlpha); 173 } 174 175 } 176 177 178 public static float BEAM_RANGE_BONUS = 1200f; 179 public static float HARD_FLUX_DISSIPATION_PERCENT = 100f; 180 public static float DAMAGE_MULT = 0.75f; 181 182 @Override 183 public void initBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) { 184 super.initBeforeShipCreation(hullSize, stats, id); 185 186 stats.getBallisticWeaponFluxCostMod().modifyMult(id, 0); 187 stats.getEnergyWeaponFluxCostMod().modifyMult(id, 0); 188 stats.getMissileWeaponFluxCostMod().modifyMult(id, 0); 189 190 stats.getBeamWeaponRangeBonus().modifyFlat(id, BEAM_RANGE_BONUS); 191 192 stats.getBeamWeaponDamageMult().modifyMult(id, DAMAGE_MULT); 193 194 // basically instant 195 stats.getShieldUnfoldRateMult().modifyPercent(id, 10000f); 196 // doesn't matter if unfold is instant 197 //stats.getShieldTurnRateMult().modifyPercent(id, SHIELD_BONUS_TURN); 198 199 stats.getHardFluxDissipationFraction().modifyFlat(id, (float)HARD_FLUX_DISSIPATION_PERCENT * 0.01f); 200 } 201 202 203 @Override 204 protected DwellerCombatPlugin createPlugin(ShipAPI ship) { 205 DwellerCombatPlugin plugin = super.createPlugin(ship); 206 207 List<DwellerShipPart> parts = plugin.getParts(); 208 parts.clear(); 209 210 //WobblyPart part = new WobblyPart("shrouded_eye_base", 1f, 5, 5, 1f, new Vector2f(0, 0), 0f); 211 WobblyPart part = new WobblyPart("shrouded_eye_base_dark", 1f, 5, 5, 1f, new Vector2f(0, 0), 0f); 212 parts.add(part); 213 214 Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR; 215 //glow = new Color(150, 30, 80, 255); 216 217 part = new WobblyPart("shrouded_eye_iris", 0.6f, 3, 3, 1f, new Vector2f(0, 0), 0f); 218 part.color = glow; 219 part.additiveBlend = true; 220 part.alphaMult = 0.5f; 221 //part.setWeaponActivated(); 222 parts.add(part); 223 224 PlasmaEyePart eyePart = new PlasmaEyePart(new Vector2f(0, 0), 0f, ship, 110f); 225 parts.add(eyePart); 226 227// plugin.getActiveLayers().add(CombatEngineLayers.ABOVE_PARTICLES_LOWER); 228// plugin.getActiveLayers().add(CombatEngineLayers.ABOVE_PARTICLES); 229 230 return plugin; 231 } 232 233 @Override 234 protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) { 235// params.maxOffset = 50f; 236// params.initialMembers = 50; 237// params.negativeParticleAreaMult = 1.5f; 238 239 params.maxOffset = 130f; 240// params.initialMembers = 2000; 241// params.baseMembersToMaintain = params.initialMembers; 242// params.numToRespawn = 100; 243 244 //params.negativeParticleClearCenterAreaRadius = 150f; 245 params.negativeParticleClearCenterAreaRadius = 50f; 246 247// public static Color SHROUD_COLOR = new Color(100, 0, 25, 255); 248// public static Color SHROUD_GLOW_COLOR = new Color(150, 0, 30, 255); 249// params.color = new Color(100, 10, 10, 255); 250// params.flashFringeColor = new Color(150, 12, 12, 255); 251// params.color = new Color(100, 0, 0, 255); 252// params.flashFringeColor = new Color(150, 0, 0, 255); 253// params.flashCoreColor = Misc.setBrightness(params.color, 255); 254 255 //params.negativeParticleHighContrastMode = true; 256// params.negativeParticleNumBase = 4; 257// params.negativeParticleNumOverloaded = 4; 258 //params.negativeParticleClearCenterAreaRadius = 200f; 259 //params.negativeParticleAreaMult = 0.75f; 260 } 261 262} 263 264 265 266 267 268 269 270 271