Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package data.shipsystems.scripts;
- import com.fs.starfarer.api.Global;
- import com.fs.starfarer.api.combat.CombatEngineAPI;
- import com.fs.starfarer.api.combat.CombatEntityAPI;
- import com.fs.starfarer.api.combat.DamageType;
- import com.fs.starfarer.api.combat.MutableShipStatsAPI;
- import com.fs.starfarer.api.combat.ShipAPI;
- import com.fs.starfarer.api.plugins.ShipSystemStatsScript;
- import data.scripts.util.AnamorphicFlare;
- import java.awt.Color;
- import org.apache.log4j.Level;
- import org.lazywizard.lazylib.MathUtils;
- import org.lazywizard.lazylib.FastTrig;
- import org.lazywizard.lazylib.VectorUtils;
- import org.lazywizard.lazylib.combat.CombatUtils;
- import org.lwjgl.util.vector.Vector2f;
- // Phase teleporter system, with some extras
- public class DeracinatorStatsSmall implements ShipSystemStatsScript {
- // "Inhale" effect constants
- private static final int MAX_PARTICLES_PER_FRAME = 9; // Based on charge level
- private static final float PARTICLE_RADIUS = 130f;
- private static final float PARTICLE_SIZE = 5f;
- private static final Color PARTICLE_COLOR = new Color(155, 240, 200);
- private static final float PARTICLE_OPACITY = 0.85f;
- private static final String CHARGEUP_SOUND = "system_deracinatorchargesmall";
- // Explosion effect constants
- private static final Color EXPLOSION_COLOR = new Color(55, 160, 88);
- private static final float EXPLOSION_VISUAL_RADIUS = 750f;
- private static final float EXPLOSION_PUSH_RADIUS = 500f;
- private static final String EXPLOSION_SOUND = "luciferdriveactivate2";
- // Explosion damage constants
- private static final float EXPLOSION_DAMAGE_AMOUNT = 750f;
- private static final float EXPLOSION_EMP_DAMAGE_AMOUNT = 1200f;
- private static final float EXPLOSION_DAMAGE_VS_ALLIES_MODIFIER = .11f;
- private static final float EXPLOSION_EMP_VS_ALLIES_MODIFIER = .05f;
- private static final DamageType EXPLOSION_DAMAGE_TYPE = DamageType.ENERGY;
- private static final float DAMAGE_MOD_VS_FIGHTER = 0.95f;
- private static final float DAMAGE_MOD_VS_FRIGATE = 0.9f;
- private static final float DAMAGE_MOD_VS_DESTROYER = 0.5f;
- private static final float DAMAGE_MOD_VS_CRUISER = 0.20f;
- private static final float DAMAGE_MOD_VS_CAPITAL = 0.15f;
- // Explosion force constants
- private static final float EXPLOSION_FORCE_VS_ALLIES_MODIFIER = .5f;
- private static final float FORCE_VS_ASTEROID = 290f;
- private static final float FORCE_VS_FIGHTER = 205f;
- private static final float FORCE_VS_FRIGATE = 120f;
- private static final float FORCE_VS_DESTROYER = 85f;
- private static final float FORCE_VS_CRUISER = 40f;
- private static final float FORCE_VS_CAPITAL = 25f;
- // Local variables, don't touch these
- private boolean isActive = false;
- static {
- // Set to Level.DEBUG if you need to track down a problem in the system
- Global.getLogger(DeracinatorStatsSmall.class).setLevel(Level.ERROR);
- }
- @Override
- public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
- // instanceof also acts as a null check
- if (!(stats.getEntity() instanceof ShipAPI)) {
- return;
- }
- ShipAPI ship = (ShipAPI) stats.getEntity();
- // Chargeup, show particle inhalation effect
- if (state == State.IN) {
- // Everything in this block is only done once per chargeup
- if (!isActive) {
- Global.getLogger(DeracinatorStatsSmall.class).log(Level.INFO, "Started State.IN");
- isActive = true;
- Global.getSoundPlayer().playSound(CHARGEUP_SOUND, 1f, 1f, ship.getLocation(), ship.getVelocity());
- }
- // Exact amount per second doesn't matter since it's purely decorative
- Vector2f particlePos, particleVel;
- int numParticlesThisFrame = Math.round(effectLevel * MAX_PARTICLES_PER_FRAME);
- for (int x = 0; x < numParticlesThisFrame; x++) {
- particlePos = MathUtils.getRandomPointOnCircumference(ship.getLocation(), PARTICLE_RADIUS);
- particleVel = Vector2f.sub(ship.getLocation(), particlePos, null);
- Global.getCombatEngine().addSmokeParticle(particlePos, particleVel, PARTICLE_SIZE, PARTICLE_OPACITY, 1f, PARTICLE_COLOR);
- }
- } // Cooldown, explode once system is finished
- else if (state == State.OUT) {
- // Everything in this section is only done once per cooldown
- if (isActive) {
- CombatEngineAPI engine = Global.getCombatEngine();
- engine.spawnExplosion(ship.getLocation(), ship.getVelocity(), EXPLOSION_COLOR, EXPLOSION_VISUAL_RADIUS, 0.21f);
- engine.spawnExplosion(ship.getLocation(), ship.getVelocity(), EXPLOSION_COLOR, EXPLOSION_VISUAL_RADIUS / 2f, 0.19f);
- Global.getSoundPlayer().playSound(EXPLOSION_SOUND, 1f, 1f, ship.getLocation(), ship.getVelocity());
- Vector2f loc = new Vector2f(ship.getLocation());
- loc.x -= 8f * FastTrig.cos(ship.getFacing() * Math.PI / 180f);
- loc.y -= 8f * FastTrig.sin(ship.getFacing() * Math.PI / 180f);
- AnamorphicFlare.createFlare(ship, new Vector2f(loc), engine, 1f, 0.05f, -15f + (float) Math.random() * 30f, 10f, 6f, EXPLOSION_COLOR, PARTICLE_COLOR);
- ShipAPI victim;
- Vector2f dir;
- float force, damage, emp, mod;
- for (CombatEntityAPI tmp : CombatUtils.getEntitiesWithinRange(ship.getLocation(), EXPLOSION_PUSH_RADIUS)) {
- if (tmp == ship) {
- continue;
- }
- mod = 1f - (MathUtils.getDistance(ship, tmp) / EXPLOSION_PUSH_RADIUS);
- Global.getLogger(DeracinatorStatsSmall.class).log(Level.DEBUG, "Modifier for " + tmp.toString() + "=" + mod);
- force = FORCE_VS_ASTEROID * mod;
- damage = EXPLOSION_DAMAGE_AMOUNT * mod;
- emp = EXPLOSION_EMP_DAMAGE_AMOUNT * mod;
- if (tmp instanceof ShipAPI) {
- victim = (ShipAPI) tmp;
- // Modify push strength based on ship class
- if (victim.getHullSize() == ShipAPI.HullSize.FIGHTER) {
- force = FORCE_VS_FIGHTER * mod;
- damage /= DAMAGE_MOD_VS_FIGHTER;
- } else if (victim.getHullSize() == ShipAPI.HullSize.FRIGATE) {
- force = FORCE_VS_FRIGATE * mod;
- damage /= DAMAGE_MOD_VS_FRIGATE;
- } else if (victim.getHullSize() == ShipAPI.HullSize.DESTROYER) {
- force = FORCE_VS_DESTROYER * mod;
- damage /= DAMAGE_MOD_VS_DESTROYER;
- } else if (victim.getHullSize() == ShipAPI.HullSize.CRUISER) {
- force = FORCE_VS_CRUISER * mod;
- damage /= DAMAGE_MOD_VS_CRUISER;
- } else if (victim.getHullSize() == ShipAPI.HullSize.CAPITAL_SHIP) {
- force = FORCE_VS_CAPITAL * mod;
- damage /= DAMAGE_MOD_VS_CAPITAL;
- }
- if (victim.getOwner() == ship.getOwner()) {
- damage *= EXPLOSION_DAMAGE_VS_ALLIES_MODIFIER;
- emp *= EXPLOSION_EMP_VS_ALLIES_MODIFIER;
- force *= EXPLOSION_FORCE_VS_ALLIES_MODIFIER;
- }
- Global.getLogger(DeracinatorStatsSmall.class).log(Level.DEBUG,
- ship.getVariant().getDisplayName()
- + " dealing damage " + damage + " and emp " + emp
- + " to " + victim.getVariant().getDisplayName());
- if (victim.getShield() != null && victim.getShield().isOn() && victim.getShield().isWithinArc(ship.getLocation())) {
- victim.getFluxTracker().increaseFlux(damage * 2, true);
- } else {
- for (int x = 0; x < 5; x++) {
- engine.spawnEmpArc(ship, MathUtils.getRandomPointInCircle(victim.getLocation(), victim.getCollisionRadius()),
- victim, victim, EXPLOSION_DAMAGE_TYPE, damage / 10,
- emp / 5, EXPLOSION_PUSH_RADIUS, null, 2f,
- EXPLOSION_COLOR, EXPLOSION_COLOR);
- }
- }
- }
- dir = VectorUtils.getDirectionalVector(ship.getLocation(), tmp.getLocation());
- dir.scale(force);
- Global.getLogger(DeracinatorStatsSmall.class).log(Level.DEBUG,
- ship.getVariant().getDisplayName() + " pushing "
- + tmp.toString() + " with force " + force);
- Vector2f.add(tmp.getVelocity(), dir, tmp.getVelocity());
- }
- isActive = false;
- }
- }
- }
- @Override
- public void unapply(MutableShipStatsAPI stats, String id) {
- }
- @Override
- public StatusData getStatusData(int index, State state, float effectLevel) {
- if (state == State.IN) {
- if (index == 0) {
- return new StatusData("charging scalar deracinator", false);
- } else if (index == 1) {
- return new StatusData("weapons and shields inoperable", true);
- }
- }
- return null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement