1package com.fs.starfarer.api.impl.campaign;
3import java.util.ArrayList;
4import java.util.Arrays;
5import java.util.Iterator;
7import java.util.Random;
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.HullMods;
19import com.fs.starfarer.api.impl.campaign.ids.Stats;
20import com.fs.starfarer.api.impl.campaign.ids.Tags;
21import com.fs.starfarer.api.loading.HullModSpecAPI;
22import com.fs.starfarer.api.loading.VariantSource;
23import com.fs.starfarer.api.plugins.DModAdderPlugin;
24import com.fs.starfarer.api.plugins.DModAdderPlugin.DModAdderParams;
25import com.fs.starfarer.api.util.Misc;
26import com.fs.starfarer.api.util.WeightedRandomPicker;
40 public static boolean setDHull(ShipVariantAPI variant) {
42 variant.setSource(VariantSource.REFIT);
44 if (!variant.getHullSpec().isDefaultDHull()) {
45 String dHullId = Misc.getDHullId(variant.getHullSpec());
47 variant.setHullSpecAPI(dHull);
58 public static void addDMods(FleetMemberData data,
boolean own, CampaignFleetAPI recoverer, Random random) {
59 addDMods(data.getMember(), data.getStatus() == Status.DESTROYED, own, recoverer, random);
62 public static void addDMods(FleetMemberAPI member,
boolean destroyed,
boolean own, CampaignFleetAPI recoverer, Random random) {
63 ShipVariantAPI variant = member.getVariant();
64 addDMods(variant, destroyed, own, recoverer, random);
66 public static void addDMods(ShipVariantAPI variant,
boolean destroyed,
boolean own, CampaignFleetAPI recoverer, Random random) {
68 if (random ==
null) random =
new Random();
73 DModAdderParams params =
new DModAdderParams();
74 params.variant = variant;
75 params.destroyed = destroyed;
77 params.recoverer = recoverer;
78 params.random = random;
79 DModAdderPlugin plugin =
Global.
getSector().getGenericPlugins().pickPlugin(DModAdderPlugin.class, params);
81 plugin.addDMods(params);
98 List<HullModSpecAPI> potentialMods =
getModsWithTags(Tags.HULLMOD_DAMAGE);
101 boolean hasStructDamage =
getNumDMods(variant, Tags.HULLMOD_DAMAGE_STRUCT) > 0;
102 if (hasStructDamage) {
107 if (variant.getHullSpec().getFighterBays() > 0) {
108 potentialMods.addAll(
getModsWithTags(Tags.HULLMOD_FIGHTER_BAY_DAMAGE));
111 if (variant.getHullSpec().isPhase()) {
125 int num = 2 + random.nextInt(3);
130 if (recoverer !=
null) {
131 int extra = (int) recoverer.getStats().getDynamic().getValue(Stats.SHIP_DMOD_REDUCTION, 0);
133 extra = random.nextInt(extra + 1);
135 extra = -1 * random.nextInt(-extra + 1);
141 if (num < 1) num = 1;
145 int add = num - already;
147 add = (1 - reduction);
153 if (add <= 0)
return;
156 WeightedRandomPicker<HullModSpecAPI> picker =
new WeightedRandomPicker<HullModSpecAPI>(random);
157 picker.addAll(potentialMods);
158 for (
int i = 0; i < add && !picker.isEmpty(); i++) {
159 HullModSpecAPI pick = picker.pickAndRemove();
161 if (pick.hasTag(Tags.HULLMOD_DAMAGE_STRUCT) &&
getNumDMods(variant, Tags.HULLMOD_DAMAGE_STRUCT) > 0) {
165 variant.removeSuppressedMod(pick.getId());
166 variant.addPermaMod(pick.getId(),
false);
172 public static void addDMods(FleetMemberAPI member,
boolean canAddDestroyedMods,
int num, Random random) {
173 ShipVariantAPI variant = member.getVariant();
174 addDMods(variant, canAddDestroyedMods, num, random);
176 public static void addDMods(ShipVariantAPI variant,
boolean canAddDestroyedMods,
int num, Random random) {
177 if (random ==
null) random =
new Random();
179 DModAdderParams params =
new DModAdderParams();
180 params.variant = variant;
181 params.canAddDestroyedMods = canAddDestroyedMods;
183 params.random = random;
184 DModAdderPlugin plugin =
Global.
getSector().getGenericPlugins().pickPlugin(DModAdderPlugin.class, params);
185 if (plugin !=
null) {
186 plugin.addDMods(params);
199 List<HullModSpecAPI> potentialMods =
getModsWithTags(Tags.HULLMOD_DAMAGE);
200 if (canAddDestroyedMods) potentialMods.addAll(
getModsWithTags(Tags.HULLMOD_DESTROYED_ALWAYS));
204 boolean hasStructDamage =
getNumDMods(variant, Tags.HULLMOD_DAMAGE_STRUCT) > 0;
205 if (hasStructDamage) {
209 if (variant.getHullSpec().getFighterBays() > 0) {
211 potentialMods.addAll(
getModsWithTags(Tags.HULLMOD_FIGHTER_BAY_DAMAGE));
214 if (variant.getHullSpec().isPhase()) {
218 if (variant.isCarrier()) {
222 potentialMods =
new ArrayList<HullModSpecAPI>(potentialMods);
228 WeightedRandomPicker<HullModSpecAPI> picker =
new WeightedRandomPicker<HullModSpecAPI>(random);
229 picker.addAll(potentialMods);
231 for (
int i = 0; i < num && !picker.isEmpty(); i++) {
232 HullModSpecAPI pick = picker.pickAndRemove();
234 if (pick.hasTag(Tags.HULLMOD_DAMAGE_STRUCT) &&
getNumDMods(variant, Tags.HULLMOD_DAMAGE_STRUCT) > 0) {
238 variant.removeSuppressedMod(pick.getId());
239 variant.addPermaMod(pick.getId(),
false);
253 boolean auto = variant.hasHullMod(HullMods.AUTOMATED);
255 boolean civ = variant.getHullSpec().getHints().contains(ShipTypeHints.CIVILIAN);
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;
262 Iterator<HullModSpecAPI> iter = mods.iterator();
263 while (iter.hasNext()) {
264 HullModSpecAPI curr = iter.next();
265 if (!peakTime && curr.hasTag(Tags.HULLMOD_PEAK_TIME)) {
269 if (phase && curr.hasTag(Tags.HULLMOD_NOT_PHASE)) {
273 if (auto && curr.hasTag(Tags.HULLMOD_NOT_AUTO)) {
277 if (civ && curr.hasTag(Tags.HULLMOD_NOT_CIV)) {
281 if (civ && !curr.hasTag(Tags.HULLMOD_CIV) && !curr.hasTag(Tags.HULLMOD_CIV_ONLY)) {
285 if (!civ && curr.hasTag(Tags.HULLMOD_CIV_ONLY)) {
289 if (!shields && curr.hasTag(Tags.HULLMOD_REQ_SHIELDS)) {
296 Iterator<HullModSpecAPI> iter = mods.iterator();
297 while (iter.hasNext()) {
298 HullModSpecAPI curr = iter.next();
299 if (variant.hasHullMod(curr.getId())) iter.remove();
306 if (!variant.hasHullMod(mod.getId())) added++;
307 variant.removeSuppressedMod(mod.getId());
308 variant.addPermaMod(mod.getId(),
false);
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;
325 List<HullModSpecAPI> result =
new ArrayList<HullModSpecAPI>();
327 if (mod.getTags().containsAll(Arrays.asList(tags))) {
336 for (String
id : variant.getHullMods()) {
337 if (
getMod(
id).hasTag(Tags.HULLMOD_DMOD)) count++;
344 for (String
id : variant.getHullMods()) {
345 if (
getMod(
id).hasTag(Tags.HULLMOD_DMOD)) {
346 if (variant.getHullSpec().getBuiltInMods().contains(
id))
continue;
353 public static int getNumDMods(ShipVariantAPI variant, String ... tags) {
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++;
363 public static HullModSpecAPI
getMod(String
id) {
368 ShipHullSpecAPI base = v.getHullSpec().getDParentHull();
372 if (!v.getHullSpec().isDefaultDHull() && !v.getHullSpec().isRestoreToBase()) {
373 base = v.getHullSpec();
375 if (base ==
null && v.getHullSpec().isRestoreToBase()) {
376 base = v.getHullSpec().getBaseHull();
378 if (base.isBuiltInMod(
id)) {
379 v.removePermaMod(
id);
380 v.addSuppressedMod(
id);
382 v.removePermaMod(
id);
static SettingsAPI getSettings()
static SectorAPI getSector()
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 assumeAllShipsAreAutomated
static boolean setDHull(ShipVariantAPI variant)
static List< HullModSpecAPI > getModsWithoutTags(List< HullModSpecAPI > mods, String ... tags)
static HullModSpecAPI getMod(String id)
static int reduceNextDmodsBy
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 MAX_DMODS_FROM_COMBAT
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)
ShipHullSpecAPI getHullSpec(String hullId)
HullModSpecAPI getHullModSpec(String modId)
List< HullModSpecAPI > getAllHullModSpecs()