1package com.fs.starfarer.api.impl.combat.threat;
3import java.util.ArrayList;
8import com.fs.starfarer.api.GameState;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
11import com.fs.starfarer.api.campaign.CargoStackAPI;
12import com.fs.starfarer.api.campaign.SpecialItemData;
13import com.fs.starfarer.api.combat.BaseHullMod;
14import com.fs.starfarer.api.combat.MutableShipStatsAPI;
15import com.fs.starfarer.api.combat.ShipAPI;
16import com.fs.starfarer.api.combat.ShipAPI.HullSize;
17import com.fs.starfarer.api.combat.WeaponAPI;
18import com.fs.starfarer.api.impl.campaign.ids.Items;
19import com.fs.starfarer.api.impl.campaign.ids.Stats;
20import com.fs.starfarer.api.impl.campaign.ids.Tags;
21import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.RoilingSwarmParams;
22import com.fs.starfarer.api.loading.HullModSpecAPI;
23import com.fs.starfarer.api.util.ColorShifterUtil;
24import com.fs.starfarer.api.util.Misc;
50 boolean sMod =
isSMod(stats);
68 if (amount <= 0f || ship ==
null)
return;
81 RoilingSwarmParams params = swarm.
params;
93 params.maxNumMembersToAlwaysRemoveAbove = (int) (params.baseMembersToMaintain * 1.5f);
94 params.initialMembers = params.baseMembersToMaintain;
108 boolean debuff = active < maxRequired;
112 "FRAGMENTS: " + active,
120 if (existing !=
null)
return existing;
126 RoilingSwarmParams params =
new RoilingSwarmParams();
144 params.flashRateMult = 0.25f;
145 params.flashCoreRadiusMult = 0f;
146 params.flashRadius = 120f;
147 params.flashFringeColor =
new Color(255,0,0,40);
148 params.flashCoreColor =
new Color(255,255,255,127);
153 params.maxOffset = radius;
154 params.initialMembers = numMembers;
155 params.baseMembersToMaintain = params.initialMembers;
162 params.flashRateMult = 0.25f;
163 params.flashCoreRadiusMult = 0f;
164 params.flashRadius = 120f;
165 params.flashFringeColor =
new Color(255,0,0,40);
166 params.flashCoreColor =
new Color(255,255,255,127);
171 params.minOffset = 0f;
173 params.generateOffsetAroundAttachedEntityOval =
true;
174 params.despawnSound =
null;
175 params.spawnOffsetMult = 0.33f;
176 params.spawnOffsetMultForInitialSpawn = 1f;
180 params.maxNumMembersToAlwaysRemoveAbove = params.baseMembersToMaintain * 2;
184 params.initialMembers = 0;
185 params.initialMembers = params.baseMembersToMaintain;
186 params.removeMembersAboveMaintainLevel =
false;
189 List<WeaponAPI> glowWeapons =
new ArrayList<>();
206 protected boolean resetFlash =
false;
209 public int getNumMembersToMaintain() {
211 return (
int)Math.round(((0.2f + 0.8f * ship.
getHullLevel()) * super.getNumMembersToMaintain()));
213 return super.getNumMembersToMaintain();
217 public void advance(
float amount) {
218 super.advance(amount);
220 glowColorShifter.
advance(amount);
225 params.flashFrequency = 4f;
226 params.flashProbability = 1f;
229 if (!glowWeapons.isEmpty()) {
230 float ammoFractionTotal = 0f;
233 float f = w.getAmmo() / Math.max(1f, w.getMaxAmmo());
234 Color glowColor = w.getSpec().getGlowColor();
238 glowColorShifter.
shift(w, glowColor, 0.5f, 0.5f, 1f);
239 float weight = w.getSpec().getOrdnancePointCost(
null);
240 ammoFractionTotal += f * weight;
244 float ammoFraction = ammoFractionTotal / Math.max(1f, totalOP);
245 params.flashFrequency = (1f + ammoFraction) * 2f;
246 params.flashFrequency *= Math.max(1f, Math.min(2f, params.baseMembersToMaintain / 50f));
247 params.flashProbability = 1f;
248 if (ammoFraction <= 0f) {
249 params.flashProbability = 0f;
253 float glowAlphaBase = 30f;
258 float extraGlow = (totalOP - 10f) / 90f;
259 if (extraGlow < 0) extraGlow = 0;
260 if (extraGlow > 1f) extraGlow = 1f;
262 int glowAlpha = (int)(glowAlphaBase + glowAlphaBase * (ammoFraction + extraGlow * 0.5f));
263 if (glowAlpha > 255) glowAlpha = 255;
266 params.flashFringeColor =
Misc.
setAlpha(params.flashFringeColor, glowAlpha);
272 params.flashProbability = 0f;
295 case CAPITAL_SHIP:
return 100;
296 case CRUISER:
return 60;
297 case DESTROYER:
return 40;
298 case FRIGATE:
return 20;
299 case FIGHTER:
return 50;
300 case DEFAULT:
return 20;
307 case CAPITAL_SHIP:
return 5f;
308 case CRUISER:
return 3f;
309 case DESTROYER:
return 2f;
310 case FRIGATE:
return 1f;
311 case FIGHTER:
return 0f;
312 case DEFAULT:
return 0f;
325 if (ship ==
null || ship.
getVariant() ==
null)
return false;
344 return "Can not be installed on a phase ship";
346 return "Incompatible with Shrouded hullmods";
365 if (index == 0)
return "" + (int) Math.round(
SMOD_CR_PENALTY * 100f) +
"%";
static SettingsAPI getSettings()
static CombatEngineAPI getCombatEngine()
static GameState getCurrentState()
boolean isSMod(MutableShipStatsAPI stats)
void modifyFlat(String source, float value)
void modifyPercent(String source, float value)
static final String FRAGMENT_FABRICATOR
static final String FRAGMENT_SWARM_RESPAWN_RATE_MULT
static final String FRAGMENT_SWARM_SIZE_MOD
void applyEffectsAfterShipCreation(ShipAPI ship, String id)
static String CONSTRUCTION_SWARM_FLOCKING_CLASS
static String RECLAMATION_SWARM_EXCHANGE_CLASS
boolean isApplicableToShip(ShipAPI ship)
CargoStackAPI getRequiredItem()
static float SMOD_MAINTENANCE_PENALTY
static String STANDARD_SWARM_EXCHANGE_CLASS
String getUnapplicableReason(ShipAPI ship)
static float getBaseSwarmRespawnRateMult(HullSize size)
void advanceInCombat(ShipAPI ship, float amount)
static boolean hasShroudedHullmods(ShipAPI ship)
static String RECLAMATION_SWARM_FLOCKING_CLASS
static boolean SHOW_OVERLAY_ON_THREAT_SHIPS
String getDescriptionParam(int index, HullSize hullSize)
String getSModDescriptionParam(int index, HullSize hullSize, ShipAPI ship)
static String STANDARD_SWARM_FLOCKING_CLASS
boolean isSModEffectAPenalty()
static int getBaseSwarmSize(HullSize size)
void applyEffectsBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id)
static float SMOD_CR_PENALTY
static RoilingSwarmEffect createSwarmFor(ShipAPI ship)
static Object STATUS_KEY1
int getNumActiveMembers()
RoilingSwarmParams params
static RoilingSwarmEffect getSwarmFor(CombatEntityAPI entity)
static Map< String, Integer > FRAGMENT_NUM
static Map< String, Integer > SWARM_RADIUS
static boolean isSwarmPhaseMode(ShipAPI ship)
void advance(float amount)
void shift(Object source, Color to, float durIn, float durOut, float shift)
static Color setAlpha(Color color, int alpha)
static Color setBrightness(Color color, int brightness)
CargoStackAPI createCargoStack(CargoItemType type, Object data, CargoAPI cargo)
String getSpriteName(String category, String id)
HullModSpecAPI getHullModSpec(String modId)
void maintainStatusForPlayerShip(Object key, String spriteName, String title, String data, boolean isDebuff)
float getCollisionRadius()
MutableStat getZeroFluxSpeedBoost()
MutableStat getMaxCombatReadiness()
MutableStat getSuppliesPerMonth()
DynamicStatsAPI getDynamic()
void setExtraOverlayMatchHullColor(boolean extraOverlayMatchHullColor)
float getMaxSpeedWithoutBoost()
ShipHullSpecAPI getHullSpec()
MutableShipStatsAPI getMutableStats()
void setExtraOverlay(String spriteName)
void setExtraOverlayShadowOpacity(float extraOverlayOpacity)
List< WeaponAPI > getAllWeapons()
ShipVariantAPI getVariant()
boolean hasTag(String tag)
Collection< String > getHullMods()
int getNumFragmentsToFire()
boolean hasTag(String tag)
float getValue(String id)