001package com.fs.starfarer.api.impl.combat; 002 003import java.awt.Color; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.Global; 008import com.fs.starfarer.api.combat.CombatEngineAPI; 009import com.fs.starfarer.api.combat.CombatEntityAPI; 010import com.fs.starfarer.api.combat.DamagingProjectileAPI; 011import com.fs.starfarer.api.combat.ProximityExplosionEffect; 012import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual.NEParams; 013import com.fs.starfarer.api.loading.MissileSpecAPI; 014import com.fs.starfarer.api.util.Misc; 015 016public class RiftCascadeMineExplosion implements ProximityExplosionEffect { 017 018 public static String SIZE_MULT_KEY = "core_sizeMultKey"; 019 020 public void onExplosion(DamagingProjectileAPI explosion, DamagingProjectileAPI originalProjectile) { 021 Float sizeMult = null; 022 if (originalProjectile.getCustomData() != null) { 023 sizeMult = (Float) originalProjectile.getCustomData().get(SIZE_MULT_KEY); 024 } 025 if (sizeMult == null) sizeMult = 1f; 026 027 NEParams p = createStandardRiftParams("riftcascade_minelayer", 25f * sizeMult); 028 p.fadeOut = 1f; 029 //p.hitGlowSizeMult = 0.5f; 030 spawnStandardRift(explosion, p); 031 } 032 033// public static void spawnStandardRift(DamagingProjectileAPI explosion, String minelayerId, float baseRadius) { 034// NEParams p = createStandardRiftParams(minelayerId, baseRadius); 035// spawnStandardRift(explosion, p); 036// } 037 038 public static void spawnStandardRift(DamagingProjectileAPI explosion, NEParams params) { 039 CombatEngineAPI engine = Global.getCombatEngine(); 040 explosion.addDamagedAlready(explosion.getSource()); 041 042 CombatEntityAPI prev = null; 043 for (int i = 0; i < params.numRiftsToSpawn; i++) { // 2 by default 044 NEParams p = params.clone(); 045 p.radius *= 0.75f + 0.5f * (float) Math.random(); 046 047 p.withHitGlow = prev == null; 048 049 Vector2f loc = new Vector2f(explosion.getLocation()); 050 //loc = Misc.getPointWithinRadius(loc, p.radius * 1f); 051 loc = Misc.getPointAtRadius(loc, p.radius * 0.4f); 052 053 CombatEntityAPI e = engine.addLayeredRenderingPlugin(new NegativeExplosionVisual(p)); 054 e.getLocation().set(loc); 055 056 if (prev != null) { 057 float dist = Misc.getDistance(prev.getLocation(), loc); 058 Vector2f vel = Misc.getUnitVectorAtDegreeAngle(Misc.getAngleInDegrees(loc, prev.getLocation())); 059 vel.scale(dist / (p.fadeIn + p.fadeOut) * 0.7f); 060 e.getVelocity().set(vel); 061 } 062 063 prev = e; 064 } 065 066 } 067 068 069 public static NEParams createStandardRiftParams(String minelayerId, float baseRadius) { 070 Color color = new Color(100,100,255,255); 071 Object o = Global.getSettings().getWeaponSpec(minelayerId).getProjectileSpec(); 072 if (o instanceof MissileSpecAPI) { 073 MissileSpecAPI spec = (MissileSpecAPI) o; 074 color = spec.getGlowColor(); 075 } 076 NEParams p = createStandardRiftParams(color, baseRadius); 077 return p; 078 } 079 080 public static NEParams createStandardRiftParams(Color borderColor, float radius) { 081 NEParams p = new NEParams(); 082 //p.radius = 50f; 083 p.hitGlowSizeMult = .75f; 084 //p.hitGlowSizeMult = .67f; 085 p.spawnHitGlowAt = 0f; 086 p.noiseMag = 1f; 087 //p.fadeIn = 0f; 088 //p.fadeOut = 0.25f; 089 090 //p.color = new Color(175,100,255,255); 091 092 //p.hitGlowSizeMult = .75f; 093 p.fadeIn = 0.1f; 094 //p.noisePeriod = 0.05f; 095 p.underglow = RiftCascadeEffect.EXPLOSION_UNDERCOLOR; 096 //p.withHitGlow = i == 0; 097 p.withHitGlow = true; 098 099 //p.radius = 20f; 100 p.radius = radius; 101 //p.radius *= 0.75f + 0.5f * (float) Math.random(); 102 103 p.color = borderColor; 104 return p; 105 } 106 107 108} 109 110 111