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