Skip to content

Commit 33b14b9

Browse files
authored
Merge pull request #8397 from IllianiBird/campaignUpgradeFix
Fix #8389, #8390: Rewrote Campaign Upgrade Process to (Hopefully) Fix Stalling
2 parents bf189f9 + 855445f commit 33b14b9

File tree

2 files changed

+46
-84
lines changed

2 files changed

+46
-84
lines changed

MekHQ/resources/mekhq/resources/CampaignUpgradeDialog.properties

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
# Microsoft's "Game Content Usage Rules"
2929
# <https://www.xbox.com/en-US/developers/rules> and it is not endorsed by or
3030
# affiliated with Microsoft.
31-
CampaignUpgradeDialog.upgrading=<html><h2 style="text-align:center;">Upgrading Campaign to <b>{0}</b>.\
32-
<br>\
33-
<br>Please wait.</h2></html>
31+
CampaignUpgradeDialog.upgrading=<html><h1 style="text-align:center">Campaign Upgraded to {0}</h1></html>
3432
CampaignUpgradeDialog.button.cancel=Cancel
3533
CampaignUpgradeDialog.button.confirm=Confirm
3634
CampaignUpgradeDialog.button.manual=Manual

MekHQ/src/mekhq/gui/dialog/CampaignUpgradeDialog.java

Lines changed: 45 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,15 @@
3333
package mekhq.gui.dialog;
3434

3535
import static megamek.client.ui.WrapLayout.wordWrap;
36-
import static mekhq.gui.campaignOptions.CampaignOptionsDialog.CampaignOptionsDialogMode.CAMPAIGN_UPGRADE;
3736
import static mekhq.utilities.MHQInternationalization.getFormattedTextAt;
3837
import static mekhq.utilities.MHQInternationalization.getTextAt;
3938

4039
import java.awt.BorderLayout;
4140
import java.awt.Component;
42-
import java.awt.Frame;
4341
import java.util.List;
44-
import javax.swing.DefaultComboBoxModel;
42+
import java.util.Map;
4543
import javax.swing.DefaultListCellRenderer;
4644
import javax.swing.DefaultListModel;
47-
import javax.swing.JDialog;
4845
import javax.swing.JLabel;
4946
import javax.swing.JList;
5047
import javax.swing.JPanel;
@@ -58,9 +55,11 @@
5855
import mekhq.MHQConstants;
5956
import mekhq.MekHQ;
6057
import mekhq.campaign.Campaign;
58+
import mekhq.campaign.personnel.SpecialAbility;
59+
import mekhq.campaign.personnel.skills.SkillType;
6160
import mekhq.gui.baseComponents.immersiveDialogs.ImmersiveDialogCore;
61+
import mekhq.gui.baseComponents.immersiveDialogs.ImmersiveDialogNotification;
6262
import mekhq.gui.baseComponents.immersiveDialogs.ImmersiveDialogWidth;
63-
import mekhq.gui.baseComponents.roundedComponents.RoundedLineBorder;
6463
import mekhq.gui.campaignOptions.CampaignOptionsDialog;
6564

6665
/**
@@ -157,9 +156,45 @@ public static void campaignUpgradeDialog(Campaign campaign, Runnable runnable) {
157156
}
158157

159158
CampaignPreset chosenPreset = presets.get(comboChoiceIndex);
160-
LOGGER.info("Applying {} during upgrade process", chosenPreset.getTitle());
159+
campaign.setGameOptions(chosenPreset.getGameOptions());
160+
campaign.setRandomSkillPreferences(chosenPreset.getRandomSkillPreferences());
161+
Map<String, SkillType> presetSkills = chosenPreset.getSkills();
162+
for (final String skillName : SkillType.getSkillList()) {
163+
SkillType storedType = SkillType.getType(skillName);
164+
SkillType presetType = presetSkills.get(skillName);
165+
166+
if (storedType == null || presetType == null) {
167+
LOGGER.info("Skipping outdated or missing skill: {}", skillName);
168+
continue;
169+
}
170+
171+
// Update Target Number
172+
storedType.setTarget(presetType.getTarget());
173+
174+
// Update Skill Costs
175+
int size = storedType.getCosts().length;
176+
Integer[] presetCosts = presetType.getCosts();
177+
for (int level = 0; level < size; level++) {
178+
try {
179+
int cost = presetCosts[level];
180+
SkillType.setCost(skillName, cost, level);
181+
} catch (IllegalArgumentException e) {
182+
LOGGER.info("Skipping outdated or missing skill level: {}", skillName);
183+
}
184+
}
185+
186+
// Update Skill Milestones
187+
storedType.setGreenLevel(presetType.getGreenLevel());
188+
storedType.setRegularLevel(presetType.getRegularLevel());
189+
storedType.setVeteranLevel(presetType.getVeteranLevel());
190+
storedType.setEliteLevel(presetType.getEliteLevel());
191+
storedType.setHeroicLevel(presetType.getHeroicLevel());
192+
storedType.setLegendaryLevel(presetType.getLegendaryLevel());
193+
}
194+
195+
SpecialAbility.replaceSpecialAbilities(chosenPreset.getSpecialAbilities());
161196

162-
triggerLoadingDialog(campaign, chosenPreset, runnable);
197+
LOGGER.info("Applying {} during upgrade process", chosenPreset.getTitle());
163198
}
164199
case PRESET_SELECTION_CUSTOMIZE -> {
165200
CampaignOptionsDialog optionsDialog = new CampaignOptionsDialog(null, campaign);
@@ -170,62 +205,10 @@ public static void campaignUpgradeDialog(Campaign campaign, Runnable runnable) {
170205
SwingUtilities.invokeLater(runnable);
171206
}
172207
}
173-
}
174-
175-
/**
176-
* Triggers a loading dialog while the provided campaign is upgraded using the chosen preset.
177-
*
178-
* <p>This method performs the upgrade operation on a background thread, displaying a modal overlay to the user.
179-
* Upon completion, the dialog is closed and, if specified, a {@link Runnable} completion task is executed.</p>
180-
*
181-
* @param campaign The campaign being upgraded.
182-
* @param chosenPreset The campaign preset to apply during the upgrade.
183-
* @param onUpgradeComplete A task to execute once the upgrade is complete.
184-
*
185-
* @author Illiani
186-
* @since 0.50.07
187-
*/
188-
/**
189-
* Triggers a loading dialog while upgrading campaign options. This method can be called from any thread and will
190-
* ensure all Swing operations occur on the Event Dispatch Thread.
191-
*
192-
* @param campaign the campaign to upgrade
193-
* @param chosenPreset the preset to apply
194-
* @param onUpgradeComplete callback to run after upgrade completes
195-
*/
196-
private static void triggerLoadingDialog(Campaign campaign, CampaignPreset chosenPreset,
197-
Runnable onUpgradeComplete) {
198-
SwingUtilities.invokeLater(() -> {
199-
JDialog loadingDialog = new JDialog((Frame) null, true);
200-
loadingDialog.setUndecorated(true);
201208

202-
JLabel loadingLabel = new JLabel(getFormattedTextAt(RESOURCE_BUNDLE, "CampaignUpgradeDialog.upgrading",
203-
MHQConstants.VERSION.toString()));
204-
loadingLabel.setBorder(RoundedLineBorder.createRoundedLineBorder());
205-
loadingDialog.add(loadingLabel);
206-
loadingDialog.pack();
207-
loadingDialog.setLocationRelativeTo(null);
208-
209-
SwingWorker<Void, Void> worker = new SwingWorker<>() {
210-
@Override
211-
protected Void doInBackground() {
212-
CampaignOptionsDialog optionsDialog = new CampaignOptionsDialog(null, campaign, chosenPreset,
213-
CAMPAIGN_UPGRADE);
214-
optionsDialog.processApplyAction();
215-
return null;
216-
}
217-
218-
@Override
219-
protected void done() {
220-
loadingDialog.setVisible(false);
221-
loadingDialog.dispose();
222-
onUpgradeComplete.run();
223-
}
224-
};
225-
226-
worker.execute();
227-
loadingDialog.setVisible(true); // Blocks EDT until worker.done() closes dialog
228-
});
209+
new ImmersiveDialogNotification(campaign,
210+
getFormattedTextAt(RESOURCE_BUNDLE, "CampaignUpgradeDialog.upgrading", MHQConstants.VERSION.toString()),
211+
true);
229212
}
230213

231214
/**
@@ -295,23 +278,4 @@ public Component getListCellRendererComponent(JList<?> list,
295278

296279
return panel;
297280
}
298-
299-
300-
/**
301-
* Converts a list of {@link CampaignPreset} objects into a combo box model of their display names.
302-
*
303-
* @return a {@link DefaultComboBoxModel} holding the titles of available campaign presets.
304-
*
305-
* @author Illiani
306-
* @since 0.50.07
307-
*/
308-
private static DefaultComboBoxModel<String> convertPresetListModelToComboBoxModel() {
309-
DefaultComboBoxModel<String> comboBoxModel = new DefaultComboBoxModel<>();
310-
311-
for (CampaignPreset preset : presets) {
312-
comboBoxModel.addElement(preset.getTitle());
313-
}
314-
315-
return comboBoxModel;
316-
}
317281
}

0 commit comments

Comments
 (0)