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 dealArmorDamage(projectile, (ShipAPI) target, point, DAMAGE);
23 }
24 }
25
26 public static void dealArmorDamage(DamagingProjectileAPI projectile, ShipAPI target, Vector2f point, float armorDamage) {
27 CombatEngineAPI engine = Global.getCombatEngine();
28
29 ArmorGridAPI grid = target.getArmorGrid();
30 int[] cell = grid.getCellAtLocation(point);
31 if (cell == null) return;
32
33 int gridWidth = grid.getGrid().length;
34 int gridHeight = grid.getGrid()[0].length;
35
36 float damageTypeMult = DisintegratorEffect.getDamageTypeMult(projectile.getSource(), target);
37
38 float damageDealt = 0f;
39 for (int i = -2; i <= 2; i++) {
40 for (int j = -2; j <= 2; j++) {
41 if ((i == 2 || i == -2) && (j == 2 || j == -2)) continue; // skip corners
42
43 int cx = cell[0] + i;
44 int cy = cell[1] + j;
45
46 if (cx < 0 || cx >= gridWidth || cy < 0 || cy >= gridHeight) continue;
47
48 float damMult = 1/30f;
49 if (i == 0 && j == 0) {
50 damMult = 1/15f;
51 } else if (i <= 1 && i >= -1 && j <= 1 && j >= -1) { // S hits
52 damMult = 1/15f;
53 } else { // T hits
54 damMult = 1/30f;
55 }
56
57 float armorInCell = grid.getArmorValue(cx, cy);
58 float damage = armorDamage * damMult * damageTypeMult;
59 damage = Math.min(damage, armorInCell);
60 if (damage <= 0) continue;
61
62 target.getArmorGrid().setArmorValue(cx, cy, Math.max(0, armorInCell - damage));
63 damageDealt += damage;
64 }
65 }
66
67 if (damageDealt > 0) {
68 if (Misc.shouldShowDamageFloaty(projectile.getSource(), target)) {
69 engine.addFloatingDamageText(point, damageDealt, Misc.FLOATY_ARMOR_DAMAGE_COLOR, target, projectile.getSource());
70 }
71 target.syncWithArmorGridState();
72 }
73 }
74}
static CombatEngineAPI getCombatEngine()
Definition Global.java:63
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)