001package com.fs.starfarer.api.impl.combat; 002 003import org.lwjgl.util.vector.Vector2f; 004 005import com.fs.starfarer.api.Global; 006import com.fs.starfarer.api.combat.ArmorGridAPI; 007import com.fs.starfarer.api.combat.CombatEngineAPI; 008import com.fs.starfarer.api.combat.CombatEntityAPI; 009import com.fs.starfarer.api.combat.DamagingProjectileAPI; 010import com.fs.starfarer.api.combat.OnHitEffectPlugin; 011import com.fs.starfarer.api.combat.ShipAPI; 012import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI; 013import com.fs.starfarer.api.util.Misc; 014 015public class BreachOnHitEffect implements OnHitEffectPlugin { 016 017 public static float DAMAGE = 250; 018 019 public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, 020 Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine) { 021 if (!shieldHit && target instanceof ShipAPI) { 022 float mult = 1f; 023// if (projectile != null && projectile.getSource() != null) { 024// mult = projectile.getSource().getMutableStats().getMissileWeaponDamageMult().getModifiedValue(); 025// } 026 dealArmorDamage(projectile, (ShipAPI) target, point, DAMAGE * mult); 027 } 028 } 029 030 public static void dealArmorDamage(DamagingProjectileAPI projectile, ShipAPI target, Vector2f point, float armorDamage) { 031 CombatEngineAPI engine = Global.getCombatEngine(); 032 033 ArmorGridAPI grid = target.getArmorGrid(); 034 int[] cell = grid.getCellAtLocation(point); 035 if (cell == null) return; 036 037 int gridWidth = grid.getGrid().length; 038 int gridHeight = grid.getGrid()[0].length; 039 040 float damageTypeMult = DisintegratorEffect.getDamageTypeMult(projectile.getSource(), target); 041 042 float damageDealt = 0f; 043 for (int i = -2; i <= 2; i++) { 044 for (int j = -2; j <= 2; j++) { 045 if ((i == 2 || i == -2) && (j == 2 || j == -2)) continue; // skip corners 046 047 int cx = cell[0] + i; 048 int cy = cell[1] + j; 049 050 if (cx < 0 || cx >= gridWidth || cy < 0 || cy >= gridHeight) continue; 051 052 float damMult = 1/30f; 053 if (i == 0 && j == 0) { 054 damMult = 1/15f; 055 } else if (i <= 1 && i >= -1 && j <= 1 && j >= -1) { // S hits 056 damMult = 1/15f; 057 } else { // T hits 058 damMult = 1/30f; 059 } 060 061 float armorInCell = grid.getArmorValue(cx, cy); 062 float damage = armorDamage * damMult * damageTypeMult; 063 damage = Math.min(damage, armorInCell); 064 if (damage <= 0) continue; 065 066 target.getArmorGrid().setArmorValue(cx, cy, Math.max(0, armorInCell - damage)); 067 damageDealt += damage; 068 } 069 } 070 071 if (damageDealt > 0) { 072 if (Misc.shouldShowDamageFloaty(projectile.getSource(), target)) { 073 engine.addFloatingDamageText(point, damageDealt, Misc.FLOATY_ARMOR_DAMAGE_COLOR, target, projectile.getSource()); 074 } 075 target.syncWithArmorGridState(); 076 } 077 } 078} 079 080 081