001package com.fs.starfarer.api.impl.campaign.procgen.themes;
002
003import java.util.Random;
004
005import com.fs.starfarer.api.campaign.AICoreOfficerPlugin;
006import com.fs.starfarer.api.campaign.CampaignFleetAPI;
007import com.fs.starfarer.api.campaign.SectorEntityToken;
008import com.fs.starfarer.api.characters.PersonAPI;
009import com.fs.starfarer.api.combat.ShipVariantAPI;
010import com.fs.starfarer.api.fleet.FleetMemberAPI;
011import com.fs.starfarer.api.impl.campaign.BaseGenericPlugin;
012import com.fs.starfarer.api.impl.campaign.DModManager;
013import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflater;
014import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflaterParams;
015import com.fs.starfarer.api.impl.campaign.ids.Commodities;
016import com.fs.starfarer.api.impl.campaign.ids.HullMods;
017import com.fs.starfarer.api.impl.campaign.ids.Skills;
018import com.fs.starfarer.api.impl.campaign.ids.Tags;
019import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageGenFromSeed.SDMParams;
020import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageGenFromSeed.SalvageDefenderModificationPlugin;
021import com.fs.starfarer.api.loading.VariantSource;
022import com.fs.starfarer.api.util.Misc;
023
024public class PKDefenderPluginImpl extends BaseGenericPlugin implements SalvageDefenderModificationPlugin {
025        
026        public float getStrength(SDMParams p, float strength, Random random, boolean withOverride) {
027                // doesn't matter, just something non-zero so we end up with a fleet
028                // the auto-generated fleet will get replaced by this anyway
029                return strength;
030        }
031        public float getMinSize(SDMParams p, float minSize, Random random, boolean withOverride) {
032                return minSize;
033        }
034        
035        public float getMaxSize(SDMParams p, float maxSize, Random random, boolean withOverride) {
036                return maxSize; 
037        }
038        
039        public float getProbability(SDMParams p, float probability, Random random, boolean withOverride) {
040                return probability;
041        }
042        
043        public void reportDefeated(SDMParams p, SectorEntityToken entity, CampaignFleetAPI fleet) {
044
045        }
046        
047        public void modifyFleet(SDMParams p, CampaignFleetAPI fleet, Random random, boolean withOverride) {
048                
049                Misc.addDefeatTrigger(fleet, "PK14thDefeated");
050                
051                fleet.setNoFactionInName(true);
052                fleet.setName("Remnants of Task Force Safeguard");
053                
054                AICoreOfficerPlugin plugin = Misc.getAICoreOfficerPlugin(Commodities.ALPHA_CORE);
055                
056                fleet.getFleetData().clear();
057                fleet.getFleetData().setShipNameRandom(random);
058                
059                
060                FleetMemberAPI member = fleet.getFleetData().addFleetMember("legion_xiv_Automated");
061                //member.setShipName("HSS Sentinel");
062                member.setId("xivtf_" + random.nextLong());
063                PersonAPI person = plugin.createPerson(Commodities.ALPHA_CORE, fleet.getFaction().getId(), random);
064                person.getStats().setSkipRefresh(true);
065                person.getStats().setSkillLevel(Skills.CARRIER_GROUP, 1);
066                person.getStats().setSkillLevel(Skills.FIGHTER_UPLINK, 1);
067                person.getStats().setSkipRefresh(false);
068                
069                member.setCaptain(person);
070                ShipVariantAPI v = member.getVariant().clone();
071                v.setSource(VariantSource.REFIT);
072                v.addTag(Tags.TAG_NO_AUTOFIT);
073                v.addTag(Tags.TAG_AUTOMATED_NO_PENALTY);
074                member.setVariant(v, false, true);
075                fleet.setCommander(person);
076                
077                addAutomated(fleet, "onslaught_xiv_Elite", null, Commodities.ALPHA_CORE, random);
078                
079                addAutomated(fleet, "dominator_XIV_Elite", null, Commodities.BETA_CORE, random);
080                addAutomated(fleet, "eagle_xiv_Elite", null, Commodities.BETA_CORE, random);
081                addAutomated(fleet, "falcon_xiv_Elite", null, Commodities.BETA_CORE, random);
082                addAutomated(fleet, "falcon_xiv_Escort", null, Commodities.BETA_CORE, random);
083                
084                addAutomated(fleet, "enforcer_XIV_Elite", null, Commodities.GAMMA_CORE, random);
085                addAutomated(fleet, "enforcer_XIV_Elite", null, Commodities.GAMMA_CORE, random);
086                addAutomated(fleet, "enforcer_XIV_Elite", null, Commodities.GAMMA_CORE, random);
087
088                
089                for (FleetMemberAPI curr : fleet.getFleetData().getMembersListCopy()) {
090                        makeAICoreSkillsGoodForLowTech(curr, true);
091                        curr.getRepairTracker().setCR(curr.getRepairTracker().getMaxCR());
092                }
093                
094                for (FleetMemberAPI curr : fleet.getFleetData().getMembersListCopy()) {
095                        v = curr.getVariant().clone();
096                        v.setSource(VariantSource.REFIT);
097                        curr.setVariant(v, false, false);
098                }
099                
100                if (fleet.getInflater() instanceof DefaultFleetInflater) {
101                        DefaultFleetInflater dfi = (DefaultFleetInflater) fleet.getInflater();
102                        DefaultFleetInflaterParams dfip = (DefaultFleetInflaterParams)dfi.getParams();
103                        dfip.allWeapons = true;
104                        dfip.averageSMods = 3;
105                        dfip.quality = 0.4f;
106                        
107                        // what a HACK
108                        DModManager.assumeAllShipsAreAutomated = true;
109                        fleet.inflateIfNeeded();
110                        fleet.setInflater(null);
111                        DModManager.assumeAllShipsAreAutomated = false;
112                }
113                
114                for (FleetMemberAPI curr : fleet.getFleetData().getMembersListCopy()) {
115                        curr.getVariant().addPermaMod(HullMods.AUTOMATED);
116                        curr.getVariant().setVariantDisplayName("Automated");
117                        curr.getVariant().addTag(Tags.TAG_NO_AUTOFIT);
118                        curr.getVariant().addTag(Tags.TAG_AUTOMATED_NO_PENALTY);
119                        curr.getVariant().addTag(Tags.VARIANT_UNRESTORABLE);
120                        curr.getVariant().addTag(Tags.TAG_RETAIN_SMODS_ON_RECOVERY);
121                        if (curr.isCapital()) {
122                                curr.getVariant().addTag(Tags.VARIANT_ALWAYS_RECOVERABLE);
123                        }
124                }
125        }
126        
127        public static void addAutomated(CampaignFleetAPI fleet, String variantId, String shipName, String aiCore, Random random) {
128                AICoreOfficerPlugin plugin = Misc.getAICoreOfficerPlugin(Commodities.ALPHA_CORE);
129                
130                FleetMemberAPI member = fleet.getFleetData().addFleetMember(variantId);
131                member.setId("xivtf_" + random.nextLong());
132                
133                //System.out.println("ID for " + variantId + ": " + member.getId());
134                
135                //member.setId("xivtf_" + random.nextLong());
136                if (shipName != null) {
137                        member.setShipName(shipName);
138                }
139                if (aiCore != null) {
140                        PersonAPI person = plugin.createPerson(aiCore, fleet.getFaction().getId(), random);
141                        member.setCaptain(person);
142                }
143        }
144        
145        public static void makeAICoreSkillsGoodForLowTech(FleetMemberAPI member, boolean integrate) {
146                if (member.getCaptain() == null || !member.getCaptain().isAICore()) return;
147                
148                PersonAPI person = member.getCaptain();
149                person.getStats().setSkipRefresh(true);
150                String aiCoreId = person.getAICoreId(); 
151                
152                if (integrate) {
153                        person.getStats().setLevel(person.getStats().getLevel() + 1);
154                        person.getStats().setSkillLevel(Skills.BALLISTIC_MASTERY, 2);
155                }
156                
157                boolean alpha = Commodities.ALPHA_CORE.equals(aiCoreId);
158                boolean beta = Commodities.BETA_CORE.equals(aiCoreId);
159                boolean gamma = Commodities.GAMMA_CORE.equals(aiCoreId);
160                
161                if (member.isCapital() || member.isCruiser()) {
162                        person.getStats().setSkillLevel(Skills.COMBAT_ENDURANCE, 0);
163                        person.getStats().setSkillLevel(Skills.MISSILE_SPECIALIZATION, 2);
164                }
165                
166                // actually, the base skills are pretty much fine, so just add ballistic mastery if integrating, and
167                // that's all
168                
169                // Base skills, for reference (pulled from AICoreOfficerPluginImpl)
170                // ALPHA CORE
171//              person.getStats().setLevel(7);
172//              person.getStats().setSkillLevel(Skills.HELMSMANSHIP, 2);
173//              person.getStats().setSkillLevel(Skills.TARGET_ANALYSIS, 2);
174//              person.getStats().setSkillLevel(Skills.IMPACT_MITIGATION, 2);
175//              person.getStats().setSkillLevel(Skills.FIELD_MODULATION, 2);
176//              person.getStats().setSkillLevel(Skills.GUNNERY_IMPLANTS, 2);
177//              person.getStats().setSkillLevel(Skills.COMBAT_ENDURANCE, 2);
178//              person.getStats().setSkillLevel(Skills.DAMAGE_CONTROL, 2);
179                
180                // BETA CORE
181//              person.getStats().setLevel(5);
182//              person.getStats().setSkillLevel(Skills.HELMSMANSHIP, 2);
183//              person.getStats().setSkillLevel(Skills.TARGET_ANALYSIS, 2);
184//              person.getStats().setSkillLevel(Skills.IMPACT_MITIGATION, 2);
185//              person.getStats().setSkillLevel(Skills.GUNNERY_IMPLANTS, 2);
186//              person.getStats().setSkillLevel(Skills.COMBAT_ENDURANCE, 2);
187
188                // GAMMA CORE
189//              person.getStats().setLevel(3);
190//              person.getStats().setSkillLevel(Skills.HELMSMANSHIP, 2);
191//              person.getStats().setSkillLevel(Skills.IMPACT_MITIGATION, 2);
192//              person.getStats().setSkillLevel(Skills.COMBAT_ENDURANCE, 2);
193                
194                person.getStats().setSkipRefresh(false);
195        }
196        
197        @Override
198        public int getHandlingPriority(Object params) {
199                if (!(params instanceof SDMParams)) return 0;
200                SDMParams p = (SDMParams) params;
201                
202                if (p.entity != null && p.entity.getMemoryWithoutUpdate().contains(
203                                MiscellaneousThemeGenerator.PK_CACHE_KEY)) {
204                        return 2;
205                }
206                return -1;
207        }
208        public float getQuality(SDMParams p, float quality, Random random, boolean withOverride) {
209                return quality;
210        }
211}
212
213
214