1package com.fs.starfarer.api.impl.combat.dweller;
3import java.util.ArrayList;
4import java.util.Collections;
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.MutableShipStatsAPI;
12import com.fs.starfarer.api.combat.ShieldAPI;
13import com.fs.starfarer.api.combat.ShipAPI;
14import com.fs.starfarer.api.combat.ShipCommand;
15import com.fs.starfarer.api.combat.ShipSystemAPI;
16import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
17import com.fs.starfarer.api.combat.WeaponAPI;
18import com.fs.starfarer.api.impl.combat.BaseShipSystemScript;
19import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.ShroudNegativeParticleFilter;
20import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
21import com.fs.starfarer.api.loading.BeamWeaponSpecAPI;
22import com.fs.starfarer.api.util.Misc;
47 if (w.getSlot().isDecorative()) {
60 float min = 10000000f;
64 float test = w.getSlot().getLocation().y;
70 if (primary !=
null) {
74 Collections.sort(
weapons, (w1, w2) -> {
75 return (
int) Math.signum(Math.abs(w1.getSlot().getLocation().y) - Math.abs(w2.getSlot().getLocation().y));
80 float [] offsets =
new float []
81 {0f, incr, -incr, 2f * incr, -2f * incr, 3f * incr, -3f * incr, 4f * incr, -4f * incr};
82 for (
int i = 0; i <
weapons.size(); i++) {
95 if (
weapons.size() == 0)
return false;
101 return weapons.get(0).getRange();
115 if (shield !=
null) {
125 if (state == State.IN) {
126 if (shield !=
null) {
128 shield.
setArc(360f - currOpening);
142 }
else if (state == State.ACTIVE) {
145 w.setForceFireOneFrame(
true);
148 }
else if (state == State.OUT) {
149 if (shield !=
null) {
151 shield.
setArc(360f - currOpening);
155 if (state == State.IN || state == State.ACTIVE) {
156 if (shroud !=
null) {
168 float accel = ConvulsiveLungeSystemScript.PARTICLE_WINDUP_ACCEL * amount * effectLevel;
169 if (shroud !=
null) {
173 float accelMult = 1f;
179 p.vel.x += dir.x * accel * accelMult;
180 p.vel.y += dir.y * accel * accelMult;
183 if (state == State.ACTIVE) {
195 if (shroud !=
null) {
209 if (state == State.IDLE) {
218 public StatusData
getStatusData(
int index, State state,
float effectLevel) {
224 return super.getInfoText(system, ship);
230 if (shroud ==
null || shroud.
getAttachedTo() ==
null)
return true;
static CombatEngineAPI getCombatEngine()
void unmodifyMult(String source)
void modifyMult(String source, float value)
void setFlag(AIFlags flag)
List< WeaponAPI > weapons
void findWeapons(ShipAPI ship)
StatusData getStatusData(int index, State state, float effectLevel)
static String DARKENED_GAZE_SYSTEM_TAG
boolean isParticleOk(DwellerShroud shroud, Vector2f loc)
String getInfoText(ShipSystemAPI system, ShipAPI ship)
static float SHIELD_OPENING
static float TURN_RATE_REDUCTION
static float DAMAGE_TAKEN_MULT
static String DARKENED_GAZE_PRIMARY_WEAPON_TAG
void unapply(MutableShipStatsAPI stats, String id)
void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel)
DwellerShroudParams getShroudParams()
static DwellerShroud getShroudFor(CombatEntityAPI entity)
List< SwarmMember > getMembers()
CombatEntityAPI getAttachedTo()
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static float getAngleDiff(float from, float to)
static boolean isInArc(float direction, float arc, Vector2f from, Vector2f to)
static float getAngleInDegrees(Vector2f v)
TOGGLE_SHIELD_OR_PHASE_CLOAK
float getElapsedInLastFrame()
boolean isOverloadedOrVenting()
MutableStat getHullDamageTakenMult()
MutableStat getMaxTurnRate()
CombatEntityAPI getEntity()
void forceFacing(float facing)
MutableShipStatsAPI getMutableStats()
FluxTrackerAPI getFluxTracker()
List< WeaponAPI > getAllWeapons()
void blockCommandForOneFrame(ShipCommand command)
ShipwideAIFlags getAIFlags()
void setCustom(Object custom)
List< Float > getTurretAngleOffsets()
List< Float > getHardpointAngleOffsets()