1package com.fs.starfarer.api.impl.combat;
3import java.util.ArrayList;
4import java.util.EnumSet;
5import java.util.Iterator;
10import org.lwjgl.util.vector.Vector2f;
12import com.fs.starfarer.api.Global;
13import com.fs.starfarer.api.combat.BaseCombatLayeredRenderingPlugin;
14import com.fs.starfarer.api.combat.CombatEngineAPI;
15import com.fs.starfarer.api.combat.CombatEngineLayers;
16import com.fs.starfarer.api.combat.CombatEntityAPI;
17import com.fs.starfarer.api.combat.DamagingProjectileAPI;
18import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin;
19import com.fs.starfarer.api.combat.OnFireEffectPlugin;
20import com.fs.starfarer.api.combat.OnHitEffectPlugin;
21import com.fs.starfarer.api.combat.ShipAPI;
22import com.fs.starfarer.api.combat.ViewportAPI;
23import com.fs.starfarer.api.combat.WeaponAPI;
24import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
25import com.fs.starfarer.api.graphics.SpriteAPI;
26import com.fs.starfarer.api.util.FaderUtil;
27import com.fs.starfarer.api.util.Misc;
44 return "cryoflamer_loop";
49 "cryoflamer_hit_shield_light",
50 "cryoflamer_hit_shield_solid",
51 "cryoflamer_hit_shield_heavy",
52 "cryoflamer_hit_light",
53 "cryoflamer_hit_solid",
54 "cryoflamer_hit_heavy");
61 return "nebula_particles";
76 protected List<CryofluxTransducerEffect>
trails;
78 if (
trails ==
null)
return;
80 Iterator<CryofluxTransducerEffect> iter =
trails.iterator();
81 while (iter.hasNext()) {
82 if (iter.next().isExpired()) iter.remove();
89 Vector2f com =
new Vector2f();
94 if (curr.proj !=
null) {
95 Vector2f.add(com, curr.proj.getLocation(), com);
96 weight += curr.proj.getBrightness();
101 com.scale(1f / weight);
102 float volume = Math.min(weight, 1f);
104 totalDist /= (float)
trails.size();
105 float mult = totalDist / Math.max(maxRange, 1f);
107 if (mult > 1f) mult = 1f;
108 if (mult < 0f) mult = 0f;
109 mult = (float) Math.sqrt(mult);
124 for (
int i = 0; i < numIter; i++) {
128 float dist1 =
Misc.
getDistance(trail.prev.getLocation(), trail.proj.getLocation());
129 if (dist1 < trail.proj.getProjectileSpec().getLength() * 1f) {
130 float maxSpeed = trail.prev.getMoveSpeed() * 0.5f;
132 float e = trail.prev.getElapsed();
135 maxSpeed *= Math.max(0.25f, 1f - (e - t) * 0.5f);
137 if (dist1 < thresholdDist && e > t) {
138 maxSpeed *= dist1 / thresholdDist;
143 Vector2f diff = Vector2f.sub(driftTo, trail.prev.getLocation(),
new Vector2f());
145 diff.scale(Math.min(dist, maxSpeed * amount));
146 Vector2f.add(trail.prev.getLocation(), diff, trail.prev.getLocation());
147 Vector2f.add(trail.prev.getTailEnd(), diff, trail.prev.getTailEnd());
161 Vector2f vel =
new Vector2f();
162 if (target instanceof
ShipAPI) {
195 trails =
new ArrayList<CryofluxTransducerEffect>();
205 public static class ParticleData {
207 public Vector2f offset =
new Vector2f();
208 public Vector2f vel =
new Vector2f();
209 public float scale = 1f;
211 public float scaleIncreaseRate = 1f;
212 public float turnDir = 1f;
213 public float angle = 1f;
228 angle = (float) Math.random() * 360f;
231 scaleIncreaseRate = 2f / maxDur;
241 turnDir = Math.signum((
float) Math.random() - 0.5f) * 60f * (float) Math.random();
244 float driftDir = (float) Math.random() * 360f;
254 public void advance(
float amount) {
255 scale += scaleIncreaseRate * amount;
257 scale += scaleIncreaseRate * amount * 1f;
260 offset.x += vel.x * amount;
261 offset.y += vel.y * amount;
263 angle += turnDir * amount;
269 protected List<ParticleData>
particles =
new ArrayList<ParticleData>();
281 for (
int i = 0; i < num; i++) {
290 float f = index / (
particles.size() - 1);
292 dir.scale(length * f);
293 Vector2f.add(p.offset, dir, p.offset);
352 float alphaMult = 1f;
353 Vector2f offset = p.offset;
355 if (Math.abs(diff) > 0.1f) {
358 Vector2f loc =
new Vector2f(x + offset.x, y + offset.y);
360 p.sprite.setAngle(p.angle);
361 p.sprite.setSize(size, size);
362 p.sprite.setAlphaMult(b * alphaMult * p.fader.getBrightness());
363 p.sprite.setColor(color);
364 p.sprite.renderAtCenter(loc.x, loc.y);
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static CombatEngineAPI getCombatEngine()
void init(CombatEntityAPI entity)
String getParticleSpriteKey()
void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine)
String getParticleSpriteCat()
DamagingProjectileAPI prev
CryofluxTransducerEffect createTrail(DamagingProjectileAPI projectile, DamagingProjectileAPI prev)
CryofluxTransducerEffect()
DamagingProjectileAPI proj
void advance(float amount)
void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon)
List< CryofluxTransducerEffect > trails
void playImpactSound(ApplyDamageResultAPI damageResult, Vector2f point, Vector2f vel)
void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
List< ParticleData > particles
float getParticleScaleIncreaseRateMult()
void render(CombatEngineLayers layer, ViewportAPI viewport)
EnumSet< CombatEngineLayers > getActiveLayers()
CryofluxTransducerEffect(DamagingProjectileAPI proj, DamagingProjectileAPI prev)
EnumSet< CombatEngineLayers > layers
void advance(float amount)
static void playSound(ApplyDamageResultAPI result, Vector2f loc, Vector2f vel, String lightShields, String solidShields, String heavyShields, String lightHull, String solidHull, String heavyHull)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static Color setAlpha(Color color, int alpha)
static Vector2f rotateAroundOrigin(Vector2f v, float angle)
static Vector2f closestPointOnLineToPoint(Vector2f p1, Vector2f p2, Vector2f p3)
static float getHitGlowSize(float baseSize, float baseDamage, ApplyDamageResultAPI result)
static float getAngleDiff(float from, float to)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static Color scaleAlpha(Color color, float factor)
static Vector2f getPointWithinRadius(Vector2f from, float r)
static Vector2f normalise(Vector2f v)
ABOVE_SHIPS_AND_MISSILES_LAYER
SpriteAPI getSprite(String filename)
void playLoop(String id, Object playingEntity, float pitch, float volume, Vector2f loc, Vector2f vel)
CombatEntityAPI addLayeredRenderingPlugin(CombatLayeredRenderingPlugin plugin)
Map< String, Object > getCustomData()
boolean isEntityInPlay(CombatEntityAPI entity)
void addNebulaParticle(Vector2f loc, Vector2f vel, float size, float endSizeMult, float rampUpFraction, float fullBrightnessFraction, float totalDuration, Color color)
ProjectileSpecAPI getProjectileSpec()
float getProjectileSpeed()
void setTexWidth(float texWidth)
void setTexHeight(float texHeight)