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.BoundsAPI.SegmentAPI;
13import com.fs.starfarer.api.combat.CombatEngineAPI;
14import com.fs.starfarer.api.combat.CombatFleetManagerAPI;
15import com.fs.starfarer.api.combat.ShipAPI;
16import com.fs.starfarer.api.impl.combat.RiftLanceEffect;
17import com.fs.starfarer.api.impl.combat.threat.ConstructionSwarmSystemScript.SwarmConstructableVariant;
18import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
19import com.fs.starfarer.api.input.InputEventAPI;
20import com.fs.starfarer.api.util.IntervalUtil;
21import com.fs.starfarer.api.util.Misc;
22import com.fs.starfarer.api.util.WeightedRandomPicker;
38 protected List<ShipAPI>
pieces =
new ArrayList<>();
39 protected List<ShipAPI>
swarms =
new ArrayList<>();
60 this.fadeOutTime = 15f;
63 this.fadeOutTime = 12f;
66 this.fadeOutTime = 9f;
69 this.fadeOutTime = 7f;
72 this.fadeOutTime = 7f;
76 this.fadeOutTime += 3f;
90 public void advance(
float amount, List<InputEventAPI> events) {
100 if (progress < 0f) progress = 0f;
101 if (progress > 1f) progress = 1f;
111 boolean first =
true;
112 boolean anyInEngine =
false;
117 Vector2f vel = ship.getVelocity();
118 Vector2f acc =
new Vector2f(vel);
119 if (acc.length() != 0) {
122 acc.scale(amount * ship.getDeceleration());
123 Vector2f.add(vel, acc, vel);
124 float speed = vel.length();
125 if (speed <= 1 || speed < acc.length()) {
131 if (progress > 0.5f) {
132 alpha = (1f - progress) * 2f;
135 ship.setAlphaMult(alpha);
143 float jitterLevel = 1f - progress;
145 if (jitterLevel < 0.5f) {
148 jitterLevel = (1f - jitterLevel) * 2f;
151 if (jitterLevel < 0.5f) {
153 }
else if (remaining <= 2f) {
154 jitterLevel = remaining / 2f;
159 jitterLevel = (float) Math.sqrt(jitterLevel);
162 float jitterRange = 1f;
163 if (remaining < 2f) {
164 jitterRange = remaining / 2f;
168 float maxRangeBonus = 25f;
169 float jitterRangeBonus = jitterRange * maxRangeBonus;
174 ship.setJitter(
this, c, jitterLevel, 3, 0f, jitterRangeBonus);
183 ship.setAlphaMult(0f);
190 if (ship ==
null)
return;
200 float baseDuration = 2f;
206 if (remaining < 1f) extraDur = 1f;
209 for (
int i = 0; i < 11; i++) {
212 float dur = baseDuration + baseDuration * (float) Math.random();
217 v.scale(nSize + nSize * (
float) Math.random() * 0.5f);
219 Vector2f.add(vel, v, v);
221 float maxSpeed = nSize * 1.5f * 0.2f;
222 float minSpeed = nSize * 1f * 0.2f;
223 float overMin = v.length() - minSpeed;
225 float durMult = 1f - overMin / (maxSpeed - minSpeed);
226 if (durMult < 0.1f) durMult = 0.1f;
227 dur *= 0.5f + 0.5f * durMult;
230 0.5f / dur, 0f, dur, c);
241 numSwarms = (int) Math.round(curr.cr * 100f);
246 for (
int i = 0; i < numSwarms; i++) {
260 if (swarm ==
null)
continue;
266 if (piece ==
null)
continue;
284 float facing = (float) Math.random() * 360f;
311 swarm.params.flashFrequency = 5f;
312 swarm.params.flashProbability = 1f;
317 swarm.params.flashFringeColor =
new Color(255,70,30,50);
318 swarm.params.flashCoreRadiusMult = 0f;
320 swarm.params.springStretchMult = 1f;
329 s.getP1().scale(collisionMult);
330 s.getP2().scale(collisionMult);
331 s.set(s.getP1().x, s.getP1().y, s.getP2().x, s.getP2().y);
340 swarm.params.initialMembers = 0;
341 swarm.params.baseMembersToMaintain = 50;
static SoundPlayerAPI getSoundPlayer()
static CombatEngineAPI getCombatEngine()
void modifyMult(String source, float value)
static Color getColorForDarkening(Color from)
static List< SwarmConstructableVariant > CONSTRUCTABLE
static String RECLAMATION_SWARM_EXCHANGE_CLASS
static String RECLAMATION_SWARM_FLOCKING_CLASS
static RoilingSwarmEffect createSwarmFor(ShipAPI ship)
int getNumActiveMembers()
RoilingSwarmParams params
static RoilingSwarmEffect getSwarmFor(CombatEntityAPI entity)
static ListMap< RoilingSwarmEffect > getFlockingMap()
static float IMPACT_VOLUME_MULT
static String RECLAMATION_SWARM_WING
static String SHIP_BEING_RECLAIMED
static float RECLAMATION_SWARM_COLLISION_MULT
void advance(float amount, List< InputEventAPI > events)
static float RECLAMATION_SWARM_RADIUS_MULT
List< ShipAPI > getPieces()
static float CR_PER_RECLAMATION_SWARM
ThreatShipReclamationScript(ShipAPI ship, float delay)
static float RECLAMATION_SWARM_HP_MULT
static float RECLAMATION_SWARM_FRAGMENT_SIZE_MULT
void spawnSwarms(float amount)
void spawnParticles(ShipAPI ship, float amount, float progress)
static float RECLAMATION_SWARM_SPEED_MULT
static Color EMP_FRINGE_COLOR
void setDurationIn(float durationIn)
void forceIntervalElapsed()
void advance(float amount)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static Color setAlpha(Color color, int alpha)
static Vector2f getPointWithinRadius(Vector2f from, float r)
static Vector2f getPointWithinRadiusUniform(Vector2f from, float r, Random random)
void addAll(Collection< T > items)
void playLoop(String id, Object playingEntity, float pitch, float volume, Vector2f loc, Vector2f vel)
List< SegmentAPI > getOrigSegments()
CombatFleetManagerAPI getFleetManager(FleetSide side)
void removeEntity(CombatEntityAPI entity)
boolean isInEngine(ShipAPI ship)
void removePlugin(EveryFrameCombatPlugin plugin)
void addNegativeNebulaParticle(Vector2f loc, Vector2f vel, float size, float endSizeMult, float rampUpFraction, float fullBrightnessFraction, float totalDuration, Color color)
List< ShipAPI > getShips()
float getCollisionRadius()
void setCollisionRadius(float radius)
BoundsAPI getExactBounds()
ShipAPI spawnShipOrWing(String specId, Vector2f location, float facing)
void setSuppressDeploymentMessages(boolean suppressDeploymentMessages)
void setSourceShip(ShipAPI sourceShip)
MutableStat getMaxSpeed()
MutableShipStatsAPI getMutableStats()
void setMaxHitpoints(float maxArmor)
void setHitpoints(float value)
FleetMemberAPI getFleetMember()
void setDoNotRender(boolean doNotRender)
void setImpactVolumeMult(float impactVolumeMult)
ArmorGridAPI getArmorGrid()
ShipVariantAPI getVariant()
void setExplosionScale(float explosionScale)
void setHulkChanceOverride(float hulkChanceOverride)
String getHullVariantId()