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