Starsector API
Loading...
Searching...
No Matches
HullModItemManager.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import com.fs.starfarer.api.GameState;
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.campaign.CampaignFleetAPI;
9import com.fs.starfarer.api.campaign.CargoAPI;
10import com.fs.starfarer.api.campaign.CargoStackAPI;
11import com.fs.starfarer.api.campaign.econ.MarketAPI;
12import com.fs.starfarer.api.campaign.listeners.RefitScreenListener;
13import com.fs.starfarer.api.combat.ShipVariantAPI;
14import com.fs.starfarer.api.fleet.FleetMemberAPI;
15import com.fs.starfarer.api.loading.HullModSpecAPI;
16import com.fs.starfarer.api.util.ListMap;
17import com.fs.starfarer.api.util.Misc;
18
19public class HullModItemManager implements RefitScreenListener {
20
21 public static class HullModInstallData {
22 public String modId;
23 public CargoStackAPI item;
24 }
25
26 public static class HullModDiff {
27 public List<String> needItems = new ArrayList<>();
28 public List<String> noLongerNeedItems = new ArrayList<>();
29 }
30
32 String key = "$hullModItemManager";
34 if (manager == null) {
35 manager = new HullModItemManager();
37 }
38 return manager;
39 }
40
42
46
47 protected Object readResolve() {
48 return this;
49 }
50
51 public boolean isRequiredItemAvailable(String modId, FleetMemberAPI member, ShipVariantAPI currentVariant, MarketAPI dockedAt) {
52 if (Global.getCurrentState() == GameState.TITLE) return true;
53
54 if (member == null || currentVariant == null) return true;
55
58 if (req == null) return true;
59
61 if (fleet == null) return true;
62
63 String memberId = member.getId();
64 List<HullModInstallData> installed = map.getList(memberId);
65 List<String> installedIds = new ArrayList<>();
66 for (HullModInstallData data : installed) {
67 installedIds.add(data.modId);
68 }
69
70 if (installedIds.contains(modId)) return true;
71
72 int available = getNumAvailableMinusUnconfirmed(req, member, currentVariant, dockedAt);
73 return available >= 1;
74 }
75
76 public int getNumAvailableMinusUnconfirmed(CargoStackAPI req, FleetMemberAPI member, ShipVariantAPI currentVariant, MarketAPI dockedAt) {
77 int requiredAlreadyByUnconfirmed = getNumUnconfirmed(req, member, currentVariant);
78 int available = getNumAvailable(req, dockedAt);
79 return available - requiredAlreadyByUnconfirmed;
80 }
81 public int getNumUnconfirmed(CargoStackAPI req, FleetMemberAPI member, ShipVariantAPI currentVariant) {
82 if (member == null || currentVariant == null) return 0;
83
84 HullModDiff diff = getHullmodDiff(member, currentVariant);
85 int requiredAlreadyByUnconfirmed = 0;
86 for (String otherModId : diff.needItems) {
87 HullModSpecAPI otherMod = Global.getSettings().getHullModSpec(otherModId);
88 CargoStackAPI otherReq = otherMod.getEffect().getRequiredItem();
89 if (otherReq == null) continue;
90
91 if (req.getType() == otherReq.getType() && req.getData() != null &&
92 req.getData().equals(otherReq.getData())) {
93 requiredAlreadyByUnconfirmed++;
94 }
95 }
96 for (String otherModId : diff.noLongerNeedItems) {
97 HullModSpecAPI otherMod = Global.getSettings().getHullModSpec(otherModId);
98 CargoStackAPI otherReq = otherMod.getEffect().getRequiredItem();
99 if (otherReq == null) continue;
100
101 if (req.getType() == otherReq.getType() && req.getData() != null &&
102 req.getData().equals(otherReq.getData())) {
103 requiredAlreadyByUnconfirmed--;
104 }
105 }
106 return requiredAlreadyByUnconfirmed;
107 }
108
109 public int getNumAvailable(CargoStackAPI req, MarketAPI dockedAt) {
111 if (fleet == null) return 0;
112
113 CargoAPI cargo = fleet.getCargo();
114
115 float quantity = (int) Math.round(cargo.getQuantity(req.getType(), req.getData()));
116 if (dockedAt != null) {
117 cargo = Misc.getStorageCargo(dockedAt);
118 if (cargo != null) {
119 quantity += (int) Math.round(cargo.getQuantity(req.getType(), req.getData()));
120 }
121 }
122 return (int) Math.round(quantity);
123 }
124
126 CargoAPI cargo = Global.getFactory().createCargo(true);
127
128 String memberId = member.getId();
129 List<HullModInstallData> installed = map.getList(memberId);
130 for (HullModInstallData data : installed) {
131 cargo.addItems(data.item.getType(), data.item.getData(), 1f);
132 }
133
134// cargo.addSpecial(new SpecialItemData(Items.SYNCHROTRON, null), 1);
135// cargo.addSpecial(new SpecialItemData(Items.CATALYTIC_CORE, null), 1);
136// cargo.addSpecial(new SpecialItemData(Items.BIOFACTORY_EMBRYO, null), 1);
137// cargo.addSpecial(new SpecialItemData(Items.ORBITAL_FUSION_LAMP, null), 1);
138// cargo.addSpecial(new SpecialItemData(Items.CRYOARITHMETIC_ENGINE, null), 1);
139// cargo.addSpecial(new SpecialItemData(Items.DEALMAKER_HOLOSUITE, null), 1);
140
141 cargo.sort();
142 return cargo;
143 }
144
145 public void giveBackAllItems(FleetMemberAPI member) {
146 giveBackAllItems(member, null);
147 }
148
149 public void giveBackAllItems(FleetMemberAPI member, CargoAPI cargo) {
150 String memberId = member.getId();
151 List<HullModInstallData> installed = map.getList(memberId);
152 List<String> installedIds = new ArrayList<>();
153 for (HullModInstallData data : installed) {
154 installedIds.add(data.modId);
155 }
156 for (String modId : installedIds) {
157 giveBackRequiredItems(modId, member, cargo);
158 }
159
160 map.cleanupEmptyLists();
161 }
162
163 @Override
165 HullModDiff diff = getHullmodDiff(member, member.getVariant());
166 for (String modId : diff.needItems) {
167 takeRequiredItems(modId, member, dockedAt);
168 }
169 for (String modId : diff.noLongerNeedItems) {
170 giveBackRequiredItems(modId, member, null);
171 }
172
173 map.cleanupEmptyLists();
174 }
175
176 public HullModDiff getHullmodDiff(FleetMemberAPI member, ShipVariantAPI currentVariant) {
177 HullModDiff diff = new HullModDiff();
178
179 String memberId = member.getId();
180 List<HullModInstallData> installed = map.getList(memberId);
181 List<String> installedIds = new ArrayList<>();
182 for (HullModInstallData data : installed) {
183 installedIds.add(data.modId);
184 }
185
186 for (String modId : currentVariant.getHullMods()) {
187 if (member.getHullSpec().isBuiltInMod(modId)) continue;
190 if (req == null) continue;
191
192 if (!installedIds.contains(modId)) {
193 diff.needItems.add(modId);
194 }
195 installedIds.remove(modId);
196 }
197
198 diff.noLongerNeedItems.addAll(installedIds);
199
200 return diff;
201 }
202
203 public void takeRequiredItems(String modId, FleetMemberAPI member, MarketAPI dockedAt) {
206 if (req == null) return;
207
208 String memberId = member.getId();
209 List<HullModInstallData> installed = map.getList(memberId);
210 for (HullModInstallData data : installed) {
211 if (data.modId.equals(modId)) return;
212 }
213
214
216 if (fleet == null) return;
217 CargoAPI cargo = fleet.getCargo();
218
219 boolean removed = false;
220 if (cargo.getQuantity(req.getType(), req.getData()) >= 1f) {
221 cargo.removeItems(req.getType(), req.getData(), 1);
222 removed = true;
223 }
224
225 if (!removed && dockedAt != null) {
226 cargo = Misc.getStorageCargo(dockedAt);
227 if (cargo != null && cargo.getQuantity(req.getType(), req.getData()) >= 1f) {
228 cargo.removeItems(req.getType(), req.getData(), 1);
229 removed = true;
230 }
231 }
232
233 if (!removed) return;
234
235 HullModInstallData data = new HullModInstallData();
236 data.modId = modId;
237 data.item = req;
238 map.add(memberId, data);
239 }
240
241 public void giveBackRequiredItems(String modId, FleetMemberAPI member, CargoAPI cargo) {
244 if (req == null) return;
245
246 if (cargo == null) {
248 if (fleet == null) return;
249 cargo = fleet.getCargo();
250 }
251
252 String memberId = member.getId();
253 List<HullModInstallData> installed = map.getList(memberId);
254 for (HullModInstallData data : installed) {
255 if (data.modId.equals(modId)) {
256 map.remove(memberId, data);
257 cargo.addItems(data.item.getType(), data.item.getData(), 1);
258 break;
259 }
260 }
261 }
262}
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
static SettingsAPI getSettings()
Definition Global.java:57
static FactoryAPI getFactory()
Definition Global.java:41
static GameState getCurrentState()
Definition Global.java:27
static SectorAPI getSector()
Definition Global.java:65
int getNumUnconfirmed(CargoStackAPI req, FleetMemberAPI member, ShipVariantAPI currentVariant)
int getNumAvailable(CargoStackAPI req, MarketAPI dockedAt)
void takeRequiredItems(String modId, FleetMemberAPI member, MarketAPI dockedAt)
HullModDiff getHullmodDiff(FleetMemberAPI member, ShipVariantAPI currentVariant)
void giveBackAllItems(FleetMemberAPI member, CargoAPI cargo)
int getNumAvailableMinusUnconfirmed(CargoStackAPI req, FleetMemberAPI member, ShipVariantAPI currentVariant, MarketAPI dockedAt)
void reportFleetMemberVariantSaved(FleetMemberAPI member, MarketAPI dockedAt)
boolean isRequiredItemAvailable(String modId, FleetMemberAPI member, ShipVariantAPI currentVariant, MarketAPI dockedAt)
void giveBackRequiredItems(String modId, FleetMemberAPI member, CargoAPI cargo)
static CargoAPI getStorageCargo(MarketAPI market)
Definition Misc.java:4307
CargoAPI createCargo(boolean unlimitedStacks)
HullModSpecAPI getHullModSpec(String modId)
float getQuantity(CargoAPI.CargoItemType type, Object data)
boolean removeItems(CargoAPI.CargoItemType itemType, Object data, float quantity)
void addItems(CargoAPI.CargoItemType itemType, Object data, float quantity)
ListenerManagerAPI getListenerManager()
void set(String key, Object value)