Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed Loading & Saving of Some Campaign Options #5858

Merged
merged 6 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2100,7 +2100,9 @@ lblCombatAbilitiesTab.text=Combat Ability Options \u2318
lblManeuveringAbilitiesTab.text=Maneuvering Ability Options \u2318

lblUtilityAbilitiesTab.text=Utility Ability Options \u2318

lblEdgeCostPanel.text=Edge Cost
lblEdgeCost.text=Cost
lblEdgeCost.tooltip=The cost per rank of Edge.
lblAddAll.text=Enable All
lblAddAll.tooltip=Enable all SPA.
lblRemoveAll.text=Disable All
Expand Down
11 changes: 0 additions & 11 deletions MekHQ/src/mekhq/campaign/CampaignOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,8 @@ public class CampaignOptions {
// that haven't been invented yet, or that are completely extinct
public static final int TECH_UNKNOWN = 5;

public static final int TRANSIT_UNIT_DAY = 0;
public static final int TRANSIT_UNIT_WEEK = 1;
public static final int TRANSIT_UNIT_MONTH = 2;
public static final int TRANSIT_UNIT_NUM = 3;

public static final String S_TECH = "Tech";
public static final String S_AUTO = "Automatic Success";
Expand All @@ -87,15 +85,6 @@ public static String getTechLevelName(final int techLevel) {
default -> "Unknown";
};
}

public static String getTransitUnitName(final int unit) {
return switch (unit) {
case TRANSIT_UNIT_DAY -> "Days";
case TRANSIT_UNIT_WEEK -> "Weeks";
case TRANSIT_UNIT_MONTH -> "Months";
default -> "Unknown";
};
}
// endregion Magic Numbers

// region Variable Declarations
Expand Down
8 changes: 4 additions & 4 deletions MekHQ/src/mekhq/gui/campaignOptions/CampaignOptionsPane.java
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ private JTabbedPane createAdvancementParentTab() {
advancementTab.loadValuesFromCampaignOptions();

// Skills
skillsTab = new SkillsTab();
skillsTab = new SkillsTab(campaignOptions);

JTabbedPane skillsContentTabs = createSubTabs(Map.of(
"combatSkillsTab", skillsTab.createSkillsTab(true),
Expand Down Expand Up @@ -417,7 +417,7 @@ public void applyCampaignOptionsToCampaign(@Nullable CampaignPreset preset, bool

// Advancement
advancementTab.applyCampaignOptionsToCampaign(options, presetRandomSkillPreferences);
skillsTab.applyCampaignOptionsToCampaign(presetSkills);
skillsTab.applyCampaignOptionsToCampaign(options, presetSkills);
abilitiesTab.applyCampaignOptionsToCampaign(preset);

// Logistics
Expand Down Expand Up @@ -457,14 +457,14 @@ public void applyPreset(@Nullable CampaignPreset campaignPreset) {
// Human Resources
personnelTab.loadValuesFromCampaignOptions(presetCampaignOptions);
biographyTab.loadValuesFromCampaignOptions(presetCampaignOptions,
presetCampaignOptions.getRandomOriginOptions());
presetCampaignOptions.getRandomOriginOptions(), campaignPreset.getRankSystem());
relationshipsTab.loadValuesFromCampaignOptions(presetCampaignOptions);
turnoverAndRetentionTab.loadValuesFromCampaignOptions(presetCampaignOptions);

// Advancement
advancementTab.loadValuesFromCampaignOptions(presetCampaignOptions,
campaignPreset.getRandomSkillPreferences());
skillsTab.loadValuesFromCampaignOptions(campaignPreset.getSkills());
skillsTab.loadValuesFromCampaignOptions(presetCampaignOptions, campaignPreset.getSkills());
// The ability tab is a special case, so handled differently to other tabs
abilitiesTab.buildAllAbilityInfo(campaignPreset.getSpecialAbilities());

Expand Down
18 changes: 16 additions & 2 deletions MekHQ/src/mekhq/gui/campaignOptions/contents/BiographyTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import mekhq.campaign.personnel.enums.FamilialRelationshipDisplayLevel;
import mekhq.campaign.personnel.enums.PersonnelRole;
import mekhq.campaign.personnel.enums.RandomDeathMethod;
import mekhq.campaign.personnel.ranks.RankSystem;
import mekhq.campaign.universe.Faction;
import mekhq.campaign.universe.Planet;
import mekhq.campaign.universe.PlanetarySystem;
Expand Down Expand Up @@ -1267,6 +1268,7 @@ public JPanel createRankTab() {

// Contents
Component rankSystemsViewport = rankSystemsPane.getViewport().getView();
rankSystemsPane.applyToCampaign();

// Layout the Panel
final JPanel panel = new CampaignOptionsStandardPanel("RankTab", true);
Expand All @@ -1287,17 +1289,19 @@ public JPanel createRankTab() {
}

public void loadValuesFromCampaignOptions() {
loadValuesFromCampaignOptions(null, null);
loadValuesFromCampaignOptions(null, null, null);
}

/**
* Loads values from campaign options, optionally integrating with presets for default settings.
*
* @param presetCampaignOptions Optional preset campaign options, or `null` to use the campaign's active settings.
* @param presetRandomOriginOptions Optional random origin options, or `null` to use the default origin settings.
* @param presetRankSystem Optional rank system, or `null` to use the default system.
*/
public void loadValuesFromCampaignOptions(@Nullable CampaignOptions presetCampaignOptions,
@Nullable RandomOriginOptions presetRandomOriginOptions) {
@Nullable RandomOriginOptions presetRandomOriginOptions,
@Nullable RankSystem presetRankSystem) {
CampaignOptions options = presetCampaignOptions;
if (options == null) {
options = this.campaignOptions;
Expand All @@ -1308,6 +1312,10 @@ public void loadValuesFromCampaignOptions(@Nullable CampaignOptions presetCampai
originOptions = this.randomOriginOptions;
}

RankSystem rankSystem = presetRankSystem;
if (rankSystem == null) {
rankSystem = campaign.getRankSystem();
}

// General
chkUseDylansRandomXP.setSelected(options.isUseDylansRandomXP());
Expand Down Expand Up @@ -1374,6 +1382,9 @@ public void loadValuesFromCampaignOptions(@Nullable CampaignOptions presetCampai
for (int i = 0; i < chkUsePortrait.length; i++) {
chkUsePortrait[i].setSelected(usePortraitForRole[i]);
}

// Ranks
rankSystemsPane.getComboRankSystems().setSelectedItem(rankSystem);
}

/**
Expand Down Expand Up @@ -1460,5 +1471,8 @@ public void applyCampaignOptionsToCampaign(@Nullable CampaignOptions presetCampa
for (int i = 0; i < chkUsePortrait.length; i++) {
options.setUsePortraitForRole(i, chkUsePortrait[i].isSelected());
}

// Ranks
rankSystemsPane.applyToCampaign();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1046,8 +1046,6 @@ public void applyCampaignOptionsToCampaign(@Nullable CampaignOptions presetCampa
options.setAutoLogisticsHeatSink((int) spnAutoLogisticsHeatSink.getValue());
options.setAutoLogisticsOther((int) spnAutoLogisticsOther.getValue());



// Delivery
options.setNDiceTransitTime((int) spnNDiceTransitTime.getValue());
options.setConstantTransitTime((int) spnConstantTransitTime.getValue());
Expand All @@ -1062,7 +1060,7 @@ public void applyCampaignOptionsToCampaign(@Nullable CampaignOptions presetCampa
options.setMaxJumpsPlanetaryAcquisition((int) spnMaxJumpPlanetaryAcquisitions.getValue());
options.setPlanetAcquisitionFactionLimit(comboPlanetaryAcquisitionsFactionLimits.getSelectedItem());
options.setDisallowPlanetAcquisitionClanCrossover(disallowPlanetaryAcquisitionClanCrossover.isSelected());
options.setDisallowPlanetAcquisitionClanCrossover(disallowPlanetaryAcquisitionClanCrossover.isSelected());
options.setDisallowClanPartsFromIS(disallowClanPartsFromIS.isSelected());
options.setPenaltyClanPartsFromIS((int) spnPenaltyClanPartsFromIS.getValue());
options.setPlanetAcquisitionVerboseReporting(usePlanetaryAcquisitionsVerbose.isSelected());
for (int i = ITechnology.RATING_A; i <= ITechnology.RATING_F; i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -820,8 +820,7 @@ public void loadValuesFromCampaignOptions(@Nullable CampaignOptions presetCampai
useExtendedPartsModifierBox.setSelected(options.isUseExtendedPartsModifier());
usePeacetimeCostBox.setSelected(options.isUsePeacetimeCost());
showPeacetimeCostBox.setSelected(options.isShowPeacetimeCost());
comboFinancialYearDuration = new MMComboBox<>("comboFinancialYearDuration",
FinancialYearDuration.values());
comboFinancialYearDuration.setSelectedItem(options.getFinancialYearDuration());
newFinancialYearFinancesToCSVExportBox.setSelected(options.isNewFinancialYearFinancesToCSVExport());
payForPartsBox.setSelected(options.isPayForParts());
payForRepairsBox.setSelected(options.isPayForRepairs());
Expand Down
2 changes: 2 additions & 0 deletions MekHQ/src/mekhq/gui/campaignOptions/contents/MarketsTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -807,7 +807,9 @@ public void applyCampaignOptionsToCampaign(@Nullable CampaignOptions presetCampa
options.setJumpShipContractPercent((double) spnJumpShipPercent.getValue());
options.setWarShipContractPercent((double) spnWarShipPercent.getValue());
options.setEquipmentContractSaleValue(chkEquipContractSaleValue.isSelected());
options.setMercSizeLimited(chkMercSizeLimited.isSelected());
options.setBLCSaleValue(chkBLCSaleValue.isSelected());
options.setUseInfantryDontCount(useInfantryDoseNotCountBox.isSelected());
options.setOverageRepaymentInFinalPayment(chkOverageRepaymentInFinalPayment.isSelected());
}
}
4 changes: 2 additions & 2 deletions MekHQ/src/mekhq/gui/campaignOptions/contents/RulesetsTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -1063,7 +1063,7 @@ public void applyCampaignOptionsToCampaign(@Nullable CampaignOptions presetCampa
options.setUseVerboseBidding(chkUseVerboseBidding.isSelected());

// Legacy
options.setUseAtB(chkUseAtB.isSelected());
options.setUseAtB(chkUseAtB.isSelected() && !chkUseStratCon.isSelected());
options.setUseVehicles(chkUseVehicles.isSelected());
options.setDoubleVehicles(chkDoubleVehicles.isSelected());
options.setUseAero(chkOpForUsesAero.isSelected());
Expand Down Expand Up @@ -1136,7 +1136,7 @@ public void loadValuesFromCampaignOptions(@Nullable CampaignOptions presetCampai
chkUseVerboseBidding.setSelected(options.isUseVerboseBidding());

// Legacy
chkUseAtB.setSelected(options.isUseAtB());
chkUseAtB.setSelected(options.isUseAtB() && !options.isUseStratCon());
chkUseVehicles.setSelected(options.isUseVehicles());
chkDoubleVehicles.setSelected(options.isDoubleVehicles());
chkOpForUsesAero.setSelected(options.isUseAero());
Expand Down
80 changes: 73 additions & 7 deletions MekHQ/src/mekhq/gui/campaignOptions/contents/SkillsTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import megamek.common.annotations.Nullable;
import megamek.common.enums.SkillLevel;
import megamek.logging.MMLogger;
import mekhq.campaign.CampaignOptions;
import mekhq.campaign.personnel.SkillType;
import mekhq.gui.campaignOptions.components.*;

Expand Down Expand Up @@ -56,6 +57,8 @@ public class SkillsTab {
private static final String RESOURCE_PACKAGE = "mekhq/resources/CampaignOptionsDialog";
private static final ResourceBundle resources = ResourceBundle.getBundle(RESOURCE_PACKAGE);

private final CampaignOptions campaignOptions;

private Map<String, JSpinner> allTargetNumbers;
private Map<String, List<JLabel>> allSkillLevels;
private Map<String, List<JSpinner>> allSkillCosts;
Expand All @@ -64,13 +67,21 @@ public class SkillsTab {
private List<Double> storedValuesSpinners = new ArrayList<>();
private List<SkillLevel> storedValuesComboBoxes = new ArrayList<>();

private JPanel pnlEdgeCost;
private JLabel lblEdgeCost;
private JSpinner spnEdgeCost;

private static final MMLogger logger = MMLogger.create(SkillsTab.class);

/**
* Constructs a new `SkillsTab` instance and initializes the necessary data
* structures for managing skill configurations.
*
* @param campaignOptions the {@code CampaignOptions} instance that holds the settings
* to be modified or displayed in this tab.
*/
public SkillsTab() {
public SkillsTab(CampaignOptions campaignOptions) {
this.campaignOptions = campaignOptions;
initialize();
}

Expand All @@ -95,6 +106,10 @@ private void initializeGeneral() {
storedTargetNumber = 0;
storedValuesSpinners = new ArrayList<>();
storedValuesComboBoxes = new ArrayList<>();

pnlEdgeCost = new JPanel();
lblEdgeCost = new JLabel();
spnEdgeCost = new JSpinner();
}

/**
Expand Down Expand Up @@ -142,6 +157,10 @@ public JPanel createSkillsTab(boolean isCombatTab) {
skillPanels.add(skillPanel);
}

// Content
pnlEdgeCost = createEdgeCostPanel();
pnlEdgeCost.setVisible(!isCombatTab);

// Layout the Panel
final JPanel panel = new CampaignOptionsStandardPanel(isCombatTab ?
"CombatSkillsTab" : "SupportSkillsTab", true);
Expand Down Expand Up @@ -169,6 +188,11 @@ public JPanel createSkillsTab(boolean isCombatTab) {
layout.gridy = 0;
panel.add(headerPanel, layout);

layout.gridwidth = 2;
layout.gridx = 0;
layout.gridy++;
panel.add(pnlEdgeCost, layout);

layout.gridwidth = 1;
layout.gridx = 0;
layout.gridy++;
Expand All @@ -195,6 +219,31 @@ public JPanel createSkillsTab(boolean isCombatTab) {
return createParentPanel(panel, "CombatSkillsTab");
}

/**
* Creates a panel to configure and display the edge cost option in the SkillsTab.
*
* @return A {@link JPanel} containing the label and spinner for the edge cost configuration.
*/
private JPanel createEdgeCostPanel() {
lblEdgeCost = new CampaignOptionsLabel("EdgeCost");
spnEdgeCost = new CampaignOptionsSpinner("EdgeCost",
100, 0, 500, 1);

// Layout the Panel
final JPanel panel = new CampaignOptionsStandardPanel("EdgeCostPanel",
true, "EdgeCostPanel");
final GridBagConstraints layout = new CampaignOptionsGridBagConstraints(panel);

layout.gridwidth = 1;
layout.gridx = 0;
layout.gridy = 0;
panel.add(lblEdgeCost, layout);
layout.gridx++;
panel.add(spnEdgeCost, layout);

return panel;
}

/**
* Toggles the visibility of all components related to skills in the SkillsTab UI.
* <p>
Expand Down Expand Up @@ -420,7 +469,7 @@ private static void milestoneActionListener(List<JComboBox<SkillLevel>> comboBox
* </p>
*/
public void loadValuesFromCampaignOptions() {
loadValuesFromCampaignOptions(new HashMap<>());
loadValuesFromCampaignOptions(null, new HashMap<>());
}

/**
Expand All @@ -434,7 +483,13 @@ public void loadValuesFromCampaignOptions() {
* @param presetSkillValues an optional map of preset skill values. If null
* or empty, default skill values are used instead.
*/
public void loadValuesFromCampaignOptions(Map<String, SkillType> presetSkillValues) {
public void loadValuesFromCampaignOptions(@Nullable CampaignOptions presetCampaignOptions,
Map<String, SkillType> presetSkillValues) {
CampaignOptions options = presetCampaignOptions;
if (presetCampaignOptions == null) {
options = this.campaignOptions;
}

String[] skills = SkillType.getSkillList(); // default skills

for (String skillName : skills) {
Expand Down Expand Up @@ -472,12 +527,12 @@ public void loadValuesFromCampaignOptions(Map<String, SkillType> presetSkillValu
SkillLevel levelToSet = determineMilestoneLevel(i, greenIndex, regularIndex,
veteranIndex, eliteIndex);
milestones.get(i).setSelectedItem(levelToSet);

logger.debug(String.format("Updated milestone at index %d for skill: %s to %s",
i, skillName, levelToSet));
}
}
}

// Edge Costs
spnEdgeCost.setValue(options.getEdgeCost());
}

/**
Expand Down Expand Up @@ -519,11 +574,19 @@ private SkillLevel determineMilestoneLevel(int index, int greenIndex, int regula
* with the configured target numbers, costs, and milestones for each skill.
* </p>
*
* @param presetCampaignOptions the {@link CampaignOptions} instance to save settings to,
* or {@code null} to update the current campaign options.
* @param presetSkills an optional map of preset skill values. Overrides default
* values if provided. Null values will use the campaign's
* default values.
*/
public void applyCampaignOptionsToCampaign(@Nullable Map<String, SkillType> presetSkills) {
public void applyCampaignOptionsToCampaign(@Nullable CampaignOptions presetCampaignOptions,
@Nullable Map<String, SkillType> presetSkills) {
CampaignOptions options = presetCampaignOptions;
if (presetCampaignOptions == null) {
options = this.campaignOptions;
}

for (final String skillName : SkillType.getSkillList()) {
SkillType type = SkillType.getType(skillName);
if (presetSkills != null) {
Expand All @@ -544,6 +607,9 @@ public void applyCampaignOptionsToCampaign(@Nullable Map<String, SkillType> pres
// Update Skill Milestones
updateSkillMilestones(type);
}

// Edge Costs
options.setEdgeCost((int) spnEdgeCost.getValue());
}

/**
Expand Down
Loading