Starsector API
Loading...
Searching...
No Matches
HA_CMD.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.rulecmd;
2
3import java.util.ArrayList;
4import java.util.LinkedHashSet;
5import java.util.List;
6import java.util.Map;
7import java.util.Random;
8import java.util.Set;
9
10import org.lwjgl.util.vector.Vector2f;
11
12import com.fs.starfarer.api.EveryFrameScript;
13import com.fs.starfarer.api.Global;
14import com.fs.starfarer.api.campaign.BattleAPI;
15import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason;
16import com.fs.starfarer.api.campaign.CampaignFleetAPI;
17import com.fs.starfarer.api.campaign.CargoAPI;
18import com.fs.starfarer.api.campaign.FactionAPI;
19import com.fs.starfarer.api.campaign.FleetAssignment;
20import com.fs.starfarer.api.campaign.InteractionDialogAPI;
21import com.fs.starfarer.api.campaign.JumpPointAPI;
22import com.fs.starfarer.api.campaign.LocationAPI;
23import com.fs.starfarer.api.campaign.OptionPanelAPI;
24import com.fs.starfarer.api.campaign.RepLevel;
25import com.fs.starfarer.api.campaign.SectorEntityToken;
26import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
27import com.fs.starfarer.api.campaign.SpecialItemData;
28import com.fs.starfarer.api.campaign.StarSystemAPI;
29import com.fs.starfarer.api.campaign.TextPanelAPI;
30import com.fs.starfarer.api.campaign.ai.ModularFleetAIAPI;
31import com.fs.starfarer.api.campaign.econ.Industry;
32import com.fs.starfarer.api.campaign.econ.MarketAPI;
33import com.fs.starfarer.api.campaign.econ.MonthlyReport;
34import com.fs.starfarer.api.campaign.econ.MonthlyReport.FDNode;
35import com.fs.starfarer.api.campaign.listeners.ColonyPlayerHostileActListener;
36import com.fs.starfarer.api.campaign.listeners.CurrentLocationChangedListener;
37import com.fs.starfarer.api.campaign.listeners.EconomyTickListener;
38import com.fs.starfarer.api.campaign.listeners.FleetEventListener;
39import com.fs.starfarer.api.campaign.rules.MemKeys;
40import com.fs.starfarer.api.campaign.rules.MemoryAPI;
41import com.fs.starfarer.api.impl.campaign.CargoPodsEntityPlugin;
42import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin;
43import com.fs.starfarer.api.impl.campaign.CoreReputationPlugin.RepRewards;
44import com.fs.starfarer.api.impl.campaign.ids.Conditions;
45import com.fs.starfarer.api.impl.campaign.ids.Entities;
46import com.fs.starfarer.api.impl.campaign.ids.Factions;
47import com.fs.starfarer.api.impl.campaign.ids.Industries;
48import com.fs.starfarer.api.impl.campaign.ids.Items;
49import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
50import com.fs.starfarer.api.impl.campaign.ids.Stats;
51import com.fs.starfarer.api.impl.campaign.intel.GensHannanMachinations;
52import com.fs.starfarer.api.impl.campaign.intel.LuddicChurchImmigrationDeal;
53import com.fs.starfarer.api.impl.campaign.intel.PerseanLeagueMembership;
54import com.fs.starfarer.api.impl.campaign.intel.PerseanLeagueMembership.AgreementEndingType;
55import com.fs.starfarer.api.impl.campaign.intel.SindrianDiktatFuelDeal;
56import com.fs.starfarer.api.impl.campaign.intel.TriTachyonDeal;
57import com.fs.starfarer.api.impl.campaign.intel.bases.LuddicPathBaseManager;
58import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel;
59import com.fs.starfarer.api.impl.campaign.intel.bases.PirateBaseIntel.PirateBaseTier;
60import com.fs.starfarer.api.impl.campaign.intel.events.EventFactor;
61import com.fs.starfarer.api.impl.campaign.intel.events.HALuddicPathDealFactor;
62import com.fs.starfarer.api.impl.campaign.intel.events.HAPirateKingDealFactor;
63import com.fs.starfarer.api.impl.campaign.intel.events.HegemonyHostileActivityFactor;
64import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityCause2;
65import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityEventIntel;
66import com.fs.starfarer.api.impl.campaign.intel.events.HostileActivityEventIntel.HAERandomEventData;
67import com.fs.starfarer.api.impl.campaign.intel.events.LuddicChurchHostileActivityFactor;
68import com.fs.starfarer.api.impl.campaign.intel.events.LuddicChurchStandardActivityCause;
69import com.fs.starfarer.api.impl.campaign.intel.events.LuddicPathHostileActivityFactor;
70import com.fs.starfarer.api.impl.campaign.intel.events.PerseanLeagueHostileActivityFactor;
71import com.fs.starfarer.api.impl.campaign.intel.events.PirateBasePirateActivityCause2;
72import com.fs.starfarer.api.impl.campaign.intel.events.SindrianDiktatHostileActivityFactor;
73import com.fs.starfarer.api.impl.campaign.intel.events.SindrianDiktatStandardActivityCause;
74import com.fs.starfarer.api.impl.campaign.intel.events.StandardPerseanLeagueActivityCause;
75import com.fs.starfarer.api.impl.campaign.intel.events.TriTachyonHostileActivityFactor;
76import com.fs.starfarer.api.impl.campaign.intel.events.ttcr.TriTachyonCommerceRaiding;
77import com.fs.starfarer.api.impl.campaign.intel.group.GenericRaidFGI.GenericRaidParams;
78import com.fs.starfarer.api.impl.campaign.intel.group.KnightsOfLuddTakeoverExpedition;
79import com.fs.starfarer.api.impl.campaign.intel.group.PerseanLeagueBlockade;
80import com.fs.starfarer.api.impl.campaign.intel.group.PerseanLeaguePunitiveExpedition;
81import com.fs.starfarer.api.impl.campaign.intel.group.SindrianDiktatPunitiveExpedition;
82import com.fs.starfarer.api.impl.campaign.intel.group.TTMercenaryAttack;
83import com.fs.starfarer.api.impl.campaign.intel.group.TTMercenaryReversedAttack;
84import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission;
85import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission.FleetStyle;
86import com.fs.starfarer.api.impl.campaign.missions.hub.MissionFleetAutoDespawn;
87import com.fs.starfarer.api.impl.campaign.procgen.StarSystemGenerator;
88import com.fs.starfarer.api.impl.campaign.rulecmd.salvage.MarketCMD.TempData;
89import com.fs.starfarer.api.impl.campaign.shared.SharedData;
90import com.fs.starfarer.api.ui.TooltipMakerAPI;
91import com.fs.starfarer.api.ui.TooltipMakerAPI.TooltipCreator;
92import com.fs.starfarer.api.util.Misc;
93import com.fs.starfarer.api.util.Misc.FleetFilter;
94import com.fs.starfarer.api.util.Misc.Token;
95
101public class HA_CMD extends BaseCommandPlugin {
102
103 public static final String PATHER_AGREEMENT = "$patherAgreement";
104 public static final String PATHER_AGREEMENT_PERMANENT = "$patherAgreementPermanent";
105
106
107 public static void setPatherAgreement(boolean agreement, float duration) {
108 if (!agreement) {
109 Global.getSector().getPlayerMemoryWithoutUpdate().unset(PATHER_AGREEMENT);
110 Global.getSector().getPlayerMemoryWithoutUpdate().unset(PATHER_AGREEMENT_PERMANENT);
111 return;
112 }
113 if (duration <= 0) {
114 Global.getSector().getPlayerMemoryWithoutUpdate().set(PATHER_AGREEMENT_PERMANENT, true);
115 }
116 Global.getSector().getPlayerMemoryWithoutUpdate().set(PATHER_AGREEMENT, true, duration);
117 }
118 public static boolean playerHasPatherAgreement() {
119 //if (true) return true;
120 // second part is to make 0.96a-RC8 saves work now that the correct variable is being set
121 return Global.getSector().getPlayerMemoryWithoutUpdate().getBoolean(PATHER_AGREEMENT) ||
122 Global.getSector().getMemoryWithoutUpdate().getBoolean(PATHER_AGREEMENT);
123 }
124 public static boolean playerPatherAgreementIsPermanent() {
125 //if (true) return true;
126 // second part is to make 0.96a-RC8 saves work now that the correct variable is being set
127 return Global.getSector().getPlayerMemoryWithoutUpdate().getBoolean(PATHER_AGREEMENT_PERMANENT) ||
128 Global.getSector().getMemoryWithoutUpdate().getBoolean(PATHER_AGREEMENT_PERMANENT);
129 }
130
131 public static float getPlayerPatherAgreementDays() {
132 return Global.getSector().getPlayerMemoryWithoutUpdate().getExpire(PATHER_AGREEMENT);
133 }
134
135
136 public static int computePirateProtectionPaymentPerMonth(PirateBaseIntel intel) {
137 int perTick = computePirateProtectionPaymentPerTick(intel);
138 float numIter = Global.getSettings().getFloat("economyIterPerMonth");
139 return (int) (perTick * numIter);
140 }
141
142 public static int computePirateProtectionPaymentPerTick(PirateBaseIntel intel) {
143 float numIter = Global.getSettings().getFloat("economyIterPerMonth");
144 float f = 1f / numIter;
145
146 int payment = 0;
147 float feeFraction = Global.getSettings().getFloat("pirateProtectionPaymentFraction");
148
149 for (MarketAPI market : PirateBasePirateActivityCause2.getColoniesAffectedBy(intel)) {
150 //if (market.isHidden()) continue;
151 //if (!Factions.DIKTAT.equals(market.getFaction().getId()) && !market.isPlayerOwned()) continue;
152 if (!market.isPlayerOwned()) continue;
153
154 payment += (int) (market.getGrossIncome() * f) * feeFraction;
155 }
156
157 return payment;
158 }
159
160 public static class StationKingScript implements EveryFrameScript, TooltipCreator,
161 EconomyTickListener,
162 FleetEventListener,
163 CurrentLocationChangedListener,
164 ColonyPlayerHostileActListener {
165
166 protected boolean done = false;
167 protected PirateBaseIntel intel;
168 protected Random random = new Random();
169 //protected IntervalUtil interval;
170
171 protected float untilMercCheck = 0f;
172 protected float mercProbMult = 1f;
173 protected transient boolean spawnMerc = false;
174
175 public StationKingScript(PirateBaseIntel intel) {
176 this.intel = intel;
177 Global.getSector().getListenerManager().addListener(this);
178 //interval = new IntervalUtil(0.01f, maxInterval)
179 resetMercCheckDelay();
180 }
181
182 protected Object readResolve() {
183 if (random == null) {
184 random = new Random();
185 }
186 return this;
187 }
188
189 protected void resetMercCheckDelay() {
190 untilMercCheck = Global.getSettings().getFloatFromArray("pirateProtectionMercSpawnInterval", 0) +
191 (Global.getSettings().getFloatFromArray("pirateProtectionMercSpawnInterval", 1) -
192 Global.getSettings().getFloatFromArray("pirateProtectionMercSpawnInterval", 0)) * Misc.random.nextFloat();
193 }
194
195 protected void setDone() {
196 done = true;
197 Global.getSector().getListenerManager().removeListener(this);
198 }
199
200 public boolean isDone() {
201 return done;
202 }
203 public boolean runWhilePaused() {
204 return false;
205 }
206
207 public void reportEconomyTick(int iterIndex) {
208 MonthlyReport report = SharedData.getData().getCurrentReport();
209 FDNode marketsNode = report.getNode(MonthlyReport.OUTPOSTS);
210
211 int payment = computePirateProtectionPaymentPerTick(intel);
212 if (payment <= 0) return;
213
214 FDNode paymentNode = report.getNode(marketsNode, "pirate_payment");
215 paymentNode.name = "Protection payment";
216 //paymentNode.custom = MonthlyReport.EXPORTS;
217 //paymentNode.mapEntity = market.getPrimaryEntity();
218 paymentNode.upkeep += payment;
219 paymentNode.tooltipCreator = this;
220 paymentNode.mapEntity = intel.getEntity();
221
222 paymentNode.icon = Global.getSettings().getSpriteName("income_report", "generic_expense");
223 //paymentNode.icon = intel.getIcon();
224 //}
225 }
226
227 public void reportEconomyMonthEnd() {
228
229 }
230
231 public void createTooltip(TooltipMakerAPI tooltip, boolean expanded, Object tooltipParam) {
232 float opad = 10f;
233 tooltip.addSpacer(-10f);
234 tooltip.addPara("Protection payment to the " + intel.getBaseCommander().getPost() + " of " +
235 intel.getEntity().getName() + ". The pirate base is located in the " +
236 intel.getSystem().getNameWithLowercaseTypeShort() + ".", opad);
237 }
238
239 public float getTooltipWidth(Object tooltipParam) {
240 return 450;
241 }
242
243 public boolean isTooltipExpandable(Object tooltipParam) {
244 return false;
245 }
246
247 public void advance(float amount) {
248 if (isDone()) return;
249
250 if (intel.isEnded() || intel.isEnding()) {
251 if (intel.playerHasDealWithBaseCommander()) {
252 // the "station destroyed by mercs (or whoever)" case
253 intel.setPlayerHasDealWithBaseCommander(false);
254 }
255 setDone();
256 return;
257 }
258
259
260 if (intel.playerHasDealWithBaseCommander() && intel.getSystem().isCurrentLocation()) {
261 CampaignFleetAPI station = Misc.getStationFleet(intel.getEntity());
262 List<CampaignFleetAPI> fleets = new ArrayList<CampaignFleetAPI>(intel.getSystem().getFleets());
263 fleets.add(station);
264 for (CampaignFleetAPI fleet : fleets) {
265 MarketAPI source = Misc.getSourceMarket(fleet);
266 if (source == intel.getMarket() || fleet == station) {// &&
267 //fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE)) {
268 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(),
269 MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE, "psk_deal", true, 0.1f);
270 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_ALLOW_PLAYER_BATTLE_JOIN_TOFF, true, 0.1f);
271 }
272 }
273 }
274
275 float days = Global.getSector().getClock().convertToDays(amount);
276 untilMercCheck -= days;
277 if (untilMercCheck < 0) untilMercCheck = 0;
278
279 if (spawnMerc) {
280 spawnMerc();
281 spawnMerc = false;
282 }
283 }
284
285 public void reportFleetDespawnedToListener(CampaignFleetAPI fleet, FleetDespawnReason reason, Object param) {
286 }
287
288 public void reportBattleOccurred(CampaignFleetAPI fleet, CampaignFleetAPI primaryWinner, BattleAPI battle) {
289 if (!battle.isPlayerInvolved()) return;
290
291 CampaignFleetAPI station = Misc.getStationFleet(intel.getEntity());
292 if (station == null) return;
293 if (intel.getEntity() == null) return;
294 LocationAPI cLoc = null;
295 if (fleet != null) cLoc = fleet.getContainingLocation();
296 if (cLoc == null && primaryWinner != null) cLoc = primaryWinner.getContainingLocation();
297 if (intel.getEntity().getContainingLocation() != cLoc) {
298 return;
299 }
300
301 for (CampaignFleetAPI curr : battle.getNonPlayerSideSnapshot()) {
302 if (!curr.knowsWhoPlayerIs() && curr != station) continue;
303
304 MarketAPI source = Misc.getSourceMarket(curr);
305
306 if (source == intel.getMarket() || curr == station) {
307 endDeal(false, null);
308 return;
309 }
310 }
311 }
312
313 public void reportRaidForValuablesFinishedBeforeCargoShown(InteractionDialogAPI dialog, MarketAPI market, TempData actionData, CargoAPI cargo) {
314 if (market == intel.getMarket() && !actionData.secret && !cargo.isEmpty()) {
315 endDeal(false, dialog);
316 }
317 }
318
319 public void reportRaidToDisruptFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData, Industry industry) {
320 if (market == intel.getMarket() && !actionData.secret) {
321 endDeal(false, dialog);
322 }
323 }
324
325 public void reportTacticalBombardmentFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData) {
326 if (market == intel.getMarket() && !actionData.secret) {
327 endDeal(false, dialog);
328 }
329 }
330
331 public void reportSaturationBombardmentFinished(InteractionDialogAPI dialog, MarketAPI market, TempData actionData) {
332 if (market == intel.getMarket() && !actionData.secret) {
333 endDeal(false, dialog);
334 }
335 }
336
337 public void endDeal(boolean amicable, InteractionDialogAPI dialog) {
338 if (!intel.playerHasDealWithBaseCommander()) return;
339
340 TextPanelAPI textPanel = dialog == null ? null : dialog.getTextPanel();
341
342 intel.setPlayerHasDealWithBaseCommander(false);
343
344 if (amicable) {
345 intel.sendUpdateIfPlayerHasIntel(PirateBaseIntel.DEAL_CANCELLED_PARAM, textPanel);
346 } else {
347 intel.sendUpdateIfPlayerHasIntel(PirateBaseIntel.DEAL_BROKEN_PARAM, textPanel);
348 }
349
350 if (!amicable) {
351 Misc.incrUntrustwortyCount();
352 }
353
354 if (amicable) {
355 Misc.adjustRep(intel.getBaseCommander(), -(RepRewards.HIGH + 0.01f), textPanel);
356 Misc.adjustRep(intel.getBaseCommander().getFaction().getId(), -(RepRewards.MEDIUM + 0.01f), textPanel);
357 } else {
358 Misc.adjustRep(intel.getBaseCommander(), -(RepRewards.HIGH * 2f), textPanel);
359 Misc.adjustRep(intel.getBaseCommander().getFaction().getId(), -(RepRewards.MEDIUM * 2f), textPanel);
360 }
361
362
363 CampaignFleetAPI station = Misc.getStationFleet(intel.getEntity());
364 List<CampaignFleetAPI> fleets = new ArrayList<CampaignFleetAPI>(intel.getSystem().getFleets());
365 fleets.add(station);
366 for (CampaignFleetAPI fleet : fleets) {
367 MarketAPI source = Misc.getSourceMarket(fleet);
368 if (source == intel.getMarket() || fleet == station) {// &&
369 //fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE)) {
370 Misc.setFlagWithReason(fleet.getMemoryWithoutUpdate(),
371 MemFlags.MEMORY_KEY_MAKE_NON_HOSTILE, "psk_deal", false, 0);
372 fleet.getMemoryWithoutUpdate().unset(MemFlags.MEMORY_KEY_ALLOW_PLAYER_BATTLE_JOIN_TOFF);
373 }
374 }
375
376 setDone();
377 }
378
379 public void reportCurrentLocationChanged(LocationAPI prev, LocationAPI curr) {
380 if (curr == intel.getSystem()) {
381 float prob = Global.getSettings().getFloat("pirateProtectionMercSpawnChance");
382 prob *= mercProbMult;
383
384 // uhcomment to spawn merc whenever the player enters the system with the base
385// untilMercCheck = 0f;
386// prob = 1f;
387
388 if (untilMercCheck <= 0 && random.nextFloat() < prob) {
389 mercProbMult *= Global.getSettings().getFloat("pirateProtectionMercSpawnChanceMult");
390 spawnMerc = true;
391 resetMercCheckDelay();
392 }
393 }
394 }
395
396 public void spawnMerc() {
397
398 CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
399
400 JumpPointAPI jp = Misc.findNearestJumpPointTo(pf);
401 float dist = Misc.getDistance(pf, jp);
402 if (dist > 500f) {
403 return;
404 }
405
406 float f = 10f;
407 StarSystemAPI system = intel.getSystem();
408 int difficulty = 0;
409
410
411 PirateBaseTier tier = intel.getTier();
412 switch (tier) {
413 case TIER_1_1MODULE: difficulty = 3; break;
414 case TIER_2_1MODULE: difficulty = 4; break;
415 case TIER_3_2MODULE: difficulty = 5; break;
416 case TIER_4_3MODULE: difficulty = 6; break;
417 case TIER_5_3MODULE: difficulty = 7; break;
418 }
419 difficulty += random.nextInt(3);
420
421
422 FleetCreatorMission m = new FleetCreatorMission(random);
423 m.beginFleet();
424
425 Vector2f hLoc = system.getLocation();
426 m.createQualityFleet(difficulty, Factions.MERCENARY, hLoc);
427 //m.triggerFleetAllowLongPursuit();
428 m.triggerSetFleetFaction(Factions.INDEPENDENT);
429 m.triggerMakeLowRepImpact();
430 m.triggerFleetSetAllWeapons();
431 m.triggerFleetMakeImportantPermanent(null);
432 m.triggerSetFleetMemoryValue("$psk_merc", true);
433
434 CampaignFleetAPI fleet = m.createFleet();
435 if (fleet != null) {
436
437 system.addEntity(fleet);
438
439 Vector2f loc = new Vector2f(pf.getLocation());
440 loc = Misc.getPointAtRadius(loc, 400f);
441 fleet.setLocation(loc.x, loc.y);
442 SectorEntityToken e = system.createToken(loc);
443 fleet.addAssignment(FleetAssignment.ORBIT_AGGRESSIVE, e, 2f + 3f * random.nextFloat(), "preparing to attack " + intel.getEntity().getName());
444 //CampaignFleetAPI station = Misc.getStationFleet(intel.getEntity());
445 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, intel.getEntity(), 20f, "moving to attack " + intel.getEntity().getName());
446 //Misc.giveStandardReturnToSourceAssignments(fleet, false);
447 fleet.addScript(new MissionFleetAutoDespawn(null, fleet));
448
449 fleet.addAssignmentAtStart(FleetAssignment.INTERCEPT, pf, 1f, null);
450
451 }
452
453 }
454 }
455
456 protected SectorEntityToken other;
457
458 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
459 if (dialog == null) return false;
460
461 OptionPanelAPI options = dialog.getOptionPanel();
462 TextPanelAPI text = dialog.getTextPanel();
463 CampaignFleetAPI pf = Global.getSector().getPlayerFleet();
464 other = dialog.getInteractionTarget();
465 CargoAPI cargo = pf.getCargo();
466
467
468 String action = params.get(0).getString(memoryMap);
469
470 MemoryAPI memory = memoryMap.get(MemKeys.LOCAL);
471 if (memory == null) return false; // should not be possible unless there are other big problems already
472
473
474 //MarketAPI market = dialog.getInteractionTarget().getMarket();
475 StarSystemAPI system = null;
476 if (dialog.getInteractionTarget().getContainingLocation() instanceof StarSystemAPI) {
477 system = (StarSystemAPI) dialog.getInteractionTarget().getContainingLocation();
478 }
479
480 if ("baseInvolved".equals(action)) {
481 if (system == null) return false;
482 PirateBaseIntel base = PirateBaseIntel.getIntelFor(dialog.getInteractionTarget());
483 if (base == null) return false;
484
485 return baseInvolved(system, base);
486 } else if ("addStationKingScript".equals(action)) {
487 Global.getSoundPlayer().playUISound("ui_rep_raise", 1f, 1f);
488 PirateBaseIntel base = PirateBaseIntel.getIntelFor(dialog.getInteractionTarget());
489 if (base == null) return false;
490 base.getSystem().addScript(new StationKingScript(base));
491
492 // feels extraneous given the below also sending an update
493 //base.sendUpdate(PirateBaseIntel.DEAL_MADE_PARAM, text);
494
495 HostileActivityEventIntel ha = HostileActivityEventIntel.get();
496 if (ha != null) {
497 int tier = base.getTier().ordinal();
498 if (tier < 0) tier = 0;
499 if (tier > 4) tier = 4;
500 int points = -1 * Global.getSettings().getIntFromArray("HA_pirateBase", tier);
501 HAPirateKingDealFactor factor = new HAPirateKingDealFactor(points);
502 ha.addFactor(factor, dialog);
503 }
504
505 Misc.adjustRep(base.getBaseCommander(), RepRewards.HIGH, text);
506 Misc.adjustRep(base.getBaseCommander().getFaction().getId(), RepRewards.MEDIUM, text);
507 } else if ("endStationKingDeal".equals(action)) {
508 PirateBaseIntel base = PirateBaseIntel.getIntelFor(dialog.getInteractionTarget());
509 if (base == null) return false;
510 for (EveryFrameScript curr : base.getSystem().getScripts()) {
511 if (curr instanceof StationKingScript) {
512 StationKingScript script = (StationKingScript) curr;
513 script.endDeal(true, dialog);
514 return true;
515 }
516 }
517 return false;
518 } else if ("playerColoniesHavePatherActvity".equals(action)) {
519 for (MarketAPI market : Misc.getPlayerMarkets(false)) {
520 float interest = LuddicPathBaseManager.getLuddicPathMarketInterest(market);
521 if (market.hasCondition(Conditions.PATHER_CELLS) && interest > 0) {
522 return true;
523 }
524 }
525// for (IntelInfoPlugin intel : Global.getSector().getIntelManager().getIntel(HostileActivityIntel.class)) {
526// HostileActivityIntel curr = (HostileActivityIntel) intel;
527// HostileActivityPlugin a = curr.getActivityOfClass(LuddicPathHostileActivityPluginImpl.class);
528// if (a != null && a.getEffectMagnitude() > 0f) {
529// return true;
530// }
531// }
532 } else if ("payMegaTithe".equals(action)) {
533 int megaTithe = memory.getInt("$LP_megaTithe");
534 int dur = memory.getInt("$LP_megaTitheDuration");
535 cargo.getCredits().subtract(megaTithe);
536 AddRemoveCommodity.addCreditsLossText(megaTithe, text);
537 if (cargo.getCredits().get() <= 0) {
538 cargo.getCredits().set(0);
539 }
540 setPatherAgreement(true, dur);
541 LuddicPathHostileActivityFactor.avertOrAbortAttack();
542
543 final String factionId = Factions.LUDDIC_PATH;
544 float range = 100000f;
545 List<CampaignFleetAPI> fleets = Misc.findNearbyFleets(pf, range, new FleetFilter() {
546 public boolean accept(CampaignFleetAPI curr) {
547 return curr.getFaction().getId().equals(factionId);
548 }
549 });
550
551 for (CampaignFleetAPI curr : fleets) {
552 if (curr.getAI() != null) {
553 curr.getAI().setActionTextOverride(null);
554 }
555 if (curr.getAI() instanceof ModularFleetAIAPI) {
556 ModularFleetAIAPI mAI = (ModularFleetAIAPI) curr.getAI();
557 mAI.getTacticalModule().forceTargetReEval();
558 }
559 Misc.giveStandardReturnToSourceAssignments(curr, true);
560 }
561
562 HostileActivityEventIntel ha = HostileActivityEventIntel.get();
563 if (ha != null) {
564 int points = -1 * Global.getSettings().getInt("HA_megaTithe");
565 HALuddicPathDealFactor factor = new HALuddicPathDealFactor(points);
566 ha.addFactor(factor, dialog);
567 }
568
569 return true;
570 } else if ("gavePKToPather".equals(action)) {
571 HostileActivityEventIntel ha = HostileActivityEventIntel.get();
572 if (ha != null) {
573 int points = -1 * Global.getSettings().getInt("HA_givePK");
574 HALuddicPathDealFactor factor = new HALuddicPathDealFactor(points);
575 ha.addFactor(factor, dialog);
576 }
577 LuddicPathHostileActivityFactor.avertOrAbortAttack();
578 } else if ("computeMegaTithe".equals(action)) {
579 float credits = cargo.getCredits().get();
580
581 float normalTithe = (int) Global.getSector().getPlayerFleet().getFleetPoints() * 200;
582
583 int tithe = 0;
584
585 float tithePerPointPerColonySize = Global.getSettings().getFloat("luddicPathTithePerPointOfInterestPerColonySize");
586 int titheDuration = Global.getSettings().getInt("luddicPathTitheDurationDays");
587
588 for (MarketAPI market : Misc.getPlayerMarkets(false)) {
589 float interest = LuddicPathBaseManager.getLuddicPathMarketInterest(market);
590 interest += market.getSize();
591 tithe += interest * market.getSize() * tithePerPointPerColonySize;
592 }
593
594 tithe += normalTithe;
595
596 tithe = (int) Misc.getRounded(tithe);
597
598 memoryMap.get(MemKeys.LOCAL).set("$LP_megaTithe", (int)tithe, 0);
599 memoryMap.get(MemKeys.LOCAL).set("$LP_megaTitheDGS", Misc.getWithDGS(tithe), 0);
600 memoryMap.get(MemKeys.LOCAL).set("$LP_megaTitheDuration", titheDuration, 0);
601
602 return tithe > 0;
603 } else if ("kazeronInstallNanoforge".equals(action)) {
604 MarketAPI kazeron = PerseanLeagueHostileActivityFactor.getKazeron(false);
605 if (kazeron != null) {
606 SpecialItemData data = new SpecialItemData(Items.PRISTINE_NANOFORGE, null);
607 for (Industry ind : kazeron.getIndustries()) {
608 if (ind.wantsToUseSpecialItem(data)) {
609 ind.setSpecialItem(data);
610 break;
611 }
612 }
613 }
614 } else if ("kazeronNanoforgeMissing".equals(action)) {
615 MarketAPI kazeron = PerseanLeagueHostileActivityFactor.getKazeron(false);
616 if (kazeron == null) return true;
617 for (Industry ind : kazeron.getIndustries()) {
618 if (ind.getSpecialItem() == null) continue;
619 if (ind.getSpecialItem().getId().equals(Items.PRISTINE_NANOFORGE)) {
620 return false;
621 }
622 }
623 return true;
624 } else if ("stopPayingHouseHannan".equals(action)) {
625 PerseanLeagueMembership.stopPayingHouseHannan(params.get(1).getBoolean(memoryMap), dialog);
626// PerseanLeagueMembership.setPayingHouseHannan(false);
627// Misc.incrUntrustwortyCount();
628 } else if ("leaveLeague".equals(action)) {
629 PerseanLeagueMembership m = PerseanLeagueMembership.get();
630 if (m != null) {
631 // do this here so that the intel is shown; would also happen automatically
632 // when the membership is ended
633 PerseanLeagueMembership.stopPayingHouseHannan(false, dialog);
634
635 m.endMembership(AgreementEndingType.ENDED, dialog);
636 //m.sendUpdate(new Object(), dialog.getTextPanel());
637 }
638 } else if ("printTriTachDealRepReq".equals(action)) {
639 FactionAPI triTach = Global.getSector().getFaction(Factions.TRITACHYON);
640 CoreReputationPlugin.addRequiredStanding(triTach, RepLevel.INHOSPITABLE, null, dialog.getTextPanel(), null, null, 0f, true);
641 CoreReputationPlugin.addCurrentStanding(triTach, null, dialog.getTextPanel(), null, null, 0f);
642 } else if ("isTTCRInProgress".equals(action)) {
643 return TriTachyonCommerceRaiding.get() != null;
644 } else if ("isTTRaidingPlayerCommerce".equals(action)) {
645 HostileActivityEventIntel intel = HostileActivityEventIntel.get();
646 if (intel != null) {
647 EventFactor factor = intel.getFactorOfClass(TriTachyonHostileActivityFactor.class);
648 if (factor instanceof TriTachyonHostileActivityFactor) {
649 TriTachyonHostileActivityFactor ttFactor = (TriTachyonHostileActivityFactor) factor;
650 return ttFactor.getProgress(intel) > 0;
651 }
652 }
653 } else if ("makeTriTachDeal".equals(action)) {
654 if (TriTachyonDeal.get() == null) {
655 new TriTachyonDeal(dialog);
656 }
657 } else if ("breakTriTachDeal".equals(action)) {
658 if (TriTachyonDeal.get() != null) {
659 TriTachyonDeal.get().endAgreement(com.fs.starfarer.api.impl.campaign.intel.TriTachyonDeal.AgreementEndingType.BROKEN, dialog);
660 }
661 } else if ("printLCDealRepReq".equals(action)) {
662 FactionAPI luddicChurch = Global.getSector().getFaction(Factions.LUDDIC_CHURCH);
663 CoreReputationPlugin.addRequiredStanding(luddicChurch, RepLevel.INHOSPITABLE, null, dialog.getTextPanel(), null, null, 0f, true);
664 CoreReputationPlugin.addCurrentStanding(luddicChurch, null, dialog.getTextPanel(), null, null, 0f);
665 } else if ("breakLCDeal".equals(action)) {
666 if (LuddicChurchImmigrationDeal.get() != null) {
667 LuddicChurchImmigrationDeal.get().endAgreement(com.fs.starfarer.api.impl.campaign.intel.LuddicChurchImmigrationDeal.AgreementEndingType.BROKEN, dialog);
668 }
669 } else if ("KOLTakeoverInProgress".equals(action)) {
671 } else if ("makeLuddicChurchDeal".equals(action)) {
672 if (LuddicChurchImmigrationDeal.get() == null) {
673 new LuddicChurchImmigrationDeal(dialog);
674 }
675 } else if ("joinLeague".equals(action)) {
676 new PerseanLeagueMembership(dialog);
677
679 HegemonyHostileActivityFactor.avertInspectionIfNotInProgress();
680 } else if ("canJoinLeague".equals(action)) {
681 return canPlayerJoinTheLeague();
682 } else if ("isPLExpeditionInProgress".equals(action)) {
684 } else if ("isPLProtectingPlayerSpace".equals(action)) {
685 HostileActivityEventIntel intel = HostileActivityEventIntel.get();
686 if (intel != null) {
687 EventFactor factor = intel.getFactorOfClass(PerseanLeagueHostileActivityFactor.class);
688 if (factor instanceof PerseanLeagueHostileActivityFactor) {
689 PerseanLeagueHostileActivityFactor plFactor = (PerseanLeagueHostileActivityFactor) factor;
690 return plFactor.getProgress(intel) > 0;
691 }
692 }
693 } else if ("canSendPLPunitiveExpedition".equals(action)) {
695 } else if ("updateLeagueData".equals(action)) {
696 float duesF = Global.getSettings().getFloat("perseanLeagueFeeFraction");
697 float hannanF = Global.getSettings().getFloat("houseHannanFeeFraction");
698
699 memoryMap.get(MemKeys.LOCAL).set("$plDuesPercent", (int)Math.round(duesF * 100f) + "%", 0);
700 memoryMap.get(MemKeys.LOCAL).set("$hannanBribePercent", (int)Math.round(hannanF * 100f) + "%", 0);
701 return canPlayerJoinTheLeague();
702
703 } else if ("canRemakeDealWithHouseHannan".equals(action)) {
704 return GensHannanMachinations.canRemakeDealWithHouseHannan();
705 } else if ("endGHMachinations".equals(action)) {
706 GensHannanMachinations m = GensHannanMachinations.get();
707 if (m != null) {
708 m.endMachinations(text);
709 }
710 } else if ("doKOLTTakeover".equals(action)) {
711 KnightsOfLuddTakeoverExpedition takeover = KnightsOfLuddTakeoverExpedition.get();
712 if (takeover != null) {
713 takeover.performTakeover(true);
714 }
715 } else if ("updateKOLTArmadaData".equals(action)) {
716 KnightsOfLuddTakeoverExpedition takeover = KnightsOfLuddTakeoverExpedition.get();
717 if (takeover != null) {
718 MemoryAPI mem = memoryMap.get(MemKeys.LOCAL);
719 mem.set("$KOLT_target", takeover.getBlockadeParams().specificMarket.getName());
720 return true;
721 }
722 } else if ("updateTTMAData".equals(action)) {
723 MemoryAPI mem = memoryMap.get(MemKeys.LOCAL);
724
725// int bribe = Global.getSettings().getInt("triTachyonMercBribe");
726// int bribeSmall = bribe / 2;
727// mem.set("$bribeSmall", Misc.getWithDGS(bribeSmall));
728// mem.set("$bribe", Misc.getWithDGS(bribe));
729
730 TTMercenaryAttack attack = TTMercenaryAttack.get();
731 StarSystemAPI target = TriTachyonHostileActivityFactor.getPrimaryTriTachyonSystem();
732 boolean reversible = attack != null && !attack.isSpawning() && !attack.isFailed() &&
733 !attack.isSucceeded() && !attack.isAborted() && !attack.isEnding() && !attack.isEnded() &&
734 target != null;
735
736 mem.set("$attackReversible", reversible);
737 if (target != null) {
738 mem.set("$triTachSystem", target.getNameWithLowercaseTypeShort());
739 }
740 return true;
741
742 } else if ("retargetTTMA".equals(action)) {
743 TTMercenaryReversedAttack.sendReversedAttack(dialog);
744 } else if ("computeSacredProtectorsData".equals(action)) {
745 MemoryAPI mem = memoryMap.get(MemKeys.LOCAL);
746 int supplies = (int) Global.getSector().getPlayerFleet().getFleetPoints() * 1;
747 mem.set("$SP_supplies", (int)supplies, 0);
748 return true;
749 } else if ("sacredProtectorsCheckCargoPods".equals(action)) {
750 MemoryAPI mem = memoryMap.get(MemKeys.LOCAL);
751 int supplies = mem.getInt("$SP_supplies");
752 return sacredProtectorsCheckCargoPods(supplies);
753 } else if ("knightsHasslingPlayerColonies".equals(action)) {
754 HostileActivityEventIntel intel = HostileActivityEventIntel.get();
755 if (intel != null) {
756 HostileActivityCause2 cause = intel.getActivityCause(LuddicChurchHostileActivityFactor.class, LuddicChurchStandardActivityCause.class);
757 if (cause instanceof LuddicChurchStandardActivityCause) {
758 LuddicChurchStandardActivityCause lcCause = (LuddicChurchStandardActivityCause) cause;
759 return lcCause.getProgress() > 0;
760 }
761 }
762 } else if ("printSDDealRepReq".equals(action)) {
763 FactionAPI diktat = Global.getSector().getFaction(Factions.DERELICT);
764 CoreReputationPlugin.addRequiredStanding(diktat, RepLevel.INHOSPITABLE, null, dialog.getTextPanel(), null, null, 0f, true);
765 CoreReputationPlugin.addCurrentStanding(diktat, null, dialog.getTextPanel(), null, null, 0f);
766 } else if ("breakSDDeal".equals(action)) {
767 if (SindrianDiktatFuelDeal.get() != null) {
768 SindrianDiktatFuelDeal.get().endAgreement(com.fs.starfarer.api.impl.campaign.intel.SindrianDiktatFuelDeal.AgreementEndingType.BROKEN, dialog);
769 }
770 } else if ("makeDiktatDeal".equals(action)) {
771 if (SindrianDiktatFuelDeal.get() == null) {
772 new SindrianDiktatFuelDeal(dialog);
773 }
774 } else if ("diktatConcernedByFuelProd".equals(action)) {
775 HostileActivityEventIntel intel = HostileActivityEventIntel.get();
776 if (intel != null) {
777 HostileActivityCause2 cause = intel.getActivityCause(SindrianDiktatHostileActivityFactor.class, SindrianDiktatStandardActivityCause.class);
778 if (cause instanceof SindrianDiktatStandardActivityCause) {
779 SindrianDiktatStandardActivityCause lcCause = (SindrianDiktatStandardActivityCause) cause;
780 return lcCause.getProgress() > 0;
781 }
782 }
783 }
784
785// else if ("printLeagueRequirements".equals(action)) {
786//
787// }
788
789 return false;
790 }
791
792 public boolean sacredProtectorsCheckCargoPods(int remove) {
793 float maxPodsDist = 1500f;
794 for (SectorEntityToken entity : other.getContainingLocation().getAllEntities()) {
795 if (Entities.CARGO_PODS.equals(entity.getCustomEntityType())) {
796 VisibilityLevel vLevel = entity.getVisibilityLevelTo(other);
797 if (entity.getCustomPlugin() instanceof CargoPodsEntityPlugin) {
798 float dist = Misc.getDistance(other, entity);
799 if (dist > maxPodsDist) continue;
800
801 if (vLevel == VisibilityLevel.COMPOSITION_DETAILS ||
802 vLevel == VisibilityLevel.COMPOSITION_AND_FACTION_DETAILS) {
803 CargoPodsEntityPlugin plugin = (CargoPodsEntityPlugin) entity.getCustomPlugin();
804 if (plugin.getElapsed() <= 1f && entity.getCargo() != null) {
805 float supplies = entity.getCargo().getSupplies();
806 if (supplies >= remove) {
807 entity.getCargo().removeSupplies(remove * 2);
808 return true;
809 }
810 }
811 }
812 }
813 }
814 }
815 return false;
816 }
817
818
819 public static boolean isKOLTakeoverInProgress() {
820 return KnightsOfLuddTakeoverExpedition.get() != null &&
821 !KnightsOfLuddTakeoverExpedition.get().isSucceeded() &&
822 !KnightsOfLuddTakeoverExpedition.get().isAborted() &&
823 !KnightsOfLuddTakeoverExpedition.get().isFailed();
824 }
825
826 public static boolean isPLExpeditionInProgress() {
827 return PerseanLeaguePunitiveExpedition.get() != null &&
828 !PerseanLeaguePunitiveExpedition.get().isSucceeded() &&
829 !PerseanLeaguePunitiveExpedition.get().isAborted() &&
830 !PerseanLeaguePunitiveExpedition.get().isFailed();
831 }
832
833 public static void avertOrEndKOLTakeoverAsNecessary() {
834 KnightsOfLuddTakeoverExpedition takeover = KnightsOfLuddTakeoverExpedition.get();
835 if (takeover != null) {
836 takeover.finish(false);
837 }
838
839 HostileActivityEventIntel intel = HostileActivityEventIntel.get();
840 if (intel != null) {
841 HAERandomEventData data = intel.getRollDataForEvent();
842 if (data != null && data.factor instanceof LuddicChurchHostileActivityFactor) {
843 intel.resetHA_EVENT();
844 }
845 }
846 }
847
849 SindrianDiktatPunitiveExpedition attack = SindrianDiktatPunitiveExpedition.get();
850 if (attack != null) {
851 attack.finish(false);
852 }
853
854 HostileActivityEventIntel intel = HostileActivityEventIntel.get();
855 if (intel != null) {
856 HAERandomEventData data = intel.getRollDataForEvent();
857 if (data != null && data.factor instanceof SindrianDiktatHostileActivityFactor) {
858 intel.resetHA_EVENT();
859 }
860 }
861 }
862
863
864 public static void avertOrEndPLBlockadeAsNecessary() {
865 PerseanLeagueBlockade blockade = PerseanLeagueBlockade.get();
866 if (blockade != null) {
867 blockade.finish(false);
868 }
869
870 PerseanLeaguePunitiveExpedition expedition = PerseanLeaguePunitiveExpedition.get();
871 if (expedition != null) {
872 expedition.finish(false);
873 }
874
875 HostileActivityEventIntel intel = HostileActivityEventIntel.get();
876 if (intel != null) {
877 HAERandomEventData data = intel.getRollDataForEvent();
878 if (data != null && data.factor instanceof PerseanLeagueHostileActivityFactor) {
879 intel.resetHA_EVENT();
880 }
881 }
882 }
883
884 public static boolean canPlayerJoinTheLeague() {
885 if (isPLExpeditionInProgress()) return false;
886
887 if (PerseanLeagueMembership.isLeagueMember()) return false;
888 if (PerseanLeagueMembership.isLeftLeagueWhenGoodDeal()) return false;
889
890 if (PerseanLeagueHostileActivityFactor.wasPLEverSatBombardedByPlayer()) return false;
891 if (PerseanLeagueHostileActivityFactor.getKazeron(false) == null) return false;
892
893 if (PerseanLeagueMembership.getNumTimesLeftLeague() >= PerseanLeagueMembership.TIMES_LEFT_LEAGUE_FOR_NO_REJOIN) {
894 return false;
895 }
896
897 int large = 0;
898 int count = 0;
899 int medium = 0;
900 for (MarketAPI market : Misc.getPlayerMarkets(false)) {
901 int size = market.getSize();
902 if (size >= StandardPerseanLeagueActivityCause.LARGE_COLONY) {
903 large++;
904 }
905 if (size >= StandardPerseanLeagueActivityCause.MEDIUM_COLONY) {
906 medium++;
907 }
908 count++;
909 }
910 if (large > 0 || (medium > 0 && count >= StandardPerseanLeagueActivityCause.COUNT_IF_MEDIUM)) {
911 return true;
912 }
913 return false;
914 }
915
916 public static boolean baseInvolved(StarSystemAPI system, PirateBaseIntel base) {
917 if (system == null) return false;
918 if (base == null) return false;
919
920 return !PirateBasePirateActivityCause2.getColoniesAffectedBy(base).isEmpty();
921 }
922
923
924 public static class PLPunExData {
925 public HostileActivityEventIntel intel;
926 public StarSystemAPI target;
927 public MarketAPI kazeron;
928 }
929
932 }
933 public static PLPunExData computePerseanLeaguePunitiveExpeditionData() {
934 if (PerseanLeagueMembership.isDefeatedBlockadeOrPunEx()) {
935 return null;
936 }
938 return null;
939 }
940
941 HostileActivityEventIntel intel = HostileActivityEventIntel.get();
942 if (intel == null) return null;
943
944 StarSystemAPI target = PerseanLeagueHostileActivityFactor.findBlockadeTarget(intel, null);
945 if (target == null) return null;
946
947 MarketAPI kazeron = PerseanLeagueHostileActivityFactor.getKazeron(true);
948 if (kazeron == null) return null;
949
950 PLPunExData data = new PLPunExData();
951 data.intel = intel;
952 data.target = target;
953 data.kazeron = kazeron;
954 return data;
955 }
956
957 public static void sendPerseanLeaguePunitiveExpedition(InteractionDialogAPI dialog) {
958
960 if (data == null) {
961 return;
962 }
963
965
966 GenericRaidParams params = new GenericRaidParams(new Random(), true);
967 params.factionId = data.kazeron.getFactionId();
968 params.source = data.kazeron;
969
970 Random random = new Random();
971
972 params.prepDays = 14f + random.nextFloat() * 14f;
973 params.payloadDays = 27f + 7f * random.nextFloat();
974
975 params.raidParams.where = data.target;
976
977 Set<String> disrupt = new LinkedHashSet<String>();
978 for (MarketAPI market : Misc.getMarketsInLocation(data.target, Factions.PLAYER)) {
979 params.raidParams.allowedTargets.add(market);
980 params.raidParams.allowNonHostileTargets = true;
981 for (Industry ind : market.getIndustries()) {
982 if (ind.getSpec().hasTag(Industries.TAG_UNRAIDABLE)) continue;
983 disrupt.add(ind.getId());
984
985 }
986 }
987
988 // this is set in the custom fleet creation in PerseanLeaguePunitiveExpedition
989 //params.makeFleetsHostile = false;
990
991 params.raidParams.disrupt.addAll(disrupt);
992 params.raidParams.raidsPerColony = Math.min(disrupt.size(), 4);
993 if (disrupt.isEmpty()) {
994 params.raidParams.raidsPerColony = 2;
995 }
996
997 if (params.raidParams.allowedTargets.isEmpty()) {
998 return;
999 }
1000
1001 params.style = FleetStyle.STANDARD;
1002
1003
1004 float fleetSizeMult = data.kazeron.getStats().getDynamic().getMod(Stats.COMBAT_FLEET_SIZE_MULT).computeEffective(0f);
1005
1006 float f = data.intel.getMarketPresenceFactor(data.target);
1007
1008 float totalDifficulty = fleetSizeMult * 50f * (0.5f + 0.5f * f);
1009 if (totalDifficulty < 30) {
1010 return;
1011 }
1012 if (totalDifficulty > 100) {
1013 totalDifficulty = 100;
1014 }
1015
1016 Random r = data.intel.getRandom();
1017
1018 // mostly maxed-out fleets, some smaller ones
1019 while (totalDifficulty > 0) {
1020 float max = 6f;
1021 float min = 3f;
1022
1023 if (r.nextFloat() > 0.3f) {
1024 min = (int) Math.min(totalDifficulty, 8f);
1025 max = (int) Math.min(totalDifficulty, 10f);
1026 }
1027
1028 int diff = Math.round(StarSystemGenerator.getNormalRandom(r, min, max));
1029
1030 params.fleetSizes.add(diff);
1031 totalDifficulty -= diff;
1032 }
1033
1034 PerseanLeaguePunitiveExpedition punex = new PerseanLeaguePunitiveExpedition(params);
1035 punex.setPreFleetDeploymentDelay(30f + random.nextFloat() * 60f);
1036 //punex.setPreFleetDeploymentDelay(1f);
1037 TextPanelAPI text = dialog == null ? null : dialog.getTextPanel();
1038 Global.getSector().getIntelManager().addIntel(punex, false, text);
1039
1040 }
1041
1042
1043
1044}
1045
1046
1047
1048
1049
static SettingsAPI getSettings()
Definition Global.java:51
static SoundPlayerAPI getSoundPlayer()
Definition Global.java:43
static SectorAPI getSector()
Definition Global.java:59
static void addRequiredStanding(FactionAPI faction, RepLevel req, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, float pad, boolean orBetter)
static void addCurrentStanding(FactionAPI faction, PersonAPI person, TextPanelAPI panel, TooltipMakerAPI info, Color tc, float pad)
static void addCreditsLossText(int credits, TextPanelAPI text)
static int computePirateProtectionPaymentPerMonth(PirateBaseIntel intel)
Definition HA_CMD.java:136
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)
Definition HA_CMD.java:458
static int computePirateProtectionPaymentPerTick(PirateBaseIntel intel)
Definition HA_CMD.java:142
static PLPunExData computePerseanLeaguePunitiveExpeditionData()
Definition HA_CMD.java:933
static boolean baseInvolved(StarSystemAPI system, PirateBaseIntel base)
Definition HA_CMD.java:916
static void setPatherAgreement(boolean agreement, float duration)
Definition HA_CMD.java:107
static void sendPerseanLeaguePunitiveExpedition(InteractionDialogAPI dialog)
Definition HA_CMD.java:957
int getIntFromArray(String key, int index)
float getFloatFromArray(String key, int index)
SoundAPI playUISound(String id, float pitch, float volume)