Starsector API
Loading...
Searching...
No Matches
BreachOnHitEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat;
2
3import org.lwjgl.util.vector.Vector2f;
4
5import com.fs.starfarer.api.Global;
6import com.fs.starfarer.api.combat.ArmorGridAPI;
7import com.fs.starfarer.api.combat.CombatEngineAPI;
8import com.fs.starfarer.api.combat.CombatEntityAPI;
9import com.fs.starfarer.api.combat.DamagingProjectileAPI;
10import com.fs.starfarer.api.combat.OnHitEffectPlugin;
11import com.fs.starfarer.api.combat.ShipAPI;
12import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
13import com.fs.starfarer.api.util.Misc;
14
15public class BreachOnHitEffect implements OnHitEffectPlugin {
16
17 public static float DAMAGE = 250;
18
19 public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target,
20 Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine) {
21 if (!shieldHit && target instanceof ShipAPI) {
22 float mult = 1f;
23// if (projectile != null && projectile.getSource() != null) {
24// mult = projectile.getSource().getMutableStats().getMissileWeaponDamageMult().getModifiedValue();
25// }
26 dealArmorDamage(projectile, (ShipAPI) target, point, DAMAGE * mult);
27 }
28 }
29
30 public static void dealArmorDamage(DamagingProjectileAPI projectile, ShipAPI target, Vector2f point, float armorDamage) {
32
33 ArmorGridAPI grid = target.getArmorGrid();
34 int[] cell = grid.getCellAtLocation(point);
35 if (cell == null) return;
36
37 int gridWidth = grid.getGrid().length;
38 int gridHeight = grid.getGrid()[0].length;
39
40 float damageTypeMult = DisintegratorEffect.getDamageTypeMult(projectile.getSource(), target);
41
42 float damageDealt = 0f;
43 for (int i = -2; i <= 2; i++) {
44 for (int j = -2; j <= 2; j++) {
45 if ((i == 2 || i == -2) && (j == 2 || j == -2)) continue; // skip corners
46
47 int cx = cell[0] + i;
48 int cy = cell[1] + j;
49
50 if (cx < 0 || cx >= gridWidth || cy < 0 || cy >= gridHeight) continue;
51
52 float damMult = 1/30f;
53 if (i == 0 && j == 0) {
54 damMult = 1/15f;
55 } else if (i <= 1 && i >= -1 && j <= 1 && j >= -1) { // S hits
56 damMult = 1/15f;
57 } else { // T hits
58 damMult = 1/30f;
59 }
60
61 float armorInCell = grid.getArmorValue(cx, cy);
62 float damage = armorDamage * damMult * damageTypeMult;
63 damage = Math.min(damage, armorInCell);
64 if (damage <= 0) continue;
65
66 target.getArmorGrid().setArmorValue(cx, cy, Math.max(0, armorInCell - damage));
67 damageDealt += damage;
68 }
69 }
70
71 if (damageDealt > 0) {
72 if (Misc.shouldShowDamageFloaty(projectile.getSource(), target)) {
73 engine.addFloatingDamageText(point, damageDealt, Misc.FLOATY_ARMOR_DAMAGE_COLOR, target, projectile.getSource());
74 }
76 }
77 }
78}
79
80
81
static CombatEngineAPI getCombatEngine()
Definition Global.java:69
static void dealArmorDamage(DamagingProjectileAPI projectile, ShipAPI target, Vector2f point, float armorDamage)
void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine)
static float getDamageTypeMult(ShipAPI source, ShipAPI target)
static boolean shouldShowDamageFloaty(ShipAPI source, ShipAPI target)
Definition Misc.java:5955
static Color FLOATY_ARMOR_DAMAGE_COLOR
Definition Misc.java:214
void setArmorValue(int cellX, int cellY, float value)
float getArmorValue(int cellX, int cellY)
void addFloatingDamageText(Vector2f loc, float damage, Color color, CombatEntityAPI attachedTo, CombatEntityAPI damageSource)