001package com.fs.starfarer.api.characters; 002 003import java.util.LinkedHashMap; 004import java.util.Map; 005 006import com.fs.starfarer.api.Global; 007import com.fs.starfarer.api.combat.ShipAPI.HullSize; 008import com.fs.starfarer.api.combat.ShipVariantAPI; 009import com.fs.starfarer.api.fleet.FleetMemberAPI; 010import com.fs.starfarer.api.loading.VariantSource; 011import com.fs.starfarer.api.plugins.impl.CoreAutofitPlugin; 012import com.fs.starfarer.api.ui.Alignment; 013import com.fs.starfarer.api.ui.ButtonAPI; 014import com.fs.starfarer.api.ui.TooltipMakerAPI; 015import com.fs.starfarer.api.util.Misc; 016 017public class SkillsChangeRemoveVentsCapsEffect extends BaseSkillsChangeEffect { 018 019 public static class VentsCapsEffectData { 020 FleetMemberAPI member; 021 int maxVents; 022 int maxCaps; 023 } 024 025 public static class VentsCapsDataMap { 026 Map<FleetMemberAPI, VentsCapsEffectData> map = new LinkedHashMap<FleetMemberAPI, VentsCapsEffectData>(); 027 } 028 public void setMap(VentsCapsDataMap map, Map<String, Object> dataMap) { 029 String key = getClass().getSimpleName(); 030 dataMap.put(key, map); 031 } 032 public VentsCapsDataMap getMap(Map<String, Object> dataMap) { 033 String key = getClass().getSimpleName(); 034 VentsCapsDataMap map = (VentsCapsDataMap)dataMap.get(key); 035 if (map == null) { 036 map = new VentsCapsDataMap(); 037 dataMap.put(key, map); 038 } 039 return map; 040 } 041 042 public static int getMaxVents(HullSize size, MutableCharacterStatsAPI stats) { 043 int maxVents = CoreAutofitPlugin.getBaseMax(size); 044 if (stats != null) { 045 maxVents = (int) stats.getMaxVentsBonus().computeEffective(maxVents); 046 } 047 return maxVents; 048 } 049 050 public static int getMaxCaps(HullSize size, MutableCharacterStatsAPI stats) { 051 int maxCapacitors = CoreAutofitPlugin.getBaseMax(size); 052 if (stats != null) { 053 maxCapacitors = (int) stats.getMaxCapacitorsBonus().computeEffective(maxCapacitors); 054 } 055 return maxCapacitors; 056 } 057 058 059 public VentsCapsDataMap getEffects(MutableCharacterStatsAPI from, MutableCharacterStatsAPI to) { 060 VentsCapsDataMap result = new VentsCapsDataMap(); 061 062 063 for (FleetMemberAPI member : Global.getSector().getPlayerFleet().getFleetData().getMembersListCopy()) { 064 VentsCapsEffectData data = new VentsCapsEffectData(); 065 int maxVentsPre = getMaxVents(member.getHullSpec().getHullSize(), from); 066 int maxCapsPre = getMaxCaps(member.getHullSpec().getHullSize(), from); 067 068 int maxVentsPost = getMaxVents(member.getHullSpec().getHullSize(), to); 069 int maxCapsPost = getMaxCaps(member.getHullSpec().getHullSize(), to); 070 071 int caps = member.getVariant().getNumFluxCapacitors(); 072 int vents = member.getVariant().getNumFluxVents(); 073 074 data.member = member; 075 data.maxVents = maxVentsPost; 076 data.maxCaps = maxCapsPost; 077 078 boolean add = false; 079 if (maxVentsPre > maxVentsPost && vents > maxVentsPost) { 080 add = true; 081 } 082 if (maxCapsPre > maxCapsPost && caps > maxCapsPost) { 083 add = true; 084 } 085 if (add) { 086 result.map.put(member, data); 087 } 088 } 089 return result; 090 } 091 092 093 @Override 094 public boolean hasEffects(MutableCharacterStatsAPI from, MutableCharacterStatsAPI to) { 095 return !getEffects(from, to).map.isEmpty(); 096 } 097 098 @Override 099 public void printEffects(MutableCharacterStatsAPI from, MutableCharacterStatsAPI to, TooltipMakerAPI info, Map<String, Object> dataMap) { 100 super.prepare(); 101 102 VentsCapsDataMap map = getEffects(from, to); 103 setMap(map, dataMap); 104 105 info.addSectionHeading("Excess vents and capacitors", base, dark, Alignment.MID, 15f); 106 107 info.addPara("Ships that have more than the new maximum number of flux vents " 108 + "and capacitors will have the excess vents and capacitors removed.", 10f, 109 Misc.getNegativeHighlightColor(), 110 "excess vents and capacitors removed" 111 ); 112 } 113 114 @Override 115 public void infoButtonPressed(ButtonAPI button, Object param, Map<String, Object> dataMap) { 116 } 117 118 @Override 119 public void applyEffects(MutableCharacterStatsAPI from, MutableCharacterStatsAPI to, Map<String, Object> dataMap) { 120 VentsCapsDataMap map = getMap(dataMap); 121 122 for (VentsCapsEffectData data : map.map.values()) { 123 clampNumVentsAndCaps(data.member, to); 124 } 125 } 126 127 public static void clampNumVentsAndCaps(FleetMemberAPI member, MutableCharacterStatsAPI stats) { 128 int maxVents = getMaxVents(member.getHullSpec().getHullSize(), stats); 129 int maxCaps = getMaxCaps(member.getHullSpec().getHullSize(), stats); 130 ShipVariantAPI variant = member.getVariant(); 131 if (variant.getNumFluxVents() > maxVents || variant.getNumFluxCapacitors() > maxCaps) { 132 variant = variant.clone(); 133 variant.setSource(VariantSource.REFIT); 134 variant.setNumFluxVents(Math.min(variant.getNumFluxVents(), maxVents)); 135 variant.setNumFluxCapacitors(Math.min(variant.getNumFluxCapacitors(), maxCaps)); 136 member.setVariant(variant, false, false); 137 } 138 } 139 140} 141 142 143 144 145 146 147