Starsector API
Loading...
Searching...
No Matches
DModManager.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign;
2
3import java.util.ArrayList;
4import java.util.Arrays;
5import java.util.Iterator;
6import java.util.List;
7import java.util.Random;
8
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.CampaignFleetAPI;
11import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.FleetMemberData;
12import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.Status;
13import com.fs.starfarer.api.combat.ShieldAPI.ShieldType;
14import com.fs.starfarer.api.combat.ShipHullSpecAPI;
15import com.fs.starfarer.api.combat.ShipHullSpecAPI.ShipTypeHints;
16import com.fs.starfarer.api.combat.ShipVariantAPI;
17import com.fs.starfarer.api.fleet.FleetMemberAPI;
18import com.fs.starfarer.api.impl.campaign.ids.Stats;
19import com.fs.starfarer.api.impl.campaign.ids.Tags;
20import com.fs.starfarer.api.loading.HullModSpecAPI;
21import com.fs.starfarer.api.loading.VariantSource;
22import com.fs.starfarer.api.plugins.DModAdderPlugin;
23import com.fs.starfarer.api.plugins.DModAdderPlugin.DModAdderParams;
24import com.fs.starfarer.api.util.Misc;
25import com.fs.starfarer.api.util.WeightedRandomPicker;
26
27public class DModManager {
28
29// public static final String HULLMOD_DAMAGE = "damage";
30// public static final String HULLMOD_PHASE_ALWAYS = "phaseAlways";
31// public static final String HULLMOD_DAMAGE_STRUCT = "damageStruct";
32// public static final String HULLMOD_DESTROYED_ALWAYS = "destroyedAlways";
33// public static final String HULLMOD_FIGHTER_BAY_DAMAGE = "fighterBayDamage";
34// public static final String HULLMOD_CARRIER_ALWAYS = "carrierAlways";
35
36
37 public static int MAX_DMODS_FROM_COMBAT = Global.getSettings().getInt("maxDModsAddedByCombat");
38
39 public static boolean setDHull(ShipVariantAPI variant) {
40 //if (!variant.getHullSpec().isDHull()) {
42 //if (!variant.isDHull()) {
43 if (!variant.getHullSpec().isDefaultDHull()) {
44 String dHullId = Misc.getDHullId(variant.getHullSpec());
46 variant.setHullSpecAPI(dHull);
47 return true;
48 }
49 return false;
50 }
51
52 public static int reduceNextDmodsBy = 0;
53
57 public static void addDMods(FleetMemberData data, boolean own, CampaignFleetAPI recoverer, Random random) {
58 addDMods(data.getMember(), data.getStatus() == Status.DESTROYED, own, recoverer, random);
59 }
60
61 public static void addDMods(FleetMemberAPI member, boolean destroyed, boolean own, CampaignFleetAPI recoverer, Random random) {
62 ShipVariantAPI variant = member.getVariant();
63 addDMods(variant, destroyed, own, recoverer, random);
64 }
65 public static void addDMods(ShipVariantAPI variant, boolean destroyed, boolean own, CampaignFleetAPI recoverer, Random random) {
66 //int original = getNumDMods(variant);
67 if (random == null) random = new Random();
68
69// if (own) {
70// System.out.println("323ffwe");
71// }
72 DModAdderParams params = new DModAdderParams();
73 params.variant = variant;
74 params.destroyed = destroyed;
75 params.own = own;
76 params.recoverer = recoverer;
77 params.random = random;
79 if (plugin != null) {
80 plugin.addDMods(params);
81 return;
82 }
83
84
85 if (destroyed) {
87// if (own) {
88// int added = getNumDMods(variant) - original;
89// if (added > 0) return;
90// }
91 }
92
93// if (member.getHullSpec().getHints().contains(ShipTypeHints.CIVILIAN)) {
94// addAllPermaModsWithTags(variant, Tags.HULLMOD_CIV_ALWAYS);
95// }
96
97 List<HullModSpecAPI> potentialMods = getModsWithTags(Tags.HULLMOD_DAMAGE);
98 removeUnsuitedMods(variant, potentialMods);
99
100 boolean hasStructDamage = getNumDMods(variant, Tags.HULLMOD_DAMAGE_STRUCT) > 0;
101 if (hasStructDamage) {
102 potentialMods = getModsWithoutTags(potentialMods, Tags.HULLMOD_DAMAGE_STRUCT);
103 }
104
105 //if (variant.getHullSpec().getFighterBays() > 0 || variant.isCarrier()) {
106 if (variant.getHullSpec().getFighterBays() > 0) {
107 potentialMods.addAll(getModsWithTags(Tags.HULLMOD_FIGHTER_BAY_DAMAGE));
108 }
109 //if (variant.getHullSpec().getDefenseType() == ShieldType.PHASE) {
110 if (variant.getHullSpec().isPhase()) {
111 potentialMods.addAll(getModsWithTags(Tags.HULLMOD_DAMAGE_PHASE));
112 }
113
114// if (variant.isCarrier()) {
115// if (own || true) { // bit too harsh to always add damaged flight decks to recovered enemy carriers
116// potentialMods.addAll(getModsWithTags(Tags.HULLMOD_CARRIER_ALWAYS));
117// } else {
118// addAllPermaModsWithTags(variant, Tags.HULLMOD_CARRIER_ALWAYS);
119// }
120// }
121
122 removeModsAlreadyInVariant(variant, potentialMods);
123
124 int num = 2 + random.nextInt(3);
125
126 int reduction = 0;
127 reduction += reduceNextDmodsBy;
129 if (recoverer != null) {
130 int extra = (int) recoverer.getStats().getDynamic().getValue(Stats.SHIP_DMOD_REDUCTION, 0);
131 if (extra >= 0) {
132 extra = random.nextInt(extra + 1);
133 } else {
134 extra = -1 * random.nextInt(-extra + 1);
135 }
136 reduction += extra;
137 }
138
139 num -= reduction;
140 if (num < 1) num = 1;
141
142 int already = getNumDMods(variant);
143
144 int add = num - already;
145 if (own) {
146 add = (1 - reduction);
147 }
148
149 if (add + already > MAX_DMODS_FROM_COMBAT) {
150 add = MAX_DMODS_FROM_COMBAT - already;
151 }
152 if (add <= 0) return;
153
154
156 picker.addAll(potentialMods);
157 for (int i = 0; i < add && !picker.isEmpty(); i++) {
158 HullModSpecAPI pick = picker.pickAndRemove();
159 if (pick != null) {
161 i--;
162 continue;
163 }
164 variant.removeSuppressedMod(pick.getId());
165 variant.addPermaMod(pick.getId(), false);
166 }
167 }
168 }
169
170
171 public static void addDMods(FleetMemberAPI member, boolean canAddDestroyedMods, int num, Random random) {
172 ShipVariantAPI variant = member.getVariant();
173 addDMods(variant, canAddDestroyedMods, num, random);
174 }
175 public static void addDMods(ShipVariantAPI variant, boolean canAddDestroyedMods, int num, Random random) {
176 if (random == null) random = new Random();
177
178 DModAdderParams params = new DModAdderParams();
179 params.variant = variant;
180 params.canAddDestroyedMods = canAddDestroyedMods;
181 params.num = num;
182 params.random = random;
184 if (plugin != null) {
185 plugin.addDMods(params);
186 return;
187 }
188
189
190// if (member.getHullSpec().getHints().contains(ShipTypeHints.CIVILIAN)) {
191// int added = addAllPermaModsWithTags(variant, Tags.HULLMOD_CIV_ALWAYS);
192// if (added > 0) {
193// num -= added;
194// if (num <= 0) return;
195// }
196// }
197
198 List<HullModSpecAPI> potentialMods = getModsWithTags(Tags.HULLMOD_DAMAGE);
199 if (canAddDestroyedMods) potentialMods.addAll(getModsWithTags(Tags.HULLMOD_DESTROYED_ALWAYS));
200
201 removeUnsuitedMods(variant, potentialMods);
202
203 boolean hasStructDamage = getNumDMods(variant, Tags.HULLMOD_DAMAGE_STRUCT) > 0;
204 if (hasStructDamage) {
205 potentialMods = getModsWithoutTags(potentialMods, Tags.HULLMOD_DAMAGE_STRUCT);
206 }
207
208 if (variant.getHullSpec().getFighterBays() > 0) {
209 //if (variant.getHullSpec().getFighterBays() > 0 || variant.isCarrier()) {
210 potentialMods.addAll(getModsWithTags(Tags.HULLMOD_FIGHTER_BAY_DAMAGE));
211 }
212 //if (variant.getHullSpec().getDefenseType() == ShieldType.PHASE) {
213 if (variant.getHullSpec().isPhase()) {
214 potentialMods.addAll(getModsWithTags(Tags.HULLMOD_DAMAGE_PHASE));
215 }
216
217 if (variant.isCarrier()) {
218 potentialMods.addAll(getModsWithTags(Tags.HULLMOD_CARRIER_ALWAYS));
219 }
220
221 potentialMods = new ArrayList<HullModSpecAPI>(potentialMods);
222
223 removeModsAlreadyInVariant(variant, potentialMods);
224
225// System.out.println("");
226// System.out.println("Adding: ");
228 picker.addAll(potentialMods);
229 int added = 0;
230 for (int i = 0; i < num && !picker.isEmpty(); i++) {
231 HullModSpecAPI pick = picker.pickAndRemove();
232 if (pick != null) {
234 i--;
235 continue;
236 }
237 variant.removeSuppressedMod(pick.getId());
238 variant.addPermaMod(pick.getId(), false);
239 //System.out.println("Mod: " + pick.getId());
240 added++;
241 }
242 }
243// if (getNumDMods(variant) < 5) {
244// System.out.println("ewfwefew");
245// }
246 }
247
248
249 public static boolean assumeAllShipsAreAutomated = false;
250
251 public static void removeUnsuitedMods(ShipVariantAPI variant, List<HullModSpecAPI> mods) {
252 //boolean auto = variant.hasHullMod(HullMods.AUTOMATED);
253 boolean auto = Misc.isAutomated(variant);
254 if (assumeAllShipsAreAutomated) auto = true;
255 boolean civ = variant.getHullSpec().getHints().contains(ShipTypeHints.CIVILIAN);
256 //boolean phase = variant.getHullSpec().getDefenseType() == ShieldType.PHASE;
257 boolean phase = variant.getHullSpec().isPhase();
258 boolean peakTime = variant.getHullSpec().getNoCRLossTime() < 10000;
259 boolean shields = variant.getHullSpec().getDefenseType() == ShieldType.FRONT ||
260 variant.getHullSpec().getDefenseType() == ShieldType.OMNI;
261
262 Iterator<HullModSpecAPI> iter = mods.iterator();
263 while (iter.hasNext()) {
264 HullModSpecAPI curr = iter.next();
265 if (!peakTime && curr.hasTag(Tags.HULLMOD_PEAK_TIME)) {
266 iter.remove();
267 continue;
268 }
269 if (phase && curr.hasTag(Tags.HULLMOD_NOT_PHASE)) {
270 iter.remove();
271 continue;
272 }
273 if (auto && curr.hasTag(Tags.HULLMOD_NOT_AUTO)) {
274 iter.remove();
275 continue;
276 }
277 if (civ && curr.hasTag(Tags.HULLMOD_NOT_CIV)) {
278 iter.remove();
279 continue;
280 }
281 if (civ && !curr.hasTag(Tags.HULLMOD_CIV) && !curr.hasTag(Tags.HULLMOD_CIV_ONLY)) {
282 iter.remove();
283 continue;
284 }
285 if (!civ && curr.hasTag(Tags.HULLMOD_CIV_ONLY)) {
286 iter.remove();
287 continue;
288 }
289 if (!shields && curr.hasTag(Tags.HULLMOD_REQ_SHIELDS)) {
290 iter.remove();
291 continue;
292 }
293 }
294 }
295 public static void removeModsAlreadyInVariant(ShipVariantAPI variant, List<HullModSpecAPI> mods) {
296 Iterator<HullModSpecAPI> iter = mods.iterator();
297 while (iter.hasNext()) {
298 HullModSpecAPI curr = iter.next();
299 if (variant.hasHullMod(curr.getId())) iter.remove();
300 }
301 }
302
303 public static int addAllPermaModsWithTags(ShipVariantAPI variant, String ... tags) {
304 int added = 0;
305 for (HullModSpecAPI mod : getModsWithTags(tags)) {
306 if (!variant.hasHullMod(mod.getId())) added++;
307 variant.removeSuppressedMod(mod.getId());
308 variant.addPermaMod(mod.getId(), false);
309 }
310 return added;
311 }
312
313 public static List<HullModSpecAPI> getModsWithoutTags(List<HullModSpecAPI> mods, String ... tags) {
314 List<HullModSpecAPI> result = new ArrayList<HullModSpecAPI>();
315 OUTER: for (HullModSpecAPI mod : mods) {
316 for (String tag : tags) {
317 if (mod.hasTag(tag)) continue OUTER;
318 }
319 result.add(mod);
320 }
321 return result;
322 }
323
324 public static List<HullModSpecAPI> getModsWithTags(String ... tags) {
325 List<HullModSpecAPI> result = new ArrayList<HullModSpecAPI>();
327 if (mod.getTags().containsAll(Arrays.asList(tags))) {
328 result.add(mod);
329 }
330 }
331 return result;
332 }
333
334 public static int getNumDMods(ShipVariantAPI variant) {
335 int count = 0;
336 for (String id : variant.getHullMods()) {
337 if (getMod(id).hasTag(Tags.HULLMOD_DMOD)) count++;
338 }
339 return count;
340 }
341
342 public static int getNumNonBuiltInDMods(ShipVariantAPI variant) {
343 int count = 0;
344 for (String id : variant.getHullMods()) {
345 if (getMod(id).hasTag(Tags.HULLMOD_DMOD)) {
346 if (variant.getHullSpec().getBuiltInMods().contains(id)) continue;
347 count++;
348 }
349 }
350 return count;
351 }
352
353 public static int getNumDMods(ShipVariantAPI variant, String ... tags) {
354 int count = 0;
355 for (String id : variant.getHullMods()) {
356 HullModSpecAPI mod = getMod(id);
357 if (!mod.getTags().containsAll(Arrays.asList(tags))) continue;
358 if (mod.hasTag(Tags.HULLMOD_DMOD)) count++;
359 }
360 return count;
361 }
362
363 public static HullModSpecAPI getMod(String id) {
364 return Global.getSettings().getHullModSpec(id);
365 }
366
367 public static void removeDMod(ShipVariantAPI v, String id) {
369
370 // so that a skin with dmods can be "restored" - i.e. just dmods suppressed w/o changing to
371 // actual base skin
373 base = v.getHullSpec();
374 }
375 if (base == null && v.getHullSpec().isRestoreToBase()) {
376 base = v.getHullSpec().getBaseHull();
377 }
378 if (base.isBuiltInMod(id)) {
379 v.removePermaMod(id);
380 v.addSuppressedMod(id);
381 } else {
382 v.removePermaMod(id);
383 v.removeMod(id);
384 }
385 }
386}
387
388
389
390
391
static SettingsAPI getSettings()
Definition Global.java:57
static SectorAPI getSector()
Definition Global.java:65
static void addDMods(ShipVariantAPI variant, boolean destroyed, boolean own, CampaignFleetAPI recoverer, Random random)
static List< HullModSpecAPI > getModsWithTags(String ... tags)
static void addDMods(FleetMemberAPI member, boolean canAddDestroyedMods, int num, Random random)
static int getNumNonBuiltInDMods(ShipVariantAPI variant)
static void addDMods(FleetMemberData data, boolean own, CampaignFleetAPI recoverer, Random random)
static boolean setDHull(ShipVariantAPI variant)
static List< HullModSpecAPI > getModsWithoutTags(List< HullModSpecAPI > mods, String ... tags)
static HullModSpecAPI getMod(String id)
static void addDMods(ShipVariantAPI variant, boolean canAddDestroyedMods, int num, Random random)
static int addAllPermaModsWithTags(ShipVariantAPI variant, String ... tags)
static void removeUnsuitedMods(ShipVariantAPI variant, List< HullModSpecAPI > mods)
static void addDMods(FleetMemberAPI member, boolean destroyed, boolean own, CampaignFleetAPI recoverer, Random random)
static int getNumDMods(ShipVariantAPI variant)
static int getNumDMods(ShipVariantAPI variant, String ... tags)
static void removeModsAlreadyInVariant(ShipVariantAPI variant, List< HullModSpecAPI > mods)
static void removeDMod(ShipVariantAPI v, String id)
static final String HULLMOD_CARRIER_ALWAYS
Definition Tags.java:233
static final String HULLMOD_DESTROYED_ALWAYS
Definition Tags.java:230
static final String HULLMOD_FIGHTER_BAY_DAMAGE
Definition Tags.java:232
static final String HULLMOD_DAMAGE_STRUCT
Definition Tags.java:229
static boolean isAutomated(MutableShipStatsAPI stats)
Definition Misc.java:5491
static String getDHullId(ShipHullSpecAPI spec)
Definition Misc.java:3553
ShipHullSpecAPI getHullSpec(String hullId)
HullModSpecAPI getHullModSpec(String modId)
List< HullModSpecAPI > getAllHullModSpecs()
< T > T pickPlugin(Class< T > c, Object params)
GenericPluginManagerAPI getGenericPlugins()
EnumSet< ShipTypeHints > getHints()
void setSource(VariantSource source)
void setHullSpecAPI(ShipHullSpecAPI hullSpec)
void addDMods(DModAdderParams params)