1package com.fs.starfarer.api.impl.combat.threat;
3import java.util.ArrayList;
8import org.lwjgl.util.vector.Vector2f;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.combat.BaseEveryFrameCombatPlugin;
12import com.fs.starfarer.api.combat.CombatEngineAPI;
13import com.fs.starfarer.api.combat.DamageType;
14import com.fs.starfarer.api.combat.EmpArcEntityAPI;
15import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams;
16import com.fs.starfarer.api.combat.MutableShipStatsAPI;
17import com.fs.starfarer.api.combat.ShipAPI;
18import com.fs.starfarer.api.combat.ShipAPI.HullSize;
19import com.fs.starfarer.api.combat.ShipSystemAPI;
20import com.fs.starfarer.api.combat.ShipSystemAPI.SystemState;
21import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
22import com.fs.starfarer.api.combat.WeaponAPI.WeaponSize;
23import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;
24import com.fs.starfarer.api.input.InputEventAPI;
25import com.fs.starfarer.api.loading.WeaponSlotAPI;
26import com.fs.starfarer.api.util.Misc;
27import com.fs.starfarer.api.util.Misc.FindShipFilter;
55 public DelayedCombatActionPlugin(
float delay, Runnable r) {
61 public void advance(
float amount, List<InputEventAPI> events) {
65 if (elapsed < delay)
return;
77 protected List<WeaponSlotAPI>
slots;
83 if (
slots !=
null)
return;
84 slots =
new ArrayList<>();
86 if (slot.isSystemSlot()) {
88 if (slot.getSlotSize() == WeaponSize.MEDIUM) {
107 if ((state == State.COOLDOWN || state == State.IDLE) &&
cooldownToSet >= 0f) {
114 if (state == State.IDLE || state == State.COOLDOWN || effectLevel <= 0f) {
118 if (state == State.IN || state == State.OUT) {
119 float jitterLevel = effectLevel;
121 float maxRangeBonus = 150f;
123 float jitterRangeBonus = (1f - effectLevel * effectLevel) * maxRangeBonus;
125 float brightness = 0f;
126 float threshold = 0.1f;
127 if (effectLevel < threshold) {
128 brightness = effectLevel / threshold;
130 brightness = 1f - (effectLevel - threshold) / (1f - threshold);
132 if (brightness < 0) brightness = 0;
133 if (brightness > 1) brightness = 1;
134 if (state == State.OUT) {
135 jitterRangeBonus = 0f;
136 brightness = effectLevel * effectLevel;
143 ship.
setJitter(
this, color, jitterLevel, 5, 0f, 3f + jitterRangeBonus);
149 if (target !=
null) {
155 EmpArcParams params =
new EmpArcParams();
156 params.segmentLengthMult = 8f;
157 params.zigZagReductionFactor = 0.15f;
158 params.fadeOutDist = 500f;
159 params.minFadeOutMult = 2f;
160 params.flickerRateMult = 0.7f;
169 params.flickerRateMult = 0.3f;
182 "energy_lash_friendly_impact",
186 new Color(255,255,255,255),
196 params.flickerRateMult = 0.4f;
198 int numArcs =
slots.size();
204 for (
int i = 0; i < numArcs; i++) {
205 float delay = 0.03f * i;
218 Runnable r =
new Runnable() {
221 Vector2f slotLoc =
slots.get(index).computePosition(ship2);
223 Color core =
new Color(255,255,255,255);
234 "energy_lash_enemy_impact",
269 if (target ==
null || target.
getSystem() ==
null || target.
isHulk())
return;
277 }
else if (isSwarm) {
293 boolean hitPhase =
false;
307 public void advance(
float amount, List<InputEventAPI> events) {
336 public StatusData
getStatusData(
int index, State state,
float effectLevel) {
343 if (system.
getState() != SystemState.IDLE)
return null;
346 if (target !=
null && target != ship) {
349 if ((target ==
null || target == ship) && ship.
getShipTarget() !=
null) {
350 return "OUT OF RANGE";
359 return dist <= range + radSum;
363 if (other ==
null)
return false;
373 if (other.
getSystem() ==
null)
return false;
389 float extraRange = 0f;
396 if (target !=
null) {
399 if (dist > range + radSum + extraRange) target =
null;
412 if (dist > range + radSum) target =
null;
416 if (target ==
null) {
427 return target !=
null && target != ship;
static SoundPlayerAPI getSoundPlayer()
static CombatEngineAPI getCombatEngine()
Object getCustom(AIFlags flag)
boolean hasFlag(AIFlags flag)
float computeEffective(float baseValue)
boolean isValidLashTarget(ShipAPI ship, ShipAPI other)
void unapply(MutableShipStatsAPI stats, String id)
List< WeaponSlotAPI > slots
void applyEffectToTarget(ShipAPI ship, ShipAPI target)
static float getRange(ShipAPI ship)
static float HIT_PHASE_ENEMY_COOLDOWN_MULT
void findSlots(ShipAPI ship)
ShipAPI findTarget(ShipAPI ship)
static float MAX_COOLDOWN
boolean isUsable(ShipSystemAPI system, ShipAPI ship)
void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel)
static float COOLDOWN_DP_MULT
static float MAX_HIT_ENEMY_COOLDOWN
String getInfoText(ShipSystemAPI system, ShipAPI ship)
boolean isInRange(ShipAPI ship, ShipAPI target)
static float PHASE_OVERLOAD_DUR
static float MIN_HIT_ENEMY_COOLDOWN
static float SWARM_TIMEOUT
StatusData getStatusData(int index, State state, float effectLevel)
static float MAX_LASH_RANGE
static float MIN_COOLDOWN
static String SHIP_UNDER_CONSTRUCTION
static boolean isAttackSwarm(ShipAPI ship)
static Color EMP_FRINGE_COLOR
static void setSwarmPhaseMode(ShipAPI ship)
static Color PHASE_CORE_COLOR
static Color EMP_FRINGE_COLOR_BRIGHT
static Color PHASE_FRINGE_COLOR
static ShipAPI findClosestShipTo(ShipAPI ship, Vector2f locFromForSorting, HullSize smallestToNote, float maxRange, boolean considerShipRadius, boolean allowHulks, FindShipFilter filter)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
EmpArcEntityAPI spawnEmpArcPierceShields(ShipAPI damageSource, Vector2f point, CombatEntityAPI pointAnchor, CombatEntityAPI empTargetEntity, DamageType damageType, float damAmount, float empDamAmount, float maxRange, String impactSoundId, float thickness, Color fringe, Color core)
void removePlugin(EveryFrameCombatPlugin plugin)
void addPlugin(EveryFrameCombatPlugin plugin)
float getElapsedInLastFrame()
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)
float getCollisionRadius()
void setSingleFlickerMode()
void setTargetToShipCenter(Vector2f sourceSlotPos, ShipAPI ship)
void setCoreWidthOverride(float coreWidthOverride)
boolean isOverloadedOrVenting()
void beginOverloadWithTotalBaseDuration(float totalDur)
void showOverloadFloatyIfNeeded()
StatBonus getSystemRangeBonus()
CombatEntityAPI getEntity()
void setOverloadColor(Color color)
ShipHullSpecAPI getHullSpec()
MutableShipStatsAPI getMutableStats()
FluxTrackerAPI getFluxTracker()
boolean hasTag(String tag)
Vector2f getMouseTarget()
ShipwideAIFlags getAIFlags()
ShipSystemAPI getSystem()
void setJitter(Object source, Color color, float intensity, int copies, float range)
void resetOverloadColor()
List< WeaponSlotAPI > getAllWeaponSlotsCopy()
float getSuppliesToRecover()
void setCooldown(float cooldown)
ShipSystemStatsScript getScript()
void setCooldownRemaining(float remaining)
float getCooldownRemaining()
void hitWithEnergyLash(ShipAPI overseer, ShipAPI ship)
Vector2f computePosition(CombatEntityAPI ship)