1package com.fs.starfarer.api.impl.combat.dweller;
5import org.lwjgl.util.vector.Vector2f;
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
9import com.fs.starfarer.api.campaign.CargoStackAPI;
10import com.fs.starfarer.api.campaign.SpecialItemData;
11import com.fs.starfarer.api.combat.CollisionClass;
12import com.fs.starfarer.api.combat.CombatEngineAPI;
13import com.fs.starfarer.api.combat.CombatEntityAPI;
14import com.fs.starfarer.api.combat.DamageAPI;
15import com.fs.starfarer.api.combat.DamageType;
16import com.fs.starfarer.api.combat.DamagingProjectileAPI;
17import com.fs.starfarer.api.combat.EmpArcEntityAPI;
18import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams;
19import com.fs.starfarer.api.combat.ShipAPI;
20import com.fs.starfarer.api.combat.ShipAPI.HullSize;
21import com.fs.starfarer.api.combat.listeners.DamageDealtModifier;
22import com.fs.starfarer.api.impl.campaign.ids.Items;
23import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual.NEParams;
24import com.fs.starfarer.api.impl.combat.RiftCascadeMineExplosion;
25import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams;
26import com.fs.starfarer.api.impl.combat.threat.EnergyLashSystemScript.DelayedCombatActionPlugin;
27import com.fs.starfarer.api.loading.DamagingExplosionSpec;
28import com.fs.starfarer.api.ui.Alignment;
29import com.fs.starfarer.api.ui.TooltipMakerAPI;
30import com.fs.starfarer.api.util.Misc;
31import com.fs.starfarer.api.util.TimeoutTracker;
32import com.fs.starfarer.api.util.WeightedRandomPicker;
54 public ShroudedThunderheadDamageDealtMod(
ShipAPI ship) {
57 public String modifyDamageDealt(Object param,
59 Vector2f point,
boolean shieldHit) {
71 ShroudedThunderheadHullmodData data =
getData(ship);
72 RecentHitData hit =
new RecentHitData();
75 hit.point =
new Vector2f(point);
77 hit.shieldHit = shieldHit;
87 super.applyEffectsAfterShipCreation(ship,
id);
88 ship.
addListener(
new ShroudedThunderheadDamageDealtMod(ship));
101 public static String
DATA_KEY =
"core_ShroudedThunderheadHullmod_data_key";
102 public static class RecentHitData {
109 public static class ShroudedThunderheadHullmodData {
113 boolean hasRecentEnoughHits() {
114 for (RecentHitData curr : recentHits.
getItems()) {
121 float getHitProbability() {
126 RecentHitData pickRecentHit() {
127 if (!hasRecentEnoughHits())
return null;
128 WeightedRandomPicker<RecentHitData> picker =
new WeightedRandomPicker<>();
129 for (RecentHitData curr : recentHits.
getItems()) {
134 RecentHitData misfire =
new RecentHitData();
136 return picker.pick();
143 ShroudedThunderheadHullmodData data = (ShroudedThunderheadHullmodData) engine.
getCustomData().get(key);
145 data =
new ShroudedThunderheadHullmodData();
153 super.advanceInCombat(ship, amount);
156 if (amount <= 0f)
return;
158 ShroudedThunderheadHullmodData data =
getData(ship);
161 float prob = data.getHitProbability();
163 shroud.
getParams().flashProbability = Math.min(0.1f + prob * 1.4f, 1f);
167 if (data.untilArc <= 0f) {
168 boolean hasRecentHits = data.hasRecentEnoughHits();
170 RecentHitData hit = data.pickRecentHit();
171 if (hit !=
null && hit.target !=
null) {
172 data.recentHits.remove(hit);
179 data.recentHits.advance(amount);
184 case CAPITAL_SHIP:
return 1f;
185 case CRUISER:
return 0.6666666667f;
186 case DESTROYER:
return 0.3333333333f;
209 Vector2f point = hit.point;
227 if (shroud !=
null) {
237 EmpArcParams params =
new EmpArcParams();
238 params.segmentLengthMult = 8f;
239 params.zigZagReductionFactor = 0.15f;
241 params.fadeOutDist = 50f;
242 params.minFadeOutMult = 10f;
244 params.flickerRateMult = 0.3f;
249 params.movementDurOverride = Math.max(0.05f, dist / arcSpeed);
251 float arcWidth = 40f + mult * 40f;
252 float explosionRadius = 40f + mult * 40f;
259 new Color(255,255,255,255),
268 float volume = 0.75f + 0.25f * mult;
269 float pitch = 1f + 0.25f * (1f - mult);
272 if (shroud !=
null) {
274 params =
new EmpArcParams();
275 params.segmentLengthMult = 4f;
276 params.glowSizeMult = 4f;
277 params.flickerRateMult = 0.5f + (float) Math.random() * 0.5f;
278 params.flickerRateMult *= 1.5f;
281 Color fringe = color;
282 Color core = Color.white;
284 float thickness = shroudParams.overloadArcThickness;
289 angle = angle + 90f * ((float) Math.random() - 0.5f);
291 dist = shroudParams.maxOffset * shroud.
getShroudParams().overloadArcOffsetMult;
292 dist = dist * 0.5f + dist * 0.5f * (float) Math.random();
296 Vector2f to = Vector2f.add(from, dir,
new Vector2f());
299 from, ship, to, ship, thickness, fringe, core, params);
308 float explosionDelay = params.movementDurOverride * 0.8f;
315 explosionRadius * 0.5f,
324 new Color(255,255,255,0),
325 new Color(255,100,100,0)
327 spec.setMinEMPDamage(emp * 0.5f);
328 spec.setMaxEMPDamage(emp);
331 spec.setUseDetailedExplosion(
false);
332 spec.setSoundSetId(
"rift_lightning_explosion");
333 spec.setSoundVolume(0.5f + 0.5f * mult);
360 color =
new Color(255,75,75,255);
362 color, 14f + 6f * mult);
363 p.fadeOut = 0.5f + 0.5f * mult;
364 p.hitGlowSizeMult = 0.6f;
392 tooltip.
addPara(
"Fires rift lightning bolts at locations recently hit by this ship's weapons.", opad);
394 tooltip.
addPara(
"The amount of damage and the flux generated depend on the size of the ship the "
395 +
"hullmod is installed on. The probability of a bolt being fired increases with the number "
396 +
"of hits landed over the previous %s seconds. "
397 +
"Bolts are not triggered by weapons dealing soft flux damage, such as beams.", opad,
406 HullSize [] sizes =
new HullSize[] {HullSize.FRIGATE, HullSize.DESTROYER, HullSize.CRUISER, HullSize.CAPITAL_SHIP};
411 float sizeW = width - damW - empW - fluxW - 10f;
414 new Object [] {
"Ship size", sizeW,
"Damage", damW,
"EMP", empW,
"Flux cost", fluxW});
416 for (HullSize size : sizes) {
428 Alignment.
MID, c,
"" +
"" + (
int) Math.round(fluxCost));
static SettingsAPI getSettings()
static boolean CODEX_TOOLTIP_MODE
static SoundPlayerAPI getSoundPlayer()
static CombatEngineAPI getCombatEngine()
static final String SHROUDED_THUNDERHEAD
static void spawnStandardRift(DamagingProjectileAPI explosion, NEParams params)
static NEParams createStandardRiftParams(String minelayerId, float baseRadius)
DwellerShroudParams getShroudParams()
static DwellerShroud getShroudFor(CombatEntityAPI entity)
boolean deductFlux(ShipAPI ship, float fluxCost)
void addCrewCasualties(TooltipMakerAPI tooltip, float opad)
static float RIFT_LIGHTNING_SPEED
static Color RIFT_LIGHTNING_COLOR
static float FLUX_PER_DAMAGE
CargoStackAPI getRequiredItem()
static float getPowerMult(HullSize size)
void applyEffectsAfterShipCreation(ShipAPI ship, String id)
static float getDamage(HullSize size)
static float RECENT_HIT_DUR
void spawnLightning(ShipAPI ship, RecentHitData hit)
static float getEMPDamage(HullSize size)
static float MAX_REFIRE_DELAY
static float MISFIRE_WEIGHT
String getDescriptionParam(int index, HullSize hullSize)
static float WEIGHT_PER_RECENT_HIT
static float MIN_REFIRE_DELAY
static float MAX_TIME_SINCE_RECENT_HIT
static float REFIRE_RATE_MULT
void addPostDescriptionSection(TooltipMakerAPI tooltip, HullSize hullSize, final ShipAPI ship, float width, boolean isForModSpec)
static ShroudedThunderheadHullmodData getData(ShipAPI ship)
void advanceInCombat(ShipAPI ship, float amount)
boolean shouldAddDescriptionToTooltip(HullSize hullSize, ShipAPI ship, boolean isForModSpec)
static float getFluxCost(HullSize size)
RoilingSwarmParams getParams()
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static Color getNegativeHighlightColor()
static String getHullSizeStr(HullSize size)
static Color getBasePlayerColor()
static Color getGrayColor()
static Color getBrightPlayerColor()
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static Color getHighlightColor()
static Color getDarkPlayerColor()
static float getAngleInDegrees(Vector2f v)
float getRemaining(T item)
CargoStackAPI createCargoStack(CargoItemType type, Object data, CargoAPI cargo)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
EmpArcEntityAPI spawnEmpArcVisual(Vector2f from, CombatEntityAPI fromAnchor, Vector2f to, CombatEntityAPI toAnchor, float thickness, Color fringe, Color core)
Map< String, Object > getCustomData()
DamagingProjectileAPI spawnDamagingExplosion(DamagingExplosionSpec spec, ShipAPI source, Vector2f location)
void addPlugin(EveryFrameCombatPlugin plugin)
boolean isForceHardFlux()
default DamagingExplosionSpec getExplosionSpecIfExplosion()
void setSingleFlickerMode()
void setFadedOutAtStart(boolean fadedOutAtStart)
void setRenderGlowAtStart(boolean renderGlowAtStart)
void setCoreWidthOverride(float coreWidthOverride)
void addListener(Object listener)