1package com.fs.starfarer.api.impl.campaign.procgen.themes;
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.HashMap;
8import java.util.Random;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.AICoreOfficerPlugin;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.FactionAPI;
14import com.fs.starfarer.api.campaign.FactionDoctrineAPI;
15import com.fs.starfarer.api.campaign.GenericPluginManagerAPI;
16import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
17import com.fs.starfarer.api.characters.PersonAPI;
18import com.fs.starfarer.api.combat.WeaponAPI.AIHints;
19import com.fs.starfarer.api.combat.WeaponAPI.WeaponSize;
20import com.fs.starfarer.api.combat.WeaponAPI.WeaponType;
21import com.fs.starfarer.api.fleet.FleetMemberAPI;
22import com.fs.starfarer.api.impl.campaign.events.OfficerManagerEvent.SkillPickPreference;
23import com.fs.starfarer.api.impl.campaign.fleets.BaseGenerateFleetOfficersPlugin;
24import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
25import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
26import com.fs.starfarer.api.impl.campaign.ids.Commodities;
27import com.fs.starfarer.api.impl.campaign.ids.Factions;
28import com.fs.starfarer.api.impl.campaign.ids.Ranks;
29import com.fs.starfarer.api.impl.campaign.ids.Skills;
30import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality;
31import com.fs.starfarer.api.loading.WeaponSpecAPI;
32import com.fs.starfarer.api.util.Misc;
33import com.fs.starfarer.api.util.WeightedRandomPicker;
79 if (!(params instanceof GenerateFleetOfficersPickData))
return -1;
81 GenerateFleetOfficersPickData data = (GenerateFleetOfficersPickData) params;
83 if (data.params !=
null && !data.params.
withOfficers)
return -1;
102 if (members.isEmpty())
return;
104 Map<String, AICoreOfficerPlugin> plugins =
new HashMap<String, AICoreOfficerPlugin>();
110 String nothing =
"nothing";
114 fleetFP += member.getFleetPointCost();
116 boolean allowAlphaAnywhere = fleetFP > 150f;
117 boolean allowBetaAnywhere = fleetFP > 75f;
123 int numCommanderSkills = 0;
124 if (allowBetaAnywhere) numCommanderSkills++;
125 if (allowAlphaAnywhere) numCommanderSkills++;
136 int minCores = (int) (fleetFP / fpPerCore * (params !=
null ? params.
officerNumberMult : 1f));
137 if (params !=
null) {
140 if (minCores < 1) minCores = 1;
142 boolean debug =
true;
150 if (member.isFighterWing())
continue;
152 int size = member.getHullSpec().getHullSize().ordinal();
153 if (size > maxSize) {
158 List<FleetMemberAPI> allWithOfficers =
new ArrayList<FleetMemberAPI>();
163 if (member.isFighterWing())
continue;
165 float fp = member.getFleetPointCost();
169 if (params !=
null && params.
aiCores == OfficerQuality.AI_GAMMA) {
171 }
else if (params !=
null && params.
aiCores == OfficerQuality.AI_BETA) {
173 }
else if (params !=
null && params.
aiCores == OfficerQuality.AI_ALPHA) {
175 }
else if (params !=
null && params.
aiCores == OfficerQuality.AI_OMEGA) {
177 }
else if (params !=
null && params.
aiCores == OfficerQuality.AI_BETA_OR_GAMMA) {
178 if (member.isCapital() || member.isCruiser()) {
180 }
else if (allowAlphaAnywhere) {
190 if (member.isCapital() || member.isCruiser()) {
192 }
else if (allowAlphaAnywhere) {
196 if (member.isCruiser() || member.isDestroyer()) {
198 }
else if (allowBetaAnywhere && member.isFrigate()) {
202 if (member.isDestroyer() || member.isFrigate()) {
208 if (addedCores >= minCores) {
212 String pick = picker.
pick();
214 System.out.println(
"Picked [" + pick +
"] for " + member.getHullId());
217 if (plugin !=
null) {
221 member.setCaptain(person);
226 if (!member.isFighterWing() && !member.isCivilian()) {
227 withOfficers.
add(member, fp);
230 allWithOfficers.add(member);
238 if (withOfficers.
isEmpty() && !allWithOfficers.isEmpty()) {
239 withOfficers.
add(allWithOfficers.get(0), 1f);
272 float missileWeight = 0f;
275 if (spec ==
null)
continue;
277 if (spec.
getSize() == WeaponSize.MEDIUM) w = 2f;
278 if (spec.
getSize() == WeaponSize.LARGE) w = 4f;
283 if (spec.
getType() == WeaponType.MISSILE) {
291 weight += decks * 4f;
292 pdWeight += decks * 4f;
295 boolean hasUsefulPD = pdWeight > weight * 0.25f;
296 boolean hasEnoughMissiles = missileWeight > weight * 0.2f;
299 if (hasUsefulPD && !hasEnoughMissiles) {
347 if (random ==
null) random =
new Random();
348 if (numSkills <= 0)
return;
358 if (skills.isEmpty())
return;
361 Collections.shuffle(skills, random);
366 boolean debug =
true;
368 if (debug) System.out.println(
"Generating commander skills, person level " + stats.
getLevel() +
", skills: " + numSkills);
370 for (String skillId : skills) {
371 if (debug) System.out.println(
"Selected skill: [" + skillId +
"]");
374 if (picks >= numSkills) {
378 if (debug) System.out.println(
"Done generating commander skills\n");
static SettingsAPI getSettings()
static SkillPickPreference getSkillPrefForShip(FleetMemberAPI member)
Boolean noCommanderSkills
HubMissionWithTriggers.OfficerQuality aiCores
FactionDoctrineAPI doctrineOverride
boolean doNotIntegrateAICores
static final String ALPHA_CORE
static final String BETA_CORE
static final String GAMMA_CORE
static final String OMEGA_CORE
static final String DERELICT
static final String REMNANTS
static String SPACE_COMMANDER
static String POST_FLEET_COMMANDER
static final String BALLISTIC_MASTERY
static final String COMBAT_ENDURANCE
static final String MISSILE_SPECIALIZATION
static final String POINT_DEFENSE
static final String ENERGY_WEAPON_MASTERY
static final String POLARIZED_ARMOR
boolean isForceNoCommander()
boolean forceIntegrateCores
void setPutCoresOnCivShips(boolean putCoresOnCivShips)
boolean isPutCoresOnCivShips()
int getHandlingPriority(Object params)
RemnantOfficerGeneratorPlugin(boolean derelictMode, float coreMult)
boolean isForceIntegrateCores()
static SkillPickPreference getSkillPrefForShip(FleetMemberAPI member)
void setForceNoCommander(boolean forceNoCommander)
void addCommanderAndOfficers(CampaignFleetAPI fleet, FleetParamsV3 params, Random random)
static void addCommanderSkills(PersonAPI commander, CampaignFleetAPI fleet, FleetParamsV3 params, int numSkills, Random random)
boolean putCoresOnCivShips
RemnantOfficerGeneratorPlugin()
void setForceIntegrateCores(boolean forceIntegrateCores)
static void integrateAndAdaptCoreForAIFleet(FleetMemberAPI member)
static AICoreOfficerPlugin getAICoreOfficerPlugin(String commodityId)
static boolean isAutomated(MutableShipStatsAPI stats)
float getFloat(String key)
PersonAPI createPerson(String aiCoreId, String factionId, Random random)
void setCommander(PersonAPI commander)
FleetDataAPI getFleetData()
FactionDoctrineAPI getDoctrine()
float getCommanderSkillsShuffleProbability()
List< String > getCommanderSkills()
void setFlagship(FleetMemberAPI flagship)
List< FleetMemberAPI > getMembersListCopy()
void setSkillLevel(String id, float level)
void refreshCharacterStatsEffects()
float getSkillLevel(String id)
void setSkipRefresh(boolean skipRefresh)
void setRankId(String rank)
MutableCharacterStatsAPI getStats()
void setPostId(String postId)
boolean hasTag(String tag)
Collection< String > getFittedWeaponSlots()
WeaponSpecAPI getWeaponSpec(String slotId)
List< WeaponGroupSpec > getWeaponGroups()
ShipVariantAPI getVariant()
ShipHullSpecAPI getHullSpec()
EnumSet< WeaponAPI.AIHints > getAIHints()