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