1package com.fs.starfarer.api.impl.campaign.econ.impl;
4import java.util.ArrayList;
6import java.util.Random;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.CargoAPI;
10import com.fs.starfarer.api.campaign.CargoStackAPI;
11import com.fs.starfarer.api.campaign.FactionAPI;
12import com.fs.starfarer.api.campaign.econ.CommoditySpecAPI;
13import com.fs.starfarer.api.campaign.econ.MarketAPI;
14import com.fs.starfarer.api.campaign.econ.MarketImmigrationModifier;
15import com.fs.starfarer.api.campaign.impl.items.BlueprintProviderItem;
16import com.fs.starfarer.api.campaign.impl.items.ModSpecItemPlugin;
17import com.fs.starfarer.api.campaign.rules.MemoryAPI;
18import com.fs.starfarer.api.impl.campaign.ids.Conditions;
19import com.fs.starfarer.api.impl.campaign.ids.Factions;
20import com.fs.starfarer.api.impl.campaign.ids.Stats;
21import com.fs.starfarer.api.impl.campaign.population.PopulationComposition;
22import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec.DropData;
23import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageEntity;
24import com.fs.starfarer.api.ui.TooltipMakerAPI;
25import com.fs.starfarer.api.util.Misc;
38 int size =
market.getSize();
41 if (
market.hasCondition(Conditions.RUINS_VAST)) {
44 }
else if (
market.hasCondition(Conditions.RUINS_EXTENSIVE)) {
47 }
else if (
market.hasCondition(Conditions.RUINS_WIDESPREAD)) {
50 }
else if (
market.hasCondition(Conditions.RUINS_SCATTERED)) {
55 size = Math.min(size, max);
72 market.addTransientImmigrationModifier(
this);
78 market.removeTransientImmigrationModifier(
this);
84 if (!super.isAvailableToBuild())
return false;
85 if (
market.hasCondition(Conditions.RUINS_VAST) ||
86 market.hasCondition(Conditions.RUINS_EXTENSIVE) ||
87 market.hasCondition(Conditions.RUINS_WIDESPREAD) ||
88 market.hasCondition(Conditions.RUINS_SCATTERED)) {
96 if (!super.isAvailableToBuild())
return super.getUnavailableReason();
97 return "Requires ruins";
102 incoming.add(Factions.TRITACHYON, 10f);
107 if (
market.hasCondition(Conditions.RUINS_VAST)) {
109 }
else if (
market.hasCondition(Conditions.RUINS_EXTENSIVE)) {
111 }
else if (
market.hasCondition(Conditions.RUINS_WIDESPREAD)) {
113 }
else if (
market.hasCondition(Conditions.RUINS_SCATTERED)) {
116 return base + super.getPatherInterest();
127 tooltip.addPara(
"In addition to extracting basic resources, " +
128 "there's also a chance to find blueprints and other rare items. Anything " +
129 "found will be delivered to the designated production gathering point.", opad);
131 boolean hasRuins =
true;
132 if (
market.hasCondition(Conditions.RUINS_VAST)) {
133 tooltip.addPara(
"The vast ruins here offer incredible potential for valuable finds.", opad);
134 }
else if (
market.hasCondition(Conditions.RUINS_EXTENSIVE)) {
135 tooltip.addPara(
"The extensive ruins here offer the opportunity for valuable finds.", opad);
136 }
else if (
market.hasCondition(Conditions.RUINS_WIDESPREAD)) {
137 tooltip.addPara(
"The widespread ruins here offer a solid chance of finding something valuable, given time.", opad);
138 }
else if (
market.hasCondition(Conditions.RUINS_SCATTERED)) {
139 tooltip.addPara(
"The scattered ruins here offer only a slight chance of finding something valuable, though one never knows what might be located given enough time.", opad);
147 tooltip.addPara(
"These ruins are largely untapped.", opad);
148 }
else if (mult >= .5f) {
149 tooltip.addPara(
"These ruins have been stripped of easy pickings, but the more difficult areas remain, filled with promise.", opad);
150 }
else if (mult >= 0.25f) {
151 tooltip.addPara(
"These ruins have been combed through, though the chance for a few new finds still remains.", opad);
153 tooltip.addPara(
"These ruins have been comprehensively combed over multiple times, and there is little chance of a new valuable find.", opad);
161 float mult =
market.getStats().getDynamic().getStat(Stats.TECH_MINING_MULT).getModifiedValue();
167 MemoryAPI mem =
market.getMemoryWithoutUpdate();
176 MemoryAPI mem =
market.getMemoryWithoutUpdate();
186 if (
market.hasCondition(Conditions.RUINS_VAST)) {
188 }
else if (
market.hasCondition(Conditions.RUINS_EXTENSIVE)) {
190 }
else if (
market.hasCondition(Conditions.RUINS_WIDESPREAD)) {
192 }
else if (
market.hasCondition(Conditions.RUINS_SCATTERED)) {
210 List<DropData> dropRandom =
new ArrayList<DropData>();
211 List<DropData> dropValue =
new ArrayList<DropData>();
213 DropData d =
new DropData();
215 d.group =
"blueprints_low";
221 d.group =
"rare_tech_low";
227 d.group =
"ai_cores3";
233 d.group =
"any_hullmod_low";
238 d.group =
"weapons2";
248 float num = base * (5f + random.nextFloat() * 2f);
249 if (num < 1) num = 1;
252 d.chances = (int) Math.round(num);
253 d.group =
"techmining_first_find";
257 CargoAPI result = SalvageEntity.generateSalvage(random, 1f, 1f, base * mult, 1f, dropValue, dropRandom);
260 OUTER:
for (CargoStackAPI stack : result.getStacksCopy()) {
261 if (stack.getPlugin() instanceof BlueprintProviderItem) {
262 BlueprintProviderItem bp = (BlueprintProviderItem) stack.getPlugin();
263 List<String> list = bp.getProvidedShips();
265 for (String
id : list) {
266 if (!pf.knowsShip(
id))
continue OUTER;
270 list = bp.getProvidedWeapons();
272 for (String
id : list) {
273 if (!pf.knowsWeapon(
id))
continue OUTER;
277 list = bp.getProvidedFighters();
279 for (String
id : list) {
280 if (!pf.knowsFighter(
id))
continue OUTER;
284 list = bp.getProvidedIndustries();
286 for (String
id : list) {
287 if (!pf.knowsIndustry(
id))
continue OUTER;
290 result.removeStack(stack);
291 }
else if (stack.getPlugin() instanceof ModSpecItemPlugin) {
292 ModSpecItemPlugin mod = (ModSpecItemPlugin) stack.getPlugin();
293 if (!pf.knowsHullMod(mod.getModId()))
continue OUTER;
294 result.removeStack(stack);
312 market.getStats().getDynamic().getStat(Stats.TECH_MINING_MULT).unmodifyMult(
getModId(0));
322 Color highlight = Misc.getHighlightColor();
324 String pre =
"Alpha-level AI core currently assigned. ";
325 if (mode == AICoreDescriptionMode.MANAGE_CORE_DIALOG_LIST || mode == AICoreDescriptionMode.INDUSTRY_TOOLTIP) {
326 pre =
"Alpha-level AI core. ";
329 String aStr =
"" + (int)Math.round(a * 100f) +
"%";
331 if (mode == AICoreDescriptionMode.INDUSTRY_TOOLTIP) {
333 TooltipMakerAPI text = tooltip.beginImageWithText(coreSpec.getIconName(), 48);
334 text.addPara(pre +
"Reduces upkeep cost by %s. Reduces demand by %s unit. " +
335 "Increases finds by %s.", 0f, highlight,
338 tooltip.addImageWithText(opad);
342 tooltip.addPara(pre +
"Reduces upkeep cost by %s. Reduces demand by %s unit. " +
343 "Increases finds by %s.", opad, highlight,
358 market.getStats().getDynamic().getStat(Stats.TECH_MINING_MULT).unmodifyMult(
getModId(1));
362 public void addImproveDesc(TooltipMakerAPI info, ImprovementDescriptionMode mode) {
364 Color highlight = Misc.getHighlightColor();
367 String aStr =
"" + (int)Math.round(a * 100f) +
"%";
369 if (mode == ImprovementDescriptionMode.INDUSTRY_TOOLTIP) {
370 info.addPara(
"Finds increased by %s.", 0f, highlight, aStr);
372 info.addPara(
"Increases finds by %s.", 0f, highlight, aStr);
375 info.addSpacer(opad);
376 super.addImproveDesc(info, mode);
static SettingsAPI getSettings()
static SectorAPI getSector()
static int DEMAND_REDUCTION
void applyIncomeAndUpkeep(float sizeOverride)
Map< String, MutableCommodityQuantity > supply
MutableStat demandReduction
void modifyIncoming(MarketAPI market, PopulationComposition incoming)
String getUnavailableReason()
void applyNoAICoreModifiers()
static float ALPHA_CORE_FINDS_BONUS
void applyAlphaCoreSupplyAndDemandModifiers()
static float getTechMiningRuinSizeModifier(MarketAPI market)
void setTechMiningMult(float value)
void addPostDemandSection(TooltipMakerAPI tooltip, boolean hasDemand, IndustryTooltipMode mode)
float getPatherInterest()
static float IMPROVE_FINDS_BONUS
void applyImproveModifiers()
void addImproveDesc(TooltipMakerAPI info, ImprovementDescriptionMode mode)
void addAlphaCoreDescription(TooltipMakerAPI tooltip, AICoreDescriptionMode mode)
CargoAPI generateCargoForGatheringPoint(Random random)
static final String TECH_MINING_MULT
boolean isAvailableToBuild()
float getTechMiningRuinSizeModifier()
float getEffectivenessMult()
float getTechMiningMult()
boolean hasPostDemandSection(boolean hasDemand, IndustryTooltipMode mode)
void applyAlphaCoreModifiers()
CommoditySpecAPI getCommoditySpec(String commodityId)
float getFloat(String key)