1package com.fs.starfarer.api.impl.combat.threat;
3import java.util.Iterator;
7import org.lwjgl.util.vector.Vector2f;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.combat.CollisionClass;
11import com.fs.starfarer.api.combat.CombatEngineAPI;
12import com.fs.starfarer.api.combat.CombatEntityAPI;
13import com.fs.starfarer.api.combat.DamageType;
14import com.fs.starfarer.api.combat.DamagingProjectileAPI;
15import com.fs.starfarer.api.combat.EmpArcEntityAPI;
16import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams;
17import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin;
18import com.fs.starfarer.api.combat.MissileAPI;
19import com.fs.starfarer.api.combat.OnFireEffectPlugin;
20import com.fs.starfarer.api.combat.ShipAPI;
21import com.fs.starfarer.api.combat.WeaponAPI;
22import com.fs.starfarer.api.combat.WeaponAPI.AIHints;
23import com.fs.starfarer.api.impl.campaign.ids.Stats;
24import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
25import com.fs.starfarer.api.util.Misc;
26import com.fs.starfarer.api.util.WeightedRandomPicker;
75 if (ship ==
null)
return;
80 boolean disable = active < required;
101 Vector2f noTargetDest =
null;
102 if (target ==
null) noTargetDest =
pickNoTargetDest(projectile, weapon, engine);
104 Vector2f towards = noTargetDest;
105 if (target !=
null) towards = target.
getLocation();
108 if (pick ==
null)
return;
110 pick.setRecentlyPicked(1f);
112 float thickness = 30f;
116 Color coreColor = Color.white;
126 float coreWidthMult = 0.75f;
128 EmpArcParams params =
new EmpArcParams();
129 params.segmentLengthMult = 8f;
131 params.zigZagReductionFactor = 0.5f;
134 params.flickerRateMult = 1f;
135 params.fadeOutDist = 1000f;
136 params.minFadeOutMult = 1f;
139 params.glowSizeMult = 0.5f;
140 params.glowAlphaMult = 0.75f;
151 if (target !=
null) {
158 "voltaic_discharge_emp_impact",
170 params.flickerRateMult = 1f;
172 Vector2f to = noTargetDest;
186 float range = Math.min(weapon.
getRange() - spread, 150f);
190 Vector2f.add(from, dir, dir);
196 float range = weapon.
getRange() + 50f;
200 range * 2f, range * 2f);
203 float minScore = Float.MAX_VALUE;
207 ignoreFlares |= weapon.
hasAIHint(AIHints.IGNORES_FLARES);
211 while (iter.hasNext()) {
212 Object o = iter.next();
215 !(o instanceof
ShipAPI))
continue;
217 if (other.
getOwner() == owner)
continue;
219 boolean phaseHit =
false;
220 if (other instanceof
ShipAPI) {
222 if (otherShip.
isHulk())
continue;
236 if (ignoreFlares && other instanceof
MissileAPI) {
238 if (missile.
isFlare())
continue;
243 if (dist > range)
continue;
249 if (score < minScore) {
262 if (dist > maxRange)
continue;
static CombatEngineAPI getCombatEngine()
static final String PD_IGNORES_FLARES
int getNumActiveMembers()
RoilingSwarmParams params
WeightedRandomPicker< SwarmMember > getPicker(boolean preferNonFlashing, boolean preferNonPicked, Vector2f towards)
static RoilingSwarmEffect getSwarmFor(CombatEntityAPI entity)
CombatEntityAPI getAttachedTo()
static Color EMP_FRINGE_COLOR
static void setSwarmPhaseMode(ShipAPI ship)
void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
static boolean isSwarmPhaseMode(ShipAPI ship)
static int FRAGMENTS_TO_FIRE
void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon)
int getNumFragmentsToFire()
static Color PHASE_CORE_COLOR
static Color EMP_FRINGE_COLOR_BRIGHT
static String SWARM_TAG_PHASE_MODE
Vector2f pickNoTargetDest(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
CombatEntityAPI findTarget(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
static Color PHASE_FRINGE_COLOR
static SwarmMember pickFragmentTowardsPointWithinRange(RoilingSwarmEffect swarm, Vector2f towards, float maxRange)
void setDurationOut(float durationOut)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float getTargetingRadius(Vector2f from, CombatEntityAPI target, boolean considerShield)
static Vector2f getPointWithinRadius(Vector2f from, float r)
static boolean isInArc(float direction, float arc, Vector2f from, Vector2f to)
Iterator< Object > getCheckIterator(Vector2f loc, float checkWidth, float checkHeight)
EmpArcEntityAPI spawnEmpArcVisual(Vector2f from, CombatEntityAPI fromAnchor, Vector2f to, CombatEntityAPI toAnchor, float thickness, Color fringe, Color core)
CollisionGridAPI getAllObjectGrid()
EmpArcEntityAPI spawnEmpArc(ShipAPI damageSource, Vector2f point, CombatEntityAPI pointAnchor, CombatEntityAPI empTargetEntity, DamageType damageType, float damAmount, float empDamAmount, float maxRange, String impactSoundId, float thickness, Color fringe, Color core)
CollisionClass getCollisionClass()
void setSingleFlickerMode()
void setFadedOutAtStart(boolean fadedOutAtStart)
void setUpdateFromOffsetEveryFrame(boolean updateFromOffsetEveryFrame)
void setRenderGlowAtStart(boolean renderGlowAtStart)
void setCoreWidthOverride(float coreWidthOverride)
DynamicStatsAPI getDynamic()
MutableShipStatsAPI getMutableStats()
void setForceDisabled(boolean forceDisabled)
boolean hasAIHint(AIHints hint)
default void showNoFragmentSwarmWarning(WeaponAPI w, ShipAPI ship)
float getValue(String id)