3333package mekhq .gui .dialog ;
3434
3535import static megamek .client .ui .WrapLayout .wordWrap ;
36- import static mekhq .gui .campaignOptions .CampaignOptionsDialog .CampaignOptionsDialogMode .CAMPAIGN_UPGRADE ;
3736import static mekhq .utilities .MHQInternationalization .getFormattedTextAt ;
3837import static mekhq .utilities .MHQInternationalization .getTextAt ;
3938
4039import java .awt .BorderLayout ;
4140import java .awt .Component ;
42- import java .awt .Frame ;
4341import java .util .List ;
44- import javax . swing . DefaultComboBoxModel ;
42+ import java . util . Map ;
4543import javax .swing .DefaultListCellRenderer ;
4644import javax .swing .DefaultListModel ;
47- import javax .swing .JDialog ;
4845import javax .swing .JLabel ;
4946import javax .swing .JList ;
5047import javax .swing .JPanel ;
5855import mekhq .MHQConstants ;
5956import mekhq .MekHQ ;
6057import mekhq .campaign .Campaign ;
58+ import mekhq .campaign .personnel .SpecialAbility ;
59+ import mekhq .campaign .personnel .skills .SkillType ;
6160import mekhq .gui .baseComponents .immersiveDialogs .ImmersiveDialogCore ;
61+ import mekhq .gui .baseComponents .immersiveDialogs .ImmersiveDialogNotification ;
6262import mekhq .gui .baseComponents .immersiveDialogs .ImmersiveDialogWidth ;
63- import mekhq .gui .baseComponents .roundedComponents .RoundedLineBorder ;
6463import 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