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