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