diff --git a/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties b/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties index 07a9ed84366..2927b6b518b 100644 --- a/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties @@ -602,6 +602,10 @@ lblUseFunctionalEscapeArtist.tooltip=If enabled, player-owned characters can use lblResetTemporaryPrisonerCapacity.text=Reset Prisoner Capacity Reductions lblResetTemporaryPrisonerCapacity.tooltip=This option removes any penalties to Prisoner Capacity that might have been\ \ added by Prisoner Events. +lblDisableIntelBreachChance.text=Disable Intel Breach Chance +lblDisableIntelBreachChance.tooltip=If enabled, releasing prisoners will not trigger intel breach events. When \ + disabled (default), releasing prisoners may cause intel breaches that increase contract morale levels. Only \ + available when using MekHQ prisoner capture rules. # createDependentsPanel lblDependentsPanel.text=Civilians lblUseRandomDependentAddition.text=Random Addition diff --git a/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptions.java b/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptions.java index b29874d3a65..299c88146fd 100644 --- a/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptions.java +++ b/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptions.java @@ -276,6 +276,7 @@ public static String getTechLevelName(final int techLevel) { // Prisoners private PrisonerCaptureStyle prisonerCaptureStyle; private boolean useFunctionalEscapeArtist; + private boolean disableIntelBreachChance; // Dependent private boolean useRandomDependentAddition; @@ -869,6 +870,7 @@ public CampaignOptions() { // Prisoners setPrisonerCaptureStyle(PrisonerCaptureStyle.NONE); useFunctionalEscapeArtist = false; + disableIntelBreachChance = false; // Dependent setUseRandomDependentAddition(false); @@ -2137,6 +2139,14 @@ public boolean isUseFunctionalEscapeArtist() { public void setUseFunctionalEscapeArtist(final boolean useFunctionalEscapeArtist) { this.useFunctionalEscapeArtist = useFunctionalEscapeArtist; } + + public boolean isDisableIntelBreachChance() { + return disableIntelBreachChance; + } + + public void setDisableIntelBreachChance(final boolean disableIntelBreachChance) { + this.disableIntelBreachChance = disableIntelBreachChance; + } // endregion Prisoners // region Personnel Randomization diff --git a/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptionsMarshaller.java b/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptionsMarshaller.java index 9efe151be2e..b4769e7dd79 100644 --- a/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptionsMarshaller.java +++ b/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptionsMarshaller.java @@ -386,6 +386,10 @@ public static void writeCampaignOptionsToXML(final CampaignOptions campaignOptio indent, "useFunctionalEscapeArtist", campaignOptions.isUseFunctionalEscapeArtist()); + MHQXMLUtility.writeSimpleXMLTag(pw, + indent, + "disableIntelBreachChance", + campaignOptions.isDisableIntelBreachChance()); // endregion Prisoners // region Dependent diff --git a/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptionsUnmarshaller.java b/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptionsUnmarshaller.java index 8705ae6967e..ff2177a93a5 100644 --- a/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptionsUnmarshaller.java +++ b/MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptionsUnmarshaller.java @@ -391,6 +391,8 @@ private static boolean parseNodeName(Version version, String nodeName, CampaignO nodeContents)); case "useFunctionalEscapeArtist" -> campaignOptions.setUseFunctionalEscapeArtist(parseBoolean( nodeContents)); + case "disableIntelBreachChance" -> campaignOptions.setDisableIntelBreachChance(parseBoolean( + nodeContents)); case "useRandomDependentAddition" -> campaignOptions.setUseRandomDependentAddition(parseBoolean( nodeContents)); case "useRandomDependentRemoval" -> campaignOptions.setUseRandomDependentRemoval(parseBoolean( diff --git a/MekHQ/src/mekhq/campaign/randomEvents/prisoners/PrisonerEventManager.java b/MekHQ/src/mekhq/campaign/randomEvents/prisoners/PrisonerEventManager.java index f046c2e3e24..86ea7562b52 100644 --- a/MekHQ/src/mekhq/campaign/randomEvents/prisoners/PrisonerEventManager.java +++ b/MekHQ/src/mekhq/campaign/randomEvents/prisoners/PrisonerEventManager.java @@ -503,6 +503,10 @@ public static void checkForIntelBreachEvent(Campaign campaign, int freedPrisoner return; } + if (campaign.getCampaignOptions().isDisableIntelBreachChance()) { + return; + } + List activeContracts = campaign.getActiveAtBContracts(); activeContracts.removeIf(contract -> contract.getMoraleLevel().isOverwhelming() || contract.getMoraleLevel().isRouted()); diff --git a/MekHQ/src/mekhq/gui/campaignOptions/contents/PersonnelTab.java b/MekHQ/src/mekhq/gui/campaignOptions/contents/PersonnelTab.java index 167ebee9da6..81c10ce53d4 100644 --- a/MekHQ/src/mekhq/gui/campaignOptions/contents/PersonnelTab.java +++ b/MekHQ/src/mekhq/gui/campaignOptions/contents/PersonnelTab.java @@ -205,6 +205,7 @@ public class PersonnelTab { private MMComboBox comboPrisonerCaptureStyle; private JCheckBox chkResetTemporaryPrisonerCapacity; private JCheckBox chkUseFunctionalEscapeArtist; + private JCheckBox chkDisableIntelBreachChance; private JPanel dependentsPanel; private JCheckBox chkUseRandomDependentAddition; @@ -250,6 +251,7 @@ private void initializePrisonersAndDependentsTab() { comboPrisonerCaptureStyle = new MMComboBox<>("comboPrisonerCaptureStyle", PrisonerCaptureStyle.values()); chkResetTemporaryPrisonerCapacity = new JCheckBox(); chkUseFunctionalEscapeArtist = new JCheckBox(); + chkDisableIntelBreachChance = new JCheckBox(); dependentsPanel = new JPanel(); chkUseRandomDependentAddition = new JCheckBox(); @@ -1198,6 +1200,14 @@ public Component getListCellRendererComponent(final JList list, final Object }); comboPrisonerCaptureStyle.addMouseListener(createTipPanelUpdater(prisonersAndDependentsHeader, "PrisonerCaptureStyle")); + comboPrisonerCaptureStyle.addItemListener(e -> { + PrisonerCaptureStyle selectedStyle = comboPrisonerCaptureStyle.getSelectedItem(); + boolean isMekHQ = selectedStyle != null && selectedStyle.isMekHQ(); + chkDisableIntelBreachChance.setEnabled(isMekHQ); + if (!isMekHQ) { + chkDisableIntelBreachChance.setSelected(false); + } + }); chkResetTemporaryPrisonerCapacity = new CampaignOptionsCheckBox("ResetTemporaryPrisonerCapacity"); chkResetTemporaryPrisonerCapacity.addMouseListener(createTipPanelUpdater(prisonersAndDependentsHeader, @@ -1207,6 +1217,10 @@ public Component getListCellRendererComponent(final JList list, final Object chkUseFunctionalEscapeArtist.addMouseListener(createTipPanelUpdater(prisonersAndDependentsHeader, "UseFunctionalEscapeArtist")); + chkDisableIntelBreachChance = new CampaignOptionsCheckBox("DisableIntelBreachChance"); + chkDisableIntelBreachChance.addMouseListener(createTipPanelUpdater(prisonersAndDependentsHeader, + "DisableIntelBreachChance")); + // Layout the Panel final JPanel panel = new CampaignOptionsStandardPanel("PrisonersPanel", true, "PrisonersPanel"); final GridBagConstraints layout = new CampaignOptionsGridBagConstraints(panel); @@ -1228,6 +1242,11 @@ public Component getListCellRendererComponent(final JList list, final Object layout.gridwidth = 2; panel.add(chkResetTemporaryPrisonerCapacity, layout); + layout.gridy++; + layout.gridx = 0; + layout.gridwidth = 2; + panel.add(chkDisableIntelBreachChance, layout); + return panel; } @@ -1422,6 +1441,8 @@ public void loadValuesFromCampaignOptions(@Nullable CampaignOptions presetCampai // Prisoners and Dependents comboPrisonerCaptureStyle.setSelectedItem(options.getPrisonerCaptureStyle()); chkUseFunctionalEscapeArtist.setSelected(options.isUseFunctionalEscapeArtist()); + chkDisableIntelBreachChance.setSelected(options.isDisableIntelBreachChance()); + chkDisableIntelBreachChance.setEnabled(options.getPrisonerCaptureStyle().isMekHQ()); chkUseRandomDependentAddition.setSelected(options.isUseRandomDependentAddition()); chkUseRandomDependentRemoval.setSelected(options.isUseRandomDependentRemoval()); spnDependentProfessionDieSize.setValue(options.getDependentProfessionDieSize()); @@ -1524,6 +1545,7 @@ public void applyCampaignOptionsToCampaign(Campaign campaign, @Nullable Campaign // Prisoners and Dependents options.setPrisonerCaptureStyle(comboPrisonerCaptureStyle.getSelectedItem()); options.setUseFunctionalEscapeArtist(chkUseFunctionalEscapeArtist.isSelected()); + options.setDisableIntelBreachChance(chkDisableIntelBreachChance.isSelected()); if (chkResetTemporaryPrisonerCapacity.isSelected()) { campaign.setTemporaryPrisonerCapacity(DEFAULT_TEMPORARY_CAPACITY); }