1package com.fs.starfarer.api.impl.campaign.econ.impl;
3import java.util.ArrayList;
8import org.json.JSONArray;
9import org.json.JSONException;
10import org.lwjgl.util.vector.Vector2f;
12import com.fs.starfarer.api.EveryFrameScript;
13import com.fs.starfarer.api.Global;
14import com.fs.starfarer.api.campaign.FactionDoctrineAPI;
15import com.fs.starfarer.api.campaign.SectorEntityToken;
16import com.fs.starfarer.api.campaign.SpecialItemData;
17import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin;
18import com.fs.starfarer.api.campaign.econ.CommodityMarketDataAPI;
19import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
20import com.fs.starfarer.api.campaign.econ.Industry;
21import com.fs.starfarer.api.campaign.econ.MarketAPI;
22import com.fs.starfarer.api.campaign.econ.MarketImmigrationModifier;
23import com.fs.starfarer.api.campaign.listeners.ColonyOtherFactorsListener;
24import com.fs.starfarer.api.characters.MarketConditionSpecAPI;
25import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
26import com.fs.starfarer.api.combat.MutableStat;
27import com.fs.starfarer.api.combat.MutableStat.StatMod;
28import com.fs.starfarer.api.impl.campaign.econ.CommRelayCondition;
29import com.fs.starfarer.api.impl.campaign.econ.impl.ConstructionQueue.ConstructionQueueItem;
30import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
31import com.fs.starfarer.api.impl.campaign.ids.Commodities;
32import com.fs.starfarer.api.impl.campaign.ids.Conditions;
33import com.fs.starfarer.api.impl.campaign.ids.Entities;
34import com.fs.starfarer.api.impl.campaign.ids.Factions;
35import com.fs.starfarer.api.impl.campaign.ids.Industries;
36import com.fs.starfarer.api.impl.campaign.ids.Items;
37import com.fs.starfarer.api.impl.campaign.ids.Stats;
38import com.fs.starfarer.api.impl.campaign.intel.misc.HypershuntIntel;
39import com.fs.starfarer.api.impl.campaign.population.PopulationComposition;
40import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator;
41import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.AddedEntity;
42import com.fs.starfarer.api.impl.campaign.procgen.themes.BaseThemeGenerator.EntityLocation;
43import com.fs.starfarer.api.loading.IndustrySpecAPI;
44import com.fs.starfarer.api.ui.TooltipMakerAPI;
45import com.fs.starfarer.api.ui.TooltipMakerAPI.StatModValueGetter;
46import com.fs.starfarer.api.util.Misc;
47import com.fs.starfarer.api.util.Pair;
82 int luxuryThreshold = 3;
97 if (deficit.
two <= 0) {
104 if (deficit.
two <= 0 && size > luxuryThreshold) {
114 if (deficit.
two > 0) {
121 boolean spaceportFirstInQueue =
false;
125 spaceportFirstInQueue =
true;
130 spaceportFirstInQueue =
false;
156 float stabilityDefenseMult = 0.25f + stability / 10f * 0.75f;
158 stabilityDefenseMult,
"Stability");
162 baseDef,
"Base value for a size " +
market.
getSize() +
" colony");
189 if (deficitShipsMult != 1f) {
248 if (marketSize <= 4)
return 0f;
249 if (marketSize == 5)
return 0.1f;
250 if (marketSize == 6)
return 0.15f;
251 if (marketSize == 7)
return 0.2f;
252 if (marketSize == 8)
return 0.25f;
256 if (marketSize <= 1)
return 10;
257 if (marketSize <= 2)
return 20;
258 if (marketSize <= 3)
return 50;
260 return (marketSize - 3) * 100;
308 if (mode != IndustryTooltipMode.NORMAL ||
isFunctional()) {
314 if (mod.source.startsWith(
getModId())) {
315 stabilityMods.
modifyFlat(mod.source, mod.value, mod.desc);
320 String totalStr =
"+" + (int)Math.round(total);
323 totalStr =
"" + (int)Math.round(total);
329 tooltip.
addPara(
"Stability bonus: %s", opad, h, totalStr);
331 tooltip.
addPara(
"Stability penalty: %s", opad, h, totalStr);
334 public String getPercentValue(StatMod mod) {
337 public String getMultValue(StatMod mod) {
340 public Color getModColor(StatMod mod) {
344 public String getFlatValue(StatMod mod) {
403 return super.getCurrentImage();
408 if (stability <= 5) {
409 return Math.max(0, stability / 5f);
423 float hazardMult = hazard;
425 if (hazardMult < min) hazardMult = min;
433 if (!curr.isPlayerOwned())
continue;
435 if (curr.getAdmin().isPlayer()) {
444 int overOutposts = outposts - maxOutposts;
450 return penaltyOrBonus;
476 float inFactionSupply = 0f;
477 float totalDemand = 0f;
479 if (com.isNonEcon())
continue;
481 int d = com.getMaxDemand();
482 if (d <= 0)
continue;
486 int inFaction = Math.max(Math.min(com.getMaxSupply(), com.getAvailable()),
488 if (inFaction > d) inFaction = d;
489 if (inFaction < d) inFaction = Math.max(Math.min(com.getMaxSupply(), com.getAvailable()), 0);
495 inFactionSupply += Math.max(0, Math.min(inFaction, com.getAvailable()));
498 if (totalDemand > 0) {
500 float f = inFactionSupply / totalDemand;
504 float mult = Math.round(100f - (f * max * 100f)) / 100f;
505 String desc =
"Demand supplied in-faction (" + (int)Math.round(f * 100f) +
"%)";
506 if (f == 1f) desc =
"All demand supplied in-faction";
518 }
else if (penalty < 0) {
575 if (size >= 1 && size <= 9) {
576 cid =
"population_" + size;
583 return super.getDescriptionOverride();
594 return super.getBuildOrUpgradeProgressText();
602 return super.getBuildOrUpgradeProgress();
609 return super.isBuilding();
616 return super.isUpgrading();
622 float patherLevel = 0;
624 patherLevel += getAICoreImpact(curr.getAICoreId());
628 if (adminCoreId !=
null) {
629 patherLevel += 10f * getAICoreImpact(adminCoreId);
632 List<String> targeted =
new ArrayList<String>();
638 for (String curr : targeted) {
644 if (patherLevel > 0) {
654 private float getAICoreImpact(String coreId) {
675 for (
int i = 0; i <
MAX_IND.length; i++) {
678 }
catch (JSONException e) {
679 throw new RuntimeException(e);
683 if (size < 0) size = 0;
684 if (size > 9) size = 9;
733 if (mode == ImprovementDescriptionMode.INDUSTRY_TOOLTIP) {
740 super.addImproveDesc(info, mode);
751 this.market = market;
752 this.industry = industry;
754 public void advance(
float amount) {
759 industry.lamp =
null;
763 public boolean isDone() {
766 public boolean runWhilePaused() {
792 EntityLocation loc =
new EntityLocation();
795 radius, radius / (10f + 10f * (
float) Math.random()));
823 if (
special !=
null)
return false;
831 return super.wantsToUseSpecialItem(data);
840 float minDist = Float.MAX_VALUE;
855 if (dist < minDist) {
862 if (nearest ==
null)
return null;
879 String lights =
"light-years";
880 if (dStr.equals(
"1")) lights =
"light-year";
883 text.
addPara(
"The nearest coronal tap is located in the " +
884 p.
one.getContainingLocation().getNameWithLowercaseType() +
", %s " + lights +
" away. The maximum " +
885 "range at a portal can connect to a tap is %s light-years.",
890 text.
addPara(
"The nearest coronal tap is located in the " +
891 p.
one.getContainingLocation().getNameWithLowercaseType() +
", %s " + lights +
" away, allowing " +
892 "a coronal portal located here to connect to it.",
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
void modifyFlat(String source, float value)
void unmodifyMult(String source)
void unmodifyFlat(String source)
HashMap< String, StatMod > getFlatMods()
void modifyMultAlways(String source, float value, String desc)
void modifyMult(String source, float value)
void modifyMultAlways(String source, float value, String desc)
void unmodifyMult(String source)
void modifyFlatAlways(String source, float value, String desc)
void modifyFlat(String source, float value)
void unmodifyFlat(String source)
static String COMM_RELAY_MOD_ID
static float NO_RELAY_PENALTY
Map< String, MutableCommodityQuantity > supply
String getImprovementsDescForModifiers()
static String getDeficitText(String commodityId)
static int SIZE_FOR_LARGE_IMAGE
static int SIZE_FOR_SMALL_IMAGE
Map< String, MutableCommodityQuantity > demand
String getNameForModifier()
transient IndustrySpecAPI spec
Pair< String, Integer > getMaxDeficit(String ... commodityIds)
List< ConstructionQueueItem > getItems()
static List< String > FUSION_LAMP_CONDITIONS
static int CORONAL_TAP_LIGHT_YEARS
static float OFFICER_ADDITIONAL_BASE_PROB
static float getUpkeepHazardMult(float hazard)
static float OFFICER_BASE_MERC_PROB
static int getMaxIndustries(int size)
static float IMPROVE_STABILITY_BONUS
static float getIncomeStabilityMult(float stability)
static Pair< SectorEntityToken, Float > getNearestCoronalTap(Vector2f locInHyper, boolean usable)
String getCanNotShutDownReason()
static boolean HAZARD_INCREASES_DEFENSE
boolean wantsToUseSpecialItem(SpecialItemData data)
void addImproveDesc(TooltipMakerAPI info, ImprovementDescriptionMode mode)
static float ADMIN_BASE_PROB
static void unmodifyStability(MarketAPI market, String modId)
static Pair< SectorEntityToken, Float > getNearestCoronalTap(Vector2f locInHyper, boolean usable, boolean requireDefendersDefeated)
static int getMismanagementPenalty()
static float getAccessibilityBonus(int marketSize)
static void modifyStability2(Industry industry, MarketAPI market, String modId)
float getBuildOrUpgradeProgress()
static float OFFICER_PROB_PER_SIZE
static void modifyStability(Industry industry, MarketAPI market, String modId)
static float OFFICER_BASE_PROB
static void modifyUpkeepByHazardRating(MarketAPI market, String modId)
void addPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
static float ADMIN_PROB_PER_SIZE
boolean hasPostDemandSection(boolean hasDemand, IndustryTooltipMode mode)
String getBuildOrUpgradeProgressText()
void setSpecialItem(SpecialItemData special)
static float getBaseGroundDefenses(int marketSize)
void applyImproveModifiers()
String addedHeatCondition
String removedHeatCondition
String getDescriptionOverride()
void modifyIncoming(MarketAPI market, PopulationComposition incoming)
static float getShipDeficitFleetSizeMult(MarketAPI market)
static float getNumShipsMultForMarketSize(float marketSize)
static float getShipQualityModForStability(float stability)
static float getDoctrineNumShipsMult(int doctrineNumShips)
static float getNumShipsMultForStability(float stability)
static final String LUXURY_GOODS
static final String SUPPLIES
static final String DOMESTIC_GOODS
static final String ALPHA_CORE
static final String BETA_CORE
static final String ORGANS
static final String GAMMA_CORE
static final String ORGANICS
static final String SHIPS
static final String DRUGS
static final String COMM_RELAY
static final String VERY_COLD
static final String VERY_HOT
static final String HABITABLE
static final String FUSION_LAMP
static final String LUDDIC_PATH
static final String POPULATION
static final String TECHMINING
static final String TAG_SPACEPORT
static final String HEAVYINDUSTRY
static final String FUELPROD
static final String STARFORTRESS
static final String ORBITAL_FUSION_LAMP
static final String OFFICER_IS_MERC_PROB_MOD
static final String ADMIN_PROB_MOD
static final String COMBAT_FLEET_SIZE_MULT
static final String OFFICER_PROB_MOD
static final String FLEET_QUALITY_MOD
static final String GROUND_DEFENSES_MOD
static final String OFFICER_ADDITIONAL_PROB_MULT_MOD
static final String MAX_INDUSTRIES
boolean defendersDefeated()
SectorEntityToken getEntity()
void add(String id, float value)
static AddedEntity addNonSalvageEntity(LocationAPI system, EntityLocation loc, String type, String faction)
static float getDistanceLY(SectorEntityToken from, SectorEntityToken to)
static String ucFirst(String str)
static Color getNegativeHighlightColor()
static float getMarketSizeProgress(MarketAPI market)
static void fadeAndExpire(SectorEntityToken entity)
static int getNumIndustries(MarketAPI market)
static Color getHighlightColor()
static int getMaxIndustries(MarketAPI market)
static int OVER_MAX_INDUSTRIES_PENALTY
static Industry getCurrentlyBeingConstructed(MarketAPI market)
static int getMaxMarketSize(MarketAPI market)
static float getOutpostPenalty()
static String getRoundedValueMaxOneAfterDecimal(float value)
static String getRoundedValue(float value)
OrbitAPI createCircularOrbit(SectorEntityToken focus, float angle, float orbitRadius, float orbitDays)
JSONArray getJSONArray(String key)
String getSpriteName(String category, String id)
MarketConditionSpecAPI getMarketConditionSpec(String conditionId)
IndustrySpecAPI getIndustrySpec(String industryId)
float getFloat(String key)
String getEntityNamePrefix()
FactionDoctrineAPI getDoctrine()
float getShipQualityContribution()
void addScript(EveryFrameScript script)
IntelManagerAPI getIntelManager()
CharacterDataAPI getCharacterData()
Vector2f getLocationInHyperspace()
MemoryAPI getMemoryWithoutUpdate()
List< IntelInfoPlugin > getIntel()
int getMaxExport(String factionId)
int getMaxShipping(MarketAPI market, boolean inFaction)
List< MarketAPI > getMarketsCopy()
SpecialItemData getSpecialItem()
void addTransientImmigrationModifier(MarketImmigrationModifier mod)
LocationAPI getContainingLocation()
MutableMarketStatsAPI getStats()
List< CommodityOnMarketAPI > getCommoditiesCopy()
MutableStatWithTempMods getStability()
StatBonus getAccessibilityMod()
MutableStat getIncomeMult()
String addCondition(String id)
boolean hasIndustry(String id)
List< Industry > getIndustries()
Industry getIndustry(String id)
PlanetAPI getPlanetEntity()
boolean hasCondition(String id)
void removeTransientImmigrationModifier(MarketImmigrationModifier mod)
ConstructionQueue getConstructionQueue()
void removeCondition(String id)
SectorEntityToken getPrimaryEntity()
MutableStat getUpkeepMult()
boolean contains(String key)
MutableStat getOutpostNumber()
MutableCharacterStatsAPI getStats()
DynamicStatsAPI getDynamic()
boolean hasTag(String tag)
StatBonus getMod(String id)