1package com.fs.starfarer.api.impl.combat;
4import java.util.ArrayList;
5import java.util.Collections;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.combat.CombatEngineAPI;
10import com.fs.starfarer.api.combat.MutableShipStatsAPI;
11import com.fs.starfarer.api.combat.ShipAPI;
12import com.fs.starfarer.api.combat.ShipEngineControllerAPI;
13import com.fs.starfarer.api.combat.ShipSystemAPI;
14import com.fs.starfarer.api.combat.ShipAPI.HullSize;
15import com.fs.starfarer.api.combat.ShipEngineControllerAPI.ShipEngineAPI;
16import com.fs.starfarer.api.combat.ShipSystemAPI.SystemState;
17import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
18import com.fs.starfarer.api.util.Misc;
19import com.fs.starfarer.api.util.Misc.FindShipFilter;
22 public static final Object
SHIP_KEY =
new Object();
27 public static final float RANGE = 1000f;
28 public static final Color
EFFECT_COLOR =
new Color(100,165,255,75);
31 public static class TargetData {
33 public float sinceLastAfterimage = 0f;
34 public boolean lastAbove =
false;
35 public TargetData(
ShipAPI target) {
48 final String targetDataKey = ship.
getId() +
"_interdictor_target_data";
51 if (state == State.IN && targetDataObj ==
null) {
54 }
else if (state == State.IDLE && targetDataObj !=
null) {
57 if (targetDataObj ==
null || ((TargetData) targetDataObj).target ==
null)
return;
59 final TargetData targetData = (TargetData) targetDataObj;
62 List<ShipAPI> targets =
new ArrayList<ShipAPI>();
65 List<ShipAPI> ships = engine.
getShips();
67 if (other.isShuttlePod())
continue;
68 if (other.isHulk())
continue;
69 if (!other.isDrone() && !other.isFighter())
continue;
70 if (other.getOriginalOwner() != targetData.target.
getOriginalOwner())
continue;
78 targets.add(targetData.target);
82 for (
ShipAPI target : targets) {
83 if (effectLevel >= 1) {
88 if (target.getFluxTracker().showFloaty() ||
91 target.getFluxTracker().showOverloadFloatyIfNeeded(
"Drive Interdicted!", color, 4f,
true);
98 if (target.isDrone() || target.isFighter()) {
102 float disabledSoFar = 0f;
103 boolean disabledAnEngine =
false;
104 List<ShipEngineAPI> engines =
new ArrayList<ShipEngineAPI>(ec.
getShipEngines());
105 Collections.shuffle(engines);
108 if (engine.isDisabled())
continue;
109 float contrib = engine.getContribution();
110 if (disabledSoFar + contrib <= limit) {
112 disabledSoFar += contrib;
113 disabledAnEngine =
true;
116 if (!disabledAnEngine) {
118 if (engine.isDisabled())
continue;
126 if (effectLevel > 0) {
127 float jitterLevel = effectLevel;
128 float maxRangeBonus = 20f + target.getCollisionRadius() * 0.25f;
129 float jitterRangeBonus = jitterLevel * maxRangeBonus;
130 if (state == State.OUT) {
131 jitterRangeBonus = maxRangeBonus + (1f - jitterLevel) * maxRangeBonus;
133 target.setJitter(
this,
136 jitterLevel, 6, 0f, 0 + jitterRangeBonus);
142 jitterLevel, 6, 0f, 0 + jitterRangeBonus);
162 FindShipFilter filter =
new FindShipFilter() {
163 public boolean matches(
ShipAPI ship) {
171 if (target !=
null) {
174 if (dist > range + radSum) target =
null;
185 if (dist > range + radSum) target =
null;
189 if (target ==
null) {
203 public StatusData
getStatusData(
int index, State state,
float effectLevel) {
217 if (system.
getState() != SystemState.IDLE)
return null;
220 if (target !=
null && target != ship) {
224 return "OUT OF RANGE";
234 return target !=
null && target != ship;
static CombatEngineAPI getCombatEngine()
Object getCustom(AIFlags flag)
void unapply(MutableShipStatsAPI stats, String id)
void apply(MutableShipStatsAPI stats, final String id, State state, float effectLevel)
String getInfoText(ShipSystemAPI system, ShipAPI ship)
Color getEffectColor(ShipAPI ship)
ShipAPI findTarget(ShipAPI ship)
static final Object SHIP_KEY
static final Color EFFECT_COLOR
static final Object TARGET_KEY
boolean isUsable(ShipSystemAPI system, ShipAPI ship)
StatusData getStatusData(int index, State state, float effectLevel)
float getMaxRange(ShipAPI ship)
static final float WING_EFFECT_RANGE
static ShipAPI findClosestShipEnemyOf(ShipAPI ship, Vector2f locFromForSorting, HullSize smallestToNote, float maxRange, boolean considerShipRadius)
static Color setAlpha(Color color, int alpha)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
Map< String, Object > getCustomData()
List< ShipAPI > getShips()
float getCollisionRadius()
CombatEntityAPI getEntity()
Vector2f getMouseTarget()
ShipwideAIFlags getAIFlags()
void setJitter(Object source, Color color, float intensity, int copies, float range)
ShipEngineControllerAPI getEngineController()
void computeEffectiveStats(boolean forceShowFloaty)
List< ShipEngineAPI > getShipEngines()
float getFlameoutFraction()