1package com.fs.starfarer.api.impl.combat.dweller;
3import org.lwjgl.util.vector.Vector2f;
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
7import com.fs.starfarer.api.campaign.CargoStackAPI;
8import com.fs.starfarer.api.campaign.SpecialItemData;
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.ShipAPI.HullSize;
13import com.fs.starfarer.api.combat.ShipCommand;
14import com.fs.starfarer.api.impl.campaign.ids.Items;
15import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember;
16import com.fs.starfarer.api.util.IntervalUtil;
17import com.fs.starfarer.api.util.Misc;
32 super.applyEffectsBeforeShipCreation(hullSize, stats,
id);
34 boolean sMod =
isSMod(stats);
47 if (index == 0)
return "" + (int) Math.round(
HEAL_MULT * 100f) +
"%";
58 public static String
DATA_KEY =
"core_ShroudedMantleHullmod_data_key";
59 public static class ShroudedMantleHullmodData {
61 float hullAtPrevLunge = 1f;
63 boolean lunging =
false;
65 float lungeElapsed = 0f;
66 boolean fadedFlash =
false;
71 super.advanceInCombat(ship, amount);
74 if (amount <= 0f)
return;
79 ShroudedMantleHullmodData data = (ShroudedMantleHullmodData) engine.
getCustomData().get(key);
81 data =
new ShroudedMantleHullmodData();
85 boolean forceUse =
false;
92 if (data.cooldown > 0) {
93 data.cooldown -= amount;
94 if (data.cooldown < 0) data.cooldown = 0;
95 if (data.cooldown > 0) {
108 data.interval.
advance(amount * 2f);
109 if ((data.interval.intervalElapsed() || forceUse) && !data.lunging) {
111 data.hullAtPrevLunge = Math.max(hull, data.hullAtPrevLunge);
114 data.lungeElapsed = 0f;
115 data.lungeDest =
null;
116 data.fadedFlash =
false;
117 data.hullAtPrevLunge = hull;
124 protected void doLunge(ShroudedMantleHullmodData data,
ShipAPI ship,
float amount) {
125 if (!data.lunging)
return;
130 if (data.lungeElapsed < 1f || data.lungeDest ==
null) {
131 if (data.lungeDest ==
null) {
134 Vector2f.add(data.lungeDest, ship.
getLocation(), data.lungeDest);
137 if (data.lungeDest !=
null) {
138 if (shroud !=
null) {
140 float accel = ConvulsiveLungeSystemScript.PARTICLE_WINDUP_ACCEL * amount * 1f;
142 boolean affect =
true;
145 p.vel.x += dir.x * accel;
146 p.vel.y += dir.y * accel;
154 }
else if (data.lungeDest !=
null) {
157 boolean slowdown = data.lungeElapsed >
LUNGE_DUR - 1f;
163 if (!data.fadedFlash) {
164 if (shroud !=
null) {
166 if (p.flash !=
null) {
171 data.fadedFlash =
true;
181 float freeLength = 0f;
182 float stretch = dist - freeLength;
184 float forceMag = k * Math.abs(stretch);
186 float speedInDir = Vector2f.dot(dir, ship.
getVelocity());
188 float mult = 1f - Math.min(1f, (speedInDir -
LUNGE_SPEED) / 100f);
193 float forceMagReduction = Math.min(Math.abs(forceMag), friction);
194 forceMag -= forceMagReduction;
195 friction -= forceMagReduction;
197 Vector2f force =
new Vector2f(dir);
200 force.scale(forceMag);
202 force.scale(forceMag * Math.signum(stretch));
205 Vector2f acc =
new Vector2f(force);
212 data.lungeElapsed += amount;
214 data.lunging =
false;
static SettingsAPI getSettings()
static CombatEngineAPI getCombatEngine()
boolean isSMod(MutableShipStatsAPI stats)
void modifyFlat(String source, float value)
static final String SHROUDED_MANTLE
static String HUNGERING_RIFT_HEAL_MOD_HUMAN_SHIPS
static float HULL_LOSS_FOR_PULLBACK
static float SPRING_CONSTANT
static DwellerShroud getShroudFor(CombatEntityAPI entity)
static float CREW_CASUALTIES
void doLunge(ShroudedMantleHullmodData data, ShipAPI ship, float amount)
static float LUNGE_COOLDOWN
String getDescriptionParam(int index, HullSize hullSize)
void advanceInCombat(ShipAPI ship, float amount)
String getSModDescriptionParam(int index, HullSize hullSize, ShipAPI ship)
CargoStackAPI getRequiredItem()
void applyEffectsBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id)
List< SwarmMember > getMembers()
void advance(float amount)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static Vector2f getUnitVector(Vector2f from, Vector2f to)
static float getAngleInDegrees(Vector2f v)
static Vector2f normalise(Vector2f v)
float getSafeMovementDir(ShipAPI ship)
CargoStackAPI createCargoStack(CargoItemType type, Object data, CargoAPI cargo)
Map< String, Object > getCustomData()
DynamicStatsAPI getDynamic()
FluxTrackerAPI getFluxTracker()
void giveCommand(ShipCommand command, Object param, int groupNumber)
StatBonus getMod(String id)