Starsector API
Loading...
Searching...
No Matches
SalvageDefenderInteraction.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.rulecmd.salvage;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Map;
6
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.FleetEncounterContextPlugin.DataForEncounterSide;
12import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.FleetMemberData;
13import com.fs.starfarer.api.campaign.InteractionDialogAPI;
14import com.fs.starfarer.api.campaign.InteractionDialogPlugin;
15import com.fs.starfarer.api.campaign.SectorEntityToken;
16import com.fs.starfarer.api.campaign.rules.MemoryAPI;
17import com.fs.starfarer.api.combat.BattleCreationContext;
18import com.fs.starfarer.api.fleet.FleetMemberAPI;
19import com.fs.starfarer.api.impl.campaign.FleetEncounterContext;
20import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl;
21import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.BaseFIDDelegate;
22import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.FIDConfig;
23import com.fs.starfarer.api.impl.campaign.ids.Drops;
24import com.fs.starfarer.api.impl.campaign.ids.Factions;
25import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
26import com.fs.starfarer.api.impl.campaign.ids.Stats;
27import com.fs.starfarer.api.impl.campaign.ids.Tags;
28import com.fs.starfarer.api.impl.campaign.procgen.SalvageEntityGenDataSpec.DropData;
29import com.fs.starfarer.api.impl.campaign.rulecmd.BaseCommandPlugin;
30import com.fs.starfarer.api.impl.campaign.rulecmd.FireBest;
31import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageGenFromSeed.SDMParams;
32import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.SalvageGenFromSeed.SalvageDefenderModificationPlugin;
33import com.fs.starfarer.api.loading.WeaponSpecAPI;
34import com.fs.starfarer.api.util.Misc;
35import com.fs.starfarer.api.util.Misc.Token;
36
41
42 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, final Map<String, MemoryAPI> memoryMap) {
43 if (dialog == null) return false;
44
45 final SectorEntityToken entity = dialog.getInteractionTarget();
46 final MemoryAPI memory = getEntityMemory(memoryMap);
47
48 final CampaignFleetAPI defenders = memory.getFleet("$defenderFleet");
49 if (defenders == null) return false;
50
51 dialog.setInteractionTarget(defenders);
52
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;
67
68 config.firstTimeEngageOptionText = "Engage the automated defenses";
69 config.afterFirstTimeEngageOptionText = "Re-engage the automated defenses";
70 config.noSalvageLeaveOptionText = "Continue";
71
72 config.dismissOnLeave = false;
73 config.printXPToDialog = true;
74
75 long seed = memory.getLong(MemFlags.SALVAGE_SEED);
76 config.salvageRandom = Misc.getRandom(seed, 75);
77
78
80
81 final InteractionDialogPlugin originalPlugin = dialog.getPlugin();
82 config.delegate = new BaseFIDDelegate() {
83 @Override
84 public void notifyLeave(InteractionDialogAPI dialog) {
85 // nothing in there we care about keeping; clearing to reduce savefile size
86 defenders.getMemoryWithoutUpdate().clear();
87 // there's a "standing down" assignment given after a battle is finished that we don't care about
88 defenders.clearAssignments();
89 defenders.deflate();
90
91 dialog.setPlugin(originalPlugin);
92 dialog.setInteractionTarget(entity);
93
94 //Global.getSector().getCampaignUI().clearMessages();
95
96 if (plugin.getContext() instanceof FleetEncounterContext) {
98 if (context.didPlayerWinEncounterOutright()) {
99
100 SDMParams p = new SDMParams();
101 p.entity = entity;
102 p.factionId = defenders.getFaction().getId();
103
104 SalvageDefenderModificationPlugin plugin = Global.getSector().getGenericPlugins().pickPlugin(
105 SalvageDefenderModificationPlugin.class, p);
106 if (plugin != null) {
107 plugin.reportDefeated(p, entity, defenders);
108 }
109
110 memory.unset("$hasDefenders");
111 memory.unset("$defenderFleet");
112 memory.set("$defenderFleetDefeated", true);
113 entity.removeScriptsOfClass(FleetAdvanceScript.class);
114 FireBest.fire(null, dialog, memoryMap, "BeatDefendersContinue");
115 } else {
116 boolean persistDefenders = false;
117 if (context.isEngagedInHostilities()) {
118 persistDefenders |= !Misc.getSnapshotMembersLost(defenders).isEmpty();
119 for (FleetMemberAPI member : defenders.getFleetData().getMembersListCopy()) {
120 if (member.getStatus().needsRepairs()) {
121 persistDefenders = true;
122 break;
123 }
124 }
125 }
126
127 if (persistDefenders) {
128 if (!entity.hasScriptOfClass(FleetAdvanceScript.class)) {
129 defenders.setDoNotAdvanceAI(true);
130 defenders.setContainingLocation(entity.getContainingLocation());
131 // somewhere far off where it's not going to be in terrain or whatever
132 defenders.setLocation(1000000, 1000000);
133 entity.addScript(new FleetAdvanceScript(defenders));
134 }
135 memory.expire("$defenderFleet", 10); // defenders may have gotten damaged; persist them for a bit
136 }
137 dialog.dismiss();
138 }
139 } else {
140 dialog.dismiss();
141 }
142 }
143 @Override
144 public void battleContextCreated(InteractionDialogAPI dialog, BattleCreationContext bcc) {
145 bcc.aiRetreatAllowed = false;
146 bcc.objectivesAllowed = false;
147 bcc.enemyDeployAll = true;
148 }
149 @Override
150 public void postPlayerSalvageGeneration(InteractionDialogAPI dialog, FleetEncounterContext context, CargoAPI salvage) {
151 DataForEncounterSide winner = context.getWinnerData();
152 DataForEncounterSide loser = context.getLoserData();
153
154 if (winner == null || loser == null) return;
155
156 float playerContribMult = context.computePlayerContribFraction();
157
158 List<DropData> dropRandom = new ArrayList<DropData>();
159 List<DropData> dropValue = new ArrayList<DropData>();
160
161 float valueMultFleet = Global.getSector().getPlayerFleet().getStats().getDynamic().getValue(Stats.BATTLE_SALVAGE_MULT_FLEET);
162 float valueModShips = context.getSalvageValueModPlayerShips();
163
164 for (FleetMemberData data : winner.getEnemyCasualties()) {
165 // add at least one of each weapon that was present on the OMEGA ships, since these
166 // are hard to get; don't want them to be too RNG
167 if (data.getMember() != null && context.getBattle() != null) {
168 CampaignFleetAPI fleet = context.getBattle().getSourceFleet(data.getMember());
169
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) {
175 WeaponSpecAPI spec = Global.getSettings().getWeaponSpec(weaponId);
176 if (spec.hasTag(Tags.NO_DROP)) continue;
177
178 salvage.addWeapons(weaponId, 1);
179 }
180 }
181 }
182
183 if (fleet != null &&
184 fleet.getFaction().getCustomBoolean(Factions.CUSTOM_NO_AI_CORES_FROM_AUTOMATED_DEFENSES)) {
185 continue;
186 }
187 }
188 if (config.salvageRandom.nextFloat() < playerContribMult) {
189 DropData drop = new DropData();
190 drop.chances = 1;
191 drop.value = -1;
192 switch (data.getMember().getHullSpec().getHullSize()) {
193 case CAPITAL_SHIP:
194 drop.group = Drops.AI_CORES3;
195 drop.chances = 2;
196 break;
197 case CRUISER:
198 drop.group = Drops.AI_CORES3;
199 break;
200 case DESTROYER:
201 drop.group = Drops.AI_CORES2;
202 break;
203 case FIGHTER:
204 case FRIGATE:
205 drop.group = Drops.AI_CORES1;
206 break;
207 }
208 if (drop.group != null) {
209 dropRandom.add(drop);
210 }
211 }
212 }
213
214 float fuelMult = Global.getSector().getPlayerFleet().getStats().getDynamic().getValue(Stats.FUEL_SALVAGE_VALUE_MULT_FLEET);
215 //float fuel = salvage.getFuel();
216 //salvage.addFuel((int) Math.round(fuel * fuelMult));
217
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));
222 }
223 salvage.addFromStack(stack);
224 }
225
226 }
227
228 };
229
230
231 dialog.setPlugin(plugin);
232 plugin.init(dialog);
233
234 return true;
235 }
236
237
238}
239
240
241
242
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
static MemoryAPI getEntityMemory(Map< String, MemoryAPI > memoryMap)
static boolean fire(String ruleId, InteractionDialogAPI dialog, Map< String, MemoryAPI > memoryMap, String params)
Definition FireBest.java:56
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, final Map< String, MemoryAPI > memoryMap)
static CargoAPI generateSalvage(Random random, float valueMult, float overallMult, float fuelMult, List< DropData > dropValue, List< DropData > dropRandom)
WeaponSpecAPI getWeaponSpec(String weaponId)