001package com.fs.starfarer.api.impl.campaign.intel;
002
003import java.util.ArrayList;
004
005import com.fs.starfarer.api.EveryFrameScript;
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.campaign.PlanetAPI;
008import com.fs.starfarer.api.campaign.StarSystemAPI;
009import com.fs.starfarer.api.campaign.econ.MarketAPI;
010import com.fs.starfarer.api.campaign.econ.MarketAPI.SurveyLevel;
011import com.fs.starfarer.api.campaign.econ.MarketConditionAPI;
012import com.fs.starfarer.api.impl.campaign.ids.Tags;
013import com.fs.starfarer.api.impl.campaign.intel.GenericMissionManager.GenericMissionCreator;
014import com.fs.starfarer.api.util.Misc;
015import com.fs.starfarer.api.util.WeightedRandomPicker;
016
017public class SurveyPlanetIntelCreator implements GenericMissionCreator {
018
019        public EveryFrameScript createMissionIntel() {
020                PlanetAPI planet = pickPlanet();
021                if (planet == null) return null;
022                
023                return new SurveyPlanetMissionIntel(planet);
024        }
025        
026        public float getMissionFrequencyWeight() {
027                return 10f;
028        }
029        
030        
031        protected transient WeightedRandomPicker<PlanetAPI> planetPicker = null;
032
033        
034        protected void initPicker() {
035                planetPicker = new WeightedRandomPicker<PlanetAPI>();
036                OUTER: for (StarSystemAPI system : Global.getSector().getStarSystems()) {
037                        //if (!Misc.getMarketsInLocation(system).isEmpty()) continue;
038                        for (MarketAPI market : Misc.getMarketsInLocation(system)) {
039                                if (!market.isHidden()) continue OUTER;
040                        }
041                        
042                        for (PlanetAPI planet : system.getPlanets()) {
043                                if (!isValidMissionTarget(planet)) continue;
044                                if (Misc.isImportantForReason(planet.getMemoryWithoutUpdate(), "spm")) continue;
045
046                                float weight = 1f;
047                                for (MarketConditionAPI mc : planet.getMarket().getConditions()) {
048                                        if (mc.getGenSpec() != null) {
049                                                weight += mc.getGenSpec().getXpMult();
050                                        }
051                                }
052                                
053                                planetPicker.add(planet);
054                        }
055                }
056        }
057        
058        protected void prunePicker() {
059                for (PlanetAPI planet : new ArrayList<PlanetAPI>(planetPicker.getItems())) {
060                        if (!isValidMissionTarget(planet)) {
061                                planetPicker.remove(planet);
062                        }
063                }
064        }
065        
066        public static boolean isValidMissionTarget(PlanetAPI planet) {
067                if (planet.hasTag(Tags.NOT_RANDOM_MISSION_TARGET)) return false;
068                if (planet.isStar() || planet.getMarket() == null || !planet.getMarket().isPlanetConditionMarketOnly() ||
069                                planet.getMarket().getSurveyLevel() == SurveyLevel.FULL) {
070                        return false;
071                }
072                if (planet.getContainingLocation() != null && planet.getContainingLocation().hasTag(Tags.THEME_HIDDEN)) {
073                        return false;
074                }
075                return true;
076        }
077        
078        protected PlanetAPI pickPlanet() {
079                if (planetPicker == null) {
080                        initPicker();
081                }
082                prunePicker();
083                
084                PlanetAPI planet = planetPicker.pick();
085                for (EveryFrameScript s : GenericMissionManager.getInstance().getActive()) {
086                        if (s instanceof SurveyPlanetMissionIntel) {
087                                SurveyPlanetMissionIntel intel = (SurveyPlanetMissionIntel) s;
088                                if (planet == intel.getPlanet()) {
089                                        return null;
090                                }
091                        }
092                }
093                
094                return planet;
095        }
096
097}
098
099
100