1package com.fs.starfarer.api.impl.combat.dweller;
3import java.util.Iterator;
7import org.lwjgl.util.vector.Vector2f;
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.CollisionClass;
14import com.fs.starfarer.api.combat.CombatEngineAPI;
15import com.fs.starfarer.api.combat.CombatEntityAPI;
16import com.fs.starfarer.api.combat.DamageType;
17import com.fs.starfarer.api.combat.DamagingProjectileAPI;
18import com.fs.starfarer.api.combat.EmpArcEntityAPI;
19import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams;
20import com.fs.starfarer.api.combat.MissileAPI;
21import com.fs.starfarer.api.combat.ShipAPI;
22import com.fs.starfarer.api.combat.ShipAPI.HullSize;
23import com.fs.starfarer.api.impl.campaign.ids.Items;
24import com.fs.starfarer.api.impl.combat.NegativeExplosionVisual.NEParams;
25import com.fs.starfarer.api.impl.combat.RiftCascadeMineExplosion;
26import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams;
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.WeightedRandomPicker;
57 public static String
DATA_KEY =
"core_ShroudedLensHullmod_data_key";
59 public static class ShroudedLensHullmodData {
61 float untilAttack = 0f;
62 float sinceAttack = 1000f;
68 ShroudedLensHullmodData data = (ShroudedLensHullmodData) engine.
getCustomData().get(key);
70 data =
new ShroudedLensHullmodData();
78 super.advanceInCombat(ship, amount);
81 if (amount <= 0f)
return;
83 ShroudedLensHullmodData data =
getData(ship);
85 if (data.untilAttack <= 0f) {
96 case CAPITAL_SHIP:
return 1f;
97 case CRUISER:
return 0.6666666667f;
98 case DESTROYER:
return 0.3333333333f;
106 public static float getRoF(HullSize size) {
122 angle += 45f - 90f * (float) Math.random();
128 point.scale(targetRadius * (0.8f + (
float) Math.random() * 0.4f));
145 if (shroud !=
null) {
154 if (shroud !=
null) {
156 EmpArcParams params =
new EmpArcParams();
157 params.segmentLengthMult = 4f;
158 params.glowSizeMult = 4f;
159 params.flickerRateMult = 0.5f + (float) Math.random() * 0.5f;
160 params.flickerRateMult *= 1.5f;
163 Color fringe = color;
164 Color core = Color.white;
166 float thickness = shroudParams.overloadArcThickness;
171 angle = angle + 90f * ((float) Math.random() - 0.5f);
173 dist = shroudParams.maxOffset * shroud.
getShroudParams().overloadArcOffsetMult;
174 dist = dist * 0.5f + dist * 0.5f * (float) Math.random();
178 Vector2f to = Vector2f.add(from, dir,
new Vector2f());
181 from, ship, to, ship, thickness, fringe, core, params);
189 float explosionRadius =
RADIUS;
194 explosionRadius * 0.5f,
203 new Color(255,255,255,0),
204 new Color(255,100,100,0)
208 spec.setUseDetailedExplosion(
false);
209 spec.setSoundSetId(
"abyssal_glare_explosion");
211 spec.setSoundVolume(0.33f);
226 p.spawnHitGlowAt = 1f;
227 p.additiveBlend =
true;
228 p.blackColor = Color.white;
230 p.withNegativeParticles =
false;
231 p.withHitGlow =
false;
240 float thickness = 30f;
242 Color coreColor = Color.white;
246 color =
new Color(255,0,30,255);
247 coreColor =
new Color(255,10,255,255);
253 float coreWidthMult = 1f;
264 EmpArcParams params =
new EmpArcParams();
266 params.segmentLengthMult = 4f;
271 params.maxZigZagMult = 0.25f;
273 params.zigZagReductionFactor = 1f;
282 params.flickerRateMult = 0.75f + 0.25f * (float) Math.random();
284 params.fadeOutDist = 150f;
285 params.minFadeOutMult = 5f;
287 params.glowSizeMult = 0.5f;
307 if (shroud !=
null) {
327 tooltip.
addPara(
"The \"lens\" (in the loosest sense of the word) focuses on nearby objects, "
328 +
"seemingly at random. Deals %s damage and generates %s flux.", opad, h,
331 tooltip.
addPara(
"The rate of fire depends on the size of the ship the "
332 +
"hullmod is installed on. Can not be turned off during combat operations, and continues to "
333 +
"function even if the ship is venting flux or overloaded.", opad);
341 HullSize [] sizes =
new HullSize[] {HullSize.FRIGATE, HullSize.DESTROYER, HullSize.CRUISER, HullSize.CAPITAL_SHIP};
345 float sizeW = width - rofW - fluxW - 10f;
348 new Object [] {
"Ship size", sizeW,
"Attacks / sec", rofW,
"Flux / sec", fluxW});
350 for (HullSize size : sizes) {
391 range * 2f, range * 2f);
394 float minScore = Float.MAX_VALUE;
398 boolean ignoreFlares =
false;
402 while (iter.hasNext()) {
403 Object o = iter.next();
406 !(o instanceof
ShipAPI))
continue;
408 if (other.
getOwner() == owner)
continue;
410 if (other instanceof
ShipAPI) {
420 if (ignoreFlares && other instanceof
MissileAPI) {
422 if (missile.
isFlare())
continue;
428 if (dist > range)
continue;
432 if (score < minScore) {
437 picker.
add(other, 100f / Math.max(100f, score));
441 return picker.
pick();
static SettingsAPI getSettings()
static boolean CODEX_TOOLTIP_MODE
static CombatEngineAPI getCombatEngine()
static final String SHROUDED_LENS
static void spawnStandardRift(DamagingProjectileAPI explosion, NEParams params)
static NEParams createStandardRiftParams(String minelayerId, float baseRadius)
DwellerShroudParams getShroudParams()
static DwellerShroud getShroudFor(CombatEntityAPI entity)
static Color SHROUD_GLOW_COLOR
boolean deductFlux(ShipAPI ship, float fluxCost)
void addCrewCasualties(TooltipMakerAPI tooltip, float opad)
static Color RIFT_LIGHTNING_COLOR
static float FLUX_PER_DAMAGE
String getDescriptionParam(int index, HullSize hullSize)
void advanceInCombat(ShipAPI ship, float amount)
static float getPowerMult(HullSize size)
static float getDamage(HullSize size)
CombatEntityAPI findTarget(ShipAPI ship)
CargoStackAPI getRequiredItem()
static float MAX_ROF_MULT
static float MAX_REFIRE_DELAY
static float getRoF(HullSize size)
static ShroudedLensHullmodData getData(ShipAPI ship)
static float getFluxCost(HullSize size)
void addPostDescriptionSection(TooltipMakerAPI tooltip, HullSize hullSize, final ShipAPI ship, float width, boolean isForModSpec)
boolean shouldAddDescriptionToTooltip(HullSize hullSize, ShipAPI ship, boolean isForModSpec)
void spawnExplosion(ShipAPI ship, CombatEntityAPI target)
static float MIN_REFIRE_DELAY
static float MIN_ROF_MULT
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static Color getNegativeHighlightColor()
static String getHullSizeStr(HullSize size)
static float getRoundedValueFloat(float value)
static Color getBasePlayerColor()
static Color getGrayColor()
static Color getBrightPlayerColor()
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static Vector2f getUnitVector(Vector2f from, Vector2f to)
static Color getHighlightColor()
static float getTargetingRadius(Vector2f from, CombatEntityAPI target, boolean considerShield)
static Color getDarkPlayerColor()
static float getAngleInDegrees(Vector2f v)
CargoStackAPI createCargoStack(CargoItemType type, Object data, CargoAPI cargo)
Iterator< Object > getCheckIterator(Vector2f loc, float checkWidth, float checkHeight)
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)
CollisionGridAPI getAllObjectGrid()
CollisionClass getCollisionClass()
void setSingleFlickerMode()
void setFadedOutAtStart(boolean fadedOutAtStart)
void setRenderGlowAtStart(boolean renderGlowAtStart)
void setCoreWidthOverride(float coreWidthOverride)
void setWarping(float dur)