Advertisement
DarkRevenant

Untitled

Apr 27th, 2014
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.71 KB | None | 0 0
  1. package data.shipsystems.scripts;
  2.  
  3. import com.fs.starfarer.api.Global;
  4. import com.fs.starfarer.api.combat.CombatEngineAPI;
  5. import com.fs.starfarer.api.combat.CombatEntityAPI;
  6. import com.fs.starfarer.api.combat.DamageType;
  7. import com.fs.starfarer.api.combat.MutableShipStatsAPI;
  8. import com.fs.starfarer.api.combat.ShipAPI;
  9. import com.fs.starfarer.api.plugins.ShipSystemStatsScript;
  10. import data.scripts.util.AnamorphicFlare;
  11. import java.awt.Color;
  12. import org.apache.log4j.Level;
  13. import org.lazywizard.lazylib.MathUtils;
  14. import org.lazywizard.lazylib.FastTrig;
  15. import org.lazywizard.lazylib.VectorUtils;
  16. import org.lazywizard.lazylib.combat.CombatUtils;
  17. import org.lwjgl.util.vector.Vector2f;
  18.  
  19. // Phase teleporter system, with some extras
  20. public class DeracinatorStatsSmall implements ShipSystemStatsScript {
  21.  
  22.     // "Inhale" effect constants
  23.     private static final int MAX_PARTICLES_PER_FRAME = 9; // Based on charge level
  24.     private static final float PARTICLE_RADIUS = 130f;
  25.     private static final float PARTICLE_SIZE = 5f;
  26.     private static final Color PARTICLE_COLOR = new Color(155, 240, 200);
  27.     private static final float PARTICLE_OPACITY = 0.85f;
  28.     private static final String CHARGEUP_SOUND = "system_deracinatorchargesmall";
  29.     // Explosion effect constants
  30.     private static final Color EXPLOSION_COLOR = new Color(55, 160, 88);
  31.     private static final float EXPLOSION_VISUAL_RADIUS = 750f;
  32.     private static final float EXPLOSION_PUSH_RADIUS = 500f;
  33.     private static final String EXPLOSION_SOUND = "luciferdriveactivate2";
  34.     // Explosion damage constants
  35.     private static final float EXPLOSION_DAMAGE_AMOUNT = 750f;
  36.     private static final float EXPLOSION_EMP_DAMAGE_AMOUNT = 1200f;
  37.     private static final float EXPLOSION_DAMAGE_VS_ALLIES_MODIFIER = .11f;
  38.     private static final float EXPLOSION_EMP_VS_ALLIES_MODIFIER = .05f;
  39.     private static final DamageType EXPLOSION_DAMAGE_TYPE = DamageType.ENERGY;
  40.     private static final float DAMAGE_MOD_VS_FIGHTER = 0.95f;
  41.     private static final float DAMAGE_MOD_VS_FRIGATE = 0.9f;
  42.     private static final float DAMAGE_MOD_VS_DESTROYER = 0.5f;
  43.     private static final float DAMAGE_MOD_VS_CRUISER = 0.20f;
  44.     private static final float DAMAGE_MOD_VS_CAPITAL = 0.15f;
  45.     // Explosion force constants
  46.     private static final float EXPLOSION_FORCE_VS_ALLIES_MODIFIER = .5f;
  47.     private static final float FORCE_VS_ASTEROID = 290f;
  48.     private static final float FORCE_VS_FIGHTER = 205f;
  49.     private static final float FORCE_VS_FRIGATE = 120f;
  50.     private static final float FORCE_VS_DESTROYER = 85f;
  51.     private static final float FORCE_VS_CRUISER = 40f;
  52.     private static final float FORCE_VS_CAPITAL = 25f;
  53.     // Local variables, don't touch these
  54.     private boolean isActive = false;
  55.  
  56.     static {
  57.         // Set to Level.DEBUG if you need to track down a problem in the system
  58.         Global.getLogger(DeracinatorStatsSmall.class).setLevel(Level.ERROR);
  59.     }
  60.  
  61.     @Override
  62.     public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
  63.         // instanceof also acts as a null check
  64.         if (!(stats.getEntity() instanceof ShipAPI)) {
  65.             return;
  66.         }
  67.  
  68.         ShipAPI ship = (ShipAPI) stats.getEntity();
  69.         // Chargeup, show particle inhalation effect
  70.         if (state == State.IN) {
  71.             // Everything in this block is only done once per chargeup
  72.             if (!isActive) {
  73.                 Global.getLogger(DeracinatorStatsSmall.class).log(Level.INFO, "Started State.IN");
  74.                 isActive = true;
  75.                 Global.getSoundPlayer().playSound(CHARGEUP_SOUND, 1f, 1f, ship.getLocation(), ship.getVelocity());
  76.             }
  77.  
  78.             // Exact amount per second doesn't matter since it's purely decorative
  79.             Vector2f particlePos, particleVel;
  80.             int numParticlesThisFrame = Math.round(effectLevel * MAX_PARTICLES_PER_FRAME);
  81.             for (int x = 0; x < numParticlesThisFrame; x++) {
  82.                 particlePos = MathUtils.getRandomPointOnCircumference(ship.getLocation(), PARTICLE_RADIUS);
  83.                 particleVel = Vector2f.sub(ship.getLocation(), particlePos, null);
  84.                 Global.getCombatEngine().addSmokeParticle(particlePos, particleVel, PARTICLE_SIZE, PARTICLE_OPACITY, 1f, PARTICLE_COLOR);
  85.             }
  86.         } // Cooldown, explode once system is finished
  87.         else if (state == State.OUT) {
  88.             // Everything in this section is only done once per cooldown
  89.             if (isActive) {
  90.                 CombatEngineAPI engine = Global.getCombatEngine();
  91.                 engine.spawnExplosion(ship.getLocation(), ship.getVelocity(), EXPLOSION_COLOR, EXPLOSION_VISUAL_RADIUS, 0.21f);
  92.                 engine.spawnExplosion(ship.getLocation(), ship.getVelocity(), EXPLOSION_COLOR, EXPLOSION_VISUAL_RADIUS / 2f, 0.19f);
  93.  
  94.                 Global.getSoundPlayer().playSound(EXPLOSION_SOUND, 1f, 1f, ship.getLocation(), ship.getVelocity());
  95.                 Vector2f loc = new Vector2f(ship.getLocation());
  96.                 loc.x -= 8f * FastTrig.cos(ship.getFacing() * Math.PI / 180f);
  97.                 loc.y -= 8f * FastTrig.sin(ship.getFacing() * Math.PI / 180f);
  98.                 AnamorphicFlare.createFlare(ship, new Vector2f(loc), engine, 1f, 0.05f, -15f + (float) Math.random() * 30f, 10f, 6f, EXPLOSION_COLOR, PARTICLE_COLOR);
  99.  
  100.                 ShipAPI victim;
  101.                 Vector2f dir;
  102.                 float force, damage, emp, mod;
  103.                 for (CombatEntityAPI tmp : CombatUtils.getEntitiesWithinRange(ship.getLocation(), EXPLOSION_PUSH_RADIUS)) {
  104.                     if (tmp == ship) {
  105.                         continue;
  106.                     }
  107.  
  108.                     mod = 1f - (MathUtils.getDistance(ship, tmp) / EXPLOSION_PUSH_RADIUS);
  109.                     Global.getLogger(DeracinatorStatsSmall.class).log(Level.DEBUG, "Modifier for " + tmp.toString() + "=" + mod);
  110.                     force = FORCE_VS_ASTEROID * mod;
  111.                     damage = EXPLOSION_DAMAGE_AMOUNT * mod;
  112.                     emp = EXPLOSION_EMP_DAMAGE_AMOUNT * mod;
  113.  
  114.                     if (tmp instanceof ShipAPI) {
  115.                         victim = (ShipAPI) tmp;
  116.  
  117.                         // Modify push strength based on ship class
  118.                         if (victim.getHullSize() == ShipAPI.HullSize.FIGHTER) {
  119.                             force = FORCE_VS_FIGHTER * mod;
  120.                             damage /= DAMAGE_MOD_VS_FIGHTER;
  121.                         } else if (victim.getHullSize() == ShipAPI.HullSize.FRIGATE) {
  122.                             force = FORCE_VS_FRIGATE * mod;
  123.                             damage /= DAMAGE_MOD_VS_FRIGATE;
  124.                         } else if (victim.getHullSize() == ShipAPI.HullSize.DESTROYER) {
  125.                             force = FORCE_VS_DESTROYER * mod;
  126.                             damage /= DAMAGE_MOD_VS_DESTROYER;
  127.                         } else if (victim.getHullSize() == ShipAPI.HullSize.CRUISER) {
  128.                             force = FORCE_VS_CRUISER * mod;
  129.                             damage /= DAMAGE_MOD_VS_CRUISER;
  130.                         } else if (victim.getHullSize() == ShipAPI.HullSize.CAPITAL_SHIP) {
  131.                             force = FORCE_VS_CAPITAL * mod;
  132.                             damage /= DAMAGE_MOD_VS_CAPITAL;
  133.                         }
  134.  
  135.                         if (victim.getOwner() == ship.getOwner()) {
  136.                             damage *= EXPLOSION_DAMAGE_VS_ALLIES_MODIFIER;
  137.                             emp *= EXPLOSION_EMP_VS_ALLIES_MODIFIER;
  138.                             force *= EXPLOSION_FORCE_VS_ALLIES_MODIFIER;
  139.                         }
  140.  
  141.                         Global.getLogger(DeracinatorStatsSmall.class).log(Level.DEBUG,
  142.                                 ship.getVariant().getDisplayName()
  143.                                 + " dealing damage " + damage + " and emp " + emp
  144.                                 + " to " + victim.getVariant().getDisplayName());
  145.  
  146.                         if (victim.getShield() != null && victim.getShield().isOn() && victim.getShield().isWithinArc(ship.getLocation())) {
  147.                             victim.getFluxTracker().increaseFlux(damage * 2, true);
  148.                         } else {
  149.                             for (int x = 0; x < 5; x++) {
  150.                                 engine.spawnEmpArc(ship, MathUtils.getRandomPointInCircle(victim.getLocation(), victim.getCollisionRadius()),
  151.                                         victim, victim, EXPLOSION_DAMAGE_TYPE, damage / 10,
  152.                                         emp / 5, EXPLOSION_PUSH_RADIUS, null, 2f,
  153.                                         EXPLOSION_COLOR, EXPLOSION_COLOR);
  154.                             }
  155.                         }
  156.                     }
  157.  
  158.                     dir = VectorUtils.getDirectionalVector(ship.getLocation(), tmp.getLocation());
  159.                     dir.scale(force);
  160.  
  161.                     Global.getLogger(DeracinatorStatsSmall.class).log(Level.DEBUG,
  162.                             ship.getVariant().getDisplayName() + " pushing "
  163.                             + tmp.toString() + " with force " + force);
  164.  
  165.                     Vector2f.add(tmp.getVelocity(), dir, tmp.getVelocity());
  166.                 }
  167.  
  168.                 isActive = false;
  169.             }
  170.         }
  171.     }
  172.  
  173.     @Override
  174.     public void unapply(MutableShipStatsAPI stats, String id) {
  175.     }
  176.  
  177.     @Override
  178.     public StatusData getStatusData(int index, State state, float effectLevel) {
  179.         if (state == State.IN) {
  180.             if (index == 0) {
  181.                 return new StatusData("charging scalar deracinator", false);
  182.  
  183.             } else if (index == 1) {
  184.                 return new StatusData("weapons and shields inoperable", true);
  185.             }
  186.         }
  187.  
  188.         return null;
  189.     }
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement