1package com.fs.starfarer.api.impl.combat;
3import java.util.ArrayList;
4import java.util.EnumSet;
9import org.lwjgl.opengl.GL14;
10import org.lwjgl.util.vector.Vector2f;
12import com.fs.starfarer.api.Global;
13import com.fs.starfarer.api.combat.ArmorGridAPI;
14import com.fs.starfarer.api.combat.BaseCombatLayeredRenderingPlugin;
15import com.fs.starfarer.api.combat.CombatEngineAPI;
16import com.fs.starfarer.api.combat.CombatEngineLayers;
17import com.fs.starfarer.api.combat.CombatEntityAPI;
18import com.fs.starfarer.api.combat.DamageType;
19import com.fs.starfarer.api.combat.DamagingProjectileAPI;
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.listeners.ApplyDamageResultAPI;
24import com.fs.starfarer.api.graphics.SpriteAPI;
25import com.fs.starfarer.api.util.FaderUtil;
26import com.fs.starfarer.api.util.IntervalUtil;
27import com.fs.starfarer.api.util.Misc;
51 if (shieldHit)
return;
63 public static class ParticleData {
65 public Vector2f offset =
new Vector2f();
66 public Vector2f vel =
new Vector2f();
67 public float scale = 1f;
68 public float scaleIncreaseRate = 1f;
69 public float turnDir = 1f;
70 public float angle = 1f;
74 public float elapsed = 0f;
75 public float baseSize;
77 public Color color =
new Color(100,150,255,35);
79 public ParticleData(
float baseSize,
float maxDur,
float endSizeMult) {
90 angle = (float) Math.random() * 360f;
93 scaleIncreaseRate = endSizeMult / maxDur;
94 if (endSizeMult < 1f) {
95 scaleIncreaseRate = -1f * endSizeMult;
99 this.baseSize = baseSize;
100 turnDir = Math.signum((
float) Math.random() - 0.5f) * 20f * (float) Math.random();
103 float driftDir = (float) Math.random() * 360f;
106 vel.scale(0.25f * baseSize / maxDur * (1f + (
float) Math.random() * 1f));
108 fader =
new FaderUtil(0f, 0.5f, 0.5f);
113 public void advance(
float amount) {
114 scale += scaleIncreaseRate * amount;
116 offset.x += vel.x * amount;
117 offset.y += vel.y * amount;
119 angle += turnDir * amount;
129 protected List<ParticleData>
particles =
new ArrayList<ParticleData>();
164 Vector2f loc =
new Vector2f(
offset);
169 List<ParticleData>
remove =
new ArrayList<ParticleData>();
172 if (p.elapsed >= p.maxDur) {
195 return "disintegrator_loop";
203 ParticleData p =
new ParticleData(30f, 3f + (
float) Math.random() * 2f, 2f);
208 protected void damageDealt(Vector2f loc,
float hullDamage,
float armorDamage) {
216 for (
int i = 0; i < num; i++) {
227 if (cell ==
null)
return;
229 int gridWidth = grid.
getGrid().length;
230 int gridHeight = grid.
getGrid()[0].length;
236 float hullDamage = 0f;
237 for (
int i = -2; i <= 2; i++) {
238 for (
int j = -2; j <= 2; j++) {
239 if ((i == 2 || i == -2) && (j == 2 || j == -2))
continue;
241 int cx = cell[0] + i;
242 int cy = cell[1] + j;
244 if (cx < 0 || cx >= gridWidth || cy < 0 || cy >= gridHeight)
continue;
246 float damMult = 1/30f;
247 if (i == 0 && j == 0) {
249 }
else if (i <= 1 && i >= -1 && j <= 1 && j >= -1) {
256 float damage = damagePerTick * damMult * damageTypeMult;
258 hullDamage += damage - armorInCell;
260 damage = Math.min(damage, armorInCell);
261 if (damage <= 0)
continue;
275 if (hullDamage > 1f) {
277 if (showHullDamage >= 0) {
284 Vector2f p2 =
new Vector2f(point);
313 GL14.glBlendEquation(GL14.GL_FUNC_REVERSE_SUBTRACT);
317 float size = p.baseSize * p.scale;
319 Vector2f loc =
new Vector2f(x + p.offset.x, y + p.offset.y);
321 float alphaMult = 1f;
323 p.sprite.setAngle(p.angle);
324 p.sprite.setSize(size, size);
325 p.sprite.setAlphaMult(b * alphaMult * p.fader.getBrightness());
326 p.sprite.setColor(p.color);
327 p.sprite.renderAtCenter(loc.x, loc.y);
330 GL14.glBlendEquation(GL14.GL_FUNC_ADD);
335 if (source ==
null ||
target ==
null)
return 1f;
355 return damageTypeMult;
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static CombatEngineAPI getCombatEngine()
void advance(float amount)
EnumSet< CombatEngineLayers > getActiveLayers()
int getNumParticlesPerTick()
EnumSet< CombatEngineLayers > layers
DisintegratorEffect(DamagingProjectileAPI proj, ShipAPI target, Vector2f offset)
static float getDamageTypeMult(ShipAPI source, ShipAPI target)
void setOffset(Vector2f offset)
static float TOTAL_DAMAGE
void init(CombatEntityAPI entity)
DamagingProjectileAPI proj
void render(CombatEngineLayers layer, ViewportAPI viewport)
List< ParticleData > particles
void damageDealt(Vector2f loc, float hullDamage, float armorDamage)
void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine)
void advance(float amount)
void forceIntervalElapsed()
void advance(float amount)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static boolean shouldShowDamageFloaty(ShipAPI source, ShipAPI target)
static Color FLOATY_ARMOR_DAMAGE_COLOR
static Vector2f rotateAroundOrigin(Vector2f v, float angle)
static Color FLOATY_HULL_DAMAGE_COLOR
static Vector2f getPointWithinRadius(Vector2f from, float r)
SpriteAPI getSprite(String filename)
void playLoop(String id, Object playingEntity, float pitch, float volume, Vector2f loc, Vector2f vel)
void setArmorValue(int cellX, int cellY, float value)
int[] getCellAtLocation(Vector2f loc)
float getArmorValue(int cellX, int cellY)
CombatEntityAPI addLayeredRenderingPlugin(CombatLayeredRenderingPlugin plugin)
void applyDamage(CombatEntityAPI entity, Vector2f point, float damageAmount, DamageType damageType, float empAmount, boolean bypassShields, boolean dealsSoftFlux, Object source, boolean playSound)
void addFloatingDamageText(Vector2f loc, float damage, Color color, CombatEntityAPI attachedTo, CombatEntityAPI damageSource)
boolean isEntityInPlay(CombatEntityAPI entity)
MutableStat getDamageToCapital()
MutableStat getArmorDamageTakenMult()
MutableStat getDamageToFrigates()
MutableStat getDamageToDestroyers()
MutableStat getDamageToFighters()
MutableStat getDamageToCruisers()
void setSpawnDebris(boolean spawnDebris)
MutableShipStatsAPI getMutableStats()
void setHitpoints(float value)
ArmorGridAPI getArmorGrid()
void syncWithArmorGridState()
void setTexWidth(float texWidth)
void setTexHeight(float texHeight)