diff --git a/MekHQ/src/mekhq/Utilities.java b/MekHQ/src/mekhq/Utilities.java index 28df784bdb..d33bab639e 100644 --- a/MekHQ/src/mekhq/Utilities.java +++ b/MekHQ/src/mekhq/Utilities.java @@ -19,30 +19,10 @@ */ package mekhq; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FilenameFilter; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.*; -import java.util.function.Consumer; - -import javax.swing.JTable; -import javax.swing.table.TableModel; - -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVPrinter; -import org.apache.logging.log4j.LogManager; -import org.w3c.dom.Node; - import io.sentry.Sentry; import megamek.client.Client; import megamek.client.generator.RandomNameGenerator; +import megamek.codeUtilities.MathUtility; import megamek.codeUtilities.ObjectUtility; import megamek.codeUtilities.StringUtility; import megamek.common.*; @@ -62,6 +42,22 @@ import mekhq.campaign.unit.CrewType; import mekhq.campaign.unit.Unit; import mekhq.campaign.unit.UnitTechProgression; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVPrinter; +import org.apache.logging.log4j.LogManager; +import org.w3c.dom.Node; + +import javax.swing.*; +import javax.swing.table.TableModel; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.*; +import java.util.Map.Entry; +import java.util.function.Consumer; public class Utilities { private Utilities() { @@ -346,19 +342,25 @@ public static boolean isOmniVariant(Entity entity1, Entity entity2) { return true; } + /** + * Generates an experience level based on a 2d6 roll modified by the bonus value. + * + * @param bonus the bonus value to be added to the roll + * @return the generated experience level + * @throws IllegalStateException if the roll is not within the expected range + */ public static int generateExpLevel(int bonus) { - int roll = Compute.d6(2) + bonus; - if (roll <= 2) { - return SkillType.EXP_ULTRA_GREEN; - } else if (roll < 6) { - return SkillType.EXP_GREEN; - } else if (roll < 10) { - return SkillType.EXP_REGULAR; - } else if (roll < 12) { - return SkillType.EXP_VETERAN; - } else { - return SkillType.EXP_ELITE; - } + int roll = MathUtility.clamp(Compute.d6(2) + bonus, 1, 12); + + return switch (roll) { + case 1 -> SkillType.EXP_ULTRA_GREEN; + case 2, 3, 4, 5 -> SkillType.EXP_GREEN; + case 6, 7, 8, 9 -> SkillType.EXP_REGULAR; + case 10, 11 -> SkillType.EXP_VETERAN; + case 12 -> SkillType.EXP_ELITE; + default -> throw new IllegalStateException("Unexpected value in mekhq/Utilities.java/generateExpLevel: " + + roll); + }; } /** @@ -902,28 +904,15 @@ public static Money[] readMoneyArray(Node node, int minimumSize) { } public static int getSimpleTechLevel(int level) { - switch (level) { - case TechConstants.T_IS_TW_NON_BOX: - case TechConstants.T_CLAN_TW: - case TechConstants.T_IS_TW_ALL: - case TechConstants.T_TW_ALL: - return CampaignOptions.TECH_STANDARD; - case TechConstants.T_IS_ADVANCED: - case TechConstants.T_CLAN_ADVANCED: - return CampaignOptions.TECH_ADVANCED; - case TechConstants.T_IS_EXPERIMENTAL: - case TechConstants.T_CLAN_EXPERIMENTAL: - return CampaignOptions.TECH_EXPERIMENTAL; - case TechConstants.T_IS_UNOFFICIAL: - case TechConstants.T_CLAN_UNOFFICIAL: - return CampaignOptions.TECH_UNOFFICIAL; - case TechConstants.T_TECH_UNKNOWN: - return CampaignOptions.TECH_UNKNOWN; - case TechConstants.T_ALLOWED_ALL: - case TechConstants.T_INTRO_BOXSET: - default: - return CampaignOptions.TECH_INTRO; - } + return switch (level) { + case TechConstants.T_IS_TW_NON_BOX, TechConstants.T_CLAN_TW, TechConstants.T_IS_TW_ALL, TechConstants.T_TW_ALL -> + CampaignOptions.TECH_STANDARD; + case TechConstants.T_IS_ADVANCED, TechConstants.T_CLAN_ADVANCED -> CampaignOptions.TECH_ADVANCED; + case TechConstants.T_IS_EXPERIMENTAL, TechConstants.T_CLAN_EXPERIMENTAL -> CampaignOptions.TECH_EXPERIMENTAL; + case TechConstants.T_IS_UNOFFICIAL, TechConstants.T_CLAN_UNOFFICIAL -> CampaignOptions.TECH_UNOFFICIAL; + case TechConstants.T_TECH_UNKNOWN -> CampaignOptions.TECH_UNKNOWN; + default -> CampaignOptions.TECH_INTRO; + }; } /** @@ -1059,21 +1048,21 @@ public static String getRomanNumeralsFromArabicNumber(int level, boolean checkZe public static Map sortMapByValue(Map unsortMap, boolean highFirst) { // Convert Map to List - List> list = new LinkedList<>(unsortMap.entrySet()); + List> list = new LinkedList<>(unsortMap.entrySet()); // Sort list with comparator, to compare the Map values - list.sort(Map.Entry.comparingByValue()); + list.sort(Entry.comparingByValue()); // Convert sorted map back to a Map Map sortedMap = new LinkedHashMap<>(); if (highFirst) { - ListIterator> li = list.listIterator(list.size()); + ListIterator> li = list.listIterator(list.size()); while (li.hasPrevious()) { - Map.Entry entry = li.previous(); + Entry entry = li.previous(); sortedMap.put(entry.getKey(), entry.getValue()); } } else { - for (Map.Entry entry : list) { + for (Entry entry : list) { sortedMap.put(entry.getKey(), entry.getValue()); } } @@ -1350,7 +1339,7 @@ public static MechSummary retrieveOriginalUnit(Entity newE) throws EntityLoading // I need to change the new entity to the one from the mtf file now, so that // equipment numbers will match - MechSummary summary = cacheInstance.getMech(newE.getFullChassis() + " " + newE.getModel()); + MechSummary summary = cacheInstance.getMech(newE.getFullChassis() + ' ' + newE.getModel()); if (null == summary) { // Attempt to deal with new naming convention directly @@ -1392,7 +1381,7 @@ public static List generateEntityStub(List entities) { * @return A character string */ public static String getDeploymentString(Player player) { - StringBuilder result = new StringBuilder(""); + StringBuilder result = new StringBuilder(); if (player.getStartingPos() >= 0 && player.getStartingPos() <= IStartingPositions.START_LOCATION_NAMES.length) { @@ -1405,14 +1394,14 @@ public static String getDeploymentString(Player player) { int SEx = player.getStartingAnySEx() + 1; int SEy = player.getStartingAnySEy() + 1; if ((NWx + NWy + SEx + SEy) > 0) { - result.append(" (" + NWx + ", " + NWy + ")-(" + SEx + ", " + SEy + ")"); + result.append(" (").append(NWx).append(", ").append(NWy).append(")-(").append(SEx).append(", ").append(SEy).append(')'); } } int so = player.getStartOffset(); int sw = player.getStartWidth(); if ((so != 0) || (sw != 3)) { - result.append(", " + so); - result.append(", " + sw); + result.append(", ").append(so); + result.append(", ").append(sw); } return result.toString(); diff --git a/MekHQ/src/mekhq/gui/panes/CampaignOptionsPane.java b/MekHQ/src/mekhq/gui/panes/CampaignOptionsPane.java index e95b996f61..46bcb9f9fd 100644 --- a/MekHQ/src/mekhq/gui/panes/CampaignOptionsPane.java +++ b/MekHQ/src/mekhq/gui/panes/CampaignOptionsPane.java @@ -277,7 +277,6 @@ public class CampaignOptionsPane extends AbstractMHQTabbedPane { private final JPanel turnoverAndRetentionSettingsPanel = new JPanel(); private JLabel lblTurnoverFixedTargetNumber; private JSpinner spnTurnoverFixedTargetNumber; - private JLabel lblTurnoverFrequency; private MMComboBox comboTurnoverFrequency; private JCheckBox chkUseContractCompletionRandomRetirement; private JCheckBox chkUseRandomFounderTurnover; @@ -285,9 +284,7 @@ public class CampaignOptionsPane extends AbstractMHQTabbedPane { private JCheckBox chkAeroRecruitsHaveUnits; private JCheckBox chkTrackOriginalUnit; private JCheckBox chkUseSubContractSoldiers; - private JLabel lblServiceContractDuration; private JSpinner spnServiceContractDuration; - private JLabel lblServiceContractModifier; private JSpinner spnServiceContractModifier; private JCheckBox chkPayBonusDefault; private JLabel lblPayBonusDefaultThreshold; @@ -311,11 +308,8 @@ public class CampaignOptionsPane extends AbstractMHQTabbedPane { // Payout private final JPanel turnoverAndRetentionPayoutPanel = new JPanel(); - private JLabel lblPayoutRateOfficer; private JSpinner spnPayoutRateOfficer; - private JLabel lblPayoutRateEnlisted; private JSpinner spnPayoutRateEnlisted; - private JLabel lblPayoutRetirementMultiplier; private JSpinner spnPayoutRetirementMultiplier; private JCheckBox chkUsePayoutServiceBonus; @@ -344,14 +338,10 @@ public class CampaignOptionsPane extends AbstractMHQTabbedPane { private JCheckBox chkUseFatigue; private final JPanel fatigueSubPanel = new JPanel(); - private JLabel lblFatigueWarning; - private JLabel lblFatigueRate; private JSpinner spnFatigueRate; private JCheckBox chkUseInjuryFatigue; - private JLabel lblFieldKitchenCapacity; private JSpinner spnFieldKitchenCapacity; private JCheckBox chkFieldKitchenIgnoreNonCombatants; - private JLabel lblFatigueLeaveThreshold; private JSpinner spnFatigueLeaveThreshold; //endregion Turnover and Retention Tab @@ -519,10 +509,8 @@ public class CampaignOptionsPane extends AbstractMHQTabbedPane { // Taxes private JCheckBox chkUseTaxes; private JPanel taxesSubPanel = new JPanel(); - private JLabel lblTaxesPercentage; private JSpinner spnTaxesPercentage; - private JPanel sharesPanel; private JCheckBox chkUseShareSystem; private JPanel sharesSubPanel; private JCheckBox chkSharesForAll; @@ -660,9 +648,7 @@ public class CampaignOptionsPane extends AbstractMHQTabbedPane { // contract operations private JCheckBox chkMercSizeLimited; private JCheckBox chkRestrictPartsByMission; - private JLabel lblBonusPartExchangeValue; private JSpinner spnBonusPartExchangeValue; - private JLabel lblBonusPartMaxExchangeCount; private JSpinner spnBonusPartMaxExchangeCount; private JCheckBox chkLimitLanceWeight; private JCheckBox chkLimitLanceNumUnits; @@ -2466,12 +2452,12 @@ private JScrollPane createSkillRandomizationTab() { final AbstractMHQScrollablePanel panRandomSkill = new DefaultMHQScrollablePanel(getFrame(), "skillRandomizationPanel", new GridBagLayout()); - JPanel panRollTable = new JPanel(new GridLayout(8, 3, 5, 0)); + JPanel panRollTable = new JPanel(new GridLayout(6, 3, 5, 0)); panRollTable.add(new JLabel("Value")); panRollTable.add(new JLabel("Level")); - panRollTable.add(new JLabel("# Abils")); + panRollTable.add(new JLabel("# Random SPAs")); panRollTable.add(new JLabel("less than 2")); - JLabel lblUltraGreen = new JLabel("Ultra-Green/None"); + JLabel lblUltraGreen = new JLabel(SkillLevel.ULTRA_GREEN.toString()); lblUltraGreen.setToolTipText(resources.getString("lblUltraGreen.toolTipText")); panRollTable.add(lblUltraGreen); panRollTable.add(new JLabel("0")); @@ -2487,12 +2473,6 @@ private JScrollPane createSkillRandomizationTab() { panRollTable.add(new JLabel("12 or more")); panRollTable.add(new JLabel(SkillLevel.ELITE.toString())); panRollTable.add(new JLabel("2")); - panRollTable.add(new JLabel("N/A")); - panRollTable.add(new JLabel(SkillLevel.HEROIC.toString())); - panRollTable.add(new JLabel("N/A")); - panRollTable.add(new JLabel("N/A")); - panRollTable.add(new JLabel(SkillLevel.LEGENDARY.toString())); - panRollTable.add(new JLabel("N/A")); panRollTable.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("2d6 + Bonus"), BorderFactory.createEmptyBorder(5, 5, 5, 5))); @@ -2986,7 +2966,7 @@ private JScrollPane createAgainstTheBotTab() { gridBagConstraints.gridwidth = 2; panSubAtBContract.add(chkRestrictPartsByMission, gridBagConstraints); - lblBonusPartExchangeValue = new JLabel(resources.getString("lblBonusPartExchangeValue.text")); + JLabel lblBonusPartExchangeValue = new JLabel(resources.getString("lblBonusPartExchangeValue.text")); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 1; @@ -2998,7 +2978,7 @@ private JScrollPane createAgainstTheBotTab() { gridBagConstraints.gridy = 4; panSubAtBContract.add(spnBonusPartExchangeValue, gridBagConstraints); - lblBonusPartMaxExchangeCount = new JLabel(resources.getString("lblBonusPartMaxExchangeCount.text")); + JLabel lblBonusPartMaxExchangeCount = new JLabel(resources.getString("lblBonusPartMaxExchangeCount.text")); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 1; @@ -3692,11 +3672,11 @@ private JPanel createLogPanel() { } private void createFatigueSubPanel() { - lblFatigueWarning = new JLabel(resources.getString("lblFatigueWarning.text")); + JLabel lblFatigueWarning = new JLabel(resources.getString("lblFatigueWarning.text")); lblFatigueWarning.setName("lblFatigueWarning"); lblFatigueWarning.setEnabled(campaign.getCampaignOptions().isUseFatigue()); - lblFatigueRate = new JLabel(resources.getString("lblFatigueRate.text")); + JLabel lblFatigueRate = new JLabel(resources.getString("lblFatigueRate.text")); lblFatigueRate.setToolTipText(resources.getString("lblFatigueRate.toolTipText")); lblFatigueRate.setName("lblFatigueRate"); lblFatigueRate.setEnabled(campaign.getCampaignOptions().isUseFatigue()); @@ -3711,7 +3691,7 @@ private void createFatigueSubPanel() { chkUseInjuryFatigue.setName("chkUseInjuryFatigue"); chkUseInjuryFatigue.setEnabled(campaign.getCampaignOptions().isUseFatigue()); - lblFieldKitchenCapacity = new JLabel(resources.getString("lblFieldKitchenCapacity.text")); + JLabel lblFieldKitchenCapacity = new JLabel(resources.getString("lblFieldKitchenCapacity.text")); lblFieldKitchenCapacity.setToolTipText(resources.getString("lblFieldKitchenCapacity.toolTipText")); lblFieldKitchenCapacity.setName("lblFieldKitchenCapacity"); lblFieldKitchenCapacity.setEnabled(campaign.getCampaignOptions().isUseFatigue()); @@ -3726,7 +3706,7 @@ private void createFatigueSubPanel() { chkFieldKitchenIgnoreNonCombatants.setName("chkFieldKitchenIgnoreNonCombatants"); chkFieldKitchenIgnoreNonCombatants.setEnabled(campaign.getCampaignOptions().isUseFatigue()); - lblFatigueLeaveThreshold = new JLabel(resources.getString("lblFatigueLeaveThreshold.text")); + JLabel lblFatigueLeaveThreshold = new JLabel(resources.getString("lblFatigueLeaveThreshold.text")); lblFatigueLeaveThreshold.setToolTipText(resources.getString("lblFatigueLeaveThreshold.toolTipText")); lblFatigueLeaveThreshold.setName("lblFatigueLeaveThreshold"); lblFatigueLeaveThreshold.setEnabled(campaign.getCampaignOptions().isUseFatigue()); @@ -4462,7 +4442,7 @@ private JPanel createTurnoverAndRetentionSettingsPanel() { lblTurnoverFixedTargetNumber.setName("lblTurnoverFixedTargetNumber"); lblTurnoverFixedTargetNumber.setEnabled(isUseTurnover); - lblTurnoverFrequency = new JLabel(resources.getString("lblTurnoverFrequency.text")); + JLabel lblTurnoverFrequency = new JLabel(resources.getString("lblTurnoverFrequency.text")); lblTurnoverFrequency.setToolTipText(resources.getString("lblTurnoverFrequency.toolTipText")); lblTurnoverFrequency.setName("lblTurnoverFrequency"); lblTurnoverFrequency.setEnabled(isUseTurnover); @@ -4513,7 +4493,7 @@ public Component getListCellRendererComponent(final JList list, final Object chkUseSubContractSoldiers.setName("chkUseSubContractSoldiers"); chkUseSubContractSoldiers.setEnabled(isUseTurnover); - lblServiceContractDuration = new JLabel(resources.getString("lblServiceContractDuration.text")); + JLabel lblServiceContractDuration = new JLabel(resources.getString("lblServiceContractDuration.text")); lblServiceContractDuration.setToolTipText(resources.getString("lblServiceContractDuration.toolTipText")); lblServiceContractDuration.setName("lblServiceContractDuration"); lblServiceContractDuration.setEnabled(isUseTurnover); @@ -4523,7 +4503,7 @@ public Component getListCellRendererComponent(final JList list, final Object spnServiceContractDuration.setName("spnServiceContractDuration"); spnServiceContractDuration.setEnabled(isUseTurnover); - lblServiceContractModifier = new JLabel(resources.getString("lblServiceContractModifier.text")); + JLabel lblServiceContractModifier = new JLabel(resources.getString("lblServiceContractModifier.text")); lblServiceContractModifier.setToolTipText(resources.getString("lblServiceContractModifier.toolTipText")); lblServiceContractModifier.setName("lblServiceContractModifier"); lblServiceContractModifier.setEnabled(isUseTurnover); @@ -4754,7 +4734,7 @@ private void createLoyaltySubPanel(boolean isUseTurnover) { private JPanel createTurnoverAndRetentionPayoutPanel() { boolean isUseTurnover = campaign.getCampaignOptions().isUseRandomRetirement(); - lblPayoutRateOfficer = new JLabel(resources.getString("lblPayoutRateOfficer.text")); + JLabel lblPayoutRateOfficer = new JLabel(resources.getString("lblPayoutRateOfficer.text")); lblPayoutRateOfficer.setToolTipText(resources.getString("lblPayoutRateOfficer.toolTipText")); lblPayoutRateOfficer.setName("lblPayoutRateOfficer"); lblPayoutRateOfficer.setEnabled(isUseTurnover); @@ -4764,7 +4744,7 @@ private JPanel createTurnoverAndRetentionPayoutPanel() { spnPayoutRateOfficer.setName("spnPayoutRateOfficer"); spnPayoutRateOfficer.setEnabled(isUseTurnover); - lblPayoutRateEnlisted = new JLabel(resources.getString("lblPayoutRateEnlisted.text")); + JLabel lblPayoutRateEnlisted = new JLabel(resources.getString("lblPayoutRateEnlisted.text")); lblPayoutRateEnlisted.setToolTipText(resources.getString("lblPayoutRateEnlisted.toolTipText")); lblPayoutRateEnlisted.setName("lblPayoutRateEnlisted"); lblPayoutRateEnlisted.setEnabled(isUseTurnover); @@ -4774,7 +4754,7 @@ private JPanel createTurnoverAndRetentionPayoutPanel() { spnPayoutRateEnlisted.setName("lblPayoutRateEnlisted"); spnPayoutRateEnlisted.setEnabled(isUseTurnover); - lblPayoutRetirementMultiplier = new JLabel(resources.getString("lblPayoutRetirementMultiplier.text")); + JLabel lblPayoutRetirementMultiplier = new JLabel(resources.getString("lblPayoutRetirementMultiplier.text")); lblPayoutRetirementMultiplier.setToolTipText(resources.getString("lblPayoutRetirementMultiplier.toolTipText")); lblPayoutRetirementMultiplier.setName("lblPayoutRetirementMultiplier"); lblPayoutRetirementMultiplier.setEnabled(isUseTurnover); @@ -7435,7 +7415,7 @@ private JPanel createTaxesPanel() { private JPanel createTaxesSubPanel() { boolean isEnabled = campaign.getCampaignOptions().isUseTaxes(); - lblTaxesPercentage = new JLabel(); + JLabel lblTaxesPercentage = new JLabel(); lblTaxesPercentage.setText(resources.getString("lblTaxesPercentage.text")); lblTaxesPercentage.setToolTipText(resources.getString("lblTaxesPercentage.toolTipText")); lblTaxesPercentage.setName("lblTaxesPercentage"); @@ -7478,7 +7458,7 @@ private JPanel createSharesPanel() { sharesSubPanel = createSharesSubPanel(); - sharesPanel = new JDisableablePanel("sharesPanel"); + JPanel sharesPanel = new JDisableablePanel("sharesPanel"); sharesPanel.setBorder(BorderFactory.createTitledBorder(resources.getString("sharesPanel.title"))); final GroupLayout layout = new GroupLayout(sharesPanel);