001package com.fs.starfarer.api.impl.combat.dweller; 002 003import org.lwjgl.util.vector.Vector2f; 004 005import com.fs.starfarer.api.Global; 006import com.fs.starfarer.api.combat.CombatEngineAPI; 007import com.fs.starfarer.api.combat.DamageType; 008import com.fs.starfarer.api.combat.ShipAIConfig; 009import com.fs.starfarer.api.combat.ShipAIPlugin; 010import com.fs.starfarer.api.combat.ShipAPI; 011import com.fs.starfarer.api.combat.ShipCommand; 012import com.fs.starfarer.api.combat.ShipwideAIFlags; 013import com.fs.starfarer.api.util.IntervalUtil; 014import com.fs.starfarer.api.util.Misc; 015 016public class ShroudedEjectaAI implements ShipAIPlugin { 017 018 public static class FlockingData { 019 public Vector2f loc; 020 public Vector2f vel; 021 public float minA; 022 public float maxA; 023 public float minR; 024 public float maxR; 025 public float repelAtAngleDist; 026 public float minC; 027 public float maxC; 028 public float attractWeight; 029 public float repelWeight; 030 public float cohesionWeight; 031 public float facing; 032 } 033 034 035 /** 036 * Loses hitpoints over time and eventually dissipates. 037 */ 038 public static float HULL_FRACTION_LOST_PER_SECOND = 0.0667f; 039 040 protected ShipwideAIFlags flags = new ShipwideAIFlags(); 041 protected ShipAPI ship; 042 protected boolean exploded = false; 043 protected float turnDir = 1f; 044 045 protected IntervalUtil updateInterval = new IntervalUtil(0.5f, 1.5f); 046 047 public ShroudedEjectaAI(ShipAPI ship) { 048 this.ship = ship; 049 050 doInitialSetup(); 051 052 updateInterval.forceIntervalElapsed(); 053 } 054 055 protected void doInitialSetup() { 056 turnDir = Math.signum(0.5f - (float) Math.random() * 0.5f); 057 if (turnDir == 0) turnDir = 1f; 058 } 059 060 @Override 061 public void advance(float amount) { 062 //if (true) return; 063 064 updateInterval.advance(amount); 065 if (updateInterval.intervalElapsed()) { 066 } 067 068 CombatEngineAPI engine = Global.getCombatEngine(); 069 float damage = ship.getMaxHitpoints() * HULL_FRACTION_LOST_PER_SECOND * 1f * amount; 070 ship.setHitpoints(ship.getHitpoints() - damage); 071 if (ship.getHitpoints() <= 0f) { 072 engine.applyDamage(ship, ship.getLocation(), 10000f, DamageType.ENERGY, 0f, true, false, ship, false); 073 } 074 075 giveMovementCommands(); 076 } 077 078 protected void giveMovementCommands() { 079 CombatEngineAPI engine = Global.getCombatEngine(); 080 081 //ship.giveCommand(ShipCommand.DECELERATE, null, 0); 082// if (turnDir < 0f) { 083// ship.giveCommand(ShipCommand.TURN_RIGHT, null, 0); 084// } else { 085// ship.giveCommand(ShipCommand.TURN_LEFT, null, 0); 086// } 087 088 if (ship.getVelocity().length() > ship.getMaxSpeedWithoutBoost() * 0.1f) { 089 ship.giveCommand(ShipCommand.DECELERATE, null, 0); 090 } 091 092 float heading = Misc.getAngleInDegrees(ship.getVelocity()); 093 //engine.headInDirectionWithoutTurning(ship, desiredHeading, 10000); 094 } 095 096 097 @Override 098 public ShipwideAIFlags getAIFlags() { 099 return flags; 100 } 101 102 103 104 public void setDoNotFireDelay(float amount) {} 105 public void forceCircumstanceEvaluation() {} 106 public boolean needsRefit() { return false; } 107 public void cancelCurrentManeuver() {} 108 public ShipAIConfig getConfig() { return null; } 109} 110 111 112 113 114 115 116 117 118 119 120 121 122