1package com.fs.starfarer.api.impl.campaign.intel.deciv;
3import java.util.ArrayList;
4import java.util.LinkedHashMap;
6import java.util.Random;
8import com.fs.starfarer.api.EveryFrameScript;
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.PlanetAPI;
11import com.fs.starfarer.api.campaign.SectorEntityToken;
12import com.fs.starfarer.api.campaign.econ.Industry;
13import com.fs.starfarer.api.campaign.econ.MarketAPI;
14import com.fs.starfarer.api.campaign.econ.MarketConditionAPI;
15import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
16import com.fs.starfarer.api.campaign.listeners.ListenerUtil;
17import com.fs.starfarer.api.characters.PersonAPI;
18import com.fs.starfarer.api.impl.campaign.DebugFlags;
19import com.fs.starfarer.api.impl.campaign.ids.Conditions;
20import com.fs.starfarer.api.impl.campaign.ids.Factions;
21import com.fs.starfarer.api.impl.campaign.population.CoreImmigrationPluginImpl;
22import com.fs.starfarer.api.util.IntervalUtil;
23import com.fs.starfarer.api.util.Misc;
24import com.fs.starfarer.api.util.TimeoutTracker;
28 public static final String
KEY =
"$core_decivTracker";
32 public static class MarketDecivData {
34 List<Float> stabilityHistory =
new ArrayList<Float>();
48 protected LinkedHashMap<MarketAPI, MarketDecivData>
decivData =
new LinkedHashMap<MarketAPI, MarketDecivData>();
52 protected Random
random =
new Random();
72 if (
sampler.intervalElapsed()) {
76 if (
checker.intervalElapsed()) {
82 MarketDecivData data =
decivData.get(market);
84 data =
new MarketDecivData();
108 if (!market.isInEconomy()) {
117 data.stabilityHistory.add(market.getStabilityValue());
118 while (data.stabilityHistory.size() > maxSamples && !data.stabilityHistory.isEmpty()) {
119 data.stabilityHistory.remove(0);
144 if (data.stabilityHistory.size() < max)
return false;
145 if (data.stabilityHistory.get(0) > 0 || market.
getStabilityValue() > 0)
return false;
149 boolean streakEnded =
false;
150 for (
int i = data.stabilityHistory.size() - 1; i >= 0; i--) {
151 Float curr = data.stabilityHistory.get(i);
154 if (!streakEnded) streak++;
160 if (streak < min)
return false;
161 if (zeroCount / max < fraction)
return false;
165 float prob = (streak - min) * per;
168 String
id = market.
getId();
179 if (
random.nextFloat() >= prob)
return false;
222 if (mc.getSpec().isDecivRemove()) {
243 }
else if (size <= 4) {
245 }
else if (size <= 6) {
308 if (mc.getSpec().isDecivRemove()) {
325 }
else if (size <= 4) {
327 }
else if (size <= 6) {
static SettingsAPI getSettings()
static SectorAPI getSector()
static void reportColonyDecivilized(MarketAPI market, boolean fullyDestroyed)
static void reportColonyAboutToBeDecivilized(MarketAPI market, boolean fullyDestroyed)
static boolean DECIV_DEBUG
static final String RUINS_WIDESPREAD
static final String RUINS_SCATTERED
static final String RUINS_EXTENSIVE
static final String RUINS_VAST
static final String DECIVILIZED
static final String NEUTRAL
void advance(float amount)
static float getMinFraction()
static DecivTracker getInstance()
static int getMinStreak()
static void decivilize(MarketAPI market, boolean fullDestroy, boolean withIntel)
static void sendWarning(MarketAPI market)
LinkedHashMap< MarketAPI, MarketDecivData > decivData
TimeoutTracker< String > sentWarning
MarketDecivData getDataFor(MarketAPI market)
static float getProbPerMonth()
static final String NO_DECIV_KEY
static void decivilize(MarketAPI market, boolean fullDestroy)
static void removeColony(MarketAPI market, boolean withRuins)
static int getMaxMonths()
boolean checkDeciv(MarketAPI market)
static float getWeightForMarketSizeStatic(float size)
void setWeight(float weight)
void advance(float amount)
static boolean isStoryCritical(MarketAPI market)
static void setAbandonedStationMarket(String marketId, SectorEntityToken station)
static void removeRadioChatter(MarketAPI market)
static float getDays(float amount)
float getFloat(String key)
IntelManagerAPI getIntelManager()
MemoryAPI getMemoryWithoutUpdate()
void addIntel(IntelInfoPlugin plugin)
List< MarketAPI > getMarketsCopy()
void removeMarket(MarketAPI market)
PopulationComposition getPopulation()
void setPlayerOwned(boolean playerOwned)
float getStabilityValue()
void setFactionId(String factionId)
void setPlanetConditionMarketOnly(boolean isPlanetConditionMarketOnly)
void setPrimaryEntity(SectorEntityToken primaryEntity)
void removeSubmarket(String specId)
Set< SectorEntityToken > getConnectedEntities()
MemoryAPI getMemoryWithoutUpdate()
void removeSpecificCondition(String token)
void setAdmin(PersonAPI admin)
CommDirectoryAPI getCommDirectory()
void advance(float amount)
MarketConditionAPI getSpecificCondition(String token)
void removeIndustry(String id, MarketInteractionMode mode, boolean forUpgrade)
String addCondition(String id)
List< SubmarketAPI > getSubmarketsCopy()
List< Industry > getIndustries()
List< PersonAPI > getPeopleCopy()
void setIncentiveCredits(float incentiveCredits)
boolean hasCondition(String id)
void removePerson(PersonAPI person)
List< MarketConditionAPI > getConditions()
void removeCondition(String id)
SectorEntityToken getPrimaryEntity()
void setSurveyed(boolean wasSurveyed)
void set(String key, Object value)
boolean getBoolean(String key)