Starsector API
Loading...
Searching...
No Matches
BlackMarketPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.submarkets;
2
3import java.util.Random;
4
5import org.apache.log4j.Logger;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CargoAPI;
9import com.fs.starfarer.api.campaign.CargoStackAPI;
10import com.fs.starfarer.api.campaign.CoreUIAPI;
11import com.fs.starfarer.api.campaign.FactionAPI;
12import com.fs.starfarer.api.campaign.FactionDoctrineAPI;
13import com.fs.starfarer.api.campaign.PlayerMarketTransaction;
14import com.fs.starfarer.api.campaign.SpecialItemPlugin;
15import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
16import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
17import com.fs.starfarer.api.campaign.impl.items.BlueprintProviderItem;
18import com.fs.starfarer.api.impl.campaign.CoreCampaignPluginImpl;
19import com.fs.starfarer.api.impl.campaign.DelayedBlueprintLearnScript;
20import com.fs.starfarer.api.impl.campaign.ids.Factions;
21import com.fs.starfarer.api.util.Highlights;
22import com.fs.starfarer.api.util.Misc;
23import com.fs.starfarer.api.util.WeightedRandomPicker;
24
26
27 public static Logger log = Global.getLogger(BlackMarketPlugin.class);
28
29 public void init(SubmarketAPI submarket) {
30 super.init(submarket);
31 }
32
33
35 float seconds = Global.getSector().getClock().convertToSeconds(sinceLastCargoUpdate);
36 addAndRemoveStockpiledResources(seconds, false, true, true);
38
39
41 sinceSWUpdate = 0f;
42 float stability = market.getStabilityValue();
43
44 pruneWeapons(0f);
45
46 boolean military = Misc.isMilitary(market);
47// boolean hiddenBase = market.getMemoryWithoutUpdate().getBoolean(MemFlags.HIDDEN_BASE_MEM_FLAG);
48//
49// float extraShips = 0f;
50// int extraShipSize = 0;
51// if (military && hiddenBase && !market.hasSubmarket(Submarkets.GENERIC_MILITARY)) {
52// extraShips = 500f;
53// extraShipSize = 1;
54// }
55
56 WeightedRandomPicker<String> factionPicker = new WeightedRandomPicker<String>();
57 factionPicker.add(market.getFactionId(), 15f - stability);
58 factionPicker.add(Factions.INDEPENDENT, 4f);
59 factionPicker.add(submarket.getFaction().getId(), 6f);
60
61 int weapons = 6 + Math.max(0, market.getSize() - 1) + (military ? 5 : 0);
62 int fighters = 2 + Math.max(0, (market.getSize() - 3) / 2) + (military ? 2 : 0);
63 weapons = 6 + Math.max(0, market.getSize() - 1);
64 fighters = 2 + Math.max(0, (market.getSize() - 3) / 2);
65
66 addWeapons(weapons, weapons + 2, 3, factionPicker);
67 addFighters(fighters, fighters + 2, 3, factionPicker);
68
69 if (military) {
70 weapons = market.getSize();
71 fighters = Math.max(1, market.getSize() / 3);
72 addWeapons(weapons, weapons + 2, 3, market.getFactionId(), false);
73 addFighters(fighters, fighters + 2, 3, market.getFactionId());
74 }
75
76 float sMult = 0.5f + Math.max(0, (1f - stability / 10f)) * 0.5f;
77 getCargo().getMothballedShips().clear();
78 float pOther = 0.1f;
79
80 FactionDoctrineAPI doctrine = market.getFaction().getDoctrine().clone();
81// FactionDoctrineAPI doctrine = submarket.getFaction().getDoctrine().clone();
82// doctrine.setWarships(3);
83// doctrine.setCarriers(2);
84// doctrine.setPhaseShips(2);
85
86 addShips(market.getFactionId(),
87 70f * sMult, // combat
88 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // freighter
89 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // tanker
90 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // transport
91 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // liner
92 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // utilityPts
93 null,
94 0f, // qualityMod
95 null,
96 doctrine);
97 FactionDoctrineAPI doctrineOverride = submarket.getFaction().getDoctrine().clone();
98 doctrineOverride.setWarships(3);
99 doctrineOverride.setPhaseShips(2);
100 doctrineOverride.setCarriers(2);
101 doctrineOverride.setCombatFreighterProbability(1f);
102 doctrineOverride.setShipSize(5);
103 addShips(submarket.getFaction().getId(),
104 70f, // combat
105 10f, // freighter
106 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // tanker
107 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // transport
108 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // liner
109 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // utilityPts
110 //0.8f,
111 Math.min(1f, Misc.getShipQuality(market, market.getFactionId()) + 0.5f),
112 0f, // qualityMod
113 null,
114 doctrineOverride,
115 3 // no capital ships, max size cruiser
116 );
117 addShips(Factions.INDEPENDENT,
118 15f + 15f * sMult, // combat
119 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // freighter
120 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // tanker
121 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // transport
122 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // liner
123 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // utilityPts
124 //0.8f,
125 Math.min(1f, Misc.getShipQuality(market, market.getFactionId()) + 0.5f),
126 0f, // qualityMod
127 null,
128 null,
129 3 // no capital ships, max size cruiser
130 );
131
132 addHullMods(4, 1 + itemGenRandom.nextInt(3));
133 }
134
135 getCargo().sort();
136 }
137
138 protected Object writeReplace() {
140 pruneWeapons(0f);
141 getCargo().getMothballedShips().clear();
142 }
143 return this;
144 }
145
146 @Override
147 public int getStockpileLimit(CommodityOnMarketAPI com) {
148// int demand = com.getMaxDemand();
149// int available = com.getAvailable();
150//
151// //float limit = BaseIndustry.getSizeMult(available) - BaseIndustry.getSizeMult(Math.max(0, demand - 2));
152// float limit = BaseIndustry.getSizeMult(available);
153// limit *= com.getCommodity().getEconUnit();
154
155 //limit *= com.getMarket().getStockpileMult().getModifiedValue();
156
157 float limit = OpenMarketPlugin.getBaseStockpileLimit(com);
158
159 Random random = new Random(market.getId().hashCode() + submarket.getSpecId().hashCode() + Global.getSector().getClock().getMonth() * 170000);
160 limit *= 0.9f + 0.2f * random.nextFloat();
161
162 float sm = 1f - market.getStabilityValue() / 10f;
163 limit *= (0.25f + 0.75f * sm);
164
165 if (limit < 0) limit = 0;
166
167 return (int) limit;
168 }
169
170 @Override
171 public PlayerEconomyImpactMode getPlayerEconomyImpactMode() {
172 //return PlayerEconomyImpactMode.PLAYER_BUY_ONLY;
173 // if the player buying stuff can cause a shortage, it can result in profitable buy/sell cycles, so: don't do that
174 //return PlayerEconomyImpactMode.NONE;
175 return PlayerEconomyImpactMode.PLAYER_SELL_ONLY;
176 }
177
178
179 public float getDesiredCommodityQuantity(CommodityOnMarketAPI com) {
180 boolean illegal = market.isIllegal(com.getId());
181 if (illegal) return com.getStockpile();
182
183 float blackMarketLegalFraction = 1f - 0.09f * market.getStabilityValue();
184 return com.getStockpile() * blackMarketLegalFraction;
185 }
186
187
188 @Override
189 public void reportPlayerMarketTransaction(PlayerMarketTransaction transaction) {
190 super.reportPlayerMarketTransaction(transaction);
191
192 FactionAPI faction = submarket.getFaction();
193 delayedLearnBlueprintsFromTransaction(faction, getCargo(), transaction, 60f + 60 * (float) Math.random());
194 }
195
196 public static void delayedLearnBlueprintsFromTransaction(FactionAPI faction, CargoAPI cargo, PlayerMarketTransaction transaction) {
197 delayedLearnBlueprintsFromTransaction(faction, cargo, transaction, 60f + 60 * (float) Math.random());
198 }
199 public static void delayedLearnBlueprintsFromTransaction(FactionAPI faction, CargoAPI cargo, PlayerMarketTransaction transaction, float daysDelay) {
200 DelayedBlueprintLearnScript script = new DelayedBlueprintLearnScript(faction.getId(), daysDelay);
201 for (CargoStackAPI stack : transaction.getSold().getStacksCopy()) {
202 SpecialItemPlugin plugin = stack.getPlugin();
203 if (plugin instanceof BlueprintProviderItem) {
204 BlueprintProviderItem bpi = (BlueprintProviderItem) plugin;
205
206 boolean learnedSomething = false;
207 if (bpi.getProvidedFighters() != null) {
208 for (String id : bpi.getProvidedFighters()) {
209 if (faction.knowsFighter(id)) continue;
210 script.getFighters().add(id);
211 learnedSomething = true;
212 }
213 }
214 if (bpi.getProvidedWeapons() != null) {
215 for (String id : bpi.getProvidedWeapons()) {
216 if (faction.knowsWeapon(id)) continue;
217 script.getWeapons().add(id);
218 learnedSomething = true;
219 }
220 }
221 if (bpi.getProvidedShips() != null) {
222 for (String id : bpi.getProvidedShips()) {
223 if (faction.knowsShip(id)) continue;
224 script.getShips().add(id);
225 learnedSomething = true;
226 }
227 }
228 if (bpi.getProvidedIndustries() != null) {
229 for (String id : bpi.getProvidedIndustries()) {
230 if (faction.knowsIndustry(id)) continue;
231 script.getIndustries().add(id);
232 learnedSomething = true;
233 }
234 }
235
236 if (learnedSomething) {
237 cargo.removeItems(stack.getType(), stack.getData(), 1);
238 }
239 }
240 }
241
242 if (!script.getFighters().isEmpty() || !script.getWeapons().isEmpty() ||
243 !script.getShips().isEmpty() || !script.getIndustries().isEmpty()) {
244 Global.getSector().addScript(script);
245 cargo.sort();
246 }
247 }
248
249
250 @Override
251 public boolean isIllegalOnSubmarket(CargoStackAPI stack, TransferAction action) {
252 return false;
253 }
254
255 @Override
256 public boolean isIllegalOnSubmarket(String commodityId, TransferAction action) {
257 return false;
258 }
259
260 public float getTariff() {
261 return 0f;
262 }
263
264
265 @Override
266 public boolean isBlackMarket() {
267 return true;
268 }
269
270
271 public String getTooltipAppendix(CoreUIAPI ui) {
272 if (isEnabled(ui)) {
273// CampaignEventManagerAPI manager = Global.getSector().getEventManager();
274// EventProbabilityAPI ep = manager.getProbability(Events.INVESTIGATION_SMUGGLING, market);
275// float p = ep.getProbability();
276
278 if (p < 0.05f) return "Suspicion level: none";
279
280 if (p < 0.1f) {
281 return "Suspicion level: minimal";
282 }
283 if (p < 0.2f) {
284 return "Suspicion level: medium";
285 }
286 if (p < 0.3f) {
287 return "Suspicion level: high";
288 }
289 if (p < 0.5f) {
290 return "Suspicion level: very high";
291 }
292 return "Suspicion level: extreme";
293 }
294
295 return null;
296 }
297
298 public Highlights getTooltipAppendixHighlights(CoreUIAPI ui) {
299 String appendix = getTooltipAppendix(ui);
300 if (appendix == null) return null;
301
302 Highlights h = new Highlights();
303 h.setText(appendix);
304 h.setColors(Misc.getNegativeHighlightColor());
305 return h;
306 }
307}
308
309
310
static Logger getLogger(Class c)
Definition Global.java:26
static SectorAPI getSector()
Definition Global.java:59
void addShips(String factionId, float combat, float freighter, float tanker, float transport, float liner, float utility, Float qualityOverride, float qualityMod, ShipPickMode modeOverride, FactionDoctrineAPI doctrineOverride)
void addFighters(int min, int max, int maxTier, WeightedRandomPicker< String > factionPicker)
void addAndRemoveStockpiledResources(float amount, boolean withShortageCountering, boolean withDecreaseToLimit, boolean withCargoUpdate)
void addWeapons(int min, int max, int maxTier, String factionId)
static void delayedLearnBlueprintsFromTransaction(FactionAPI faction, CargoAPI cargo, PlayerMarketTransaction transaction)
static void delayedLearnBlueprintsFromTransaction(FactionAPI faction, CargoAPI cargo, PlayerMarketTransaction transaction, float daysDelay)
boolean isIllegalOnSubmarket(CargoStackAPI stack, TransferAction action)
void reportPlayerMarketTransaction(PlayerMarketTransaction transaction)
boolean isIllegalOnSubmarket(String commodityId, TransferAction action)