42 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params,
final Map<String, MemoryAPI> memoryMap) {
43 if (dialog ==
null)
return false;
45 final SectorEntityToken entity = dialog.getInteractionTarget();
48 final CampaignFleetAPI defenders = memory.getFleet(
"$defenderFleet");
49 if (defenders ==
null)
return false;
51 dialog.setInteractionTarget(defenders);
53 final FIDConfig config =
new FIDConfig();
54 config.leaveAlwaysAvailable =
true;
55 config.showCommLinkOption =
false;
56 config.showEngageText =
false;
57 config.showFleetAttitude =
false;
58 config.showTransponderStatus =
false;
59 config.showWarningDialogWhenNotHostile =
false;
60 config.alwaysAttackVsAttack =
true;
61 config.impactsAllyReputation =
true;
62 config.impactsEnemyReputation =
false;
63 config.pullInAllies =
false;
64 config.pullInEnemies =
false;
65 config.pullInStations =
false;
66 config.lootCredits =
false;
68 config.firstTimeEngageOptionText =
"Engage the automated defenses";
69 config.afterFirstTimeEngageOptionText =
"Re-engage the automated defenses";
70 config.noSalvageLeaveOptionText =
"Continue";
72 config.dismissOnLeave =
false;
73 config.printXPToDialog =
true;
75 long seed = memory.getLong(MemFlags.SALVAGE_SEED);
76 config.salvageRandom = Misc.getRandom(seed, 75);
81 final InteractionDialogPlugin originalPlugin = dialog.getPlugin();
82 config.delegate =
new BaseFIDDelegate() {
84 public void notifyLeave(InteractionDialogAPI dialog) {
86 defenders.getMemoryWithoutUpdate().clear();
88 defenders.clearAssignments();
91 dialog.setPlugin(originalPlugin);
92 dialog.setInteractionTarget(entity);
100 SDMParams p =
new SDMParams();
102 p.factionId = defenders.getFaction().getId();
104 SalvageDefenderModificationPlugin plugin =
Global.
getSector().getGenericPlugins().pickPlugin(
105 SalvageDefenderModificationPlugin.class, p);
106 if (plugin !=
null) {
107 plugin.reportDefeated(p, entity, defenders);
110 memory.unset(
"$hasDefenders");
111 memory.unset(
"$defenderFleet");
112 memory.set(
"$defenderFleetDefeated",
true);
114 FireBest.
fire(
null, dialog, memoryMap,
"BeatDefendersContinue");
116 boolean persistDefenders =
false;
118 persistDefenders |= !Misc.getSnapshotMembersLost(defenders).isEmpty();
119 for (FleetMemberAPI member : defenders.getFleetData().getMembersListCopy()) {
120 if (member.getStatus().needsRepairs()) {
121 persistDefenders =
true;
127 if (persistDefenders) {
129 defenders.setDoNotAdvanceAI(
true);
130 defenders.setContainingLocation(entity.getContainingLocation());
132 defenders.setLocation(1000000, 1000000);
135 memory.expire(
"$defenderFleet", 10);
144 public void battleContextCreated(InteractionDialogAPI dialog, BattleCreationContext bcc) {
145 bcc.aiRetreatAllowed =
false;
146 bcc.objectivesAllowed =
false;
147 bcc.enemyDeployAll =
true;
150 public void postPlayerSalvageGeneration(InteractionDialogAPI dialog,
FleetEncounterContext context, CargoAPI salvage) {
154 if (winner ==
null || loser ==
null)
return;
158 List<DropData> dropRandom =
new ArrayList<DropData>();
159 List<DropData> dropValue =
new ArrayList<DropData>();
161 float valueMultFleet =
Global.
getSector().getPlayerFleet().getStats().getDynamic().getValue(Stats.BATTLE_SALVAGE_MULT_FLEET);
164 for (FleetMemberData data : winner.getEnemyCasualties()) {
167 if (data.getMember() !=
null && context.
getBattle() !=
null) {
168 CampaignFleetAPI fleet = context.
getBattle().getSourceFleet(data.getMember());
170 if (fleet !=
null && fleet.getFaction().getId().equals(Factions.OMEGA)) {
171 for (String slotId : data.getMember().getVariant().getNonBuiltInWeaponSlots()) {
172 String weaponId = data.getMember().getVariant().getWeaponId(slotId);
173 if (weaponId ==
null)
continue;
174 if (salvage.getNumWeapons(weaponId) <= 0) {
176 if (spec.hasTag(Tags.NO_DROP))
continue;
178 salvage.addWeapons(weaponId, 1);
184 fleet.getFaction().getCustomBoolean(Factions.CUSTOM_NO_AI_CORES_FROM_AUTOMATED_DEFENSES)) {
188 if (config.salvageRandom.nextFloat() < playerContribMult) {
189 DropData drop =
new DropData();
192 switch (data.getMember().getHullSpec().getHullSize()) {
194 drop.group = Drops.AI_CORES3;
198 drop.group = Drops.AI_CORES3;
201 drop.group = Drops.AI_CORES2;
205 drop.group = Drops.AI_CORES1;
208 if (drop.group !=
null) {
209 dropRandom.add(drop);
214 float fuelMult =
Global.
getSector().getPlayerFleet().getStats().getDynamic().getValue(Stats.FUEL_SALVAGE_VALUE_MULT_FLEET);
218 CargoAPI extra =
SalvageEntity.
generateSalvage(config.salvageRandom, valueMultFleet + valueModShips, 1f, 1f, fuelMult, dropValue, dropRandom);
219 for (CargoStackAPI stack : extra.getStacksCopy()) {
220 if (stack.isFuelStack()) {
221 stack.setSize((
int)(stack.getSize() * fuelMult));
223 salvage.addFromStack(stack);
231 dialog.setPlugin(plugin);