1package com.fs.starfarer.api.impl.campaign.population;
3import java.util.ArrayList;
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.comm.CommMessageAPI.MessageClickAction;
8import com.fs.starfarer.api.campaign.econ.ImmigrationPlugin;
9import com.fs.starfarer.api.campaign.econ.MarketAPI;
10import com.fs.starfarer.api.campaign.econ.MarketImmigrationModifier;
11import com.fs.starfarer.api.impl.campaign.ids.Factions;
12import com.fs.starfarer.api.impl.campaign.ids.Strings;
13import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
14import com.fs.starfarer.api.impl.campaign.intel.MessageIntel;
15import com.fs.starfarer.api.util.Misc;
35 public void advance(
float days,
boolean uiUpdateOnly) {
46 boolean firstTime = !
market.wasIncomingSetBefore();
62 if (uiUpdateOnly)
return;
70 for (
int i = 0; i < iter; i++) {
73 f = (iter - i) * 0.1f;
79 for (String
id : inc.
getComp().keySet()) {
80 pop.
add(
id, inc.
get(
id) * f);
93 if (newWeight < min ||
Global.
getSector().isInNewGameAdvance()) newWeight = min;
94 if (newWeight > max) {
102 float conversionFraction = 0.05f *
market.getStabilityValue() / 10f;
103 conversionFraction *= f;
104 if (conversionFraction > 0) {
110 float pirateFraction = 0.01f * Math.max(0, (5f -
market.getStabilityValue()) / 5f);
112 if (pirateFraction > 0) {
118 for (String fid :
new ArrayList<String>(pop.
getComp().keySet())) {
130 if (
market.getSize() >= Misc.MAX_COLONY_SIZE || !
market.isPlayerOwned()) {
132 market.getPopulation().normalize();
138 if (
market.isPlayerOwned()) {
139 MessageIntel intel =
new MessageIntel(
"Colony Growth - " +
market.getName(), Misc.getBasePlayerColor());
140 intel.addLine(BaseIntelPlugin.BULLET +
"Size increased to %s",
142 new String[] {
"" + (int)Math.round(market.getSize())},
143 Misc.getHighlightColor());
146 intel.setSound(BaseIntelPlugin.getSoundMajorPosting());
152 if (
market.getSize() >= Misc.MAX_COLONY_SIZE)
return;
154 for (
int i = 0; i <= 10; i++) {
155 market.removeCondition(
"population_" + i);
157 market.removeCondition(
"population_" +
market.getSize());
158 market.addCondition(
"population_" + (
market.getSize() + 1));
161 market.reapplyConditions();
162 market.reapplyIndustries();
164 if (
market.getSize() >= Misc.MAX_COLONY_SIZE) {
165 market.setImmigrationIncentivesOn(
false);
170 if (
market.getSize() <= 3) {
174 market.removeCondition(
"population_" +
market.getSize());
175 market.addCondition(
"population_" + (
market.getSize() - 1));
180 market.getPopulation().normalize();
182 market.reapplyConditions();
183 market.reapplyIndustries();
193 float stability =
market.getStabilityValue();
201 inc.
getWeight().modifyFlat(
"inc_st", stability - 5,
"Instability");
204 int numInd = Misc.getNumIndustries(
market);
208 inc.
getWeight().modifyFlat(
"inc_noInd", penalty,
"No industries");
214 float a = Math.round(
market.getAccessibilityMod().computeEffective(0f) * 100f) / 100f;
215 int accessibilityMod = (int) (a / Misc.PER_UNIT_SHIPPING);
216 inc.
getWeight().modifyFlat(
"inc_access", accessibilityMod,
"Accessibility");
222 inc.
getWeight().modifyFlat(
"inc_hazard", hazMod,
223 "Hazard rating (" + Strings.X + Misc.getRoundedValueMaxOneAfterDecimal(hazardSizeMult) +
224 " based on colony size)");
233 MarketAPI biggestInSystem =
null;
236 for (MarketAPI curr : inReach) {
237 if (curr ==
market)
continue;
239 if (curr.getFaction().isHostileTo(
market.getFaction()))
continue;
241 if (Misc.getDistanceLY(curr.getLocationInHyperspace(),
market.getLocationInHyperspace()) <= 0) {
242 if (biggestInSystem ==
null || curr.getSize() > biggestInSystem.getSize()) {
243 biggestInSystem = curr;
262 if (biggestInSystem !=
null) {
263 float sDiff = biggestInSystem.getSize() -
market.getSize();
266 inc.
getWeight().modifyFlat(
"inc_insys", sDiff,
"Larger non-hostile colony in same system");
267 }
else if (sDiff < 0) {
284 float numIndustries =
market.getIndustries().size();
285 inc.
add(Factions.PIRATES, 1f * numIndustries);
286 inc.
add(Factions.POOR, 1f * numIndustries);
288 String bulkFaction = Factions.INDEPENDENT;
289 if (
market.getFaction().isHostileTo(bulkFaction)) {
290 bulkFaction =
market.getFactionId();
292 inc.
add(bulkFaction, 10f * numIndustries);
297 for (MarketImmigrationModifier mod :
market.getAllImmigrationModifiers()) {
298 mod.modifyIncoming(
market, inc);
305 for (String fid :
new ArrayList<String>(inc.
getComp().keySet())) {
319 if (hazMod < 0) hazMod = 0;
321 return -hazMod * hazardSizeMult;
326 return hazardSizeMult;
336 if (!
market.isImmigrationIncentivesOn())
return;
337 if (
market.getSize() >= Misc.MAX_COLONY_SIZE) {
338 market.setImmigrationIncentivesOn(
false);
345 float cost =
market.getImmigrationIncentivesCost() * f;
348 inc.
getWeight().modifyFlat(
"inc_incentives", points,
"Hazard pay");
350 market.setIncentiveCredits(
market.getIncentiveCredits() + cost);
360 return (max - min) * fraction;
367 return points / (max - min);
372 return (
float) (300f * Math.pow(2, size - 3));
static SettingsAPI getSettings()
static SectorAPI getSector()
float getWeightForMarketSize(float size)
float getPopulationPointsForFraction(float fraction)
static float GROWTH_NO_INDUSTRIES
static float INCENTIVE_POINTS_EXTRA
CoreImmigrationPluginImpl(MarketAPI market)
static float getImmigrationHazardPenaltySizeMult(MarketAPI market)
void advance(float days, boolean uiUpdateOnly)
float getFractionForPopulationPoints(float points)
static final float ZERO_STABILITY_PENALTY
static final float FACTION_HOSTILITY_IMPACT
PopulationComposition computeIncoming(boolean uiUpdateOnly, float f)
static float HAZARD_SIZE_MULT
static void increaseMarketSize(MarketAPI market)
void increaseMarketSize()
static void reduceMarketSize(MarketAPI market)
static float INCENTIVE_CREDITS_PER_POINT
static float getWeightForMarketSizeStatic(float size)
static float getImmigrationHazardPenalty(MarketAPI market)
void applyIncentives(PopulationComposition inc, boolean uiUpdateOnly, float f)
static final float MAX_DIST_PENALTY
static float IMMIGRATION_PER_HAZARD
void normalizeToPositive()
void setWeight(float weight)
void add(String id, float value)
LinkedHashMap< String, Float > getComp()
float getFloat(String key)
void profilerBegin(String id)