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