1package com.fs.starfarer.api.impl.combat;
3import java.util.Iterator;
8import org.lwjgl.util.vector.Vector2f;
10import com.fs.starfarer.api.GameState;
11import com.fs.starfarer.api.Global;
12import com.fs.starfarer.api.combat.CollisionClass;
13import com.fs.starfarer.api.combat.CombatEngineAPI;
14import com.fs.starfarer.api.combat.CombatEngineLayers;
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.MissileAPI;
20import com.fs.starfarer.api.combat.ShipAPI;
21import com.fs.starfarer.api.combat.ViewportAPI;
22import com.fs.starfarer.api.combat.WeaponAPI;
23import com.fs.starfarer.api.combat.listeners.AdvanceableListener;
24import com.fs.starfarer.api.util.IntervalUtil;
25import com.fs.starfarer.api.util.Misc;
33 public static enum EMPArcHitType {
57 public static String DEBUFF_ID =
"reality_disruptor_repair_debuff";
61 public RDRepairRateDebuff(
ShipAPI ship,
float dur) {
69 public void resetDur(
float dur) {
71 this.dur = Math.max(this.dur, dur);
74 public void advance(
float amount) {
81 "REALITY DISRUPTED",
"SLOWER REPAIRS: " + (
int)Math.max(1, Math.round(dur)) +
" SEC",
true);
119 super.advance(amount);
123 if (keepSpawningParticles) {
152 super.render(
layer, viewport,
null);
158 return super.isExpired() && (!keepSpawningParticles || (!
weapon.
getShip().isAlive() &&
proj ==
null));
172 return super.getGlobalAlphaMult();
184 float thickness = 20f;
185 float coreWidthMult = 0.67f;
188 if (target !=
null) {
195 "realitydisruptor_emp_impact",
198 new Color(255,255,255,255)
205 if (target instanceof
ShipAPI) {
207 List<RDRepairRateDebuff> listeners = s.
getListeners(RDRepairRateDebuff.class);
208 if (listeners.isEmpty()) {
234 Vector2f.add(from, dir, dir);
244 range * 2f, range * 2f);
247 float minScore = Float.MAX_VALUE;
248 while (iter.hasNext()) {
249 Object o = iter.next();
252 !(o instanceof
ShipAPI))
continue;
254 if (other.
getOwner() == owner)
continue;
256 if (other instanceof
ShipAPI) {
258 if (otherShip.
isHulk())
continue;
266 if (dist > range)
continue;
272 if (score < minScore) {
289 float underSize = 75f;
297 float velMult = 0.2f;
310 addDarkParticle(size, in, out, 1.5f, size * 0.5f * velMult, 0f, color);
311 Vector2f offset =
new Vector2f(dir);
312 offset.scale(size * 0.6f + (
float) Math.random() * 0.2f);
313 Vector2f.add(
prev.offset, offset,
prev.offset);
316 addDarkParticle(size * 1f, in, out, 1.3f, size * 0.5f * velMult, 0f, color);
317 Vector2f offset =
new Vector2f(dir);
318 offset.scale(size * 1.2f + (
float) Math.random() * 0.2f);
319 Vector2f.add(
prev.offset, offset,
prev.offset);
322 addDarkParticle(size * .8f, in, out, 1.1f, size * 0.5f * velMult, 0f, color);
323 Vector2f offset =
new Vector2f(dir);
324 offset.scale(size * 1.6f + (
float) Math.random() * 0.2f);
325 Vector2f.add(
prev.offset, offset,
prev.offset);
329 addDarkParticle(size * .8f, in, out, 1.1f, size * 0.5f * velMult, 0f, color);
330 Vector2f offset =
new Vector2f(dir);
331 offset.scale(size * 2.0f + (
float) Math.random() * 0.2f);
332 Vector2f.add(
prev.offset, offset,
prev.offset);
378 float baseDuration = 1.5f;
379 Vector2f vel =
new Vector2f();
386 if (vel.length() > 100f) {
387 vel.scale(100f / vel.length());
392 case INIMICAL_EMANATION:
399 if (target !=
null && !(target instanceof
MissileAPI)) {
411 boolean inimical = type == EMPArcHitType.INIMICAL_EMANATION;
414 for (
int i = 0; i < numNegative; i++) {
415 float dur = baseDuration + baseDuration * (float) Math.random();
419 if (type == EMPArcHitType.SOURCE) {
422 float scatterMult = 1f;
423 if (inimical) scatterMult = 0.25f;
426 v.scale(nSize + nSize * (
float) Math.random() * 0.5f);
429 float endSizeMult = 2f;
430 if (type == EMPArcHitType.SOURCE) {
433 Vector2f offset =
new Vector2f(dir);
434 offset.scale(size * 0.2f * i);
435 Vector2f.add(pt, offset, pt);
439 Vector2f.add(vel, v, v);
441 float maxSpeed = nSize * 1.5f * 0.2f;
442 float minSpeed = nSize * 1f * 0.2f;
443 float overMin = v.length() - minSpeed;
445 float durMult = 1f - overMin / (maxSpeed - minSpeed);
446 if (durMult < 0.1f) durMult = 0.1f;
447 dur *= 0.5f + 0.5f * durMult;
454 float rampUp = 0.25f / dur;
461 rampUp, 0f, dur, color);
464 float dur = baseDuration;
465 float rampUp = 0.5f / dur;
475 for (
int i = 0; i < numSwirly; i++) {
476 Vector2f loc =
new Vector2f(point);
477 float scatterMult = 1f;
478 if (inimical) scatterMult = 0.5f;
480 float s = size * 4f * (0.5f + (float) Math.random() * 0.5f);
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static CombatEngineAPI getCombatEngine()
static GameState getCurrentState()
void modifyMult(String source, float value)
ParticleData addDarkParticle(float baseSize, float durIn, float durOut, float endSizeMult, float maxDriftVel, float maxAngVel, Color color)
ParticleData addParticle(float baseSize, float durIn, float durOut, float endSizeMult, float maxDriftVel, float maxAngVel, Color color)
void randomizePrevParticleLocation(float maxOffset)
void setSpriteSheetKey(String spriteSheetKey)
void addChargingParticles(WeaponAPI weapon)
RealityDisruptorChargeGlow(WeaponAPI weapon)
static void spawnEMPParticles(EMPArcHitType type, DamagingProjectileAPI proj, Vector2f point, CombatEntityAPI target)
void advance(float amount)
static boolean isProjectileExpired(DamagingProjectileAPI proj)
static boolean isWeaponCharging(WeaponAPI weapon)
void attachToProjectile(DamagingProjectileAPI proj)
static float REPAIR_RATE_DEBUFF_DUR
Vector2f pickNoTargetDest(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
void render(CombatEngineLayers layer, ViewportAPI viewport)
float getGlobalAlphaMult()
static float ARC_RATE_MULT
DamagingProjectileAPI proj
static float REPAIR_RATE_MULT
CombatEntityAPI findTarget(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
static Color STANDARD_RIFT_COLOR
static Color EXPLOSION_UNDERCOLOR
static Color getColorForDarkening(Color from)
void advance(float amount)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float getTargetingRadius(Vector2f from, CombatEntityAPI target, boolean considerShield)
static Vector2f getPointWithinRadius(Vector2f from, float r)
String getSpriteName(String category, String id)
void playLoop(String id, Object playingEntity, float pitch, float volume, Vector2f loc, Vector2f vel)
SoundAPI playSound(String id, float pitch, float volume, Vector2f loc, Vector2f vel)
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)
void maintainStatusForPlayerShip(Object key, String spriteName, String title, String data, boolean isDebuff)
boolean isEntityInPlay(CombatEntityAPI entity)
void addSwirlyNebulaParticle(Vector2f loc, Vector2f vel, float size, float endSizeMult, float rampUpFraction, float fullBrightnessFraction, float totalDuration, Color color, boolean expandAsSqrt)
CollisionGridAPI getAllObjectGrid()
void addNegativeNebulaParticle(Vector2f loc, Vector2f vel, float size, float endSizeMult, float rampUpFraction, float fullBrightnessFraction, float totalDuration, Color color)
EmpArcEntityAPI spawnEmpArc(ShipAPI damageSource, Vector2f point, CombatEntityAPI pointAnchor, CombatEntityAPI empTargetEntity, DamageType damageType, float damAmount, float empDamAmount, float maxRange, String impactSoundId, float thickness, Color fringe, Color core)
CollisionClass getCollisionClass()
Vector2f getTargetLocation()
void setCoreWidthOverride(float coreWidthOverride)
MutableStat getCombatEngineRepairTimeMult()
MutableStat getCombatWeaponRepairTimeMult()
MutableShipStatsAPI getMutableStats()
void addListener(Object listener)
void removeListener(Object listener)
< T > List< T > getListeners(Class< T > c)
Vector2f getFirePoint(int barrel)
float getCooldownRemaining()