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
30 super.init(submarket);
31 }
32
33
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
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;
78 float pOther = 0.1f;
79
81// FactionDoctrineAPI doctrine = submarket.getFaction().getDoctrine().clone();
82// doctrine.setWarships(3);
83 if (doctrine.getWarships() > 0) {
84 doctrine.setWarships(Math.max(2, doctrine.getWarships()));
85 }
86 if (doctrine.getCarriers() > 0) {
87 doctrine.setCarriers(Math.max(2, doctrine.getCarriers()));
88 }
89 if (doctrine.getPhaseShips() > 0) {
90 doctrine.setPhaseShips(Math.max(2, doctrine.getPhaseShips()));
91 }
92// doctrine.setPhaseShips(2);
93
95 70f * sMult, // combat
96 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // freighter
97 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // tanker
98 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // transport
99 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // liner
100 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // utilityPts
101 null,
102 0f, // qualityMod
103 null,
104 doctrine);
106 doctrineOverride.setWarships(3);
107 doctrineOverride.setPhaseShips(2);
108 doctrineOverride.setCarriers(2);
109 doctrineOverride.setCombatFreighterProbability(1f);
110 doctrineOverride.setShipSize(5);
112 70f, // combat
113 10f, // freighter
114 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // tanker
115 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // transport
116 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // liner
117 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // utilityPts
118 //0.8f,
119 Math.min(1f, Misc.getShipQuality(market, market.getFactionId()) + 0.5f),
120 0f, // qualityMod
121 null,
122 doctrineOverride,
123 3 // no capital ships, max size cruiser
124 );
126 15f + 15f * sMult, // combat
127 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // freighter
128 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // tanker
129 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // transport
130 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // liner
131 itemGenRandom.nextFloat() > pOther ? 0f : 10f, // utilityPts
132 //0.8f,
133 Math.min(1f, Misc.getShipQuality(market, market.getFactionId()) + 0.5f),
134 0f, // qualityMod
135 null,
136 null,
137 3 // no capital ships, max size cruiser
138 );
139
140 addHullMods(4, 1 + itemGenRandom.nextInt(3));
141 }
142
143 getCargo().sort();
144 }
145
146 protected Object writeReplace() {
148 pruneWeapons(0f);
150 }
151 return this;
152 }
153
154 @Override
156// int demand = com.getMaxDemand();
157// int available = com.getAvailable();
158//
159// //float limit = BaseIndustry.getSizeMult(available) - BaseIndustry.getSizeMult(Math.max(0, demand - 2));
160// float limit = BaseIndustry.getSizeMult(available);
161// limit *= com.getCommodity().getEconUnit();
162
163 //limit *= com.getMarket().getStockpileMult().getModifiedValue();
164
165 float limit = OpenMarketPlugin.getBaseStockpileLimit(com);
166
167 Random random = new Random(market.getId().hashCode() + submarket.getSpecId().hashCode() + Global.getSector().getClock().getMonth() * 170000);
168 limit *= 0.9f + 0.2f * random.nextFloat();
169
170 float sm = 1f - market.getStabilityValue() / 10f;
171 limit *= (0.25f + 0.75f * sm);
172
173 if (limit < 0) limit = 0;
174
175 return (int) limit;
176 }
177
178 @Override
179 public PlayerEconomyImpactMode getPlayerEconomyImpactMode() {
180 //return PlayerEconomyImpactMode.PLAYER_BUY_ONLY;
181 // if the player buying stuff can cause a shortage, it can result in profitable buy/sell cycles, so: don't do that
182 //return PlayerEconomyImpactMode.NONE;
183 return PlayerEconomyImpactMode.PLAYER_SELL_ONLY;
184 }
185
186
188 boolean illegal = market.isIllegal(com.getId());
189 if (illegal) return com.getStockpile();
190
191 float blackMarketLegalFraction = 1f - 0.09f * market.getStabilityValue();
192 return com.getStockpile() * blackMarketLegalFraction;
193 }
194
195
196 @Override
198 super.reportPlayerMarketTransaction(transaction);
199
200 FactionAPI faction = submarket.getFaction();
201 delayedLearnBlueprintsFromTransaction(faction, getCargo(), transaction, 60f + 60 * (float) Math.random());
202 }
203
205 delayedLearnBlueprintsFromTransaction(faction, cargo, transaction, 60f + 60 * (float) Math.random());
206 }
207 public static void delayedLearnBlueprintsFromTransaction(FactionAPI faction, CargoAPI cargo, PlayerMarketTransaction transaction, float daysDelay) {
208 DelayedBlueprintLearnScript script = new DelayedBlueprintLearnScript(faction.getId(), daysDelay);
209 for (CargoStackAPI stack : transaction.getSold().getStacksCopy()) {
210 SpecialItemPlugin plugin = stack.getPlugin();
211 if (plugin instanceof BlueprintProviderItem) {
213
214 boolean learnedSomething = false;
215 if (bpi.getProvidedFighters() != null) {
216 for (String id : bpi.getProvidedFighters()) {
217 if (faction.knowsFighter(id)) continue;
218 script.getFighters().add(id);
219 learnedSomething = true;
220 }
221 }
222 if (bpi.getProvidedWeapons() != null) {
223 for (String id : bpi.getProvidedWeapons()) {
224 if (faction.knowsWeapon(id)) continue;
225 script.getWeapons().add(id);
226 learnedSomething = true;
227 }
228 }
229 if (bpi.getProvidedShips() != null) {
230 for (String id : bpi.getProvidedShips()) {
231 if (faction.knowsShip(id)) continue;
232 script.getShips().add(id);
233 learnedSomething = true;
234 }
235 }
236 if (bpi.getProvidedIndustries() != null) {
237 for (String id : bpi.getProvidedIndustries()) {
238 if (faction.knowsIndustry(id)) continue;
239 script.getIndustries().add(id);
240 learnedSomething = true;
241 }
242 }
243
244 if (learnedSomething) {
245 cargo.removeItems(stack.getType(), stack.getData(), 1);
246 }
247 }
248 }
249
250 if (!script.getFighters().isEmpty() || !script.getWeapons().isEmpty() ||
251 !script.getShips().isEmpty() || !script.getIndustries().isEmpty()) {
252 Global.getSector().addScript(script);
253 cargo.sort();
254 }
255 }
256
257
258 @Override
259 public boolean isIllegalOnSubmarket(CargoStackAPI stack, TransferAction action) {
260 return false;
261 }
262
263 @Override
264 public boolean isIllegalOnSubmarket(String commodityId, TransferAction action) {
265 return false;
266 }
267
268 public float getTariff() {
269 return 0f;
270 }
271
272
273 @Override
274 public boolean isBlackMarket() {
275 return true;
276 }
277
278
279 public String getTooltipAppendix(CoreUIAPI ui) {
280 if (isEnabled(ui)) {
281// CampaignEventManagerAPI manager = Global.getSector().getEventManager();
282// EventProbabilityAPI ep = manager.getProbability(Events.INVESTIGATION_SMUGGLING, market);
283// float p = ep.getProbability();
284
286 if (p < 0.05f) return "Suspicion level: none";
287
288 if (p < 0.1f) {
289 return "Suspicion level: minimal";
290 }
291 if (p < 0.2f) {
292 return "Suspicion level: medium";
293 }
294 if (p < 0.3f) {
295 return "Suspicion level: high";
296 }
297 if (p < 0.5f) {
298 return "Suspicion level: very high";
299 }
300 return "Suspicion level: extreme";
301 }
302
303 return null;
304 }
305
307 String appendix = getTooltipAppendix(ui);
308 if (appendix == null) return null;
309
310 Highlights h = new Highlights();
311 h.setText(appendix);
313 return h;
314 }
315}
316
317
318
static Logger getLogger(Class c)
Definition Global.java:32
static SectorAPI getSector()
Definition Global.java:65
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)
void setColors(Color ... colors)
static Color getNegativeHighlightColor()
Definition Misc.java:802
static float getShipQuality(MarketAPI market)
Definition Misc.java:4505
static boolean isMilitary(MarketAPI market)
Definition Misc.java:5045
boolean removeItems(CargoAPI.CargoItemType itemType, Object data, float quantity)
List< CargoStackAPI > getStacksCopy()
boolean knowsWeapon(String weaponId)
boolean knowsIndustry(String industryId)
void setCombatFreighterProbability(float combatFreighterProbability)
void addScript(EveryFrameScript script)
boolean isIllegal(String commodityId)