1package com.fs.starfarer.api.impl.campaign.submarkets;
3import java.util.ArrayList;
5import java.util.Random;
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.CampaignUIAPI.CoreUITradeMode;
10import com.fs.starfarer.api.campaign.CargoAPI;
11import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
12import com.fs.starfarer.api.campaign.CargoStackAPI;
13import com.fs.starfarer.api.campaign.CoreUIAPI;
14import com.fs.starfarer.api.campaign.FactionAPI;
15import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
16import com.fs.starfarer.api.campaign.FactionDoctrineAPI;
17import com.fs.starfarer.api.campaign.FleetDataAPI;
18import com.fs.starfarer.api.campaign.PlayerMarketTransaction;
19import com.fs.starfarer.api.campaign.SpecialItemData;
20import com.fs.starfarer.api.campaign.SubmarketPlugin;
21import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
22import com.fs.starfarer.api.campaign.econ.MarketAPI;
23import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
24import com.fs.starfarer.api.combat.WeaponAPI.AIHints;
25import com.fs.starfarer.api.combat.WeaponAPI.WeaponSize;
26import com.fs.starfarer.api.fleet.FleetMemberAPI;
27import com.fs.starfarer.api.fleet.FleetMemberType;
28import com.fs.starfarer.api.impl.campaign.DModManager;
29import com.fs.starfarer.api.impl.campaign.fleets.DefaultFleetInflater;
30import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
31import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
32import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
33import com.fs.starfarer.api.impl.campaign.ids.Items;
34import com.fs.starfarer.api.impl.campaign.ids.Tags;
35import com.fs.starfarer.api.impl.campaign.shared.SharedData;
36import com.fs.starfarer.api.loading.FighterWingSpecAPI;
37import com.fs.starfarer.api.loading.HullModSpecAPI;
38import com.fs.starfarer.api.loading.WeaponSpecAPI;
39import com.fs.starfarer.api.plugins.impl.CoreAutofitPlugin;
40import com.fs.starfarer.api.ui.LabelAPI;
41import com.fs.starfarer.api.ui.TooltipMakerAPI;
42import com.fs.starfarer.api.util.Highlights;
43import com.fs.starfarer.api.util.Misc;
44import com.fs.starfarer.api.util.WeightedRandomPicker;
51 public static class ShipSalesData {
52 private String variantId;
53 private float numShips;
54 private float totalValue;
55 public String getVariantId() {
58 public void setVariantId(String variantId) {
59 this.variantId = variantId;
61 public float getNumShips() {
64 public void setNumShips(
float numShips) {
65 this.numShips = numShips;
67 public float getTotalValue() {
70 public void setTotalValue(
float totalValue) {
71 this.totalValue = totalValue;
132 if (stack.isNull())
continue;
159 return OnClickAction.OPEN_SUBMARKET;
179 return PlayerEconomyImpactMode.NONE;
198 if (stack.isCommodityStack()) {
200 if (qty <= 0)
continue;
203 if (mode == PlayerEconomyImpactMode.BOTH) {
205 }
else if (mode == PlayerEconomyImpactMode.PLAYER_SELL_ONLY) {
207 }
else if (mode == PlayerEconomyImpactMode.PLAYER_BUY_ONLY || mode == PlayerEconomyImpactMode.NONE) {
213 if (stack.isCommodityStack()) {
215 if (qty <= 0)
continue;
218 if (mode == PlayerEconomyImpactMode.BOTH) {
220 }
else if (mode == PlayerEconomyImpactMode.PLAYER_SELL_ONLY || mode == PlayerEconomyImpactMode.NONE) {
222 }
else if (mode == PlayerEconomyImpactMode.PLAYER_BUY_ONLY) {
272 if (action == TransferAction.PLAYER_BUY) {
273 return "Illegal to buy";
276 return "Illegal to store";
278 return "Illegal to sell";
293 for (
int i = 0; i < num; i++) {
294 String factionId = factionPicker.
pick();
299 protected void addWeapons(
int min,
int max,
int maxTier, String factionId) {
300 addWeapons(min, max, maxTier, factionId,
true);
302 protected void addWeapons(
int min,
int max,
int maxTier, String factionId,
boolean withCategories) {
304 picker.
add(factionId);
305 addWeapons(min, max, maxTier, picker, withCategories);
309 addWeapons(min, max, maxTier, factionPicker,
true);
320 for (
int i = 0; i < factionPicker.
getItems().size(); i++) {
321 String factionId = factionPicker.
getItems().get(i);
330 if (spec.
getTier() > maxTier)
continue;
331 if (spec.
getAIHints().contains(AIHints.SYSTEM))
continue;
343 if (cat !=
null && spec.
getSize() != WeaponSize.LARGE) {
349 kinetic.
add(spec, p);
351 missile.
add(spec, p);
353 nonKinetic.
add(spec, p);
361 if (withCategories) {
362 if (num > 0 && !pd.
isEmpty()) {
366 if (num > 0 && !kinetic.
isEmpty()) {
370 if (num > 0 && !missile.
isEmpty()) {
374 if (num > 0 && !nonKinetic.
isEmpty()) {
378 if (num > 0 && !strike.
isEmpty()) {
385 for (
int i = 0; i < num && !picker.
isEmpty(); i++) {
392 if (spec ==
null)
return;
404 case LARGE: count = 1;
break;
405 case MEDIUM: count = 2;
break;
406 case SMALL: count = 3;
break;
409 if (count < 1) count = 1;
414 protected void addFighters(
int min,
int max,
int maxTier, String factionId) {
426 throw new RuntimeException(
"Fighter wing spec with id [" +
id +
"] not found");
428 if (spec.
getTier() > maxTier)
continue;
439 for (
int i = 0; i < num && !picker.
isEmpty(); i++) {
444 case ASSAULT: count = 2;
break;
445 case BOMBER: count = 2;
break;
446 case INTERCEPTOR: count = 4;
break;
447 case FIGHTER: count = 3;
break;
448 case SUPPORT: count = 2;
break;
459 if (stack.isWeaponStack() || stack.isFighterWingStack()) {
460 float qty = stack.getSize();
466 cargo.
removeItems(stack.getType(), stack.getData(), Math.round(qty * (1f - keepFraction)));
479 Float qualityOverride,
481 ShipPickMode modeOverride,
483 addShips(factionId, combat, freighter, tanker, transport, liner, utility, qualityOverride, qualityMod, modeOverride, doctrineOverride, 1000);
493 Float qualityOverride,
495 ShipPickMode modeOverride,
512 params.maxShipSize = maxShipSize;
515 if (qualityOverride !=
null) {
516 params.qualityOverride = qualityOverride + qualityMod;
520 params.withOfficers =
false;
522 params.forceAllowPhaseShipsEtc =
true;
523 params.treatCombatFreighterSettingAsFraction =
true;
526 if (modeOverride !=
null) {
527 params.modeOverride = modeOverride;
530 params.doctrineOverride = doctrineOverride;
541 if (faction !=
null) {
548 if (member.getHullSpec().hasTag(
Tags.
NO_SELL))
continue;
551 picker.
add(member, f);
554 List<FleetMemberAPI> members =
new ArrayList<>();
563 String emptyVariantId = member.getHullId() +
"_Hull";
571 if (variantOrWingId.endsWith(
"_wing")) {
614 protected void addHullMods(
int maxTier,
int num, String factionId) {
619 if (stack.isModSpecStack()) {
625 if (factionId !=
null) {
635 if (spec.
getTier() > maxTier)
continue;
648 for (
int i = 0; i < num; i++) {
650 if (pick ==
null)
continue;
652 String
id = pick.
getId();
667 if (stack.isModSpecStack() && stack.getData().equals(
id)) {
678 if (stack.isSpecialStack() && stack.getSpecialDataIfSpecial().getId().equals(
Items.
TAG_MODSPEC) &&
679 stack.getSpecialDataIfSpecial().getData().equals(
id))
return true;
698 this.minSWUpdateInterval = minCargoUpdateInterval;
733 if (appendix !=
null) desc = desc +
"\n\n" + appendix;
735 if (desc !=
null && !desc.isEmpty()) {
797 boolean withShortageCountering,
798 boolean withDecreaseToLimit,
799 boolean withCargoUpdate) {
801 if (com.isNonEcon())
continue;
802 if (com.getCommodity().isMeta())
continue;
821 boolean withShortageCountering,
822 boolean withDecreaseToLimit,
823 boolean withCargoUpdate) {
846 if (withShortageCountering) {
856 if (withDecreaseToLimit) {
860 if (curr > limit && withDecreaseToLimit) {
861 float removeRate = (curr - limit) * 2f / 30f;
862 float removeAmount = removeRate * days;
864 if (curr - removeAmount < limit) {
865 removeAmount = curr - limit;
867 if (removeAmount > 0 && curr <= 1) {
871 if (removeAmount > 0) {
883 if (curr < limit && withCargoUpdate) {
884 if (limit <= 0)
return;
898 float addAmount = addRate * days;
901 if (curr + addAmount > limit) {
902 addAmount = limit - curr;
951 if (curr > limit && withDecreaseToLimit) {
952 float removeRate = (curr - limit) * 2f / 30f;
953 float removeAmount = removeRate * days;
956 if (curr - removeAmount < limit) {
957 removeAmount = curr - limit;
959 if (removeAmount > 0 && curr <= 1) {
963 if (removeAmount > 0) {
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
static void addDMods(FleetMemberData data, boolean own, CampaignFleetAPI recoverer, Random random)
static boolean setDHull(ShipVariantAPI variant)
static float getAverageDmodsForQuality(float quality)
static int getNumDModsToAdd(ShipVariantAPI variant, float averageDMods, Random random)
static float getTierProbability(int tier, float quality)
static CampaignFleetAPI createFleet(FleetParamsV3 params)
static final String PATROL_LARGE
static final String TAG_MODSPEC
PlayerTradeDataForSubmarket getPlayerTradeData(SubmarketAPI submarket)
void addTransaction(PlayerMarketTransaction transaction)
PlayerActivityTracker getPlayerActivityTracker()
static SharedData getData()
void pruneWeapons(float keepFraction)
boolean okToUpdateShipsAndWeapons()
String getIllegalTransferText(CargoStackAPI stack, TransferAction action)
boolean removeModFromCargo(String id)
void addShips(String factionId, float combat, float freighter, float tanker, float transport, float liner, float utility, Float qualityOverride, float qualityMod, ShipPickMode modeOverride, FactionDoctrineAPI doctrineOverride)
float minSWUpdateInterval
int getStockpileLimit(CommodityOnMarketAPI com)
SubmarketAPI getSubmarket()
OnClickAction getOnClickAction(CoreUIAPI ui)
boolean isIllegalOnSubmarket(FleetMemberAPI member, TransferAction action)
boolean cargoAlreadyHasMod(String id)
String getTotalValueOverride()
String getDialogText(CoreUIAPI ui)
boolean isIllegalOnSubmarket(CargoStackAPI stack, TransferAction action)
boolean shouldHaveCommodity(CommodityOnMarketAPI com)
float sinceLastCargoUpdate
String getTariffTextOverride()
void setMinSWUpdateInterval(float minCargoUpdateInterval)
void pickAndAddWeapons(WeightedRandomPicker< WeaponSpecAPI > picker)
void addHullMods(int maxTier, int num, String factionId)
void createTooltipAfterDescription(TooltipMakerAPI tooltip, boolean expanded)
String getTooltipAppendix(CoreUIAPI ui)
boolean doShortageCountering(CommodityOnMarketAPI com, float amount, boolean withShortageCountering)
boolean showInFleetScreen()
float getSinceLastCargoUpdate()
void addWeapons(int min, int max, int maxTier, String factionId, boolean withCategories)
void setSinceSWUpdate(float sinceSWUpdate)
boolean isTooltipExpandable()
String getIllegalTransferText(FleetMemberAPI member, TransferAction action)
Highlights getDialogTextHighlights(CoreUIAPI ui)
void addHullMods(int maxTier, int num)
Highlights getTooltipAppendixHighlights(CoreUIAPI ui)
void createTooltip(CoreUIAPI ui, TooltipMakerAPI tooltip, boolean expanded)
DialogOption[] getDialogOptions(CoreUIAPI ui)
void reportPlayerMarketTransaction(PlayerMarketTransaction transaction)
boolean isParticipatesInEconomy()
void addFighters(int min, int max, int maxTier, String factionId)
void addAndRemoveStockpiledResources(CommodityOnMarketAPI com, float amount, boolean withShortageCountering, boolean withDecreaseToLimit, boolean withCargoUpdate)
static float TRADE_IMPACT_DAYS
void pruneShips(float mult)
String getTotalTextOverride()
Highlights getIllegalTransferTextHighlights(CargoStackAPI stack, TransferAction action)
boolean showInCargoScreen()
boolean hasCustomTooltip()
void addFighters(int min, int max, int maxTier, WeightedRandomPicker< String > factionPicker)
Highlights getIllegalTransferTextHighlights(FleetMemberAPI member, TransferAction action)
CargoAPI getCargoNullOk()
void setCargo(CargoAPI cargo)
void addShips(String factionId, float combat, float freighter, float tanker, float transport, float liner, float utility, Float qualityOverride, float qualityMod, ShipPickMode modeOverride, FactionDoctrineAPI doctrineOverride, int maxShipSize)
FleetMemberAPI addShip(String variantOrWingId, boolean withDmods, float quality)
void addWeapons(int min, int max, int maxTier, WeightedRandomPicker< String > factionPicker, boolean withCategories)
void init(SubmarketAPI submarket)
float getPlayerTradeImpactMult()
PlayerEconomyImpactMode getPlayerEconomyImpactMode()
void addWeapons(int min, int max, int maxTier, WeightedRandomPicker< String > factionPicker)
boolean isIllegalOnSubmarket(String commodityId, TransferAction action)
void advance(float amount)
boolean isMilitaryMarket()
float getMinSWUpdateInterval()
void addAndRemoveStockpiledResources(float amount, boolean withShortageCountering, boolean withDecreaseToLimit, boolean withCargoUpdate)
void updateCargoPrePlayerInteraction()
String getTariffValueOverride()
void setSinceLastCargoUpdate(float sinceLastCargoUpdate)
void addAllCargo(CargoAPI otherCargo)
boolean isEnabled(CoreUIAPI ui)
void addWeapons(int min, int max, int maxTier, String factionId)
float getStockpilingAddRateMult(CommodityOnMarketAPI com)
static boolean isAutomated(MutableShipStatsAPI stats)
static float getShipQuality(MarketAPI market)
static ShipPickMode getShipPickMode(MarketAPI market)
CargoAPI createCargo(boolean unlimitedStacks)
FleetMemberAPI createFleetMember(FleetMemberType type, String variantOrWingId)
HullModSpecAPI getHullModSpec(String modId)
FighterWingSpecAPI getFighterWingSpec(String wingId)
WeaponSpecAPI getWeaponSpec(String weaponId)
float convertToDays(float realSeconds)
FleetDataAPI getFleetData()
void removeStack(CargoStackAPI stack)
void addWeapons(String id, int count)
boolean removeItems(CargoAPI.CargoItemType itemType, Object data, float quantity)
float getCommodityQuantity(String id)
void removeCommodity(String id, float quantity)
void initMothballedShips(String factionId)
List< CargoStackAPI > getStacksCopy()
void addItems(CargoAPI.CargoItemType itemType, Object data, float quantity)
void addCommodity(String commodityId, float quantity)
FleetDataAPI getMothballedShips()
boolean isCommodityStack()
CoreUITradeMode getTradeMode()
Map< String, Float > getWeaponSellFrequency()
Map< String, Float > getHullmodSellFrequency()
Set< String > getKnownFighters()
Set< String > getKnownWeapons()
boolean knowsHullMod(String modId)
Set< String > getKnownHullMods()
boolean isHostileTo(FactionAPI other)
Map< String, Float > getFighterSellFrequency()
FactionSpecAPI getFactionSpec()
Map< String, Float > getShipSellFrequency()
void addFleetMember(FleetMemberAPI member)
void removeFleetMember(FleetMemberAPI member)
List< FleetMemberAPI > getMembersListCopy()
CampaignFleetAPI getPlayerFleet()
CampaignClockAPI getClock()
FactionAPI getPlayerFaction()
FactionAPI getFaction(String factionId)
Vector2f getLocationInHyperspace()
String getTooltipAppendix(CoreUIAPI ui)
Highlights getTooltipAppendixHighlights(CoreUIAPI ui)
void addTradeMod(String source, float quantity, float days)
void addTradeModMinus(String source, float quantity, float days)
CommoditySpecAPI getCommodity()
void addTradeModPlus(String source, float quantity, float days)
CommodityOnMarketAPI getCommodityData(String commodityId)
boolean isUseStockpilesForShortages()
List< CommodityOnMarketAPI > getCommoditiesCopy()
boolean isIllegal(String commodityId)
SectorEntityToken getPrimaryEntity()
SubmarketSpecAPI getSpec()
SubmarketPlugin getPlugin()
String performTokenReplacement(String ruleId, String text, SectorEntityToken entity, Map< String, MemoryAPI > memoryMap)
ShipVariantAPI getVariant()
RepairTrackerAPI getRepairTracker()
void setMothballed(boolean mothballed)
boolean hasTag(String tag)
boolean isAlwaysUnlocked()
boolean hasTag(String tag)
String getAutofitCategory()
EnumSet< WeaponAPI.AIHints > getAIHints()
void setHighlight(int start, int end)
void setHighlightColors(Color ... colors)