1package com.fs.starfarer.api.impl.campaign.rulecmd;
3import java.util.ArrayList;
4import java.util.LinkedHashSet;
7import java.util.Random;
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.campaign.BaseCustomProductionPickerDelegateImpl;
12import com.fs.starfarer.api.campaign.CampaignFleetAPI;
13import com.fs.starfarer.api.campaign.CargoAPI;
14import com.fs.starfarer.api.campaign.CargoAPI.CargoItemType;
15import com.fs.starfarer.api.campaign.FactionAPI;
16import com.fs.starfarer.api.campaign.FactionAPI.ShipPickMode;
17import com.fs.starfarer.api.campaign.FactionAPI.ShipPickParams;
18import com.fs.starfarer.api.campaign.FactionProductionAPI;
19import com.fs.starfarer.api.campaign.FactionProductionAPI.ItemInProductionAPI;
20import com.fs.starfarer.api.campaign.FactionProductionAPI.ProductionItemType;
21import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.DataForEncounterSide;
22import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.FleetMemberData;
23import com.fs.starfarer.api.campaign.InteractionDialogAPI;
24import com.fs.starfarer.api.campaign.OptionPanelAPI;
25import com.fs.starfarer.api.campaign.SectorEntityToken;
26import com.fs.starfarer.api.campaign.SpecialItemData;
27import com.fs.starfarer.api.campaign.SpecialItemPlugin.RightClickActionHelper;
28import com.fs.starfarer.api.campaign.TextPanelAPI;
29import com.fs.starfarer.api.campaign.impl.items.ShroudedHullmodItemPlugin;
30import com.fs.starfarer.api.campaign.impl.items.ShroudedSubstratePlugin;
31import com.fs.starfarer.api.campaign.rules.MemKeys;
32import com.fs.starfarer.api.campaign.rules.MemoryAPI;
33import com.fs.starfarer.api.combat.BattleCreationContext;
34import com.fs.starfarer.api.combat.ShipVariantAPI;
35import com.fs.starfarer.api.fleet.FleetMemberAPI;
36import com.fs.starfarer.api.fleet.ShipRolePick;
37import com.fs.starfarer.api.impl.campaign.AbyssalLightEntityPlugin;
38import com.fs.starfarer.api.impl.campaign.AbyssalLightEntityPlugin.DespawnType;
39import com.fs.starfarer.api.impl.campaign.FleetEncounterContext;
40import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl;
41import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.BaseFIDDelegate;
42import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.FIDConfig;
43import com.fs.starfarer.api.impl.campaign.RuleBasedInteractionDialogPluginImpl;
44import com.fs.starfarer.api.impl.campaign.ids.Factions;
45import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
46import com.fs.starfarer.api.impl.campaign.ids.Items;
47import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
48import com.fs.starfarer.api.impl.campaign.ids.ShipRoles;
49import com.fs.starfarer.api.impl.campaign.ids.Tags;
50import com.fs.starfarer.api.loading.HullModSpecAPI;
51import com.fs.starfarer.api.loading.WeaponSpecAPI;
52import com.fs.starfarer.api.util.ListMap;
53import com.fs.starfarer.api.util.Misc;
54import com.fs.starfarer.api.util.Misc.Token;
55import com.fs.starfarer.api.util.WeightedRandomPicker;
61 public static enum DwellerStrength {
91 if (dialog ==
null)
return false;
103 String action = params.get(0).getString(memoryMap);
106 if (memory ==
null)
return false;
108 if (
"smallFleet".equals(action)) {
109 return engageFleet(dialog, memoryMap, memory, DwellerStrength.LOW, random);
110 }
else if (
"mediumFleet".equals(action)) {
111 return engageFleet(dialog, memoryMap, memory, DwellerStrength.MEDIUM, random);
112 }
else if (
"largeFleet".equals(action)) {
113 return engageFleet(dialog, memoryMap, memory, DwellerStrength.HIGH, random);
114 }
else if (
"hugeFleet".equals(action)) {
115 return engageFleet(dialog, memoryMap, memory, DwellerStrength.EXTREME, random);
116 }
else if (
"showWeaponPicker".equals(action)) {
119 }
else if (
"unlockHullmod".equals(action)) {
147 String substrate =
"substrate_";
148 for (String tag : spec.
getTags()) {
149 if (tag.startsWith(substrate)) {
150 String num = tag.replaceFirst(substrate,
"");
151 return Integer.parseInt(num);
161 Set<String> weapons =
new LinkedHashSet<>();
164 if (cost > 0 && cost <= substrate) {
165 weapons.add(spec.getWeaponId());
171 public Set<String> getAvailableFighters() {
172 return new LinkedHashSet<>();
175 public Set<String> getAvailableShipHulls() {
176 return new LinkedHashSet<>();
179 public Set<String> getAvailableWeapons() {
183 public float getCostMult() {
187 public float getMaximumValue() {
192 public String getWeaponColumnNameOverride() {
197 public String getNoMatchingBlueprintsLabelOverride() {
198 return "No matching weapons";
202 public String getMaximumOrderValueLabelOverride() {
203 return "Shrouded Substrate available";
207 public String getCurrentOrderValueLabelOverride() {
208 return "Shrouded Substrate required";
211 public String getItemGoesOverMaxValueStringOverride() {
212 return "Not enough Shrouded Substrate";
215 public String getCustomOrderLabelOverride() {
216 return "Weapon assembly";
219 public String getNoProductionOrdersLabelOverride() {
220 return "No assembly orders";
223 public boolean withQuantityLimits() {
227 public boolean isUseCreditSign() {
232 public int getCostOverride(Object item) {
243 if (!(plugin.
getCustom1() instanceof RightClickActionHelper))
return;
244 RightClickActionHelper helper = (RightClickActionHelper) plugin.
getCustom1();
247 helper.removeFromClickedStackFirst(cost);
252 if (item.getType() == ProductionItemType.WEAPON) {
253 helper.addItems(CargoItemType.WEAPONS, item.getSpecId(), item.getQuantity());
258 FireBest.
fire(
null, dialog, memoryMap,
"SubstrateWeaponsPicked");
268 if (fleet ==
null)
return false;
279 FIDConfig config =
new FIDConfig();
281 config.delegate =
new BaseFIDDelegate() {
289 DataForEncounterSide data = context.
getDataFor(fleet);
290 List<FleetMemberAPI> losses =
new ArrayList<FleetMemberAPI>();
291 for (FleetMemberData fmd : data.getOwnCasualties()) {
292 losses.add(fmd.getMember());
297 boolean gotGuaranteed =
false;
300 String key =
"substrate_";
302 if (sDrops ==
null) {
305 if (sDrops ==
null)
continue;
310 String hullId = member.getHullSpec().getRestoredToHullId();
311 String defeatedKey =
"$defeatedDweller_" + hullId;
314 if (firstTime && !gotGuaranteed) {
316 for (String itemId : drops) {
318 boolean add = firstTime && salvage.
getQuantity(CargoItemType.SPECIAL, sid) <= 0;
320 salvage.
addItems(CargoItemType.SPECIAL, sid, 1);
321 gotGuaranteed =
true;
331 if (min + max < 1f) {
332 if (random.nextFloat() < (min + max) / 2f) {
336 substrate = (int) Math.round(min + (max - min) * random.nextFloat());
345 bcc.aiRetreatAllowed =
false;
346 bcc.fightToTheLast =
true;
347 bcc.objectivesAllowed =
false;
348 bcc.enemyDeployAll =
true;
354 plugin.
despawn(DespawnType.FADE_OUT);
359 config.alwaysAttackVsAttack =
true;
361 config.alwaysHarry =
true;
362 config.showTransponderStatus =
false;
364 config.lootCredits =
false;
366 config.showCommLinkOption =
false;
367 config.showEngageText =
false;
368 config.showFleetAttitude =
false;
369 config.showTransponderStatus =
false;
370 config.showWarningDialogWhenNotHostile =
false;
371 config.impactsAllyReputation =
false;
372 config.impactsEnemyReputation =
false;
373 config.pullInAllies =
false;
374 config.pullInEnemies =
false;
375 config.pullInStations =
false;
377 config.showCrRecoveryText =
false;
378 config.firstTimeEngageOptionText =
"\"Battle stations!\"";
379 config.afterFirstTimeEngageOptionText =
"Move in to re-engage";
381 if (str == DwellerStrength.LOW) {
382 config.firstTimeEngageOptionText =
null;
383 config.leaveAlwaysAvailable =
true;
385 config.leaveAlwaysAvailable =
true;
386 config.noLeaveOptionOnFirstEngagement =
true;
427 if (str == DwellerStrength.LOW) {
431 }
else if (str == DwellerStrength.MEDIUM) {
436 }
else if (str == DwellerStrength.HIGH) {
441 }
else if (str == DwellerStrength.EXTREME) {
453 curr.getRepairTracker().setCR(curr.getRepairTracker().getMaxCR());
478 if (min < 0) min = 0;
479 if (max < 0) max = 0;
482 if (roles.length == 1) {
483 picker.
add((String) roles[0], 1f);
485 for (
int i = 0; i < roles.length; i += 2) {
486 picker.
add((String) roles[i], (
float) roles[i + 1]);
489 int num = min + random.nextInt(max - min + 1);
492 ShipPickParams p =
new ShipPickParams(ShipPickMode.ALL);
493 p.blockFallback =
true;
495 for (
int i = 0; i < num; i++) {
496 String role = picker.
pick();
497 List<ShipRolePick> picks = faction.
pickShip(role, p,
null, random);
502 if (variant !=
null) {
505 for (String group : dropGroups) {
static SettingsAPI getSettings()
static SoundPlayerAPI getSoundPlayer()
static FactoryAPI getFactory()
static SectorAPI getSector()
static String SHROUDED_HULLMOD_ID
static String SHROUDED_SUBSTRATE_AVAILABLE
static final String LOCAL
void despawn(DespawnType type)
float computePlayerContribFraction()
DataForEncounterSide getDataFor(CampaignFleetAPI participantOrCombined)
void init(InteractionDialogAPI dialog)
static final String DWELLER
static final String PATROL_SMALL
static final String PATROL_LARGE
static final String PATROL_MEDIUM
static final String SHROUDED_LENS
static final String SHROUDED_SUBSTRATE
static final String SHROUDED_MANTLE
static final String SHROUDED_THUNDERHEAD
static final String MAY_GO_INTO_ABYSS
static final String MEMORY_KEY_MAKE_HOSTILE
static final String DWELLER_MAELSTROM
static final String DWELLER_TENDRIL
static final String DWELLER_MAW
static final String DWELLER_EYE
static void addWeaponGainText(String weaponId, int quantity, TextPanelAPI text)
boolean engageFleet(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, MemoryAPI memory, DwellerStrength str, Random random)
static int getSubstrateCost(WeaponSpecAPI spec)
void showWeaponPicker(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
static CampaignFleetAPI createDwellerFleet(DwellerStrength str, Random random)
static String SHROUDED_MAW
static String SHROUDED_TENDRIL
static String SHROUDED_MAELSTROM
static int addShips(CampaignFleetAPI fleet, int min, int max, Random random, Object ... roles)
static ListMap< String > GUARANTEED_FIRST_TIME_ITEMS
static String SHROUDED_EYE
void unlockHullmod(InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap)
static ListMap< String > DROP_GROUPS
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
static Random getRandom(long seed, int level)
static long getSalvageSeed(SectorEntityToken entity)
static Color getHighlightColor()
static float[] getFloatArray(String key)
static Color getPositiveHighlightColor()
CampaignFleetAPI createEmptyFleet(String factionId, String name, boolean aiMode)
ShipVariantAPI getVariant(String variantId)
HullModSpecAPI getHullModSpec(String modId)
List< WeaponSpecAPI > getAllWeaponSpecs()
SoundAPI playUISound(String id, float pitch, float volume)
LocationAPI getContainingLocation()
void setName(String name)
FleetDataAPI getFleetData()
void setInflater(FleetInflater inflater)
void restartEncounterMusic(SectorEntityToken interactionTarget)
float getQuantity(CargoAPI.CargoItemType type, Object data)
void addItems(CargoAPI.CargoItemType itemType, Object data, float quantity)
List< ShipRolePick > pickShip(String role, ShipPickParams params)
String getFleetTypeName(String type)
void addKnownHullMod(String modId)
int getTotalCurrentCost()
List< ItemInProductionAPI > getCurrent()
void addFleetMember(FleetMemberAPI member)
List< FleetMemberAPI > getMembersListCopy()
void setInteractionTarget(SectorEntityToken interactionTarget)
void setPlugin(InteractionDialogPlugin plugin)
void showCustomProductionPicker(CustomProductionPickerDelegate delegate)
TextPanelAPI getTextPanel()
InteractionDialogPlugin getPlugin()
SectorEntityToken getInteractionTarget()
OptionPanelAPI getOptionPanel()
CampaignFleetAPI getPlayerFleet()
MemoryAPI getPlayerMemoryWithoutUpdate()
FactionAPI getPlayerFaction()
CampaignUIAPI getCampaignUI()
FactionAPI getFaction(String factionId)
CustomCampaignEntityPlugin getCustomPlugin()
void addDropRandom(String group, int chances)
void setContainingLocation(LocationAPI location)
MemoryAPI getMemoryWithoutUpdate()
void setFontSmallInsignia()
LabelAPI addParagraph(String text)
void highlightInLastPara(Color color, String ...strings)
String getString(String key)
void set(String key, Object value)
boolean getBoolean(String key)
String getRestoredToHullId()
ShipHullSpecAPI getHullSpec()
boolean hasTag(String tag)