diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index bc44ee3e62..11eb2a4ca0 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -259,6 +259,13 @@ removePregnancy.text=Remove Pregnancy removePregnancies.text=Remove Pregnancies regenerateLoyalty.text=Regenerate Loyalty regeneratePersonality.text=Regenerate Personality +addMinimumComplement.text=Add minimum complement +addMinimumComplementRandom.text=Random +addMinimumComplementElite.text=Elite +addMinimumComplementVeteran.text=Veteran +addMinimumComplementRegular.text=Regular +addMinimumComplementGreen.text=Green +addMinimumComplementUltraGreen.text=Ultra Green #### ProcurementTableMouseAdapter Class miClearItems.text=Clear All Items @@ -280,7 +287,6 @@ deleteUnitsCount.text=%d units removeQ.title=Remove? confirmRemove.text=Do you really want to remove %s? hireMinimumComplement.text=Hire minimum complement -addMinimumComplement.text=Add minimum complement diff --git a/MekHQ/src/mekhq/gui/adapter/UnitTableMouseAdapter.java b/MekHQ/src/mekhq/gui/adapter/UnitTableMouseAdapter.java index 694bb7b038..c5cad14256 100644 --- a/MekHQ/src/mekhq/gui/adapter/UnitTableMouseAdapter.java +++ b/MekHQ/src/mekhq/gui/adapter/UnitTableMouseAdapter.java @@ -23,6 +23,7 @@ import megamek.client.ui.swing.UnitEditorDialog; import megamek.common.*; import megamek.common.annotations.Nullable; +import megamek.common.enums.SkillLevel; import megamek.common.icons.Camouflage; import megamek.common.loaders.BLKFile; import megamek.common.loaders.EntityLoadingException; @@ -67,6 +68,7 @@ import java.util.stream.Stream; import static megamek.client.ui.WrapLayout.wordWrap; +import static mekhq.gui.dialog.HireBulkPersonnelDialog.overrideSkills; public class UnitTableMouseAdapter extends JPopupMenuAdapter { private static final MMLogger logger = MMLogger.create(UnitTableMouseAdapter.class); @@ -125,7 +127,12 @@ public class UnitTableMouseAdapter extends JPopupMenuAdapter { public static final String COMMAND_GM_MOTHBALL = COMMAND_MOTHBALL + COMMAND_GM; public static final String COMMAND_GM_ACTIVATE = COMMAND_ACTIVATE + COMMAND_GM; public static final String COMMAND_UNDEPLOY = "UNDEPLOY"; - public static final String COMMAND_HIRE_FULL_GM = COMMAND_HIRE_FULL + COMMAND_GM; + public static final String COMMAND_HIRE_FULL_GM_RANDOM = COMMAND_HIRE_FULL + COMMAND_GM; + public static final String COMMAND_HIRE_FULL_GM_ELITE = COMMAND_HIRE_FULL + COMMAND_GM + "ELITE"; + public static final String COMMAND_HIRE_FULL_GM_VETERAN = COMMAND_HIRE_FULL + COMMAND_GM + "VETERAN"; + public static final String COMMAND_HIRE_FULL_GM_REGULAR = COMMAND_HIRE_FULL + COMMAND_GM + "REGULAR"; + public static final String COMMAND_HIRE_FULL_GM_GREEN = COMMAND_HIRE_FULL + COMMAND_GM + "GREEN"; + public static final String COMMAND_HIRE_FULL_GM_ULTRA_GREEN = COMMAND_HIRE_FULL + COMMAND_GM +"ULTRA_GREEN"; public static final String COMMAND_EDIT_DAMAGE = "EDIT_DAMAGE"; public static final String COMMAND_RESTORE_UNIT = "RESTORE_UNIT"; public static final String COMMAND_SET_QUALITY = "SET_QUALITY"; @@ -324,10 +331,30 @@ public void actionPerformed(ActionEvent action) { } } } else if (command.contains(COMMAND_HIRE_FULL)) { - boolean isGM = command.equals(COMMAND_HIRE_FULL_GM); + boolean isGM = command.contains("GM"); HirePersonnelUnitAction hireAction = new HirePersonnelUnitAction(isGM); for (Unit unit : units) { hireAction.execute(gui.getCampaign(), unit); + + if (command.contains("RANDOM")) { + continue; + } + + SkillLevel skillLevel = SkillLevel.REGULAR; + if (command.contains("ELITE")) { + skillLevel = SkillLevel.ELITE; + } else if (command.contains("VETERAN")) { + skillLevel = SkillLevel.VETERAN; + } else if (command.contains("GREEN")) { + skillLevel = SkillLevel.GREEN; + } else if (command.contains("ULTRA_GREEN")) { + skillLevel = SkillLevel.ULTRA_GREEN; + } + + for (Person person : unit.getCrew()) { + overrideSkills(gui.getCampaign(), person, person.getPrimaryRole(), skillLevel.ordinal()); + } + } } else if (command.equals(COMMAND_CUSTOMIZE)) { // Single Unit only ((MekLabTab) gui.getTab(MHQTabType.MEK_LAB)).loadUnit(selectedUnit); @@ -978,10 +1005,39 @@ protected Optional createPopupMenu() { } if (oneAvailableUnitBelowMaxCrew) { - menuItem = new JMenuItem(resources.getString("addMinimumComplement.text")); - menuItem.setActionCommand(COMMAND_HIRE_FULL_GM); + JMenu menuMinimumComplement = new JMenu(resources.getString("addMinimumComplement.text")); + + menuItem = new JMenuItem(resources.getString("addMinimumComplementRandom.text")); + menuItem.setActionCommand(COMMAND_HIRE_FULL_GM_RANDOM); menuItem.addActionListener(this); - menu.add(menuItem); + menuMinimumComplement.add(menuItem); + + menuItem = new JMenuItem(resources.getString("addMinimumComplementElite.text")); + menuItem.setActionCommand(COMMAND_HIRE_FULL_GM_ELITE); + menuItem.addActionListener(this); + menuMinimumComplement.add(menuItem); + + menuItem = new JMenuItem(resources.getString("addMinimumComplementVeteran.text")); + menuItem.setActionCommand(COMMAND_HIRE_FULL_GM_VETERAN); + menuItem.addActionListener(this); + menuMinimumComplement.add(menuItem); + + menuItem = new JMenuItem(resources.getString("addMinimumComplementRegular.text")); + menuItem.setActionCommand(COMMAND_HIRE_FULL_GM_REGULAR); + menuItem.addActionListener(this); + menuMinimumComplement.add(menuItem); + + menuItem = new JMenuItem(resources.getString("addMinimumComplementGreen.text")); + menuItem.setActionCommand(COMMAND_HIRE_FULL_GM_GREEN); + menuItem.addActionListener(this); + menuMinimumComplement.add(menuItem); + + menuItem = new JMenuItem(resources.getString("addMinimumComplementUltraGreen.text")); + menuItem.setActionCommand(COMMAND_HIRE_FULL_GM_ULTRA_GREEN); + menuItem.addActionListener(this); + menuMinimumComplement.add(menuItem); + + menu.add(menuMinimumComplement); } if (oneSelected) { diff --git a/MekHQ/src/mekhq/gui/dialog/HireBulkPersonnelDialog.java b/MekHQ/src/mekhq/gui/dialog/HireBulkPersonnelDialog.java index f612f60ac6..25254f2bc7 100644 --- a/MekHQ/src/mekhq/gui/dialog/HireBulkPersonnelDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/HireBulkPersonnelDialog.java @@ -18,23 +18,6 @@ */ package mekhq.gui.dialog; -import static mekhq.campaign.personnel.SkillType.*; -import static mekhq.campaign.personnel.generator.AbstractSkillGenerator.addSkill; - -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.Objects; -import java.util.ResourceBundle; - -import javax.swing.*; -import javax.swing.JSpinner.DefaultEditor; -import javax.swing.JSpinner.NumberEditor; - import megamek.client.ui.baseComponents.MMComboBox; import megamek.client.ui.preferences.JWindowPreference; import megamek.client.ui.preferences.PreferencesNode; @@ -74,6 +57,20 @@ import static mekhq.campaign.personnel.SkillType.*; import static mekhq.campaign.personnel.generator.AbstractSkillGenerator.addSkill; +import javax.swing.*; +import javax.swing.JSpinner.DefaultEditor; +import javax.swing.JSpinner.NumberEditor; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.Objects; +import java.util.ResourceBundle; + +import static mekhq.campaign.personnel.SkillType.*; +import static mekhq.campaign.personnel.generator.AbstractSkillGenerator.addSkill; + /** * @author Jay Lawson */ @@ -362,10 +359,8 @@ private void hire(boolean isGmHire) { Person person = campaign.newPerson(selectedItem.getRole()); if ((useSkill) && (!selectedItem.getRole().isCivilian()) && (!selectedItem.getRole().isAssistant())) { - overrideSkills( - person, - selectedItem.getRole(), - Objects.requireNonNull(skillLevel.getSelectedItem()).ordinal()); + overrideSkills(campaign, person, selectedItem.getRole(), + Objects.requireNonNull(skillLevel.getSelectedItem()).ordinal()); } person.setRank(((RankDisplay) Objects.requireNonNull(choiceRanks.getSelectedItem())).getRankNumeric()); @@ -419,15 +414,16 @@ private void hire(boolean isGmHire) { } /** - * Replaces the skills for a {@link Person} based on their primary role and - * desired experience level. + * Replaces the skills for a {@link Person} based on their primary role and desired experience level. * + * @param campaign The current campaign * @param person The {@link Person} to add default skills. * @param primaryRole The primary role of the person * @param expLvl The experience level of the person (e.g. * {@link SkillType#EXP_GREEN}). */ - protected void overrideSkills(Person person, PersonnelRole primaryRole, int expLvl) { + public static void overrideSkills(Campaign campaign, Person person, PersonnelRole primaryRole, + int expLvl) { switch (primaryRole) { case MEKWARRIOR: addSkillFixedExperienceLevel(person, S_PILOT_MEK, expLvl);