Starsector API
Loading...
Searching...
No Matches
OpenMarketPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.submarkets;
2
3import java.util.HashSet;
4import java.util.Random;
5import java.util.Set;
6
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignUIAPI.CoreUITradeMode;
9import com.fs.starfarer.api.campaign.CoreUIAPI;
10import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
11import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
12import com.fs.starfarer.api.campaign.econ.SubmarketAPI;
13import com.fs.starfarer.api.impl.campaign.ids.Commodities;
14import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
15import com.fs.starfarer.api.impl.campaign.ids.Submarkets;
16import com.fs.starfarer.api.util.Highlights;
17import com.fs.starfarer.api.util.Misc;
18
20
21 public void init(SubmarketAPI submarket) {
22 super.init(submarket);
23 }
24
25
27 float seconds = Global.getSector().getClock().convertToSeconds(sinceLastCargoUpdate);
28 addAndRemoveStockpiledResources(seconds, false, true, true);
30
32 sinceSWUpdate = 0f;
33
34 boolean military = Misc.isMilitary(market);
35 boolean hiddenBase = market.getMemoryWithoutUpdate().getBoolean(MemFlags.HIDDEN_BASE_MEM_FLAG);
36
37 float extraShips = 0f;
38 //int extraShipSize = 0;
39 if (military && hiddenBase && !market.hasSubmarket(Submarkets.GENERIC_MILITARY)) {
40 extraShips = 150f;
41 //extraShipSize = 1;
42 }
43
44 pruneWeapons(0f);
45
46 int weapons = 5 + Math.max(0, market.getSize() - 1) + (Misc.isMilitary(market) ? 5 : 0);
47 int fighters = 1 + Math.max(0, (market.getSize() - 3) / 2) + (Misc.isMilitary(market) ? 2 : 0);
48
49 addWeapons(weapons, weapons + 2, 0, market.getFactionId());
50 addFighters(fighters, fighters + 2, 0, market.getFactionId());
51
52
53 getCargo().getMothballedShips().clear();
54
55 float freighters = 10f;
56 CommodityOnMarketAPI com = market.getCommodityData(Commodities.SHIPS);
57 freighters += com.getMaxSupply() * 2f;
58 if (freighters > 30) freighters = 30;
59
60 addShips(market.getFactionId(),
61 10f + extraShips, // combat
62 freighters, // freighter
63 0f, // tanker
64 10f, // transport
65 10f, // liner
66 5f, // utilityPts
67 null, // qualityOverride
68 0f, // qualityMod
69 ShipPickMode.PRIORITY_THEN_ALL,
70 null);
71
72 addShips(market.getFactionId(),
73 40f, // combat
74 0f, // freighter
75 0f, // tanker
76 0f, // transport
77 0f, // liner
78 0f, // utilityPts
79 null, // qualityOverride
80 -1f, // qualityMod
81 null,
82 null,
83 4);
84
85 float tankers = 20f;
86 com = market.getCommodityData(Commodities.FUEL);
87 tankers += com.getMaxSupply() * 3f;
88 if (tankers > 40) tankers = 40;
89 //tankers = 40;
90 addShips(market.getFactionId(),
91 0f, // combat
92 0f, // freighter
93 tankers, // tanker
94 0, // transport
95 0f, // liner
96 0f, // utilityPts
97 null, // qualityOverride
98 0f, // qualityMod
99 ShipPickMode.PRIORITY_THEN_ALL,
100 null);
101
102
103 addHullMods(1, 1 + itemGenRandom.nextInt(3), market.getFactionId());
104 }
105
106 getCargo().sort();
107 }
108
109 protected Object writeReplace() {
111 pruneWeapons(0f);
112 getCargo().getMothballedShips().clear();
113 }
114 return this;
115 }
116
117
118 public boolean shouldHaveCommodity(CommodityOnMarketAPI com) {
119 return !market.isIllegal(com);
120 }
121
122 @Override
123 public int getStockpileLimit(CommodityOnMarketAPI com) {
124// int demand = com.getMaxDemand();
125// int available = com.getAvailable();
126//
127// float limit = BaseIndustry.getSizeMult(available) - BaseIndustry.getSizeMult(Math.max(0, demand - 2));
128// limit *= com.getCommodity().getEconUnit();
129
130 //limit *= com.getMarket().getStockpileMult().getModifiedValue();
131
132 float limit = OpenMarketPlugin.getBaseStockpileLimit(com);
133
134 Random random = new Random(market.getId().hashCode() + submarket.getSpecId().hashCode() + Global.getSector().getClock().getMonth() * 170000);
135 limit *= 0.9f + 0.2f * random.nextFloat();
136
137 float sm = market.getStabilityValue() / 10f;
138 limit *= (0.25f + 0.75f * sm);
139
140 if (limit < 0) limit = 0;
141
142 return (int) limit;
143 }
144
145 public static float ECON_UNIT_MULT_EXTRA = 1f;
146 public static float ECON_UNIT_MULT_PRODUCTION = 0.4f;
147 public static float ECON_UNIT_MULT_IMPORTS = 0.1f;
148 public static float ECON_UNIT_MULT_DEFICIT = -0.2f;
149
150 public static Set<String> SPECIAL_COMMODITIES = new HashSet<String>();
151 static {
152 SPECIAL_COMMODITIES.add(Commodities.SUPPLIES);
153 SPECIAL_COMMODITIES.add(Commodities.FUEL);
154 SPECIAL_COMMODITIES.add(Commodities.CREW);
155 SPECIAL_COMMODITIES.add(Commodities.MARINES);
156 SPECIAL_COMMODITIES.add(Commodities.HEAVY_MACHINERY);
157 }
158
159 public static float getBaseStockpileLimit(CommodityOnMarketAPI com) {
160// if (com.getCommodity().getId().equals(Commodities.LUXURY_GOODS)) {
161// System.out.println("wefwefwef");
162// }
163 int shippingGlobal = Global.getSettings().getShippingCapacity(com.getMarket(), false);
164 int available = com.getAvailable();
165 int production = com.getMaxSupply();
166 production = Math.min(production, available);
167
168 int demand = com.getMaxDemand();
169 int export = (int) Math.min(production, shippingGlobal);
170
171 int extra = available - Math.max(export, demand);
172 if (extra < 0) extra = 0;
173
174 //int inDemand = Math.min(available, demand);
175 //int normal = Math.max(0, available - inDemand - extra);
176 int deficit = Math.max(0, demand - available);
177
178 float unit = com.getCommodity().getEconUnit();
179
180 int imports = available - production;
181 if (imports < 0) imports = 0;
182
183 float limit = 0f;
184 limit += imports * unit * ECON_UNIT_MULT_IMPORTS;
185 limit += production * unit * ECON_UNIT_MULT_PRODUCTION;
186 limit += extra * unit * ECON_UNIT_MULT_EXTRA;
187 limit -= deficit * unit * ECON_UNIT_MULT_DEFICIT;
188
189
190 //limit += inDemand * unit * ECON_UNIT_MULT_IN_DEMAND;
191 //limit += normal * unit * ECON_UNIT_MULT_NORMAL;
192
193 if (limit < 0) limit = 0;
194 return (int) limit;
195 }
196
197
198 public static int getApproximateStockpileLimit(CommodityOnMarketAPI com) {
199// int demand = com.getMaxDemand();
200// int available = com.getAvailable();
201//
202// float limit = BaseIndustry.getSizeMult(available) - BaseIndustry.getSizeMult(Math.max(0, demand - 2));
203// limit *= com.getCommodity().getEconUnit();
204// //limit *= 0.5f;
205//
206// if (limit < 0) limit = 0;
207// return (int) limit;
208
209 float limit = OpenMarketPlugin.getBaseStockpileLimit(com);
210 return (int) limit;
211 }
212
213
214
215
216 @Override
217 public PlayerEconomyImpactMode getPlayerEconomyImpactMode() {
218 return PlayerEconomyImpactMode.PLAYER_SELL_ONLY;
219 }
220
221
222 @Override
223 public boolean isOpenMarket() {
224 return true;
225 }
226
227
228 @Override
229 public String getTooltipAppendix(CoreUIAPI ui) {
230 if (ui.getTradeMode() == CoreUITradeMode.SNEAK) {
231 return "Requires: proper docking authorization (transponder on)";
232 }
233 return super.getTooltipAppendix(ui);
234 }
235
236
237 @Override
238 public Highlights getTooltipAppendixHighlights(CoreUIAPI ui) {
239 if (ui.getTradeMode() == CoreUITradeMode.SNEAK) {
240 String appendix = getTooltipAppendix(ui);
241 if (appendix == null) return null;
242
243 Highlights h = new Highlights();
244 h.setText(appendix);
245 h.setColors(Misc.getNegativeHighlightColor());
246 return h;
247 }
248 return super.getTooltipAppendixHighlights(ui);
249 }
250
251
252}
static SettingsAPI getSettings()
Definition Global.java:51
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)
int getShippingCapacity(MarketAPI market, boolean inFaction)