001package com.fs.starfarer.api.impl.campaign.procgen.themes; 002 003import java.util.ArrayList; 004import java.util.Collections; 005import java.util.List; 006import java.util.Random; 007 008import com.fs.starfarer.api.campaign.AICoreOfficerPlugin; 009import com.fs.starfarer.api.campaign.CampaignFleetAPI; 010import com.fs.starfarer.api.campaign.FactionAPI; 011import com.fs.starfarer.api.campaign.FactionDoctrineAPI; 012import com.fs.starfarer.api.campaign.GenericPluginManagerAPI; 013import com.fs.starfarer.api.characters.MutableCharacterStatsAPI; 014import com.fs.starfarer.api.characters.PersonAPI; 015import com.fs.starfarer.api.fleet.FleetMemberAPI; 016import com.fs.starfarer.api.impl.campaign.fleets.BaseGenerateFleetOfficersPlugin; 017import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3; 018import com.fs.starfarer.api.impl.campaign.ids.Commodities; 019import com.fs.starfarer.api.impl.campaign.ids.Factions; 020import com.fs.starfarer.api.impl.campaign.ids.Ranks; 021import com.fs.starfarer.api.util.Misc; 022import com.fs.starfarer.api.util.WeightedRandomPicker; 023 024public class OmegaOfficerGeneratorPlugin extends BaseGenerateFleetOfficersPlugin { 025 026 public OmegaOfficerGeneratorPlugin() { 027 } 028 029 @Override 030 public int getHandlingPriority(Object params) { 031 if (!(params instanceof GenerateFleetOfficersPickData)) return -1; 032 033 GenerateFleetOfficersPickData data = (GenerateFleetOfficersPickData) params; 034 if (data.params != null && !data.params.withOfficers) return -1; 035 if (data.fleet == null || !data.fleet.getFaction().getId().equals(Factions.OMEGA)) return -1; 036 return GenericPluginManagerAPI.CORE_SUBSET; 037 } 038 039 040 @Override 041 public void addCommanderAndOfficers(CampaignFleetAPI fleet, FleetParamsV3 params, Random random) { 042 if (random == null) random = Misc.random; 043 FactionAPI faction = fleet.getFaction(); 044 045 List<FleetMemberAPI> members = fleet.getFleetData().getMembersListCopy(); 046 if (members.isEmpty()) return; 047 048 WeightedRandomPicker<FleetMemberAPI> withOfficers = new WeightedRandomPicker<FleetMemberAPI>(random); 049 AICoreOfficerPlugin plugin = Misc.getAICoreOfficerPlugin(Commodities.OMEGA_CORE); 050 for (FleetMemberAPI member : members) { 051 if (member.isFighterWing()) continue; 052 053 PersonAPI person = plugin.createPerson(Commodities.OMEGA_CORE, faction.getId(), random); 054 member.setCaptain(person); 055 withOfficers.add(member, (float) Math.pow(member.getFleetPointCost(), 5f)); 056 // they're all assumed integrated and have the extra skill baked in 057 //integrateAndAdaptCoreForAIFleet(member); 058 } 059 060 FleetMemberAPI flagship = withOfficers.pick(); 061 if (flagship != null) { 062 PersonAPI commander = flagship.getCaptain(); 063 commander.setRankId(Ranks.SPACE_COMMANDER); 064 commander.setPostId(Ranks.POST_FLEET_COMMANDER); 065 fleet.setCommander(commander); 066 fleet.getFleetData().setFlagship(flagship); 067 addCommanderSkills(commander, fleet, params, 2, random); 068 } 069 } 070 071 072 public static void addCommanderSkills(PersonAPI commander, CampaignFleetAPI fleet, FleetParamsV3 params, int numSkills, Random random) { 073 if (random == null) random = new Random(); 074 if (numSkills <= 0) return; 075 076 MutableCharacterStatsAPI stats = commander.getStats(); 077 078 FactionDoctrineAPI doctrine = fleet.getFaction().getDoctrine(); 079 if (params != null && params.doctrineOverride != null) { 080 doctrine = params.doctrineOverride; 081 } 082 083 List<String> skills = new ArrayList<String>(doctrine.getCommanderSkills()); 084 if (skills.isEmpty()) return; 085 086 if (random.nextFloat() < doctrine.getCommanderSkillsShuffleProbability()) { 087 Collections.shuffle(skills, random); 088 } 089 090 stats.setSkipRefresh(true); 091 092 boolean debug = true; 093 debug = false; 094 if (debug) System.out.println("Generating commander skills, person level " + stats.getLevel() + ", skills: " + numSkills); 095 int picks = 0; 096 for (String skillId : skills) { 097 if (debug) System.out.println("Selected skill: [" + skillId + "]"); 098 stats.setSkillLevel(skillId, 1); 099 picks++; 100 if (picks >= numSkills) { 101 break; 102 } 103 } 104 if (debug) System.out.println("Done generating commander skills\n"); 105 106 stats.setSkipRefresh(false); 107 stats.refreshCharacterStatsEffects(); 108 } 109 110 111 112} 113 114 115 116 117 118 119 120 121 122 123 124