1package com.fs.starfarer.api.impl.campaign.submarkets;
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.HashMap;
7import java.util.HashSet;
12import com.fs.starfarer.api.Global;
13import com.fs.starfarer.api.campaign.CargoAPI;
14import com.fs.starfarer.api.campaign.CargoStackAPI;
15import com.fs.starfarer.api.campaign.CoreUIAPI;
16import com.fs.starfarer.api.campaign.PlayerMarketTransaction;
17import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
18import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
19import com.fs.starfarer.api.campaign.econ.MonthlyReport;
20import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
21import com.fs.starfarer.api.campaign.econ.EconomyAPI.EconomyUpdateListener;
22import com.fs.starfarer.api.campaign.econ.MonthlyReport.FDNode;
23import com.fs.starfarer.api.campaign.listeners.EconomyTickListener;
24import com.fs.starfarer.api.combat.MutableStat;
25import com.fs.starfarer.api.combat.MutableStat.StatMod;
26import com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry;
27import com.fs.starfarer.api.impl.campaign.ids.Commodities;
28import com.fs.starfarer.api.impl.campaign.ids.Strings;
29import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
30import com.fs.starfarer.api.impl.campaign.shared.SharedData;
31import com.fs.starfarer.api.ui.Alignment;
32import com.fs.starfarer.api.ui.TooltipMakerAPI;
33import com.fs.starfarer.api.util.Misc;
49 protected Map<String, MutableStat>
stockpilingBonus =
new HashMap<String, MutableStat>();
76 super.advance(amount);
107 return "Can only store resources";
123 available -= (int) mod.value;
124 if (available < 0) available = 0;
128 production = Math.min(production, available);
132 export = (int) Math.min(production, shippingGlobal);
134 int extra = available - Math.max(export, demand);
135 if (extra < 0) extra = 0;
137 int deficit = demand - available;
140 int imports = available - production;
141 if (imports < 0) imports = 0;
152 String cid = com.
getId();
164 if (limit < 0) limit = 0;
302 float totalCost = 0f;
308 if (curr <= 0)
continue;
315 totalCost += units * per;
318 return (
int) totalCost;
324 int result = (int) Math.round((spec.
getBasePrice() * mult));
325 if (result < 1) result = 1;
336 float modAlready = 0;
337 if (mod !=
null) modAlready = mod.value;
340 int available = (int) Math.round(com.
getAvailable() - modAlready);
342 if (demand > available) {
345 return deficitDrawBaseAmount;
363 if (withShortageCountering && demand > available) {
365 int deficit = demand - available;
366 if (deficit != deficit)
return false;
373 float drawAmount = deficitDrawBaseAmount * days / 30f;
375 if (curr > 0 && deficitDrawBaseAmount > 0) {
376 int daysLeft = (int) (curr / deficitDrawBaseAmount * 30f);
377 String daysStr =
"days";
383 "Local resource stockpiles (" + daysLeft +
" " + daysStr +
" left)");
386 free = Math.min(drawAmount, free);
388 if (drawAmount > 0) {
398 float addToTooltipCargo = drawAmount;
401 addToTooltipCargo = 1f;
412 comNode.upkeep += unitPrice * drawAmount;
413 comNode.custom = com;
415 if (comNode.custom2 ==
null) {
416 comNode.custom2 = 0f;
418 comNode.custom2 = (Float)comNode.custom2 + drawAmount;
420 float qty = Math.max(1, (Float) comNode.custom2);
421 qty = (float) Math.ceil(qty);
446 if (iterIndex != lastIterInMonth)
return;
457 if (!stack.isCommodityStack())
continue;
462 float addToTooltipCargo = stack.getSize();
463 String cid = stack.getCommodityId();
466 addToTooltipCargo = 1f;
473 FDNode comNode = report.
getNode(node, cid);
477 comNode.upkeep += unitPrice * addToTooltipCargo;
480 if (comNode.custom2 ==
null) {
481 comNode.custom2 = 0f;
483 comNode.custom2 = (Float)comNode.custom2 + addToTooltipCargo;
485 float qty = Math.max(1, (Float) comNode.custom2);
486 qty = (float) Math.ceil(qty);
506 return "End of month";
514 Set<String> seen =
new HashSet<String>();
516 if (!stack.isCommodityStack())
continue;
518 String cid = stack.getCommodityId();
519 if (seen.contains(cid))
continue;
527 int units = pre - post;
533 total += price * units;
561 Collections.sort(all,
new Comparator<CommodityOnMarketAPI>() {
565 return limit2 - limit1;
574 if (com.isNonEcon())
continue;
575 if (com.getCommodity().isMeta())
continue;
580 if (limit <= 0)
continue;
583 com.getCommodity().getName(),
588 tooltip.
addPara(
"A portion of the resources produced by the colony will be made available here. " +
589 "These resources can be extracted from the colony's economy for a cost equal to %s of their base value. " +
590 "This cost will be deducted at the end of the month.", opad,
593 tooltip.
addPara(
"These resources can also be used to counter temporary shortages, for a " +
594 "cost equal to %s of their base value. If additional resources are placed here, they " +
595 "will be used as well, at no cost.", opad,
603 tooltip.
addPara(
"Stockpiles are limited to %s the monthly rate.", opad,
606 tooltip.
addPara(
"No stockpiling.", opad);
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
FDNode getCounterShortageNode(MarketAPI market)
FDNode getNode(String ... path)
FDNode getRestockingNode(MarketAPI market)
MonthlyReportNodeTooltipCreator getMonthlyReportTooltip()
void modifyFlat(String source, float value)
void unmodifyFlat(String source)
StatMod getFlatStatMod(String source)
HashMap< String, StatMod > getFlatMods()
static final String TAG_NON_ECONOMIC
static final String LOCAL_RESOURCES
static SharedData getData()
MonthlyReport getCurrentReport()
float sinceLastCargoUpdate
void addAndRemoveStockpiledResources(float amount, boolean withShortageCountering, boolean withDecreaseToLimit, boolean withCargoUpdate)
void updateCargoPrePlayerInteraction()
float getStockpilingAddRateMult(CommodityOnMarketAPI com)
void reportEconomyMonthEnd()
boolean showInFleetScreen()
boolean showInCargoScreen()
static float getDeficitMonthlyCommodityUnits(CommodityOnMarketAPI com)
int getStockpileLimit(CommodityOnMarketAPI com)
transient CargoAPI preTransactionCargoCopy
void reportEconomyTick(int iterIndex)
void reportPlayerMarketTransaction(PlayerMarketTransaction transaction)
boolean doShortageCountering(CommodityOnMarketAPI com, float amount, boolean withShortageCountering)
boolean isTooltipExpandable()
void commodityUpdated(String commodityId)
void advance(float amount)
boolean isEnabled(CoreUIAPI ui)
Map< String, MutableStat > stockpilingBonus
MutableStat getStockpilingBonus(String cid)
static float STOCKPILE_MAX_MONTHS
static float STOCKPILE_COST_MULT
String getTotalTextOverride()
void init(SubmarketAPI submarket)
String getTotalValueOverride()
boolean isEconomyListenerExpired()
String getTariffTextOverride()
int getEstimatedShortageCounteringCostPerMonth()
static float STOCKPILE_MULT_EXCESS
static float STOCKPILE_MULT_IMPORTS
static float STOCKPILE_MULT_PRODUCTION
void createTooltipAfterDescription(TooltipMakerAPI tooltip, boolean expanded)
static float STOCKPILE_SHORTAGE_COST_MULT
static int getStockpilingUnitPrice(CommoditySpecAPI spec, boolean forShortageCountering)
LocalResourcesSubmarketPlugin()
boolean isParticipatesInEconomy()
String getIllegalTransferText(CargoStackAPI stack, TransferAction action)
String getTariffValueOverride()
boolean isIllegalOnSubmarket(CargoStackAPI stack, TransferAction action)
boolean shouldHaveCommodity(CommodityOnMarketAPI com)
static String getDGSCredits(float num)
static String getWithDGS(float num)
static Color getHighlightColor()
CargoAPI createCargo(boolean unlimitedStacks)
float getFloat(String key)
float convertToDays(float realSeconds)
void removeAll(CargoAPI other)
float getCommodityQuantity(String id)
void removeCommodity(String id, float quantity)
void addAll(CargoAPI other)
List< CargoStackAPI > getStacksCopy()
void addCommodity(String commodityId, float quantity)
CommoditySpecAPI getResourceIfResource()
CampaignClockAPI getClock()
ListenerManagerAPI getListenerManager()
MarketShareDataAPI getMarketShareData(MarketAPI market)
int getMaxShipping(MarketAPI market, boolean inFaction)
CommoditySpecAPI getCommodity()
MutableStatWithTempMods getAvailableStat()
CommodityMarketDataAPI getCommodityMarketData()
boolean hasTag(String tag)
void addUpdateListener(EconomyUpdateListener listener)
CommodityOnMarketAPI getCommodityData(String commodityId)
boolean isIllegal(String commodityId)
boolean hasSubmarket(String specId)
List< CommodityOnMarketAPI > getAllCommodities()
boolean isSourceIsIllegal()
void addListener(Object listener)
void removeListener(Object listener)