1package com.fs.starfarer.api.impl.combat;
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
10import org.lwjgl.util.vector.Vector2f;
12import com.fs.starfarer.api.Global;
13import com.fs.starfarer.api.combat.BaseCombatLayeredRenderingPlugin;
14import com.fs.starfarer.api.combat.CollisionClass;
15import com.fs.starfarer.api.combat.CombatEngineAPI;
16import com.fs.starfarer.api.combat.DamageType;
17import com.fs.starfarer.api.combat.EmpArcEntityAPI;
18import com.fs.starfarer.api.combat.FighterLaunchBayAPI;
19import com.fs.starfarer.api.combat.GuidedMissileAI;
20import com.fs.starfarer.api.combat.MissileAPI;
21import com.fs.starfarer.api.combat.MutableShipStatsAPI;
22import com.fs.starfarer.api.combat.ShipAPI;
23import com.fs.starfarer.api.combat.ShipAPI.HullSize;
24import com.fs.starfarer.api.combat.ShipSystemAPI;
25import com.fs.starfarer.api.combat.ShipSystemAPI.SystemState;
26import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
27import com.fs.starfarer.api.combat.WeaponAPI;
28import com.fs.starfarer.api.util.Misc;
35 protected boolean done;
40 this.missile = missile;
46 public void advance(
float amount) {
47 super.advance(amount);
60 drone.
getEngineController().
fadeToOtherColor(
this,
new Color(0,0,0,0),
new Color(0,0,0,0), 1f, 1f);
64 float jitterFraction = dist / missile.
getMaxRange();
68 float jitterMax = 1f + 10f * jitterFraction;
69 drone.
setJitter(
this,
new Color(255,100,50, (
int)(25 + 50 * jitterFraction)), 1f, 10, 1f, jitterMax);
83 if (!droneDestroyed) {
84 Vector2f damageFrom =
new Vector2f(drone.
getLocation());
101 Vector2f damageFrom =
new Vector2f(drone.
getLocation());
114 public boolean isExpired() {
124 return "terminator_missile";
148 drone.setExplosionScale(0.67f);
149 drone.setExplosionVelocityOverride(
new Vector2f());
150 drone.setExplosionFlashColorOverride(
new Color(255, 100, 50, 255));
153 if (effectLevel > 0 && !
fired) {
158 }
else if (state == State.IDLE){
170 if (target !=
null) {
171 Collections.sort(drones,
new Comparator<ShipAPI>() {
175 return (
int)Math.signum(d1 - d2);
179 Collections.shuffle(drones);
186 new Vector2f(drone.getLocation()), drone.getFacing(),
new Vector2f(drone.getVelocity()));
199 drone.getWing().removeMember(drone);
201 drone.setExplosionFlashColorOverride(
new Color(255, 100, 50, 255));
219 float thickness = 26f;
220 float coreWidthMult = 0.67f;
222 missile.
getLocation(), missile, thickness,
new Color(255,100,100,255), Color.white,
null);
226 if (drone.getShipAI() !=
null) {
227 drone.getShipAI().cancelCurrentManeuver();
264 if (dist > range + radSum) target =
null;
266 if (target ==
null) {
274 if (target !=
null)
return target;
279 if (target !=
null && target.
isFighter()) {
281 if (nearbyShip !=
null) target = nearbyShip;
283 if (target ==
null) {
291 public StatusData
getStatusData(
int index, State state,
float effectLevel) {
296 List<ShipAPI> result =
new ArrayList<ShipAPI>();
298 if (bay.getWing() ==
null)
continue;
309 if (system.
getState() != SystemState.IDLE)
return null;
318 if (target ==
null) {
322 if (dist + radSum > range) {
323 return "OUT OF RANGE";
331 if (dist > range + radSum) {
332 return "OUT OF RANGE";
static CombatEngineAPI getCombatEngine()
Object getCustom(AIFlags flag)
float computeEffective(float baseValue)
boolean isUsable(ShipSystemAPI system, ShipAPI ship)
void unapply(MutableShipStatsAPI stats, String id)
List< ShipAPI > getDrones(ShipAPI ship)
float getMaxRange(ShipAPI ship)
String getInfoText(ShipSystemAPI system, ShipAPI ship)
boolean droneStrikeUsefulVsFighters()
ShipAPI getForceNextTarget()
void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel)
boolean dronesUsefulAsPD()
ShipAPI findTarget(ShipAPI ship)
void convertDrones(ShipAPI ship, final ShipAPI target)
StatusData getStatusData(int index, State state, float effectLevel)
void setForceNextTarget(ShipAPI forceNextTarget)
static ShipAPI findClosestShipEnemyOf(ShipAPI ship, Vector2f locFromForSorting, HullSize smallestToNote, float maxRange, boolean considerShipRadius)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static Vector2f getPointWithinRadius(Vector2f from, float r)
EmpArcEntityAPI spawnEmpArcVisual(Vector2f from, CombatEntityAPI fromAnchor, Vector2f to, CombatEntityAPI toAnchor, float thickness, Color fringe, Color core)
CombatEntityAPI addLayeredRenderingPlugin(CombatLayeredRenderingPlugin plugin)
void applyDamage(CombatEntityAPI entity, Vector2f point, float damageAmount, DamageType damageType, float empAmount, boolean bypassShields, boolean dealsSoftFlux, Object source, boolean playSound)
void removeEntity(CombatEntityAPI entity)
CombatEntityAPI spawnProjectile(ShipAPI ship, WeaponAPI weapon, String weaponId, Vector2f point, float angle, Vector2f shipVelocity)
WeaponAPI createFakeWeapon(ShipAPI ship, String weaponId)
void setCollisionClass(CollisionClass collisionClass)
float getCollisionRadius()
void setFacing(float facing)
void setSingleFlickerMode()
void setCoreWidthOverride(float coreWidthOverride)
List< ShipAPI > getWingMembers()
void setTarget(CombatEntityAPI target)
void setNoFlameoutOnFizzling(boolean noFlameoutOnFizzling)
void setSpriteAlphaOverride(float spriteAlphaOverride)
void setEccmChanceOverride(float eccmChanceOverride)
void setEmpResistance(int empResistance)
DamagingProjectileAPI explode()
void setMaxRange(float maxRange)
void setMaxFlightTime(float maxFlightTime)
StatBonus getSystemRangeBonus()
CombatEntityAPI getEntity()
MutableShipStatsAPI getMutableStats()
Vector2f getMouseTarget()
List< FighterLaunchBayAPI > getLaunchBaysCopy()
ShipwideAIFlags getAIFlags()
ShipSystemAPI getSystem()
void setJitter(Object source, Color color, float intensity, int copies, float range)
ShipEngineControllerAPI getEngineController()
void fadeToOtherColor(Object key, Color other, Color contrailColor, float effectLevel, float maxBlend)
float getProjectileSpeed()