package data.scripts.weapons;
import com.fs.starfarer.api.combat.*;
import com.fs.starfarer.api.loading.MuzzleFlashSpec;
import org.lazywizard.lazylib.MathUtils;
import com.fs.starfarer.api.util.IntervalUtil;
import org.lazywizard.lazylib.VectorUtils;
import org.lazywizard.lazylib.combat.CombatUtils;
import org.lwjgl.util.vector.Vector2f;
import data.scripts.util.MagicRender;
import java.awt.*;
import java.util.List;
public class SCQ_NRT_RevolverEffect implements EveryFrameWeaponEffectPlugin {
//effects
private Color explosionColor = new Color(160, 105, 17, 100);
private Color flashColor = new Color(216, 161, 39, 150);
private final Color SMOKE1_COLOR = new Color(100, 100, 100, 130);
private final Color SMOKE2_COLOR = new Color(75, 75, 75, 110);
private final Color SMOKE3_COLOR = new Color(40, 40, 40, 60);
private boolean runOnce = false,
applyDamageBonus = false;
private float burstSpread,
burstRange,
damageRange,
modifier,
baseBurstDamage,
originWeaponDamage,
barrelOffset,
lastRoundBonusMult;
private static final float MEDIUM_DAMAGE = 150f,
LARGE_DAMAGE = 200f;
private int barrelNumber;
private Vector2f location,
barrelLocation;
private DamagingProjectileAPI proj; //The projectile itself
private final IntervalUtil timer = new IntervalUtil(0.05f, 0.15f);
private static WeaponAPI.WeaponSize weaponSize;
private MuzzleFlashSpec originMuzzleFlash;
@Override
public void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon) {
if (weapon.getShip().getOriginalOwner() == -1 || weapon.getShip().isHulk()) {
return;
}
if (!runOnce) {
//originWeaponDamage = weapon.getDamage().getDamage();
weaponSize = weapon.getSize();
originMuzzleFlash = weapon.getMuzzleFlashSpec().clone();
weapon.ensureClonedSpec();
weapon.setMaxAmmo(weapon.getSpec().getMaxAmmo());
switch (weaponSize) {
case MEDIUM:
originWeaponDamage = MEDIUM_DAMAGE;
burstSpread = 30f;
burstRange = 90f;
damageRange = 80f;
baseBurstDamage = 30f;
barrelNumber = 1;
lastRoundBonusMult = 1.5f;
if (weapon.getSlot().isTurret()) {
barrelOffset = 24.0f;
} else barrelOffset = 30.0f;
break;
case LARGE:
originWeaponDamage = LARGE_DAMAGE;
burstSpread = 35f;
burstRange = 120f;
damageRange = 100f;
baseBurstDamage = 50f;
barrelNumber = 2;
lastRoundBonusMult = 1.8f;
if (weapon.getSlot().isTurret()) {
barrelOffset = 32.0f;
} else barrelOffset = 38.0f;
break;
default:
return;
}
runOnce = true;
}
barrelLocation = new Vector2f (weapon.getLocation().getX() + barrelOffset, weapon.getLocation().getY());
VectorUtils.rotateAroundPivot(barrelLocation, weapon.getLocation(), weapon.getCurrAngle());
if (weapon.getAmmo() <= barrelNumber && weapon.getCooldownRemaining() <= 0.05f && weapon.getChargeLevel() <= 0.05f) {
applyDamageBonus = true;
} else if (weapon.getAmmo() > barrelNumber) {
applyDamageBonus = false;
}
if (applyDamageBonus) {
modifier = lastRoundBonusMult;
if (weapon.isFiring()) {
List<DamagingProjectileAPI> projectiles = engine.getProjectiles();
int size = projectiles.size();
for (int i = 0; i < size; i++) {
proj = projectiles.get(i);
if (proj != null && proj.getWeapon().getId() == weapon.getSpec().getWeaponId() && proj.getElapsed() < 0.05f) {
proj.setDamageAmount(originWeaponDamage * modifier);
}
}
}
weapon.getMuzzleFlashSpec().setParticleColor(new Color(220, 60, 20, 200));
timer.advance(amount);
if(timer.intervalElapsed() && MagicRender.screenCheck(0.1f, weapon.getLocation()) && weapon.getAmmo() > 0){
engine.addHitParticle(
weapon.getLocation(),
weapon.getShip().getVelocity(),
MathUtils.getRandomNumberInRange(30, 50),
0.7f,
MathUtils.getRandomNumberInRange(0.2f, 0.35f),
new Color(220, 120, 40, 150)
);
}
} else {
modifier = 1f;
weapon.getMuzzleFlashSpec().setParticleColor(originMuzzleFlash.getParticleColor());
//muzzleFlash effects
weapon.getMuzzleFlashSpec().setLength(originMuzzleFlash.getLength() * modifier);
weapon.getMuzzleFlashSpec().setSpread(originMuzzleFlash.getSpread() * modifier);
weapon.getMuzzleFlashSpec().setParticleCount((originMuzzleFlash.getParticleCount() * (int) (modifier * 10)) / 10);
}
if (weapon.isFiring()) {
applyExplosion(amount, engine, weapon);
}
}
private void applyExplosion(float amount, CombatEngineAPI engine, WeaponAPI weapon) {
if (applyDamageBonus && weapon.isFiring()) {
explosionColor = new Color(200, 53, 13, 150);
flashColor = new Color(255, 75, 48, 200);
} else if (!applyDamageBonus) {
explosionColor = new Color(160, 105, 17, 100);
flashColor = new Color(216, 161, 39, 150);
}
float random = ((float) barrelNumber + (float) Math.random() * 1 * modifier) / (4 - modifier);
for (int j = 0; j <= random; j++) {
location = MathUtils.getRandomPointInCone(barrelLocation, burstRange * modifier, weapon.getCurrAngle() - (burstSpread * modifier), weapon.getCurrAngle() + (burstSpread * modifier));
//add an explosion effect at that point
//void spawnExplosion(Vector2f loc, Vector2f vel, Color color, float size, float maxDuration);
engine.addHitParticle(location,new Vector2f(), MathUtils.getRandomNumberInRange(12f * modifier, 25f * modifier),0.8f, 0.3f * modifier, explosionColor);
engine.addHitParticle(location,new Vector2f(), MathUtils.getRandomNumberInRange(8f * modifier, 15f * modifier),0.5f, 0.1f * modifier, flashColor);
//engine.spawnExplosion(location, new Vector2f(), explosionColor, MathUtils.getRandomNumberInRange(9f, 22f), 0.05f);
//engine.spawnExplosion(location, new Vector2f(), flashColor, MathUtils.getRandomNumberInRange(6f, 15f), 0.05f);
//public void addSmokeParticle(Vector2f loc, Vector2f vel, float size, float opacity, float duration, Color color);
engine.addSmokeParticle(location, new Vector2f(), MathUtils.getRandomNumberInRange(7f * modifier, 14f * modifier), 0.1f, 0.50f * modifier, SMOKE3_COLOR);
engine.addSmokeParticle(location, new Vector2f(), MathUtils.getRandomNumberInRange(6f * modifier, 12f * modifier), 0.1f, 0.25f * modifier, SMOKE2_COLOR);
engine.addSmokeParticle(location, new Vector2f(), MathUtils.getRandomNumberInRange(5f * modifier, 10f * modifier), 0.1f, 0.12f * modifier, SMOKE1_COLOR);
}
List<MissileAPI> nearbyMissiles = CombatUtils.getMissilesWithinRange(location, damageRange * modifier); //damage nearby missiles
if (!nearbyMissiles.isEmpty()) {
for (MissileAPI missiles : nearbyMissiles) {
engine.applyDamage(
missiles,
location,
baseBurstDamage * modifier,
DamageType.ENERGY,
0f,
false,
false,
weapon.getShip()
);
}
}
List<ShipAPI> nearbyShips = CombatUtils.getShipsWithinRange(location, damageRange * modifier); //damage nearby ships
if (!nearbyShips.isEmpty()) {
if (nearbyShips.contains(weapon.getShip())) {
nearbyShips.remove(weapon.getShip());
}
for (CombatEntityAPI ship : nearbyShips) {
engine.applyDamage(
ship,
location,
baseBurstDamage * modifier,
DamageType.ENERGY,
0f,
false,
false,
weapon.getShip()
);
}
}
}
}