001package com.fs.starfarer.api.impl.hullmods;
002
003import org.lwjgl.util.vector.Vector2f;
004
005import com.fs.starfarer.api.campaign.CampaignUIAPI.CoreUITradeMode;
006import com.fs.starfarer.api.campaign.econ.MarketAPI;
007import com.fs.starfarer.api.combat.BaseHullMod;
008import com.fs.starfarer.api.combat.BeamAPI;
009import com.fs.starfarer.api.combat.CombatEntityAPI;
010import com.fs.starfarer.api.combat.DamageAPI;
011import com.fs.starfarer.api.combat.DamagingProjectileAPI;
012import com.fs.starfarer.api.combat.MissileAPI;
013import com.fs.starfarer.api.combat.MutableShipStatsAPI;
014import com.fs.starfarer.api.combat.ShipAPI;
015import com.fs.starfarer.api.combat.WeaponAPI;
016import com.fs.starfarer.api.combat.ShipAPI.HullSize;
017import com.fs.starfarer.api.combat.WeaponAPI.AIHints;
018import com.fs.starfarer.api.combat.listeners.DamageDealtModifier;
019import com.fs.starfarer.api.impl.campaign.ids.Stats;
020import com.fs.starfarer.api.loading.WeaponSpecAPI;
021
022public class PDIntegration extends BaseHullMod {
023
024        public static int OP_REDUCTION = 3;
025        public static float DAMAGE_BONUS_PERCENT = 25f;
026        
027        public void applyEffectsBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) {
028                stats.getDynamic().getMod(Stats.SMALL_PD_MOD).modifyFlat(id, -OP_REDUCTION);
029        }
030        
031        @Override
032        public void applyEffectsAfterShipCreation(ShipAPI ship, String id) {
033                ship.addListener(new PDIDamageDealtMod());
034        }
035
036        public String getDescriptionParam(int index, HullSize hullSize, ShipAPI ship) {
037                if (index == 0) return "" + OP_REDUCTION;
038                if (index == 1) return "" + (int) Math.round(DAMAGE_BONUS_PERCENT) + "%";
039                return null;
040        }
041        
042        @Override
043        public boolean affectsOPCosts() {
044                return true;
045        }
046
047        @Override
048        public boolean canBeAddedOrRemovedNow(ShipAPI ship, MarketAPI marketOrNull, CoreUITradeMode mode) {
049                if (ship == null || ship.getVariant() == null) return true; // autofit
050                if (!ship.getVariant().hasHullMod("pdintegration")) return true; // can always add
051
052                for (String slotId : ship.getVariant().getFittedWeaponSlots()) {
053                        WeaponSpecAPI spec = ship.getVariant().getWeaponSpec(slotId);
054                        if (spec.getAIHints().contains(AIHints.PD)) return false;
055                }
056                return true;
057        }
058
059        @Override
060        public String getCanNotBeInstalledNowReason(ShipAPI ship, MarketAPI marketOrNull, CoreUITradeMode mode) {
061                return "Can not remove while ship has point-defense weapons installed";
062        }
063        
064        
065        
066        public static class PDIDamageDealtMod implements DamageDealtModifier {
067                public String modifyDamageDealt(Object param,
068                                                                                CombatEntityAPI target, DamageAPI damage,
069                                                                                Vector2f point, boolean shieldHit) {
070                        WeaponAPI weapon = null;
071                        if (param instanceof DamagingProjectileAPI) {
072                                weapon = ((DamagingProjectileAPI)param).getWeapon();
073                        } else if (param instanceof BeamAPI) {
074                                weapon = ((BeamAPI)param).getWeapon();
075                        } else if (param instanceof MissileAPI) {
076                                weapon = ((MissileAPI)param).getWeapon();
077                        }
078                        
079                        if (weapon == null) return null;
080                        if (!weapon.hasAIHint(AIHints.PD)) return null;
081
082                        String id = "pdi_dam_mod";
083                        damage.getModifier().modifyPercent(id, DAMAGE_BONUS_PERCENT);
084                        
085                        return id;
086                }
087        }
088        
089}
090
091
092