1package com.fs.starfarer.api.impl.campaign;
4import java.util.ArrayList;
5import java.util.HashMap;
8import java.util.Random;
10import org.lwjgl.input.Keyboard;
12import com.fs.starfarer.api.Global;
13import com.fs.starfarer.api.campaign.BattleAPI;
14import com.fs.starfarer.api.campaign.BattleAPI.BattleSide;
15import com.fs.starfarer.api.campaign.CampaignFleetAPI;
16import com.fs.starfarer.api.campaign.CargoAPI;
17import com.fs.starfarer.api.campaign.CoreInteractionListener;
18import com.fs.starfarer.api.campaign.EngagementResultForFleetAPI;
19import com.fs.starfarer.api.campaign.FactionAPI;
20import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.DataForEncounterSide;
21import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.DisengageHarryAvailability;
22import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.EngagementOutcome;
23import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.PursueAvailability;
24import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.Status;
25import com.fs.starfarer.api.campaign.FleetMemberPickerListener;
26import com.fs.starfarer.api.campaign.InteractionDialogAPI;
27import com.fs.starfarer.api.campaign.InteractionDialogPlugin;
28import com.fs.starfarer.api.campaign.OptionPanelAPI;
29import com.fs.starfarer.api.campaign.RuleBasedDialog;
30import com.fs.starfarer.api.campaign.SectorEntityToken;
31import com.fs.starfarer.api.campaign.SectorEntityToken.VisibilityLevel;
32import com.fs.starfarer.api.campaign.TextPanelAPI;
33import com.fs.starfarer.api.campaign.VisualPanelAPI;
34import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI;
35import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.EncounterOption;
36import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.InitialBoardingResponse;
37import com.fs.starfarer.api.campaign.ai.CampaignFleetAIAPI.PursuitOption;
38import com.fs.starfarer.api.campaign.events.CampaignEventPlugin;
39import com.fs.starfarer.api.campaign.listeners.ListenerUtil;
40import com.fs.starfarer.api.campaign.rules.MemKeys;
41import com.fs.starfarer.api.campaign.rules.MemoryAPI;
42import com.fs.starfarer.api.campaign.rules.RuleAPI;
43import com.fs.starfarer.api.campaign.rules.RulesAPI;
44import com.fs.starfarer.api.characters.PersonAPI;
45import com.fs.starfarer.api.combat.BattleCreationContext;
46import com.fs.starfarer.api.combat.CombatReadinessPlugin;
47import com.fs.starfarer.api.combat.EngagementResultAPI;
48import com.fs.starfarer.api.fleet.CrewCompositionAPI;
49import com.fs.starfarer.api.fleet.FleetGoal;
50import com.fs.starfarer.api.fleet.FleetMemberAPI;
51import com.fs.starfarer.api.impl.campaign.FleetEncounterContext.BoardingResult;
52import com.fs.starfarer.api.impl.campaign.FleetEncounterContext.EngageBoardableOutcome;
53import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
54import com.fs.starfarer.api.impl.campaign.ids.Sounds;
55import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
56import com.fs.starfarer.api.impl.campaign.rulecmd.DumpMemory;
57import com.fs.starfarer.api.impl.campaign.rulecmd.FireBest;
58import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption;
59import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption.BaseOptionStoryPointActionDelegate;
60import com.fs.starfarer.api.impl.campaign.rulecmd.SetStoryOption.StoryOptionParams;
61import com.fs.starfarer.api.impl.campaign.skills.BaseSkillEffectDescription;
62import com.fs.starfarer.api.impl.combat.CRPluginImpl;
63import com.fs.starfarer.api.ui.LabelAPI;
64import com.fs.starfarer.api.ui.TooltipMakerAPI;
65import com.fs.starfarer.api.util.Misc;
66import com.fs.starfarer.api.util.Pair;
72 public static interface FIDConfigGen {
73 FIDConfig createConfig();
76 public static class FIDConfig {
77 public boolean showCommLinkOption =
true;
78 public boolean leaveAlwaysAvailable =
false;
79 public boolean showWarningDialogWhenNotHostile =
true;
80 public boolean showTransponderStatus =
true;
81 public boolean showFleetAttitude =
true;
82 public boolean showEngageText =
true;
83 public boolean alwaysAttackVsAttack =
false;
84 public boolean alwaysPursue =
false;
85 public boolean dismissOnLeave =
true;
86 public boolean withSalvage =
true;
87 public boolean lootCredits =
true;
89 public boolean showVictoryText =
true;
93 public boolean impactsEnemyReputation =
true;
94 public boolean impactsAllyReputation =
true;
96 public boolean pullInAllies =
true;
97 public boolean pullInEnemies =
true;
98 public boolean pullInStations =
true;
101 public String noSalvageLeaveOptionText =
null;
102 public String firstTimeEngageOptionText =
null;
103 public String afterFirstTimeEngageOptionText =
null;
105 public FIDDelegate delegate =
null;
106 public boolean printXPToDialog =
false;
108 public boolean justShowFleets =
false;
109 public boolean showPullInText =
true;
111 public boolean straightToEngage =
false;
112 public boolean playerAttackingStation =
false;
113 public boolean playerDefendingStation =
false;
116 public Random salvageRandom =
null;
119 public static interface FIDDelegate {
120 public void postPlayerSalvageGeneration(InteractionDialogAPI
dialog, FleetEncounterContext
context, CargoAPI salvage);
121 public void battleContextCreated(InteractionDialogAPI
dialog, BattleCreationContext bcc);
122 public void notifyLeave(InteractionDialogAPI
dialog);
125 public static class BaseFIDDelegate
implements FIDDelegate {
126 public void battleContextCreated(InteractionDialogAPI
dialog, BattleCreationContext bcc) {}
127 public void notifyLeave(InteractionDialogAPI
dialog) {}
128 public void postPlayerSalvageGeneration(InteractionDialogAPI
dialog, FleetEncounterContext
context, CargoAPI salvage) {}
134 protected static enum VisualType {
140 public static enum OptionId {
142 PRINT_ONGOING_BATTLE_INFO,
143 BEGIN_FLEET_ENCOUNTER_2,
148 ATTEMPT_TO_DISENGAGE,
164 CONTINUE_FROM_VICTORY_TRIGGERS,
166 CONTINUE_INTO_BATTLE,
168 CONTINUE_INTO_BOARDING,
173 ABORT_BOARDING_ACTION,
175 LAUNCH_ASSAULT_TEAMS,
185 CONTINUE_ONGOING_BATTLE,
210 protected static final Color
ENEMY_COLOR = Misc.getNegativeHighlightColor();
236 this.config = params;
242 for (FleetMemberAPI member :
Global.
getSector().getPlayerFleet().getFleetData().getMembersListCopy()) {
253 private boolean skipAttitudeOnInit =
false;
254 public void reinit(
boolean withContinueOnRuleFound) {
257 if (rule ==
null || !withContinueOnRuleFound) {
261 options.addOption(
"Continue", OptionId.REINIT_CONTINUE,
null);
283 options.addOption(
"Continue", OptionId.BEGIN_FLEET_ENCOUNTER_2);
297 if (this.config ==
null) {
298 MemoryAPI memory =
dialog.getInteractionTarget().getMemoryWithoutUpdate();
302 if (memory.contains(MemFlags.FLEET_INTERACTION_DIALOG_CONFIG_OVERRIDE_GEN)) {
303 this.config = ((FIDConfigGen) memory.get(MemFlags.FLEET_INTERACTION_DIALOG_CONFIG_OVERRIDE_GEN)).createConfig();
305 this.config =
new FIDConfig();
314 dialog.setOptionOnEscape(
"dev mode exit", OptionId.DEV_MODE_ESCAPE);
315 dialog.setOptionOnConfirm(
"dev mode exit", OptionId.DEV_MODE_ESCAPE);
348 fleet.inflateIfNeeded();
352 visual.setVisualFade(0.25f, 0.25f);
353 if (!
config.straightToEngage) {
356 String titleOne = b.getPrimary(b.getSideOne()).getNameWithFactionKeepCase();
357 if (b.getSideOne().size() > 1) titleOne +=
", with allies";
358 String titleTwo = b.getPrimary(b.getSideTwo()).getNameWithFactionKeepCase();
359 if (b.getSideTwo().size() > 1) titleTwo +=
", with allies";
375 if (!
config.justShowFleets) {
393 options.addOption(
"Continue", OptionId.BEGIN_FLEET_ENCOUNTER_2);
402 if (
config.straightToEngage) {
421 protected List<CampaignFleetAPI>
pulledIn =
new ArrayList<CampaignFleetAPI>();
428 BattleSide playerSide = b.pickSide(
Global.
getSector().getPlayerFleet());
437 CampaignFleetAPI actualOther = (CampaignFleetAPI) (
dialog.getInteractionTarget());
443 if (
config.pullInStations && !b.isStationInvolved()) {
444 SectorEntityToken closestEntity =
null;
445 CampaignFleetAPI closest =
null;
446 Pair<SectorEntityToken, CampaignFleetAPI> p = Misc.getNearestStationInSupportRange(actualOther);
448 closestEntity = p.one;
452 if (closest !=
null) {
453 BattleSide joiningSide = b.pickSide(closest,
true);
454 boolean canJoin = joiningSide != BattleSide.NO_JOIN;
455 if (!
config.pullInAllies && joiningSide == playerSide) {
458 if (!
config.pullInEnemies && joiningSide != playerSide) {
461 if (b == closest.getBattle()) {
464 if (closest.getBattle() !=
null) {
469 if (closestEntity !=
null) {
470 closestEntity.getMarket().reapplyIndustries();
475 if (!
config.straightToEngage &&
config.showPullInText) {
476 if (b.getSide(playerSide) == b.getSideFor(closest)) {
478 Misc.ucFirst(closest.getNameWithFactionKeepCase()) +
": supporting your forces.");
481 textPanel.addParagraph(Misc.ucFirst(closest.getNameWithFactionKeepCase()) +
": supporting the enemy.");
483 textPanel.addParagraph(Misc.ucFirst(closest.getNameWithFactionKeepCase()) +
": supporting the opposing side.");
486 textPanel.highlightFirstInLastPara(closest.getNameWithFactionKeepCase() +
":", closest.getFaction().getBaseUIColor());
493 for (CampaignFleetAPI fleet : actualPlayer.getContainingLocation().getFleets()) {
494 if (b == fleet.getBattle())
continue;
495 if (fleet.getBattle() !=
null)
continue;
497 if (fleet.isStationMode())
continue;
499 float dist = Misc.getDistance(actualOther.getLocation(), fleet.getLocation());
500 dist -= actualOther.getRadius();
501 dist -= fleet.getRadius();
506 if (fleet.getFleetData().getNumMembers() <= 0)
continue;
508 float baseSensorRange =
playerFleet.getBaseSensorRangeToDetect(fleet.getSensorProfile());
509 boolean visible = fleet.isVisibleToPlayerFleet();
510 VisibilityLevel level = fleet.getVisibilityLevelToPlayerFleet();
515 float joinRange = Misc.getBattleJoinRange();
516 if (fleet.getFaction().isPlayerFaction() && !fleet.isStationMode()) {
519 if (dist < joinRange &&
520 (dist < baseSensorRange || (visible && level != VisibilityLevel.SENSOR_CONTACT)) &&
521 ((fleet.getAI() !=
null && fleet.getAI().wantsToJoin(b,
true)) || fleet.isStationMode())) {
523 boolean ignore = fleet.getMemoryWithoutUpdate() !=
null &&
524 fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.FLEET_IGNORES_OTHER_FLEETS);
525 if (ignore)
continue;
527 BattleSide joiningSide = b.pickSide(fleet,
true);
528 if (!
config.pullInAllies && joiningSide == playerSide)
continue;
529 if (!
config.pullInEnemies && joiningSide != playerSide)
continue;
534 if (!
config.straightToEngage &&
config.showPullInText) {
535 if (b.getSide(playerSide) == b.getSideFor(fleet)) {
536 textPanel.addParagraph(Misc.ucFirst(fleet.getNameWithFactionKeepCase()) +
": supporting your forces.");
539 textPanel.addParagraph(Misc.ucFirst(fleet.getNameWithFactionKeepCase()) +
": joining the enemy.");
541 textPanel.addParagraph(Misc.ucFirst(fleet.getNameWithFactionKeepCase()) +
": supporting the opposing side.");
544 textPanel.highlightFirstInLastPara(fleet.getNameWithFactionKeepCase() +
":", fleet.getFaction().getBaseUIColor());
551 for (CampaignFleetAPI curr :
pulledIn) {
552 curr.inflateIfNeeded();
563 if (!
config.straightToEngage) {
576 EngagementResultForFleetAPI player = result.didPlayerWin() ? result.getWinnerResult() : result.getLoserResult();
577 EngagementResultForFleetAPI other = result.didPlayerWin() ? result.getLoserResult() : result.getWinnerResult();
578 if (player.getDeployed().isEmpty()) {
590 if (!
otherFleet.getMemoryWithoutUpdate().contains(MemFlags.MEMORY_KEY_IGNORE_PLAYER_COMMS)) {
591 otherFleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_IGNORE_PLAYER_COMMS,
true, 0);
600 boolean startedWithAllies =
false;
611 options.addOption(
"Leave", OptionId.LEAVE,
null);
612 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
620 if (captain !=
null && !captain.isPlayer()) {
634 boolean totalDefeat = !
playerFleet.isValidPlayerFleet();
638 CrewCompositionAPI crewLosses = playerSide.getCrewLossesDuringLastEngagement();
639 if ((
int)crewLosses.getCrewInt() + (
int)crewLosses.getMarines() > 0 && !totalDefeat && !mutualDestruction) {
643 int crewLost = (int) (data.getCrewLossesDuringLastEngagement().getCrewInt());
644 int marinesLost = (int) (data.getCrewLossesDuringLastEngagement().getMarines());
646 if (crewLostStr.equals(
"no")) crewLostStr =
"";
647 if (crewLostStr.indexOf(
" ") >= 0) {
648 crewLostStr = crewLostStr.substring(crewLostStr.indexOf(
" ") + 1);
651 if (marinesLostStr.equals(
"no")) marinesLostStr =
"";
652 if (marinesLostStr.indexOf(
" ") >= 0) {
653 marinesLostStr = marinesLostStr.substring(marinesLostStr.indexOf(
" ") + 1);
661 case PURSUIT_PLAYER_OUT_FIRST_WIN:
665 case PURSUIT_PLAYER_OUT_FIRST_LOSS:
669 case BATTLE_PLAYER_OUT_FIRST_WIN:
673 case BATTLE_PLAYER_OUT_FIRST_LOSS:
677 case ESCAPE_PLAYER_OUT_FIRST_WIN:
681 case ESCAPE_PLAYER_OUT_FIRST_LOSS:
685 case BATTLE_ENEMY_WIN:
690 case BATTLE_ENEMY_WIN_TOTAL:
694 case BATTLE_PLAYER_WIN:
695 if (
config.showVictoryText) {
700 case BATTLE_PLAYER_WIN_TOTAL:
701 if (
config.showVictoryText) {
706 case ESCAPE_ENEMY_LOSS_TOTAL:
707 if (
config.showVictoryText) {
712 case ESCAPE_ENEMY_SUCCESS:
713 if (result.getLoserResult().getDisabled().isEmpty() && result.getLoserResult().getDestroyed().isEmpty()) {
720 case ESCAPE_ENEMY_WIN:
724 case ESCAPE_ENEMY_WIN_TOTAL:
728 case ESCAPE_PLAYER_LOSS_TOTAL:
732 case ESCAPE_PLAYER_SUCCESS:
736 case ESCAPE_PLAYER_WIN:
740 case ESCAPE_PLAYER_WIN_TOTAL:
744 case MUTUAL_DESTRUCTION:
749 if (mutualDestruction) {
751 for (FleetMemberAPI member : result.getLoserResult().getDisabled()) {
752 otherData.addEnemy(member, Status.DISABLED);
758 if (last == EngagementOutcome.BATTLE_PLAYER_OUT_FIRST_LOSS ||
759 last == EngagementOutcome.BATTLE_PLAYER_OUT_FIRST_WIN) {
761 if (recoveryFraction > 0) {
766 if (recoveryFraction > 0) {
783 if (
config.straightToEngage) {
804 if (!
config.showFleetAttitude)
return;
809 if (!otherWantsToRun) {
842 List<FleetMemberAPI> members =
new ArrayList<FleetMemberAPI>();
843 for (FleetMemberAPI member :
playerFleet.getFleetData().getMembersListCopy()) {
844 if (member.isAlly())
continue;
845 if (member.isCivilian())
continue;
852 if (optionData ==
null)
return;
864 if (optionData == DumpMemory.OPTION_ID) {
873 if (optionData instanceof String) {
879 OptionId option = (OptionId) optionData;
887 dialog.addOptionSelectedText(option);
891 case PRINT_ONGOING_BATTLE_INFO:
898 BattleSide sideAssumingTransponderOn = b.pickSide(
playerFleet,
false);
900 if (!
config.straightToEngage) {
901 if (side == sideAssumingTransponderOn && side == BattleSide.NO_JOIN) {
903 }
else if (side != sideAssumingTransponderOn && side == BattleSide.NO_JOIN) {
918 BattleSide sideAssumingTransponderOn = b.pickSide(
playerFleet,
false);
920 if (!
config.straightToEngage) {
921 if (side == sideAssumingTransponderOn && side == BattleSide.NO_JOIN) {
923 }
else if (side != sideAssumingTransponderOn && side == BattleSide.NO_JOIN) {
937 if (!skipAttitudeOnInit) {
942 if (
config.showFleetAttitude) {
943 boolean hasStation =
false;
944 boolean allStation =
true;
946 allStation &= curr.isStationMode();
947 hasStation |= curr.isStationMode();
982 if (!
otherFleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_SKIP_TRANSPONDER_STATUS_INFO)) {
990 if (actualPlayer.isTransponderOn()) {
993 if (actualPlayer.hasShipsWithUniqueSig()) {
1006 case REINIT_CONTINUE:
1009 case INITIATE_BATTLE:
1044 case JOIN_ONGOING_BATTLE:
1047 for (CampaignFleetAPI fleet : b.getBothSides()) {
1048 fleet.inflateIfNeeded();
1053 CampaignFleetAPI prePlayerAllies = b.getCombined(playerSide);
1054 CampaignFleetAPI enemies = b.getOtherSideCombined(playerSide);
1091 addText(
"Failed to join battle; shouldn't happen.");
1095 case CONTINUE_ONGOING_BATTLE:
1099 if (
config.showEngageText) {
1104 boolean forceEngage = option == OptionId.FORCE_ENGAGE;
1108 if (
config.showEngageText) {
1114 if (
config.showEngageText) {
1120 case CONTINUE_INTO_BATTLE:
1130 BattleCreationContext bcc;
1131 if (
config.alwaysAttackVsAttack){
1139 if (b.isStationInvolved()) {
1140 boolean regen =
false;
1141 if (b.isStationInvolvedOnPlayerSide()) {
1152 b.genCombined(
false);
1156 CampaignFleetAPI combinedPlayer = b.getPlayerCombined();
1157 CampaignFleetAPI combinedEnemy = b.getNonPlayerCombined();
1163 bcc.setPlayerCommandPoints((
int)
Global.
getSector().getPlayerFleet().getCommanderStats().getCommandPoints().getModifiedValue());
1165 if (b.isStationInvolved() &&
playerGoal != FleetGoal.ESCAPE &&
otherGoal != FleetGoal.ESCAPE) {
1166 bcc.objectivesAllowed =
false;
1168 if (
config.delegate !=
null) {
1174 bcc.setInitialStepSize(1.5f);
1175 bcc.setInitialNumSteps(10 + (
float) Math.random() * 30);
1180 bcc.setInitialStepSize(1.5f);
1181 bcc.setInitialNumSteps(5 + (
float) Math.random() * 5);
1186 bcc.setPlayerCommandPoints((
int)
Global.
getSector().getPlayerFleet().getCommanderStats().getCommandPoints().getModifiedValue());
1187 if (
config.delegate !=
null) {
1198 }
else if (
otherGoal == FleetGoal.ESCAPE) {
1209 case CLEAN_DISENGAGE:
1215 po = PursuitOption.LET_THEM_GO;
1243 case ATTEMPT_TO_DISENGAGE:
1244 boolean letGo =
true;
1248 if (pursuitOption == PursuitOption.PURSUE) {
1254 }
else if (pursuitOption == PursuitOption.HARRY) {
1271 if (dha == DisengageHarryAvailability.AVAILABLE || pa == PursueAvailability.AVAILABLE) {
1294 case BEGIN_FLEET_ENCOUNTER_2:
1298 CampaignFleetAPI actualOther = (CampaignFleetAPI) (
dialog.getInteractionTarget());
1300 dialog.flickerStatic(0.1f, 0.1f);
1307 dialog.getInteractionTarget().setActivePerson(actualOther.getCommander());
1312 if (otherWantsToRun) {
1313 mem.unset(
"$weakerThanPlayerButHolding");
1317 addText(
"You try to establish a comm link, but only get static.");
1318 dialog.getInteractionTarget().setActivePerson(
null);
1323 visual.showPersonInfo(actualOther.getCommander());
1328 dialog.flickerStatic(0.1f, 0.1f);
1347 case AUTORESOLVE_PURSUE:
1355 dialog.showFleetMemberPickerDialog(
"Select craft to send in pursuit",
"Ok",
"Cancel",
1356 4, 8, 58f,
false,
true, members,
1357 new FleetMemberPickerListener() {
1358 public void pickedFleetMembers(List<FleetMemberAPI> members) {
1359 if (members !=
null && !members.isEmpty()) {
1366 CampaignFleetAPI ally =
null;
1369 if (!curr.isPlayerFleet() && !curr.getFleetData().getMembersListCopy().isEmpty() &&
1370 !curr.isStationMode()) {
1371 if (ally ==
null) ally = curr;
1372 alliedFP += ally.getFleetPoints();
1375 float playerFP = 0f;
1376 for (FleetMemberAPI member : members) {
1377 playerFP += member.getFleetPointCost();
1380 for (FleetMemberAPI member : resolver.
getResult().getLoserResult().getDisabled()) {
1381 damage += member.getFleetPointCost();
1383 for (FleetMemberAPI member : resolver.
getResult().getLoserResult().getDestroyed()) {
1384 damage += member.getFleetPointCost();
1386 float total = playerFP + alliedFP;
1387 if (total < 1) total = 1;
1389 if (ally !=
null && alliedFP > 0) {
1397 public void cancelledFleetMemberPicking() {
1402 case CRASH_MOTHBALL:
1404 dialog.showFleetMemberPickerDialog(
"Select craft to crash-mothball",
"Ok",
"Cancel",
1405 3, 7, 58f,
false,
true, choices,
1406 new FleetMemberPickerListener() {
1407 public void pickedFleetMembers(List<FleetMemberAPI> members) {
1408 for (FleetMemberAPI member :
playerFleet.getFleetData().getMembersListCopy()) {
1409 member.getRepairTracker().setCrashMothballed(
false);
1411 if (members !=
null && !members.isEmpty()) {
1412 for (FleetMemberAPI member : members) {
1413 member.getRepairTracker().setCrashMothballed(
true);
1417 if (members.size() == 1) {
1424 public void cancelledFleetMemberPicking() {
1431 case GO_TO_PRE_BATTLE:
1435 if (
config.straightToEngage) {
1451 String titleOne = b.getPrimary(b.getSideOne()).getNameWithFactionKeepCase();
1452 if (b.getSideOne().size() > 1) titleOne +=
", with allies";
1453 String titleTwo = b.getPrimary(b.getSideTwo()).getNameWithFactionKeepCase();
1454 if (b.getSideTwo().size() > 1) titleTwo +=
", with allies";
1480 case DEV_MODE_ESCAPE:
1484 if (b.isPlayerInvolved()) {
1487 case LOOT_THEN_LEAVE:
1492 case CONTINUE_LEAVE:
1493 if (option != OptionId.CONTINUE_LEAVE) {
1495 config.impactsAllyReputation,
config.impactsEnemyReputation)) {
1497 options.addOption(
"Continue", OptionId.CONTINUE_LEAVE,
null);
1498 if (!
config.straightToEngage) {
1499 options.setShortcut(OptionId.CONTINUE_LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
1524 if (
config.printXPToDialog) {
1542 if (
config.dismissOnLeave) {
1546 dialog.setOptionOnEscape(
"",
null);
1547 dialog.setOptionOnConfirm(
"",
null);
1549 if (
config.delegate !=
null) {
1569 case RECOVERY_CONTINUE:
1572 case RECOVERY_SELECT:
1573 if (!recoverableShips.isEmpty() || !storyRecoverableShips.isEmpty()) {
1574 dialog.showFleetMemberRecoveryDialog(
"Select ships to recover",
1575 recoverableShips, storyRecoverableShips,
1576 new FleetMemberPickerListener() {
1577 public void pickedFleetMembers(List<FleetMemberAPI> members) {
1578 if (members !=
null && !members.isEmpty()) {
1579 recoveredShips.clear();
1580 recoveredShips.addAll(members);
1583 ListenerUtil.reportShipsRecovered(members,
dialog);
1594 public void cancelledFleetMemberPicking() {
1599 case CONTINUE_FROM_VICTORY_TRIGGERS:
1603 visual.setVisualFade(0, 0);
1605 dialog.hideVisualPanel();
1610 public void coreUIDismissed() {
1611 if (
config.printXPToDialog) {
1622 if (
config.dismissOnLeave) {
1625 dialog.hideVisualPanel();
1628 dialog.showVisualPanel();
1630 dialog.setOptionOnEscape(
"",
null);
1631 dialog.setOptionOnConfirm(
"",
null);
1633 if (
config.delegate !=
null) {
1639 dialog.setPromptText(
"");
1642 case CONTINUE_INTO_BOARDING:
1645 case BOARDING_ACTION:
1652 case SELECT_FLAGSHIP:
1653 members =
new ArrayList<FleetMemberAPI>();
1654 for (FleetMemberAPI member :
playerFleet.getFleetData().getMembersListCopy()) {
1658 members.add(member);
1660 if (!members.isEmpty()) {
1661 dialog.showFleetMemberPickerDialog(
"Select flagship for this engagement",
"Ok",
"Cancel",
1662 3, 7, 58f,
false,
false, members,
1663 new FleetMemberPickerListener() {
1664 public void pickedFleetMembers(List<FleetMemberAPI> members) {
1665 if (members !=
null && !members.isEmpty()) {
1675 if (!members.get(0).isFlagship()) {
1681 if (
origFlagship !=
null && captain !=
null && !captain.isPlayer()) {
1688 public void cancelledFleetMemberPicking() {
1694 case ENGAGE_BOARDABLE:
1745 MemoryAPI mem = other.getMemoryWithoutUpdate();
1746 if (!mem.getBoolean(MemFlags.MEMORY_KEY_RECENTLY_DEFEATED_BY_PLAYER)) {
1747 mem.set(MemFlags.MEMORY_KEY_RECENTLY_DEFEATED_BY_PLAYER,
true, 0.5f);
1756 if (captain !=
null) {
1757 member.setCaptain(captain);
1772 if (enemyData !=
null && playerData !=
null && enemyData.disengaged() && !playerData.disengaged()) {
1779 BattleSide playerSide = b.getPlayerSide() == b.getSideOne() ? BattleSide.ONE : BattleSide.TWO;
1780 BattleSide otherSide = b.getPlayerSide() == b.getSideOne() ? BattleSide.TWO : BattleSide.ONE;
1791 boolean finished =
false;
1792 if (last == EngagementOutcome.BATTLE_PLAYER_WIN_TOTAL) {
1793 List<CampaignFleetAPI> other = b.getSide(otherSide);
1794 if (other !=
null && other.size() == 1) {
1795 CampaignFleetAPI f = other.get(0);
1796 if (f !=
null && f.isStationMode()) {
1797 b.finish(winner,
true);
1803 if (last == EngagementOutcome.ESCAPE_ENEMY_SUCCESS ||
1804 last == EngagementOutcome.ESCAPE_PLAYER_SUCCESS ||
1808 b.finish(winner,
true);
1810 for (CampaignFleetAPI curr :
pulledIn) {
1842 protected Map<FleetMemberAPI, PersonAPI>
origCaptains =
new HashMap<FleetMemberAPI, PersonAPI>();
1857 (
config.straightToEngage &&
1875 boolean playerHasReadyShips = !
playerFleet.getFleetData().getCombatReadyMembersListCopy().isEmpty();
1876 boolean otherHasReadyShips = !
otherFleet.getFleetData().getCombatReadyMembersListCopy().isEmpty();
1877 boolean totalDefeat = !
playerFleet.isValidPlayerFleet();
1892 if (mutualDestruction) {
1904 if (!otherHasReadyShips) {
1908 options.addOption(
"Continue", OptionId.CONTINUE_INTO_BOARDING,
null);
1944 if (!mutualDestruction) {
1965 if (
config.salvageRandom !=
null) {
1971 String leave =
"Leave";
1972 if (
config.straightToEngage) {
1975 options.addOption(leave, OptionId.LEAVE,
null);
1976 if (!
config.straightToEngage) {
1977 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
1994 SectorEntityToken prev =
dialog.getInteractionTarget();
1998 dialog.setPlugin(plugin);
2000 boolean firedAnyTriggers =
false;
2003 for (CampaignFleetAPI other : battle.getNonPlayerSideSnapshot()) {
2004 dialog.setInteractionTarget(other);
2007 MemoryAPI mem = other.getMemoryWithoutUpdate();
2008 List<FleetMemberAPI> losses = Misc.getSnapshotMembersLost(other);
2009 List<FleetMemberAPI> remaining = other.getFleetData().getMembersListCopy();
2013 int fpRemaining = 0;
2014 for (FleetMemberAPI curr : losses) {
2015 fpLost += curr.getFleetPointCost();
2016 fpTotal += curr.getFleetPointCost();
2018 for (FleetMemberAPI curr : remaining) {
2019 fpRemaining += curr.getFleetPointCost();
2020 fpTotal += curr.getFleetPointCost();
2023 mem.set(
"$someShipsDestroyed", !losses.isEmpty(), 0);
2024 mem.set(
"$fpLost", fpLost, 0);
2025 mem.set(
"$fpRemaining", fpRemaining, 0);
2026 mem.set(
"$fpLostFraction", (
float) fpLost / Math.max(1, fpTotal), 0);
2027 mem.set(
"$battle", battle, 0);
2029 List<String> triggers = Misc.getDefeatTriggers(other,
false);
2030 if (triggers !=
null) {
2032 for (String trigger :
new ArrayList<String>(triggers)) {
2035 triggers.remove(trigger);
2036 firedAnyTriggers =
true;
2040 Misc.clearDefeatTriggersIfNeeded(other);
2043 dialog.setInteractionTarget(prev);
2047 if (firedAnyTriggers) {
2048 options.addOption(
"Continue", OptionId.CONTINUE_FROM_VICTORY_TRIGGERS,
null);
2055 if ((
int)playerData.getRecoverableCrewLosses().getCrewInt() + (int)playerData.getRecoverableCrewLosses().getMarines() > 0) {
2058 int crewRecovered = (int) data.getRecoverableCrewLosses().getCrew();
2059 int marinesRecovered = (int) data.getRecoverableCrewLosses().getMarines();
2060 String crewRecStr =
"" + crewRecovered;
2061 if (crewRecovered <= 0) {
2064 String marinesRecStr =
"" + marinesRecovered;
2065 if (marinesRecovered <= 0) {
2082 boolean playerHasPersonnel = actualPlayer.getCargo().getMarines() > 0;
2083 boolean playerHasReadyShips = !actualPlayer.getFleetData().getCombatReadyMembersListCopy().isEmpty();
2091 if (recoverableShips ==
null) recoverableShips =
new ArrayList<FleetMemberAPI>();
2092 if (storyRecoverableShips ==
null) storyRecoverableShips =
new ArrayList<FleetMemberAPI>();
2094 if (!recoverableShips.isEmpty() || !storyRecoverableShips.isEmpty()) {
2095 int crew = actualPlayer.getCargo().getCrew();
2096 int needed = (int)actualPlayer.getFleetData().getMinCrew();
2098 int num = recoverableShips.size() + storyRecoverableShips.size();
2099 String numString =
"several ships disabled or destroyed";
2100 if (num == 1) numString =
"a ship disabled";
2101 String pre =
"The salvage chief reports that " + numString +
" during the battle " +
2102 "can be restored to basic functionalty. Recovering ships instead of breaking " +
2103 "them for salvage will greatly reduce the salvage gained from these ships.";
2115 boolean playerShipsRecoverable =
false;
2116 for (FleetMemberAPI member : recoverableShips) {
2117 if (member.getOwner() == 0 && !member.isAlly()) {
2118 playerShipsRecoverable =
true;
2122 for (FleetMemberAPI member : storyRecoverableShips) {
2123 if (member.getOwner() == 0 && !member.isAlly()) {
2124 playerShipsRecoverable =
true;
2129 boolean onlyDifficultRecovery = recoverableShips.isEmpty() && !storyRecoverableShips.isEmpty();
2130 if (playerShipsRecoverable) {
2132 textPanel.addParagraph(
"Disabled ships from your fleet are available for recovery", Misc.getHighlightColor());
2134 options.addOption(
"Consider ship recovery", OptionId.RECOVERY_SELECT, Misc.getHighlightColor(),
2135 "Disabled ships from your fleet are available for recovery.");
2137 Color color = Misc.getButtonTextColor();
2138 if (onlyDifficultRecovery) {
2139 color = Misc.getStoryOptionColor();
2141 options.addOption(
"Consider ship recovery", OptionId.RECOVERY_SELECT, color,
null);
2144 options.addOption(
"Continue", OptionId.RECOVERY_CONTINUE,
null);
2145 if (playerShipsRecoverable) {
2146 options.addOptionConfirmation(OptionId.RECOVERY_CONTINUE,
2147 "Disabled ships from your fleet are available for recovery.\n\nIf you proceed without recovering them, "
2148 +
"they will be lost permanently.",
"Proceed",
"Cancel");
2158 config.impactsAllyReputation,
config.impactsEnemyReputation);
2164 boolean validFleet =
playerFleet.isValidPlayerFleet();
2166 boolean hasAllies =
false;
2167 boolean startedWithAllies =
false;
2168 if (battle !=
null) {
2170 startedWithAllies =
context.
getBattle().getPlayerSideSnapshot().size() > 1;
2174 Random resetSalvageRandomTo =
null;
2176 if (
config.salvageRandom !=
null) {
2178 resetSalvageRandomTo = Misc.getRandom(
config.salvageRandom.nextLong(), 11);
2183 if (resetSalvageRandomTo !=
null) {
2184 config.salvageRandom = resetSalvageRandomTo;
2186 if (
config.delegate !=
null) {
2195 if (startedWithAllies) {
2201 if (startedWithAllies) {
2210 if (credits > 0 && validFleet) {
2213 Global.
getSector().getPlayerFleet().getCargo().getCredits().add(credits);
2221 options.addOption(
"Pick through the wreckage", OptionId.CONTINUE_LOOT,
null);
2226 String leave =
"Leave";
2227 boolean withEscape =
true;
2229 leave =
config.noSalvageLeaveOptionText;
2232 options.addOption(leave, OptionId.LEAVE,
null);
2234 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2240 List<FleetMemberAPI> result =
new ArrayList<FleetMemberAPI>();
2242 for (FleetMemberAPI member : all) {
2243 if (member.isAlly())
continue;
2244 if (!member.isFighterWing() && member.getRepairTracker().getCR() < crPlugin.getMalfunctionThreshold(member.getStats())) {
2260 if (optionData instanceof String)
return;
2262 if (optionData ==
null) {
2270 OptionId option = (OptionId) optionData;
2277 if (b !=
null && b.isPlayerInvolved()) {
2278 String titleOne =
"Your forces";
2279 if (b.isPlayerInvolved() && b.getPlayerSide().size() > 1) {
2280 titleOne +=
", with allies";
2282 if (!
Global.
getSector().getPlayerFleet().isValidPlayerFleet() && b.getPlayerSide().size() > 1) {
2283 titleOne =
"Allied forces";
2285 String titleTwo =
null;
2286 if (b.getPrimary(b.getNonPlayerSide()) !=
null) {
2287 titleTwo = b.getPrimary(b.getNonPlayerSide()).getNameWithFactionKeepCase();
2289 if (b.getNonPlayerSide().size() > 1) titleTwo +=
", with allies";
2290 visual.showFleetInfo(titleOne, b.getPlayerCombined(), Misc.ucFirst(titleTwo), b.getNonPlayerCombined(),
context);
2303 protected void addText(String text, Color color) {
2306 protected void addText(String text, String hl, Color hlColor) {
2307 LabelAPI label =
textPanel.addParagraph(text);
2308 label.setHighlight(hl);
2309 label.setHighlightColor(hlColor);
2313 textPanel.appendToLastParagraph(
" " + text);
2318 options.addOption(
"Cut the comm link", OptionId.CUT_COMM,
null);
2322 if (member.isFighterWing() || member.isAlly())
return false;
2323 if (Misc.isAutomated(member))
return false;
2324 if (Misc.isUnremovable(member.getCaptain()))
return false;
2335 String percent =
"+" + (int) Math.round((diff - 1f) * 100f) +
"%";
2337 textPanel.addPara(
"Additional XP due to overall battle difficulty: %s",
2338 Misc.getGrayColor(), Misc.getHighlightColor(), percent);
2347 boolean canTransfer =
false;
2348 for (FleetMemberAPI member :
playerFleet.getFleetData().getMembersListCopy()) {
2350 if (member.isFlagship())
continue;
2356 String tooltipText =
getString(
"tooltipPursueAutoresolve");
2357 options.addOption(
"Order your second-in-command to handle it", OptionId.AUTORESOLVE_PURSUE, tooltipText);
2358 options.addOption(
"Transfer command for this engagement", OptionId.SELECT_FLAGSHIP,
getString(
"tooltipSelectFlagship"));
2361 options.setEnabled(OptionId.SELECT_FLAGSHIP,
false);
2363 options.addOption(
"Take command of the action", OptionId.CONTINUE_INTO_BATTLE,
null);
2365 options.addOption(
"Transfer command for this engagement", OptionId.SELECT_FLAGSHIP,
getString(
"tooltipSelectFlagship"));
2368 options.setEnabled(OptionId.SELECT_FLAGSHIP,
false);
2373 options.addOption(
"Crash-mothball some of your ships to prevent malfunctions", OptionId.CRASH_MOTHBALL,
null);
2374 if (choices.isEmpty()) {
2375 options.setEnabled(OptionId.CRASH_MOTHBALL,
false);
2376 options.setTooltip(OptionId.CRASH_MOTHBALL,
getString(
"tooltipCrashMothballUnavailable"));
2378 options.setTooltip(OptionId.CRASH_MOTHBALL,
getString(
"tooltipCrashMothball"));
2381 if (
config.straightToEngage) {
2382 options.addOption(
"Continue into battle", OptionId.CONTINUE_INTO_BATTLE,
null);
2384 options.addOption(
"Continue", OptionId.CONTINUE_INTO_BATTLE,
null);
2390 options.addOption(
"Go back", OptionId.GO_TO_MAIN,
null);
2391 options.setShortcut(OptionId.GO_TO_MAIN, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2413 for (FleetMemberAPI member : members) {
2414 boolean last = members.indexOf(member) == members.size() - 1;
2415 boolean secondToLast = members.indexOf(member) == members.size() - 2;
2416 boolean fighter = member.isFighterWing();
2421 if (last && fighters == 0 && ships > 1) {
2422 if (members.size() > 2) {
2423 str +=
", and the " + member.getShipName();
2425 str +=
" and the " + member.getShipName();
2428 str +=
"the " + member.getShipName();
2431 if (!last && !secondToLast && !fighter) {
2435 if (last && fighters > 0) {
2436 if (fighters == 1) {
2438 str +=
"a fighter wing";
2441 str +=
", and a fighter wing";
2443 str +=
" and a fighter wing";
2448 str +=
"several fighter wings";
2451 str +=
", and several fighter wings";
2453 str +=
" and several fighter wings";
2472 boolean playerHasReadyShips =
false;
2473 for (FleetMemberAPI member :
playerFleet.getFleetData().getCombatReadyMembersListCopy()) {
2474 if (!member.isAlly()) {
2475 playerHasReadyShips =
true;
2479 options.addOption(
"Join the battle", OptionId.JOIN_ONGOING_BATTLE,
null);
2483 List<CampaignFleetAPI> otherSide = battle.getOtherSide(side);
2484 if (otherSide !=
null) {
2485 boolean knows = battle.knowsWhoPlayerIs(otherSide);
2486 boolean lowImpact =
false;
2487 CampaignFleetAPI otherPrimary = battle.getPrimary(otherSide);
2488 if (otherPrimary !=
null) {
2489 lowImpact |= otherPrimary.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_LOW_REP_IMPACT) ==
true;
2490 lowImpact |= otherPrimary.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_NO_REP_IMPACT) ==
true;
2494 config.showWarningDialogWhenNotHostile) {
2495 options.addOptionConfirmation(OptionId.JOIN_ONGOING_BATTLE,
"The " + nonHostile.getDisplayNameLong() +
" " + nonHostile.getDisplayNameIsOrAre() +
" not currently hostile, and you have been positively identified. Are you sure you want to engage in hostilities with one of their fleets?",
"Yes",
"Never mind");
2500 if (!playerHasReadyShips) {
2501 options.setEnabled(OptionId.JOIN_ONGOING_BATTLE,
false);
2505 options.addOption(
"Leave", OptionId.LEAVE,
null);
2506 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2511 if (
config.showCommLinkOption) {
2512 if (
otherFleet.getMemoryWithoutUpdate().is(
"$hailing",
true)) {
2513 options.addOption(
"Accept the comm request", OptionId.OPEN_COMM, Misc.getHighlightedOptionColor(),
null);
2514 otherFleet.getMemoryWithoutUpdate().unset(
"$hailing");
2515 }
else if (
otherFleet.getMemoryWithoutUpdate().is(
"$highlightComms",
true)) {
2516 options.addOption(
"Open a comm link", OptionId.OPEN_COMM, Misc.getHighlightedOptionColor(),
null);
2517 otherFleet.getMemoryWithoutUpdate().unset(
"$highlightComms");
2519 options.addOption(
"Open a comm link", OptionId.OPEN_COMM,
null);
2523 boolean smuggler =
otherFleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_SMUGGLER);
2524 if (
otherFleet.getFaction().isPlayerFaction() && !smuggler) {
2525 options.addOption(
"Leave", OptionId.LEAVE,
null);
2526 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2537 private List<FleetMemberAPI> recoverableShips;
2538 private List<FleetMemberAPI> storyRecoverableShips;
2539 private List<FleetMemberAPI> recoveredShips =
new ArrayList<FleetMemberAPI>();
2551 if (
ongoingBattle && b.getPlayerSide() !=
null && b.getPlayerSide().size() <= 1) {
2554 if (
config.showCommLinkOption) {
2555 options.addOption(
"Open a comm link", OptionId.OPEN_COMM,
null);
2571 boolean playerHasReadyShips =
false;
2572 boolean allyHasReadyShips =
false;
2573 for (FleetMemberAPI member :
playerFleet.getFleetData().getCombatReadyMembersListCopy()) {
2574 if (member.isAlly() && !member.isStation()) {
2575 allyHasReadyShips =
true;
2577 playerHasReadyShips =
true;
2596 }
else if (otherWantsToRun) {
2597 String pursueTooltip =
"tooltipPursue";
2598 String harassTooltip =
"tooltipHarassRetreat";
2599 String letThemGoTooltip =
"tooltipLetThemGo";
2601 letThemGoTooltip =
"tooltipLetThemGoNoPenalty";
2604 boolean canPursue =
false;
2605 boolean canHasass =
false;
2617 case LOST_LAST_ENGAGEMENT:
2618 pursueTooltip =
"tooltipPursueLostLast";
2620 case NO_READY_SHIPS:
2621 pursueTooltip =
"tooltipNoReadyShips";
2623 case TOOK_SERIOUS_LOSSES:
2625 if (withText)
addText(
getString(
"enemyDisruptedPlayerSide"),
getString(
"highlightDisruptedPlayer"), Misc.getNegativeHighlightColor());
2627 if (withText)
addText(
getString(
"enemyDisruptedPlayer"),
getString(
"highlightDisruptedPlayer"), Misc.getNegativeHighlightColor());
2629 pursueTooltip =
"tooltipPursueSeriousLosses";
2632 pursueTooltip =
"tooltipPursueTooSlow";
2640 case NO_READY_SHIPS:
2641 harassTooltip =
"tooltipNoReadyShips";
2646 boolean station =
false;
2648 for (FleetMemberAPI member :
playerFleet.getFleetData().getMembersListCopy()) {
2649 if (member.isStation()) {
2657 boolean letGo = (!canPursue && !canHasass) || !allyHasReadyShips;
2660 alliedWantsToFight =
true;
2665 po = PursuitOption.PURSUE;
2666 if (alliedWantsToRun || alliedHolding || !alliedWantsToFight || letGo) {
2667 po = PursuitOption.LET_THEM_GO;
2669 if (!canPursue && canHasass) {
2670 po = PursuitOption.HARRY;
2679 options.addOption(
"Join the pursuit", OptionId.CONTINUE_ONGOING_BATTLE,
getString(pursueTooltip));
2680 if (!canPursue || !playerHasReadyShips) {
2681 options.setEnabled(OptionId.CONTINUE_ONGOING_BATTLE,
false);
2716 options.addOption(
"Perform a salvage operation, then leave", OptionId.LOOT_THEN_LEAVE,
null);
2717 options.setShortcut(OptionId.LOOT_THEN_LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2719 options.addOption(
"Leave", OptionId.LEAVE,
null);
2720 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2725 boolean hostile =
false;
2730 options.addOption(
"Pursue them", OptionId.PURSUE,
getString(pursueTooltip));
2732 if (playerHasReadyShips) {
2733 options.addOption(
"Maneuver to force a pitched battle", OptionId.FORCE_ENGAGE,
"Outmaneuver the opposing fleet, forcing them to fight you head on.");
2740 config.showWarningDialogWhenNotHostile) {
2741 options.addOptionConfirmation(OptionId.FORCE_ENGAGE,
"The " + nonHostile.getDisplayNameLong() +
" " + nonHostile.getDisplayNameIsOrAre() +
" not currently hostile, and you have been positively identified. Are you sure you want to engage one of their fleets?",
"Yes",
"Never mind");
2744 options.addOption(
"Maneuver to force a pitched battle", OptionId.ENGAGE,
getString(
"tooltipNoReadyShips"));
2745 options.setEnabled(OptionId.FORCE_ENGAGE,
false);
2747 SetStoryOption.set(
dialog, 1, OptionId.FORCE_ENGAGE,
"forceBattle", Sounds.STORY_POINT_SPEND_COMBAT,
2748 "Maneuvered to force pitched battle with " +
otherFleet.getNameWithFactionKeepCase());
2750 options.addOption(
"Harry their retreat", OptionId.HARRY_PURSUE,
getString(harassTooltip));
2757 config.showWarningDialogWhenNotHostile) {
2758 options.addOptionConfirmation(OptionId.HARRY_PURSUE,
"The " + nonHostile.getDisplayNameLong() +
" " + nonHostile.getDisplayNameIsOrAre() +
" not currently hostile, and you have been positively identified. Are you sure you want to engage in hostilities with one of their fleets?",
"Yes",
"Never mind");
2759 options.addOptionConfirmation(OptionId.PURSUE,
"The " + nonHostile.getDisplayNameLong() +
" " + nonHostile.getDisplayNameIsOrAre() +
" not currently hostile, and you have been positively identified. Are you sure you want to engage in hostilities with one of their fleets?",
"Yes",
"Never mind");
2762 options.addOption(
"Let them go", OptionId.LET_THEM_GO,
getString(letThemGoTooltip));
2764 options.addOption(
"Leave", OptionId.LEAVE,
null);
2765 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2770 if (!canPursue || !playerHasReadyShips) {
2771 options.setEnabled(OptionId.PURSUE,
false);
2773 if (!canHasass || !playerHasReadyShips) {
2774 options.setEnabled(OptionId.HARRY_PURSUE,
false);
2779 if (alliedWantsToRun) {
2783 options.addOption(
"Join the disengage attempt", OptionId.CONTINUE_ONGOING_BATTLE,
null);
2785 boolean station =
false;
2787 for (FleetMemberAPI member :
playerFleet.getFleetData().getMembersListCopy()) {
2788 if (member.isStation()) {
2795 if (withText && !
config.straightToEngage) {
2805 if (playerHasReadyShips) {
2806 options.addOption(
"Join the engagement", OptionId.CONTINUE_ONGOING_BATTLE,
null);
2808 options.addOption(
"Join the engagement", OptionId.CONTINUE_ONGOING_BATTLE,
getString(
"tooltipNoReadyShips"));
2809 options.setEnabled(OptionId.CONTINUE_ONGOING_BATTLE,
false);
2812 options.addOption(
"Leave", OptionId.LEAVE,
null);
2813 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2816 String engageText =
"Move in to engage";
2818 engageText =
config.firstTimeEngageOptionText;
2821 engageText =
config.afterFirstTimeEngageOptionText;
2823 if (playerHasReadyShips) {
2824 options.addOption(engageText, OptionId.ENGAGE,
getString(
"tooltipEngage"));
2831 config.showWarningDialogWhenNotHostile) {
2832 options.addOptionConfirmation(OptionId.ENGAGE,
"The " + nonHostile.getDisplayNameLong() +
" " + nonHostile.getDisplayNameIsOrAre() +
" not currently hostile, and you have been positively identified. Are you sure you want to engage one of their fleets?",
"Yes",
"Never mind");
2835 options.addOption(engageText, OptionId.ENGAGE,
getString(
"tooltipNoReadyShips"));
2836 options.setEnabled(OptionId.ENGAGE,
false);
2839 boolean hostile =
false;
2843 if (!
config.leaveAlwaysAvailable &&
2846 options.addOption(
"Disengage", OptionId.DISENGAGE,
getString(
"tooltipCleanDisengage"));
2848 options.addOption(
"Disengage", OptionId.DISENGAGE,
getString(
"tooltipHarrassableDisengage"));
2851 options.addOption(
"Leave", OptionId.LEAVE,
null);
2852 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2856 boolean addSPDisengage =
true;
2858 options.addOption(
"Attempt to disengage", OptionId.ATTEMPT_TO_DISENGAGE,
getString(
"tootipAttemptToDisengage"));
2860 addSPDisengage =
true;
2863 boolean hasStation =
false;
2864 boolean allStation =
true;
2866 allStation &= curr.isStationMode();
2867 hasStation |= curr.isStationMode();
2872 options.addOption(
"Disengage", OptionId.DISENGAGE,
getString(
"tooltipCleanDisengage"));
2874 options.addOption(
"Disengage", OptionId.DISENGAGE,
getString(
"tooltipHarrassableDisengage"));
2876 addSPDisengage =
false;
2884 label.setHighlightColors(Misc.getNegativeHighlightColor(), Misc.getHighlightColor());
2888 if (addSPDisengage) {
2890 options.addOption(
"Disengage by executing a series of special maneuvers", OptionId.CLEAN_DISENGAGE,
2891 "Allows your fleet to disengage without being pursued.");
2892 SetStoryOption.set(
dialog, 1, OptionId.CLEAN_DISENGAGE,
"cleanDisengage", Sounds.STORY_POINT_SPEND_COMBAT,
2893 "Maneuvered to disengage from " +
otherFleet.getNameWithFactionKeepCase());
2900 options.addOption(
"Leave", OptionId.LEAVE,
null);
2901 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2909 if (!
options.hasOption(OptionId.LEAVE) &&
2910 !
options.hasOption(OptionId.LET_THEM_GO) &&
2911 !
options.hasOption(OptionId.DISENGAGE)) {
2912 options.addOption(
"Leave", OptionId.LEAVE,
null);
2913 options.setShortcut(OptionId.LEAVE, Keyboard.KEY_ESCAPE,
false,
false,
false,
true);
2937 final List<FleetMemberAPI> members =
new ArrayList<FleetMemberAPI>();
2939 final float crThreshold = CRPluginImpl.MALFUNCTION_START;
2940 final float hullThreshold = 0.4f;
2941 final float bonusRepairAmount = 0.1f;
2943 FleetMemberAPI flagship = fleet.getFlagship();
2944 if (flagship !=
null && !flagship.isMothballed()) {
2945 if (flagship.getStatus().getHullFraction() < hullThreshold ||
2946 flagship.getRepairTracker().getBaseCR() < crThreshold) {
2947 members.add(flagship);
2951 for (FleetMemberAPI curr : fleet.getFleetData().getMembersListCopy()) {
2952 if (curr == flagship)
continue;
2953 if (curr.isMothballed())
continue;
2954 if (!curr.getCaptain().isDefault()) {
2955 if (curr.getStatus().getHullFraction() < hullThreshold ||
2956 curr.getRepairTracker().getBaseCR() < crThreshold) {
2960 if (members.size() > 12)
break;
2975 if (members.isEmpty())
return;
2977 options.addOption(
"Perform limited emergency repairs", OptionId.EMERGENCY_REPAIRS,
2978 "Brings your flagship and a few officer-controlled ships back up to reasonable " +
2979 "combat readiness and repairs some hull damage.");
2980 StoryOptionParams params =
new StoryOptionParams(OptionId.EMERGENCY_REPAIRS,
2981 1,
"emergencyRepairs", Sounds.STORY_POINT_SPEND_COMBAT,
2982 "Performed emergency repairs when facing " +
otherFleet.getNameWithFactionKeepCase());
2984 SetStoryOption.set(
dialog, params,
2985 new BaseOptionStoryPointActionDelegate(
dialog, params) {
2987 public void confirm() {
2989 for (FleetMemberAPI member : members) {
2991 float shipDP = member.getDeploymentPointsCost();
2994 float fraction = dpRemaining / shipDP;
2995 if (fraction >= 0.99f) fraction = 1f;
2997 float baseRepairCRLevel = crThreshold + bonusRepairAmount * (float) Math.random();
2998 float baseRepairHullLevel = hullThreshold + bonusRepairAmount * (float) Math.random();
3000 float cr = member.getRepairTracker().getBaseCR();
3001 float repairedCR = cr + (baseRepairCRLevel - cr) * fraction;
3002 if (cr < repairedCR) {
3004 member.getRepairTracker().applyCREvent(repairedCR - cr,
"Emergency repairs");
3006 float hull = member.getStatus().getHullFraction();
3007 float repairedHull = hull + (baseRepairHullLevel - hull) * fraction;
3008 if (hull < repairedHull) {
3009 member.getStatus().setHullFraction(repairedHull);
3012 String str = BaseSkillEffectDescription.getValueLabelForMember(member);
3014 textPanel.addPara(str +
" performed emergency repairs", Misc.getPositiveHighlightColor());
3015 textPanel.highlightFirstInLastPara(str, Misc.getHighlightColor());
3018 if (fraction < 1f) {
3025 dialog.getOptionPanel().setEnabled(OptionId.EMERGENCY_REPAIRS,
false);
3029 public void createDescription(TooltipMakerAPI info) {
3030 super.createDescription(info);
3031 info.setParaFontDefault();
3034 info.addPara(
"Will bring up to %s deployment points worth of ships up " +
3035 "to approximately %s combat readiness and %s hull integrity. Starts with the " +
3036 "flagship and then goes on to officer-controlled ships, in the " +
3037 "order they are placed in the fleet. " +
3038 "Does not affect other ships.",
3039 0f, Misc.getHighlightColor(),
3041 "" + (
int) Math.round((crThreshold + bonusRepairAmount) * 100f) +
"%",
3042 "" + (
int) Math.round((hullThreshold + bonusRepairAmount) * 100f) +
"%"
3045 info.addPara(
"The repairs will affect:", opad);
3046 info.setBulletedListMode(BaseIntelPlugin.INDENT);
3047 float initPad = 10f;
3050 for (FleetMemberAPI member : members) {
3052 float shipDP = member.getDeploymentPointsCost();
3057 float fraction = dpRemaining / shipDP;
3058 if (fraction >= 0.99f) fraction = 1f;
3060 String str = BaseSkillEffectDescription.getValueLabelForMember(member);
3062 String post =
" (full effect)";
3063 if (fraction < 1) post =
" (partial effect)";
3065 info.addPara(str + post, initPad);
3070 info.setBulletedListMode(
null);
3071 info.addSpacer(20f);
3081 if (fleet.getAI() ==
null)
return PursuitOption.LET_THEM_GO;
3083 if (
config.alwaysPursue) {
3084 return PursuitOption.PURSUE;
3087 boolean allStation =
false;
3088 boolean hasStation =
false;
3095 allStation &= curr.isStationMode();
3096 hasStation |= curr.isStationMode();
3101 PursuitOption option = fleet.getAI().pickPursuitOption(
context, other);
3102 if (hasStation && option == PursuitOption.HARRY) {
3104 return PursuitOption.LET_THEM_GO;
3122 CampaignFleetAPI result =
null;
3124 if (otherSide !=
null) {
3125 for (CampaignFleetAPI other : otherSide) {
3126 if (!player.isHostileTo(other.getFaction()) && other.getFleetPoints() > max) {
3128 max = other.getFleetPoints();
3132 return result ==
null ? null : result.getFaction();
3137 if (last == EngagementOutcome.BATTLE_PLAYER_OUT_FIRST_WIN ||
3138 last == EngagementOutcome.BATTLE_PLAYER_OUT_FIRST_LOSS ||
3139 last == EngagementOutcome.PURSUIT_PLAYER_OUT_FIRST_WIN ||
3140 last == EngagementOutcome.PURSUIT_PLAYER_OUT_FIRST_LOSS ||
3141 last == EngagementOutcome.ESCAPE_PLAYER_OUT_FIRST_WIN ||
3142 last == EngagementOutcome.ESCAPE_PLAYER_OUT_FIRST_LOSS
3152 for (FleetMemberAPI member :
playerFleet.getFleetData().getMembersListCopy()) {
3153 if (member.canBeDeployedForCombat()) {
3154 total += member.getDeploymentPointsCost();
3170 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
3171 if (member.canBeDeployedForCombat()) {
3172 total += member.getDeploymentPointsCost();
3181 return Math.min(abs, fraction);
3186 return data.isDidEnoughToDisengage();
3192 if (data.isWonLastEngagement())
return true;
3194 if (data.isDidEnoughToDisengage())
return true;
3197 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
3198 if (member.isStation())
return true;
3204 (last == EngagementOutcome.BATTLE_PLAYER_OUT_FIRST_WIN ||
3205 last == EngagementOutcome.BATTLE_PLAYER_OUT_FIRST_LOSS ||
3206 last == EngagementOutcome.PURSUIT_PLAYER_OUT_FIRST_WIN ||
3207 last == EngagementOutcome.PURSUIT_PLAYER_OUT_FIRST_LOSS ||
3208 last == EngagementOutcome.ESCAPE_PLAYER_OUT_FIRST_WIN ||
3209 last == EngagementOutcome.ESCAPE_PLAYER_OUT_FIRST_LOSS)) {
3219 return pa != PursueAvailability.AVAILABLE;
3226 if (pa == PursueAvailability.TOO_SLOW && fleet ==
playerFleet) {
3227 pa = PursueAvailability.AVAILABLE;
3235 String faction =
otherFleet.getFaction().getEntityNamePrefix();
3236 if (faction ==
null || faction.isEmpty()) {
3237 faction =
otherFleet.getFaction().getDisplayName();
3240 if (
otherFleet.getFaction().isNeutralFaction()) {
3241 faction =
"opposing";
3245 String firstName =
otherFleet.getCommander().getName().getFirst();
3246 String lastName =
otherFleet.getCommander().getName().getLast();
3247 String fleetOrShip =
"fleet";
3248 if (
otherFleet.getFleetData().getMembersListCopy().size() == 1) {
3249 fleetOrShip =
"ship";
3250 if (
otherFleet.getFleetData().getMembersListCopy().get(0).isFighterWing()) {
3251 fleetOrShip =
"fighter wing";
3254 String playerFleetOrShip =
"fleet";
3255 if (
playerFleet.getFleetData().getMembersListCopy().size() == 1) {
3256 playerFleetOrShip =
"ship";
3257 if (
playerFleet.getFleetData().getMembersListCopy().get(0).isFighterWing()) {
3258 playerFleetOrShip =
"fighter wing";
3264 int crewLost = (int) (data.getCrewLossesDuringLastEngagement().getCrewInt());
3267 int marinesLost = (int) (data.getCrewLossesDuringLastEngagement().getMarines());
3270 int crewRecovered = (int) data.getRecoverableCrewLosses().getCrewInt();
3271 int marinesRecovered = (int) data.getRecoverableCrewLosses().getMarines();
3273 String crewRecStr =
"" + crewRecovered;
3274 if (crewRecovered <= 0) {
3277 String marinesRecStr =
"" + marinesRecovered;
3278 if (marinesRecovered <= 0) {
3279 marinesRecStr =
"no";
3282 str = str.replaceAll(
"\\$crewLost", crewLostStr);
3283 str = str.replaceAll(
"\\$marinesLost", marinesLostStr);
3284 str = str.replaceAll(
"\\$crewLost", crewLostStr);
3285 str = str.replaceAll(
"\\$crewRecovered", crewRecStr);
3286 str = str.replaceAll(
"\\$marinesRecovered", marinesRecStr);
3290 int numLifeSigns = (int) (
toBoard.getCrewComposition().getCrew() +
toBoard.getCrewComposition().getMarines());
3291 str = str.replaceAll(
"\\$numLifeSigns",
getApproximate(numLifeSigns));
3293 str = str.replaceAll(
"\\$boardableShipName",
toBoard.getShipName());
3296 str = str.replaceAll(
"\\$faction", faction);
3297 str = str.replaceAll(
"\\$fleetName", fleetName);
3298 str = str.replaceAll(
"\\$firstName", firstName);
3299 str = str.replaceAll(
"\\$lastName", lastName);
3300 str = str.replaceAll(
"\\$fleetOrShip", fleetOrShip);
3301 str = str.replaceAll(
"\\$playerFleetOrShip", playerFleetOrShip);
3304 str = str.replaceAll(
"\\$flagship",
"the " +
selectedFlagship.getShipName());
3317 int marines =
Global.
getSector().getPlayerFleet().getCargo().getMarines();
3318 str = str.replaceAll(
"\\$marines",
"" + marines);
3334 BattleSide playerSide = b.pickSide(
Global.
getSector().getPlayerFleet());
3335 CampaignFleetAPI sideOnePrimary = b.getPrimary(b.getSideOne());
3336 CampaignFleetAPI sideTwoPrimary = b.getPrimary(b.getSideTwo());
3337 if (playerSide != BattleSide.NO_JOIN) {
3338 sideOnePrimary = b.getPrimary(b.getSide(playerSide));
3339 sideTwoPrimary = b.getPrimary(b.getOtherSide(playerSide));
3342 if (sideOnePrimary !=
null) {
3343 String strOne = sideOnePrimary.getFaction().getEntityNamePrefix() +
" forces";
3344 if (strOne.startsWith(
" ")) {
3345 strOne = sideOnePrimary.getFaction().getDisplayName() +
" forces";
3350 for (CampaignFleetAPI fleet : b.getSideFor(sideOnePrimary)) {
3351 if (fleet.getFaction() != sideOnePrimary.getFaction()) {
3352 if (fleet.isPlayerFleet())
continue;
3353 strOne +=
" and their allies";
3357 str = str.replaceAll(
"\\$alliedFactionAndTheirAllies", strOne);
3359 if (sideTwoPrimary !=
null) {
3360 String strTwo = sideTwoPrimary.getFaction().getEntityNamePrefix() +
" forces";
3361 if (strTwo.startsWith(
" ")) {
3362 strTwo = sideTwoPrimary.getFaction().getDisplayName() +
" forces";
3367 for (CampaignFleetAPI fleet : b.getSideFor(sideTwoPrimary)) {
3368 if (fleet.getFaction() != sideTwoPrimary.getFaction()) {
3369 if (fleet.isPlayerFleet())
continue;
3370 strTwo +=
" and their allies";
3374 str = str.replaceAll(
"\\$enemyFactionAndTheirAllies", strTwo);
3378 String yourForcesWere =
"Your forces were";
3379 if (b.getPlayerSide() !=
null && b.getPlayerSide().size() > 1) {
3380 yourForcesWere =
"Your side was";
3382 str = str.replaceAll(
"\\$yourForcesWereOrYourSideWas", yourForcesWere);
3396 return "" + (int) value;
3400 int v = (int) value;
3401 String str =
"multiple";
3404 }
else if (v < 10) {
3406 }
else if (v < 100) {
3407 v = (int) Math.round((
float) v/10f) * 10;
3408 str =
"approximately " + v;
3409 }
else if (v < 1000) {
3410 v = (int) Math.round((
float) v/10f) * 10;
3411 str =
"approximately " + v;
3413 v = (int) Math.round((
float) v/100f) * 100;
3420 int v = (int) value;
3424 }
else if (v < 10) {
3426 }
else if (v < 100) {
3427 v = (int) Math.round((
float) v/10f) * 10;
3429 }
else if (v < 1000) {
3430 v = (int) Math.round((
float) v/10f) * 10;
3433 v = (int) Math.round((
float) v/100f) * 100;
3460 protected boolean fleetWantsToFight(CampaignFleetAPI fleet, CampaignFleetAPI other,
boolean assumeHostile) {
3461 if (
config.alwaysAttackVsAttack)
return true;
3463 boolean hasNonCivReserves =
false;
3464 for (FleetMemberAPI member :
context.
getDataFor(fleet).getInReserveDuringLastEngagement()) {
3465 if (!member.isCivilian()) {
3466 hasNonCivReserves =
true;
3472 !hasNonCivReserves) {
3476 CampaignFleetAIAPI ai = fleet.getAI();
3477 if (ai ==
null)
return false;
3478 EncounterOption option = ai.pickEncounterOption(
context, other);
3480 if (fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_MAKE_ALLOW_DISENGAGE))
return false;
3483 fleet.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_MAKE_PREVENT_DISENGAGE)
3487 (option == EncounterOption.ENGAGE || (option == EncounterOption.HOLD &&
ongoingBattle));
3502 CampaignFleetAIAPI ai = fleet.getAI();
3503 if (ai ==
null)
return false;
3505 if (!hostile)
return false;
3507 if (ai.pickEncounterOption(
context, other) == EncounterOption.HOLD_VS_STRONGER)
return true;
3520 if (
config.alwaysAttackVsAttack)
return false;
3522 boolean hasNonCivReserves =
false;
3523 for (FleetMemberAPI member :
context.
getDataFor(fleet).getInReserveDuringLastEngagement()) {
3524 if (!member.isCivilian()) {
3525 hasNonCivReserves =
true;
3531 !hasNonCivReserves) {
3535 CampaignFleetAIAPI ai = fleet.getAI();
3536 if (ai ==
null)
return false;
3537 return ai.pickEncounterOption(
context, other) == EncounterOption.DISENGAGE;
3557 if (mission ==
null) {
3560 MemoryAPI memory = mission.getMemory();
3561 if (memory !=
null) {
static SettingsAPI getSettings()
static FactoryAPI getFactory()
static SectorAPI getSector()
EngagementResultAPI getResult()
void resolvePlayerPursuit(FleetEncounterContext context, List< FleetMemberAPI > playerShipsToDeploy)
List< FleetMemberAPI > getRecoverableShips(BattleAPI battle, CampaignFleetAPI winningFleet, CampaignFleetAPI otherFleet)
void generateLoot(List< FleetMemberAPI > recoveredShips, boolean withCredits)
boolean didPlayerWinMostRecentBattleOfEncounter()
void setNoHarryBecauseOfStation(boolean noHarryBecauseOfStation)
void setAllyFPHullDamageToEnemies(float allyFPHullDamageToEnemies)
void setSalvageRandom(Random salvageRandom)
void setTextPanelForXPGain(TextPanelAPI textPanelForXPGain)
boolean adjustPlayerReputation(InteractionDialogAPI dialog, String ffText)
boolean wasLastEngagementEscape()
void applyPursuitOption(CampaignFleetAPI pursuingFleet, CampaignFleetAPI otherFleet, PursuitOption pursuitOption)
void applyAfterBattleEffectsIfThereWasABattle()
float getAllyFPHullDamageToEnemies()
boolean isOtherFleetHarriedPlayer()
float performPostEngagementRecoveryBoth(EngagementResultAPI result)
BoardingResult boardShip(FleetMemberAPI member, CampaignFleetAPI attacker, CampaignFleetAPI defender)
void setOtherFleetHarriedPlayer(boolean otherFleetHarriedPlayer)
List< FleetMemberAPI > getStoryRecoverableShips()
void recoverCrew(CampaignFleetAPI fleet)
float computeBattleDifficulty()
DataForEncounterSide getDataFor(CampaignFleetAPI participantOrCombined)
static void recoverShips(List< FleetMemberAPI > ships, FleetEncounterContext context, CampaignFleetAPI winningFleet, CampaignFleetAPI otherFleet)
PursueAvailability getPursuitAvailability(CampaignFleetAPI fleet, CampaignFleetAPI otherFleet)
float performPostVictoryRecovery(EngagementResultAPI result)
boolean hasWinnerAndLoser()
boolean isEngagedInHostilities()
EngageBoardableOutcome engageBoardableShip(FleetMemberAPI toBoard, CampaignFleetAPI fleetItBelongsTo, CampaignFleetAPI attackingFleet)
boolean isComputedDifficulty()
void setPlayerFPHullDamageToEnemies(float playerFPHullDamageToEnemies)
EngagementOutcome getLastEngagementOutcome()
DisengageHarryAvailability getDisengageHarryAvailability(CampaignFleetAPI fleet, CampaignFleetAPI otherFleet)
float getPlayerFPHullDamageToEnemies()
void setBattle(BattleAPI battle)
boolean didPlayerWinLastEngagement()
void processEngagementResults(EngagementResultAPI result)
void letBoardableGo(FleetMemberAPI toBoard, CampaignFleetAPI fleetItBelongsTo, CampaignFleetAPI attackingFleet)
void setEngagedInHostilities(boolean engagedInHostilities)
String getIntOrNo(float value)
static boolean canDisengage()
boolean didEnoughToDisengage(CampaignFleetAPI fleet)
void optionMousedOver(String optionText, Object optionData)
boolean pickedMemberToBoard
FleetMemberAPI origFlagship
CampaignFleetAPI playerFleet
void init(InteractionDialogAPI dialog)
static boolean inConversation
void restoreOrigCaptains()
FleetMemberAPI selectedFlagship
boolean alliedFleetHoldingVsStrongerEnemy()
RuleBasedInteractionDialogPluginImpl conversationDelegate
void updateMainState(boolean withText)
CrewCompositionAPI boardingParty
boolean canDisengageWithoutPursuit(CampaignFleetAPI fleet)
boolean alliedFleetWantsToDisengage()
static float EMERGENCY_REPAIRS_MAX_DP
void appendText(String text)
String getString(String id)
void addEmergencyRepairsOption()
void updateEngagementChoice(boolean withText)
FactionAPI getNonHostileOtherFaction()
void advance(float amount)
static final Color ENEMY_COLOR
InteractionDialogAPI dialog
static final Color HIGHLIGHT_COLOR
BoardingResult boardingResult
List< FleetMemberAPI > getCrashMothballable(List< FleetMemberAPI > all)
void optionSelected(String text, Object optionData)
boolean otherCanDisengage()
boolean alliedFleetWantsToFight()
FactionAPI getNonHostileOtherFaction(List< CampaignFleetAPI > otherSide)
CrewCompositionAPI maxBoardingParty
boolean alliedCanDisengage()
VisualType currVisualType
void goToEncounterEndPath()
boolean fleetCanDisengage(CampaignFleetAPI fleet)
static boolean directToComms
boolean otherFleetHoldingVsStrongerEnemy()
void addText(String text)
boolean allyEngagementChoiceNoBattle
void backFromEngagement(EngagementResultAPI result)
void reinit(boolean withContinueOnRuleFound)
void setPlayerFleet(CampaignFleetAPI playerFleet)
boolean fleetHoldingVsStrongerEnemy(CampaignFleetAPI fleet, CampaignFleetAPI other)
void addPostBattleAttitudeText()
List< CampaignFleetAPI > pulledIn
FleetEncounterContext context
boolean canDisengageCleanly(CampaignFleetAPI fleet)
void addText(String text, Color color)
void reinitPostContinue()
void setActiveMission(CampaignEventPlugin mission)
CampaignFleetAPI otherFleet
float boardingPercentSuccess
boolean fleetWantsToFight(CampaignFleetAPI fleet, CampaignFleetAPI other)
List< FleetMemberAPI > membersInOrderPreEncounter
FleetInteractionDialogPluginImpl()
FleetInteractionDialogPluginImpl(FIDConfig params)
void notifyActivePersonChanged()
void printOngoingBattleInfo()
boolean playerOutBeforeAllies()
List< FleetMemberAPI > getPursuitCapablePlayerShips()
void addText(String text, String hl, Color hlColor)
Map< String, MemoryAPI > getMemoryMap()
boolean fleetWantsToFight(CampaignFleetAPI fleet, CampaignFleetAPI other, boolean assumeHostile)
boolean otherFleetWantsToFight()
static float getDisengageSize()
void pullInNearbyFleets()
static final Color FRIEND_COLOR
String getApproximate(float value)
PursueAvailability getPursuitAvailability(CampaignFleetAPI fleet)
OptionId lastOptionMousedOver
InitialBoardingResponse aiBoardingResponse
EngagementResultAPI lastResult
String getApproximateNumOnly(float value)
boolean otherFleetWantsToDisengage()
String createShipNameListString(List< FleetMemberAPI > members)
boolean shownTooLargeToRetreatMessage
Map< FleetMemberAPI, PersonAPI > origCaptains
boolean isValidTransferCommandTarget(FleetMemberAPI member)
boolean otherFleetWantsToFight(boolean assumeHostile)
boolean firedVictoryTriggers
PursuitOption pickPursuitOption(CampaignFleetAPI fleet, CampaignFleetAPI other, FleetEncounterContext context)
boolean fleetWantsToDisengage(CampaignFleetAPI fleet, CampaignFleetAPI other)
Map< String, MemoryAPI > getMemoryMap()
void setEmbeddedMode(boolean embeddedMode)
void optionMousedOver(String optionText, Object optionData)
void optionSelected(String text, Object optionData)
boolean fireBest(String trigger)
void init(InteractionDialogAPI dialog)
void notifyActivePersonChanged()
BattleAPI createBattle(CampaignFleetAPI one, CampaignFleetAPI two)
CombatReadinessPlugin getCRPlugin()
String getString(String category, String id)
float getFloat(String key)
Color getColor(String id)