From 3055e76295deb7d552bc3972b69cc6e0fb1f8760 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 1 Feb 2021 10:17:56 -0700 Subject: [PATCH 001/115] Starting to implement Automatic Company Generation --- .../mekhq/resources/Universe.properties | 10 + MekHQ/src/mekhq/Utilities.java | 8 +- MekHQ/src/mekhq/campaign/Campaign.java | 38 +++- .../universe/enums/CompanyGenerationType.java | 68 ++++++ .../AbstractCompanyGenerator.java | 60 ++++++ .../AtBCompanyGenerator.java | 29 +++ .../CompanyGenerationOptions.java | 197 ++++++++++++++++++ .../WindchildCompanyGenerator.java | 29 +++ MekHQ/src/mekhq/gui/CampaignGUI.java | 14 +- .../gui/dialog/CompanyGenerationDialog.java | 83 ++++++++ MekHQ/src/mekhq/gui/model/DocTableModel.java | 2 +- 11 files changed, 513 insertions(+), 25 deletions(-) create mode 100644 MekHQ/resources/mekhq/resources/Universe.properties create mode 100644 MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java create mode 100644 MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties new file mode 100644 index 0000000000..905c970ee7 --- /dev/null +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -0,0 +1,10 @@ +# This is used to store any mekhq/campaign/universe Resources + +## General Universe Resources + +## Enums +# CompanyGenerationType Enum +CompanyGenerationType.AGAINST_THE_BOT.text=AtB +CompanyGenerationType.AGAINST_THE_BOT.toolTipText= +CompanyGenerationType.WINDCHILD.text=Windchild +CompanyGenerationType.WINDCHILD.toolTipText= diff --git a/MekHQ/src/mekhq/Utilities.java b/MekHQ/src/mekhq/Utilities.java index a1bf931db2..3a9f3e2117 100644 --- a/MekHQ/src/mekhq/Utilities.java +++ b/MekHQ/src/mekhq/Utilities.java @@ -500,13 +500,13 @@ public static boolean isOmniVariant(Entity entity1, Entity entity2) { public static int generateExpLevel(int bonus) { int roll = Compute.d6(2) + bonus; - if (roll < 2) { + if (roll <= 2) { return SkillType.EXP_ULTRA_GREEN; } else if (roll < 6) { return SkillType.EXP_GREEN; - } else if(roll < 10) { + } else if (roll < 10) { return SkillType.EXP_REGULAR; - } else if(roll < 12) { + } else if (roll < 12) { return SkillType.EXP_VETERAN; } else { return SkillType.EXP_ELITE; @@ -1154,7 +1154,7 @@ public static void unscrambleEquipmentNumbers(Unit unit, boolean refit) { assignTroopersAndEquipmentNums(unit); return; } - + Map partMap = new HashMap<>(); List equipNums = new ArrayList<>(); for (Mounted m : unit.getEntity().getEquipment()) { diff --git a/MekHQ/src/mekhq/campaign/Campaign.java b/MekHQ/src/mekhq/campaign/Campaign.java index c8723e19ae..6727ac2273 100644 --- a/MekHQ/src/mekhq/campaign/Campaign.java +++ b/MekHQ/src/mekhq/campaign/Campaign.java @@ -1304,11 +1304,11 @@ public boolean recruitPerson(Person p, PrisonerStatus prisonerStatus, boolean de } if (p.getPrimaryRole() == Person.T_ASTECH) { - astechPoolMinutes += 480; - astechPoolOvertime += 240; + astechPoolMinutes += Person.PRIMARY_ROLE_SUPPORT_TIME; + astechPoolOvertime += Person.PRIMARY_ROLE_OVERTIME_SUPPORT_TIME; } else if (p.getSecondaryRole() == Person.T_ASTECH) { - astechPoolMinutes += 240; - astechPoolOvertime += 120; + astechPoolMinutes += Person.SECONDARY_ROLE_SUPPORT_TIME; + astechPoolOvertime += Person.SECONDARY_ROLE_OVERTIME_SUPPORT_TIME; } p.setPrisonerStatus(prisonerStatus, log); @@ -5219,10 +5219,10 @@ public int findAtBPartsAvailabilityLevel(IAcquisitionWork acquisition, StringBui } public void resetAstechMinutes() { - astechPoolMinutes = 480 * getNumberPrimaryAstechs() + 240 - * getNumberSecondaryAstechs(); - astechPoolOvertime = 240 * getNumberPrimaryAstechs() + 120 - * getNumberSecondaryAstechs(); + astechPoolMinutes = Person.PRIMARY_ROLE_SUPPORT_TIME * getNumberPrimaryAstechs() + + Person.PRIMARY_ROLE_OVERTIME_SUPPORT_TIME * getNumberSecondaryAstechs(); + astechPoolOvertime = Person.SECONDARY_ROLE_SUPPORT_TIME * getNumberPrimaryAstechs() + + Person.SECONDARY_ROLE_OVERTIME_SUPPORT_TIME * getNumberSecondaryAstechs(); } public void setAstechPoolMinutes(int minutes) { @@ -5265,6 +5265,10 @@ public int getMedicPool() { return medicPool; } + public int getAstechNeed() { + return (getTechs().size() * 6) - getNumberAstechs(); + } + public void increaseAstechPool(int i) { astechPool += i; astechPoolMinutes += (480 * i); @@ -5272,6 +5276,13 @@ public void increaseAstechPool(int i) { MekHQ.triggerEvent(new AstechPoolChangedEvent(this, i)); } + public void fillAstechPool() { + final int need = getAstechNeed(); + if (need > 0) { + increaseAstechPool(need); + } + } + public void decreaseAstechPool(int i) { astechPool = Math.max(0, astechPool - i); // always assume that we fire the ones who have not yet worked @@ -5384,11 +5395,22 @@ public int getNumberMedics() { return medics; } + public int getMedicsNeed() { + return (getDoctors().size() * 4) - getNumberMedics(); + } + public void increaseMedicPool(int i) { medicPool += i; MekHQ.triggerEvent(new MedicPoolChangedEvent(this, i)); } + public void fillMedicPool() { + final int need = getMedicsNeed(); + if (need > 0) { + increaseMedicPool(need); + } + } + public void decreaseMedicPool(int i) { medicPool = Math.max(0, medicPool - i); MekHQ.triggerEvent(new MedicPoolChangedEvent(this, -i)); diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java new file mode 100644 index 0000000000..8ddd14f403 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.enums; + +import megamek.common.util.EncodeControl; +import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; +import mekhq.campaign.universe.generators.companyGeneration.AtBCompanyGenerator; +import mekhq.campaign.universe.generators.companyGeneration.WindchildCompanyGenerator; + +import java.util.ResourceBundle; + +public enum CompanyGenerationType { + //region Enum Declarations + AGAINST_THE_BOT("CompanyGenerationType.AGAINST_THE_BOT.text", "CompanyGenerationType.AGAINST_THE_BOT.toolTipText"), + WINDCHILD("CompanyGenerationType.WINDCHILD.text", "CompanyGenerationType.WINDCHILD.toolTipText"); + //endregion Enum Declarations + + //region Variable Declarations + private final String name; + private final String toolTipText; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + //endregion Variable Declarations + + //region Constructors + CompanyGenerationType(String name, String toolTipText) { + this.name = resources.getString(name); + this.toolTipText = resources.getString(toolTipText); + } + //endregion Constructors + + //region Getters + public String getToolTipText() { + return toolTipText; + } + //endregion Getters + + public AbstractCompanyGenerator getGenerator() { + switch (this) { + case WINDCHILD: + return new WindchildCompanyGenerator(); + case AGAINST_THE_BOT: + default: + return new AtBCompanyGenerator(); + } + } + + @Override + public String toString() { + return name; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java new file mode 100644 index 0000000000..10e7191dbb --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGeneration; + +import mekhq.campaign.personnel.Person; +import mekhq.campaign.universe.enums.CompanyGenerationType; + +import java.util.List; + +public class AbstractCompanyGenerator { + //region Variable Declarations + private CompanyGenerationType type; + private CompanyGenerationOptions options; + //endregion Variable Declarations + + //region Constructors + protected AbstractCompanyGenerator(CompanyGenerationType type) { + this(type, new CompanyGenerationOptions()); + } + + protected AbstractCompanyGenerator(CompanyGenerationType type, CompanyGenerationOptions options) { + + } + //endregion Constructors + + //region Getters/Setters + + public CompanyGenerationType getType() { + return type; + } + + public void setType(CompanyGenerationType type) { + this.type = type; + } + + public CompanyGenerationOptions getOptions() { + return options; + } + + public void setOptions(CompanyGenerationOptions options) { + this.options = options; + } + //endregion Getters/Setters +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java new file mode 100644 index 0000000000..5094b53539 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGeneration; + +import mekhq.campaign.universe.enums.CompanyGenerationType; + +public class AtBCompanyGenerator extends AbstractCompanyGenerator { + //region Constructors + public AtBCompanyGenerator() { + super(CompanyGenerationType.AGAINST_THE_BOT); + } + //endregion Constructors +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java new file mode 100644 index 0000000000..77102bf756 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGeneration; + +import mekhq.campaign.universe.Faction; +import mekhq.campaign.universe.Factions; + +import java.util.Map; + +public class CompanyGenerationOptions { + //region Variable Declarations + // Unit Setup + private Faction faction; + private int companyCount; + private int individualLanceCount; + + // Personnel + private Map supportPersonnel; + private boolean poolAssistants; + private boolean generateCompanyCommander; + private boolean generateOfficers; + /** + * If the company commander counts as one of the lance officers (reduces officer generation by 1 if true) + */ + private boolean companyCommanderLanceOfficer; + private boolean applyOfficerStatBonusToWorstSkill; + private boolean assignBestOfficers; + private boolean automaticallyAssignRanks; + + // Finances + private int startingCash; + private boolean randomizeStartingCash; + private boolean startingLoan; + private boolean payForSetup; + //endregion Variable Declarations + + //region Constructors + public CompanyGenerationOptions() { + // Unit Setup + setFaction(Factions.getInstance().getFaction("MERC")); + + // Personnel + setPoolAssistants(true); + setGenerateCompanyCommander(true); + setGenerateOfficers(true); + setCompanyCommanderLanceOfficer(false); + setAutomaticallyAssignRanks(false); + + // Finances + setStartingLoan(false); + } + //endregion Constructors + + //region Getters/Setters + //region Unit Setup + public Faction getFaction() { + return faction; + } + + public void setFaction(Faction faction) { + this.faction = faction; + } + + public int getCompanyCount() { + return companyCount; + } + + public void setCompanyCount(int companyCount) { + this.companyCount = companyCount; + } + + public int getIndividualLanceCount() { + return individualLanceCount; + } + + public void setIndividualLanceCount(int individualLanceCount) { + this.individualLanceCount = individualLanceCount; + } + //endregion Unit Setup + + //region Personnel + public Map getSupportPersonnel() { + return supportPersonnel; + } + + public void setSupportPersonnel(Map supportPersonnel) { + this.supportPersonnel = supportPersonnel; + } + + public boolean isPoolAssistants() { + return poolAssistants; + } + + public void setPoolAssistants(boolean poolAssistants) { + this.poolAssistants = poolAssistants; + } + + public boolean isGenerateCompanyCommander() { + return generateCompanyCommander; + } + + public void setGenerateCompanyCommander(boolean generateCompanyCommander) { + this.generateCompanyCommander = generateCompanyCommander; + } + + public boolean isGenerateOfficers() { + return generateOfficers; + } + + public void setGenerateOfficers(boolean generateOfficers) { + this.generateOfficers = generateOfficers; + } + + public boolean isCompanyCommanderLanceOfficer() { + return companyCommanderLanceOfficer; + } + + public void setCompanyCommanderLanceOfficer(boolean companyCommanderLanceOfficer) { + this.companyCommanderLanceOfficer = companyCommanderLanceOfficer; + } + + public boolean isApplyOfficerStatBonusToWorstSkill() { + return applyOfficerStatBonusToWorstSkill; + } + + public void setApplyOfficerStatBonusToWorstSkill(boolean applyOfficerStatBonusToWorstSkill) { + this.applyOfficerStatBonusToWorstSkill = applyOfficerStatBonusToWorstSkill; + } + + public boolean isAssignBestOfficers() { + return assignBestOfficers; + } + + public void setAssignBestOfficers(boolean assignBestOfficers) { + this.assignBestOfficers = assignBestOfficers; + } + + public boolean isAutomaticallyAssignRanks() { + return automaticallyAssignRanks; + } + + public void setAutomaticallyAssignRanks(boolean automaticallyAssignRanks) { + this.automaticallyAssignRanks = automaticallyAssignRanks; + } + //endregion Personnel + + //region Finances + public int getStartingCash() { + return startingCash; + } + + public void setStartingCash(int startingCash) { + this.startingCash = startingCash; + } + + public boolean isRandomizeStartingCash() { + return randomizeStartingCash; + } + + public void setRandomizeStartingCash(boolean randomizeStartingCash) { + this.randomizeStartingCash = randomizeStartingCash; + } + + public boolean isStartingLoan() { + return startingLoan; + } + + public void setStartingLoan(boolean startingLoan) { + this.startingLoan = startingLoan; + } + + public boolean isPayForSetup() { + return payForSetup; + } + + public void setPayForSetup(boolean payForSetup) { + this.payForSetup = payForSetup; + } + //endregion Finances + //endregion Getters/Setters +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java new file mode 100644 index 0000000000..26ee427dc0 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGeneration; + +import mekhq.campaign.universe.enums.CompanyGenerationType; + +public class WindchildCompanyGenerator extends AbstractCompanyGenerator { + //region Constructors + public WindchildCompanyGenerator() { + super(CompanyGenerationType.WINDCHILD); + } + //endregion Constructors +} diff --git a/MekHQ/src/mekhq/gui/CampaignGUI.java b/MekHQ/src/mekhq/gui/CampaignGUI.java index ed2be07671..bf12525173 100644 --- a/MekHQ/src/mekhq/gui/CampaignGUI.java +++ b/MekHQ/src/mekhq/gui/CampaignGUI.java @@ -791,12 +791,7 @@ private void initMenu() { JMenuItem miFullStrengthAstechs = new JMenuItem(resourceMap.getString("miFullStrengthAstechs.text")); miFullStrengthAstechs.setMnemonic(KeyEvent.VK_B); - miFullStrengthAstechs.addActionListener(evt -> { - int need = (getCampaign().getTechs().size() * 6) - getCampaign().getNumberAstechs(); - if (need > 0) { - getCampaign().increaseAstechPool(need); - } - }); + miFullStrengthAstechs.addActionListener(evt -> getCampaign().fillAstechPool()); menuAstechPool.add(miFullStrengthAstechs); JMenuItem miFireAllAstechs = new JMenuItem(resourceMap.getString("miFireAllAstechs.text")); @@ -840,12 +835,7 @@ private void initMenu() { JMenuItem miFullStrengthMedics = new JMenuItem(resourceMap.getString("miFullStrengthMedics.text")); miFullStrengthMedics.setMnemonic(KeyEvent.VK_B); - miFullStrengthMedics.addActionListener(evt -> { - int need = (getCampaign().getDoctors().size() * 4) - getCampaign().getNumberMedics(); - if (need > 0) { - getCampaign().increaseMedicPool(need); - } - }); + miFullStrengthMedics.addActionListener(evt -> getCampaign().fillMedicPool()); menuMedicPool.add(miFullStrengthMedics); JMenuItem miFireAllMedics = new JMenuItem(resourceMap.getString("miFireAllMedics.text")); diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java new file mode 100644 index 0000000000..06c1b48573 --- /dev/null +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.dialog; + +import mekhq.campaign.Campaign; +import mekhq.campaign.finances.Money; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; + +import java.util.ArrayList; +import java.util.List; + +public class CompanyGenerationDialog { + //region Variable Declarations + private Campaign campaign; + private AbstractCompanyGenerator companyGenerator; + //endregion Variable Declarations + + //region Constructors + public CompanyGenerationDialog(Campaign campaign, AbstractCompanyGenerator companyGenerator) { + setCampaign(campaign); + setCompanyGenerator(companyGenerator); + } + //endregion Constructors + + //region Getters/Setters + public Campaign getCampaign() { + return campaign; + } + + public void setCampaign(Campaign campaign) { + this.campaign = campaign; + } + + public AbstractCompanyGenerator getCompanyGenerator() { + return companyGenerator; + } + + public void setCompanyGenerator(AbstractCompanyGenerator companyGenerator) { + this.companyGenerator = companyGenerator; + } + //endregion Getters/Setters + + private void applyToCampaign() { + List personnel = new ArrayList<>(); + if (getCompanyGenerator().getOptions().isPoolAssistants()) { + getCampaign().fillAstechPool(); + getCampaign().fillMedicPool(); + } else { + for (int i = 0; i < getCampaign().getAstechNeed(); i++) { + personnel.add(getCompanyGenerator().generatePerson(Person.T_ASTECH)); + } + for (int i = 0; i < getCampaign().getMedicsNeed(); i++) { + personnel.add(getCompanyGenerator().generatePerson(Person.T_MEDIC)); + } + } + + if (getCompanyGenerator().getOptions().isPayForSetup()) { + Money unitCosts = Money.zero(); + Money hiringCosts = Money.zero(); + Money partCosts = Money.zero(); + for (Person person : personnel) { + hiringCosts = hiringCosts.plus(person.getSalary().multipliedBy(2)); + } + } + } +} diff --git a/MekHQ/src/mekhq/gui/model/DocTableModel.java b/MekHQ/src/mekhq/gui/model/DocTableModel.java index 163db14102..72032d498c 100644 --- a/MekHQ/src/mekhq/gui/model/DocTableModel.java +++ b/MekHQ/src/mekhq/gui/model/DocTableModel.java @@ -42,7 +42,7 @@ private String getDocDesc(Person doc) { toReturn.append(String.format(" (%d XP)", doc.getXP())); - if (campaign.getMedicsPerDoctor() < 4) { + if (campaign.getMedicsNeed() > 0) { toReturn.append(", ") .append(campaign.getMedicsPerDoctor()) .append(" medics
"); From 909ceb8a84cdd6031bf90c300d47b4d2da527643 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 1 Feb 2021 21:19:14 -0700 Subject: [PATCH 002/115] Continuing to work on an AtB Company Generator --- .../mekhq/resources/Universe.properties | 95 +++- MekHQ/src/mekhq/campaign/Campaign.java | 9 +- .../src/mekhq/campaign/personnel/Person.java | 8 +- .../src/mekhq/campaign/universe/Faction.java | 6 +- .../universe/RangedFactionSelector.java | 2 +- .../campaign/universe/enums/Alphabet.java | 84 +++ .../universe/enums/CompanyGenerationType.java | 10 + .../universe/enums/ForceNamingType.java | 60 +++ .../AbstractCompanyGenerator.java | 501 +++++++++++++++++- .../CompanyGenerationOptions.java | 211 ++++++-- .../WindchildCompanyGenerator.java | 23 + .../gui/dialog/CompanyGenerationDialog.java | 42 +- 12 files changed, 979 insertions(+), 72 deletions(-) create mode 100644 MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java create mode 100644 MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 905c970ee7..5df357d7dd 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -3,8 +3,99 @@ ## General Universe Resources ## Enums +# Alphabet Enum +Alphabets.A.ccb1943.text=Able +Alphabets.B.ccb1943.text=Baker +Alphabets.C.ccb1943.text=Charlie +Alphabets.D.ccb1943.text=Dog +Alphabets.E.ccb1943.text=Easy +Alphabets.F.ccb1943.text=Fox +Alphabets.G.ccb1943.text=George +Alphabets.H.ccb1943.text=How +Alphabets.I.ccb1943.text=Item +Alphabets.J.ccb1943.text=Jig +Alphabets.K.ccb1943.text=King +Alphabets.L.ccb1943.text=Love +Alphabets.M.ccb1943.text=Mike +Alphabets.N.ccb1943.text=Nan +Alphabets.O.ccb1943.text=Oboe +Alphabets.P.ccb1943.text=Peter +Alphabets.Q.ccb1943.text=Queen +Alphabets.R.ccb1943.text=Roger +Alphabets.S.ccb1943.text=Sugar +Alphabets.T.ccb1943.text=Tare +Alphabets.U.ccb1943.text=Uncle +Alphabets.V.ccb1943.text=Victor +Alphabets.W.ccb1943.text=William +Alphabets.X.ccb1943.text=Xray +Alphabets.Y.ccb1943.text=Yoke +Alphabets.Z.ccb1943.text=Zebra +Alphabets.A.icao1956.text=Alfa +Alphabets.B.icao1956.text=Bravo +Alphabets.C.icao1956.text=Charlie +Alphabets.D.icao1956.text=Delta +Alphabets.E.icao1956.text=Echo +Alphabets.F.icao1956.text=Foxtrot +Alphabets.G.icao1956.text=Golf +Alphabets.H.icao1956.text=Hotel +Alphabets.I.icao1956.text=India +Alphabets.J.icao1956.text=Juliett +Alphabets.K.icao1956.text=Kilo +Alphabets.L.icao1956.text=Lima +Alphabets.M.icao1956.text=Mike +Alphabets.N.icao1956.text=November +Alphabets.O.icao1956.text=Oscar +Alphabets.P.icao1956.text=Papa +Alphabets.Q.icao1956.text=Quebec +Alphabets.R.icao1956.text=Romeo +Alphabets.S.icao1956.text=Sierra +Alphabets.T.icao1956.text=Tango +Alphabets.U.icao1956.text=Uniform +Alphabets.V.icao1956.text=Victor +Alphabets.W.icao1956.text=Whisky +Alphabets.X.icao1956.text=Xray +Alphabets.Y.icao1956.text=Yankee +Alphabets.Z.icao1956.text=Zulu +Alphabets.A.greek.text=Alpha +Alphabets.B.greek.text=Beta +Alphabets.C.greek.text=Gamma +Alphabets.D.greek.text=Delta +Alphabets.E.greek.text=Epsilon +Alphabets.F.greek.text=Zeta +Alphabets.G.greek.text=Eta +Alphabets.H.greek.text=Theta +Alphabets.I.greek.text=Iota +Alphabets.J.greek.text=Kappa +Alphabets.K.greek.text=Lambda +Alphabets.L.greek.text=Mu +Alphabets.M.greek.text=Nu +Alphabets.N.greek.text=Xi +Alphabets.O.greek.text=Omicron +Alphabets.P.greek.text=Pi +Alphabets.Q.greek.text=Rho +Alphabets.R.greek.text=Sigma +Alphabets.S.greek.text=Tau +Alphabets.T.greek.text=Upsilon +Alphabets.U.greek.text=Phi +Alphabets.V.greek.text=Chi +Alphabets.W.greek.text=Psi +Alphabets.X.greek.text=Omega +Alphabets.Y.greek.text=Ena +Alphabets.Z.greek.text=Dio + # CompanyGenerationType Enum CompanyGenerationType.AGAINST_THE_BOT.text=AtB -CompanyGenerationType.AGAINST_THE_BOT.toolTipText= +CompanyGenerationType.AGAINST_THE_BOT.toolTipText=This follows the AtB rules to generate a mercenary company. CompanyGenerationType.WINDCHILD.text=Windchild -CompanyGenerationType.WINDCHILD.toolTipText= +CompanyGenerationType.WINDCHILD.toolTipText=This is a variant that ensures all personnel have units and creates a heavier force. + +# ForceNamingType Enum +ForceNamingType.CCB_1943.text=CCB (1943) +ForceNamingType.ICAO_1956.text=ICAO (1956) +ForceNamingType.GREEK_ALPHABET.text=Greek Alphabet + +## Generators +# AbstractCompanyGenerator +AbstractCompanyGenerator.commandLance.text= Command Lance +AbstractCompanyGenerator.company.text= Company +AbstractCompanyGenerator.lance.text= Lance diff --git a/MekHQ/src/mekhq/campaign/Campaign.java b/MekHQ/src/mekhq/campaign/Campaign.java index 6727ac2273..bb52fdc2a3 100644 --- a/MekHQ/src/mekhq/campaign/Campaign.java +++ b/MekHQ/src/mekhq/campaign/Campaign.java @@ -792,13 +792,20 @@ public void importScenario(Scenario scenario) { scenarios.put(scenario.getId(), scenario); } + public void addUnitToForce(final @Nullable Unit unit, final Force force) { + addUnitToForce(unit, force.getId()); + } + /** * Add unit to an existing force. This method will also assign that force's id to the unit. * * @param u * @param id */ - public void addUnitToForce(Unit u, int id) { + public void addUnitToForce(@Nullable Unit u, int id) { + if (u == null) { + return; + } Force prevForce = forceIds.get(u.getForceId()); if (null != prevForce) { prevForce.removeUnit(u.getId()); diff --git a/MekHQ/src/mekhq/campaign/personnel/Person.java b/MekHQ/src/mekhq/campaign/personnel/Person.java index f76515c190..cd2925a4a6 100644 --- a/MekHQ/src/mekhq/campaign/personnel/Person.java +++ b/MekHQ/src/mekhq/campaign/personnel/Person.java @@ -2819,11 +2819,15 @@ public Skills getSkills() { return skills; } - @Nullable - public Skill getSkill(String skillName) { + public @Nullable Skill getSkill(String skillName) { return skills.getSkill(skillName); } + public int getSkillLevel(String skillName) { + final Skill skill = getSkill(skillName); + return (skill == null) ? 0 : skill.getExperienceLevel(); + } + public void addSkill(String skillName, Skill skill) { skills.addSkill(skillName, skill); } diff --git a/MekHQ/src/mekhq/campaign/universe/Faction.java b/MekHQ/src/mekhq/campaign/universe/Faction.java index e40d8bed50..609bc51e05 100644 --- a/MekHQ/src/mekhq/campaign/universe/Faction.java +++ b/MekHQ/src/mekhq/campaign/universe/Faction.java @@ -105,7 +105,11 @@ public boolean isClan() { } public boolean isComStar() { - return "CS".equals(shortName); + return "CS".equals(getShortName()); + } + + public boolean isComStarOrWoB() { + return isComStar() || "WoB".equals(getShortName()); } public boolean isPeriphery() { diff --git a/MekHQ/src/mekhq/campaign/universe/RangedFactionSelector.java b/MekHQ/src/mekhq/campaign/universe/RangedFactionSelector.java index 8c7d38f96c..ee3b54a4c1 100644 --- a/MekHQ/src/mekhq/campaign/universe/RangedFactionSelector.java +++ b/MekHQ/src/mekhq/campaign/universe/RangedFactionSelector.java @@ -248,7 +248,7 @@ private Set getEnemies(Campaign campaign) { * @return A weight to apply to the given {@link Faction}. */ private double getFactionWeight(Faction faction) { - if (faction.isComStar() || faction.getShortName().equals("WOB")) { + if (faction.isComStarOrWoB()) { return 0.05; } else if (faction.is(Tag.MERC) || faction.is(Tag.SUPER) || faction.is(Tag.MAJOR)) { return 1.0; diff --git a/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java b/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java new file mode 100644 index 0000000000..ed73c21563 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.enums; + +import megamek.common.util.EncodeControl; + +import java.util.ResourceBundle; + +public enum Alphabet { + //region Enum Declarations + A("Alphabets.A.ccb1943.text", "Alphabets.A.icao1956.text", "Alphabets.A.greek.text"), + B("Alphabets.B.ccb1943.text", "Alphabets.B.icao1956.text", "Alphabets.B.greek.text"), + C("Alphabets.C.ccb1943.text", "Alphabets.C.icao1956.text", "Alphabets.C.greek.text"), + D("Alphabets.D.ccb1943.text", "Alphabets.D.icao1956.text", "Alphabets.D.greek.text"), + E("Alphabets.E.ccb1943.text", "Alphabets.E.icao1956.text", "Alphabets.E.greek.text"), + F("Alphabets.F.ccb1943.text", "Alphabets.F.icao1956.text", "Alphabets.F.greek.text"), + G("Alphabets.G.ccb1943.text", "Alphabets.G.icao1956.text", "Alphabets.G.greek.text"), + H("Alphabets.H.ccb1943.text", "Alphabets.H.icao1956.text", "Alphabets.H.greek.text"), + I("Alphabets.I.ccb1943.text", "Alphabets.I.icao1956.text", "Alphabets.I.greek.text"), + J("Alphabets.J.ccb1943.text", "Alphabets.J.icao1956.text", "Alphabets.J.greek.text"), + K("Alphabets.K.ccb1943.text", "Alphabets.K.icao1956.text", "Alphabets.K.greek.text"), + L("Alphabets.L.ccb1943.text", "Alphabets.L.icao1956.text", "Alphabets.L.greek.text"), + M("Alphabets.M.ccb1943.text", "Alphabets.M.icao1956.text", "Alphabets.M.greek.text"), + N("Alphabets.N.ccb1943.text", "Alphabets.N.icao1956.text", "Alphabets.N.greek.text"), + O("Alphabets.O.ccb1943.text", "Alphabets.O.icao1956.text", "Alphabets.O.greek.text"), + P("Alphabets.P.ccb1943.text", "Alphabets.P.icao1956.text", "Alphabets.P.greek.text"), + Q("Alphabets.Q.ccb1943.text", "Alphabets.Q.icao1956.text", "Alphabets.Q.greek.text"), + R("Alphabets.R.ccb1943.text", "Alphabets.R.icao1956.text", "Alphabets.R.greek.text"), + S("Alphabets.S.ccb1943.text", "Alphabets.S.icao1956.text", "Alphabets.S.greek.text"), + T("Alphabets.T.ccb1943.text", "Alphabets.T.icao1956.text", "Alphabets.T.greek.text"), + U("Alphabets.U.ccb1943.text", "Alphabets.U.icao1956.text", "Alphabets.U.greek.text"), + V("Alphabets.V.ccb1943.text", "Alphabets.V.icao1956.text", "Alphabets.V.greek.text"), + W("Alphabets.W.ccb1943.text", "Alphabets.W.icao1956.text", "Alphabets.W.greek.text"), + X("Alphabets.X.ccb1943.text", "Alphabets.X.icao1956.text", "Alphabets.X.greek.text"), + Y("Alphabets.Y.ccb1943.text", "Alphabets.Y.icao1956.text", "Alphabets.Y.greek.text"), + Z("Alphabets.Z.ccb1943.text", "Alphabets.Z.icao1956.text", "Alphabets.Z.greek.text"); + //endregion Enum Declarations + + //region Variable Declarations + private final String ccb1943; // CCB 1943 Military Phonetic Alphabet + private final String icao1956; // ICAO 1956 Military Phonetic Alphabet + private final String greek; // Greek Alphabet + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + //endregion Variable Declarations + + //region Constructors + Alphabet(String ccb1943, String icao1956, String greek) { + this.ccb1943 = resources.getString(ccb1943); + this.icao1956 = resources.getString(icao1956); + this.greek = resources.getString(greek); + } + //endregion Constructors + + //region Getters + public String getCCB1943() { + return ccb1943; + } + + public String getICAO1956() { + return icao1956; + } + + public String getGreek() { + return greek; + } + //endregion Getters +} diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java index 8ddd14f403..2a280a88c5 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java @@ -51,6 +51,16 @@ public String getToolTipText() { } //endregion Getters + //region Boolean Comparisons + public boolean isAtB() { + return this == AGAINST_THE_BOT; + } + + public boolean isWindchild() { + return this == WINDCHILD; + } + //endregion Boolean Comparisons + public AbstractCompanyGenerator getGenerator() { switch (this) { case WINDCHILD: diff --git a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java new file mode 100644 index 0000000000..43323840b6 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.enums; + +import megamek.common.util.EncodeControl; + +import java.util.ResourceBundle; + +public enum ForceNamingType { + //region Enum Declarations + CCB_1943("ForceNamingType.CCB_1943.text"), + ICAO_1956("ForceNamingType.ICAO_1956.text"), + GREEK_ALPHABET("ForceNamingType.GREEK_ALPHABET.text"); + //endregion Enum Declarations + + //region Variable Declarations + private final String name; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + //endregion Variable Declarations + + //region Constructors + ForceNamingType(String name) { + this.name = resources.getString(name); + } + //endregion Constructors + + public String getValue(Alphabet alphabet) { + switch (this) { + case ICAO_1956: + return alphabet.getICAO1956(); + case GREEK_ALPHABET: + return alphabet.getGreek(); + case CCB_1943: + default: + return alphabet.getCCB1943(); + } + } + + @Override + public String toString() { + return name; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java index 10e7191dbb..9a24663bc5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java @@ -18,34 +18,57 @@ */ package mekhq.campaign.universe.generators.companyGeneration; +import megamek.common.EntityWeightClass; +import megamek.common.util.EncodeControl; +import mekhq.MHQStaticDirectoryManager; +import mekhq.Utilities; +import mekhq.campaign.Campaign; +import mekhq.campaign.finances.Money; +import mekhq.campaign.force.Force; import mekhq.campaign.personnel.Person; +import mekhq.campaign.personnel.Skill; +import mekhq.campaign.personnel.SkillType; +import mekhq.campaign.personnel.ranks.Ranks; +import mekhq.campaign.unit.Unit; +import mekhq.campaign.universe.enums.Alphabet; import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.gui.enums.LayeredForceIcon; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; +import java.util.UUID; +import java.util.Vector; +import java.util.stream.Collectors; public class AbstractCompanyGenerator { //region Variable Declarations private CompanyGenerationType type; private CompanyGenerationOptions options; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors - protected AbstractCompanyGenerator(CompanyGenerationType type) { - this(type, new CompanyGenerationOptions()); + protected AbstractCompanyGenerator(final CompanyGenerationType type) { + this(type, new CompanyGenerationOptions(type)); } - protected AbstractCompanyGenerator(CompanyGenerationType type, CompanyGenerationOptions options) { - + protected AbstractCompanyGenerator(final CompanyGenerationType type, final CompanyGenerationOptions options) { + setType(type); + setOptions(options); } //endregion Constructors //region Getters/Setters - public CompanyGenerationType getType() { return type; } - public void setType(CompanyGenerationType type) { + public void setType(final CompanyGenerationType type) { this.type = type; } @@ -53,8 +76,472 @@ public CompanyGenerationOptions getOptions() { return options; } - public void setOptions(CompanyGenerationOptions options) { + public void setOptions(final CompanyGenerationOptions options) { this.options = options; } //endregion Getters/Setters + + //region Determination Methods + private int determineNumberLances() { + return (getOptions().getCompanyCount() * getOptions().getLancesPerCompany()) + + getOptions().getIndividualLanceCount() + + (getOptions().isGenerateMercenaryCompanyCommandLance() ? 1 : 0); + } + + private int determineNumberCompanyCommanders() { + return getOptions().isGenerateCompanyCommanders() + ? getOptions().getCompanyCount() - (getOptions().isGenerateMercenaryCompanyCommandLance() ? 0 : 1) + : 0; + } + + private int determineFirstNonOfficer() { + return determineNumberLances() + (getOptions().isCompanyCommanderLanceOfficer() ? 0 : 1); + } + //endregion Determination Methods + + //region Personnel + //region Combat Personnel + private List generateCombatPersonnel(final Campaign campaign) { + List combatPersonnel = new ArrayList<>(); + final int numMechWarriors = determineNumberLances() * getOptions().getLanceSize(); + for (int i = 0; i < numMechWarriors; i++) { + combatPersonnel.add(campaign.newPerson(Person.T_MECHWARRIOR)); + } + + if (getOptions().isAssignBestOfficers()) { + combatPersonnel = combatPersonnel.stream() + .sorted(Comparator.comparingInt(o -> o.getExperienceLevel(false))) + .sorted(Comparator.comparingInt(o -> o.getSkillLevel(SkillType.S_LEADER) + + o.getSkillLevel(SkillType.S_STRATEGY) + o.getSkillLevel(SkillType.S_TACTICS))) + .collect(Collectors.toList()); + } + + generateCommandingOfficer(combatPersonnel.get(0), numMechWarriors); + + generateOfficers(combatPersonnel); + + generateStandardMechWarriors(combatPersonnel); + + return combatPersonnel; + } + + /** + * Turns a person into the commanding officer of the force being generated + * 1) Assigns the Commander flag + * 2) Improves Gunnery and Piloting by one level + * 3) Gets two random officer skill increases + * 4) Gets the highest rank possible assigned to them + * + * @param commandingOfficer the commanding officer + * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank + */ + protected void generateCommandingOfficer(final Person commandingOfficer, final int numMechWarriors) { + commandingOfficer.setCommander(true); + commandingOfficer.improveSkill(SkillType.S_GUN_MECH); + commandingOfficer.improveSkill(SkillType.S_PILOT_MECH); + assignRandomOfficerSkillIncrease(commandingOfficer, 2); + + if (getOptions().isAutomaticallyAssignRanks()) { + if (numMechWarriors >= 36) { + commandingOfficer.setRankLevel(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); + } else if (numMechWarriors >= 12) { + commandingOfficer.setRankLevel(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 5)); + } else if (numMechWarriors >= 4) { + commandingOfficer.setRankLevel(Ranks.RWO_MAX + 4); + } else { + commandingOfficer.setRankLevel(Ranks.RWO_MAX + 3); + } + } + } + + /** + * This generates officers based on the provided options. + * + * Custom addition for larger generation: + * For every company (with a mercenary company command lance) or for every company + * after the first (as the mercenary company commander is the leader of that company) you + * generate a O4 - Captain, provided that company commander generation is enabled. These get + * two officer skill boosts instead of 1, and the rank of O4 - Captain instead of O3 - Lieutenant. + * + * An Officer gets: + * 1) An increase of one to either the highest or lowest skill of gunnery or piloting, depending + * on the set options + * 2) Two random officer skill increases if they are a company commander, otherwise they get one + * 3) A rank of O4 - Captain for Company Commanders, otherwise O3 - Lieutenant + * + * @param personnel the list of all generated personnel + */ + private void generateOfficers(final List personnel) { + int companyCommanders = determineNumberCompanyCommanders(); + // Starting at 1, as 0 is the mercenary company commander + for (int i = 1; i < determineFirstNonOfficer(); i++) { + final Person officer = personnel.get(i); + + // Improve Skills + final Skill gunnery = officer.getSkill(SkillType.S_GUN_MECH); + final Skill piloting = officer.getSkill(SkillType.S_PILOT_MECH); + if ((gunnery == null) && (piloting != null)) { + officer.improveSkill(SkillType.S_GUN_MECH); + } else if ((gunnery != null) && (piloting == null)) { + officer.improveSkill(SkillType.S_PILOT_MECH); + } else if (gunnery == null) { + // Both are null... this shouldn't occur. In this case, boost both + officer.improveSkill(SkillType.S_GUN_MECH); + officer.improveSkill(SkillType.S_PILOT_MECH); + } else { + officer.improveSkill((gunnery.getLevel() > piloting.getLevel() + && getOptions().isApplyOfficerStatBonusToWorstSkill() ? piloting : gunnery) + .getType().getName()); + } + + if (companyCommanders > 0) { + // Assign Random Officer Skill Increase + assignRandomOfficerSkillIncrease(officer, 2); + + if (getOptions().isAutomaticallyAssignRanks()) { + // Assign Rank of O4 - Captain + officer.setRankLevel(Ranks.RWO_MAX + 4); + } + + // Decrement the number of company commanders + companyCommanders--; + } else { + // Assign Random Officer Skill Increase + assignRandomOfficerSkillIncrease(officer, 1); + + if (getOptions().isAutomaticallyAssignRanks()) { + // Assign Rank of O3 - Lieutenant + officer.setRankLevel(Ranks.RWO_MAX + 3); + } + } + } + } + + /** + * This randomly assigns officer skill increases during officer creation. + * The skill level is improved by one level per roll, but if the skill is newly acquired + * it applies a second boost so that the value is set to 1. + * + * @param person the person to assign the skill increases to + * @param boosts the number of boosts to apply + */ + protected void assignRandomOfficerSkillIncrease(final Person person, final int boosts) { + for (int i = 0; i < boosts; i++) { + switch (Utilities.dice(1, 3)) { + case 0: + person.improveSkill(SkillType.S_LEADER); + if (person.getSkillLevel(SkillType.S_LEADER) == 0) { + person.improveSkill(SkillType.S_LEADER); + } + break; + case 1: + person.improveSkill(SkillType.S_STRATEGY); + if (person.getSkillLevel(SkillType.S_STRATEGY) == 0) { + person.improveSkill(SkillType.S_STRATEGY); + } + break; + case 2: + person.improveSkill(SkillType.S_TACTICS); + if (person.getSkillLevel(SkillType.S_TACTICS) == 0) { + person.improveSkill(SkillType.S_TACTICS); + } + break; + } + } + } + /** + * Sets up a standard MechWarrior + * 1) Assigns rank of E12 - Sergeant, or E4 for Clan, WoB, and ComStar + * + * @param personnel the list of all generated personnel + */ + private void generateStandardMechWarriors(final List personnel) { + final boolean isClanComStarOrWoB = getOptions().getFaction().isComStarOrWoB() + || getOptions().getFaction().isClan(); + for (int i = determineFirstNonOfficer(); i < personnel.size(); i++) { + if (getOptions().isAutomaticallyAssignRanks()) { + personnel.get(i).setRankLevel(isClanComStarOrWoB ? 4 : 12); + } + } + } + //endregion Combat Personnel + + //region Support Personnel + /** + * @param campaign the campaign to generate from + * @return a list of all support personnel + */ + private List generateSupportPersonnel(final Campaign campaign) { + List supportPersonnel = new ArrayList<>(); + for (Map.Entry entry : getOptions().getSupportPersonnel().entrySet()) { + for (int i = 0; i < entry.getValue(); i++) { + final Person person = campaign.newPerson(entry.getKey()); + // All support personnel get assigned is their rank + if (getOptions().isAutomaticallyAssignRanks()) { + switch (campaign.getRanks().getRankSystem()) { + case Ranks.RS_CCWH: + case Ranks.RS_CL: + break; + case Ranks.RS_COM: + case Ranks.RS_WOB: + case Ranks.RS_MOC: + person.setRankLevel(4); + break; + default: + person.setRankLevel(8); + break; + } + } + supportPersonnel.add(person); + } + } + return supportPersonnel; + } + //endregion Support Personnel + //endregion Personnel + + //region Units + //endregion Units + + //region Unit + private List sortPersonnelIntoLances(final List personnel) { + final Person commander = personnel.get(0); + List officers = new ArrayList<>(personnel.subList(1, determineFirstNonOfficer())); + List standardMechWarriors = new ArrayList<>(personnel.subList(determineFirstNonOfficer(), personnel.size())); + + return new ArrayList<>(personnel); + } + + /** + * This generates the TO&E structure, and assigns personnel to their individual lances. + * This is called after all dialog modifications to personnel. + * @param campaign the campaign to generate the unit within + * @param personnel a CLONED list of personnel properly organized into lances + */ + private void generateUnit(final Campaign campaign, final List personnel) { + final Force originForce = campaign.getForce(0); + final Alphabet[] alphabet = Alphabet.values(); + String background = ""; + + if (getOptions().isGenerateForceIcons() && (MHQStaticDirectoryManager.getForceIcons() != null)) { + if (MHQStaticDirectoryManager.getForceIcons().getItems().keySet().stream() + .anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getFullName(campaign.getGameYear())))) { + background = getOptions().getFaction().getFullName(campaign.getGameYear()); + } + + if (background.isEmpty() && (MHQStaticDirectoryManager.getForceIcons().getItems().keySet() + .stream().anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getShortName())))) { + background = getOptions().getFaction().getShortName(); + } + } + + // Create the Origin Force Icon, if we are generating force icons and the origin icon has + // not been set + if (getOptions().isGenerateForceIcons() + && Force.ROOT_LAYERED.equals(originForce.getIconCategory()) + && (originForce.getIconMap().entrySet().size() == 1) + && (originForce.getIconMap().containsKey(LayeredForceIcon.FRAME.getLayerPath()))) { + final LinkedHashMap> iconMap = new LinkedHashMap<>(); + + // Type + iconMap.put(LayeredForceIcon.TYPE.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.TYPE.getLayerPath()).add("BattleMech.png"); + + // Background + iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); + + // Frame + iconMap.put(LayeredForceIcon.FRAME.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.FRAME.getLayerPath()).add("Frame.png"); + + originForce.setIconMap(iconMap); + } + + // Generate the Mercenary Company Command Lance + if (getOptions().isGenerateMercenaryCompanyCommandLance()) { + Force commandLance = createLance(campaign, originForce, personnel, campaign.getName() + + resources.getString("AbstractCompanyGenerator.commandLance.text"), background); + commandLance.getIconMap().put(LayeredForceIcon.SPECIAL_MODIFIER.getLayerPath(), new Vector<>()); + commandLance.getIconMap().get(LayeredForceIcon.SPECIAL_MODIFIER.getLayerPath()).add("HQ indicator.png"); + } + + // Create Companies + for (int i = 0; i < getOptions().getCompanyCount(); i++) { + final Force company = new Force(getOptions().getForceNamingType().getValue(alphabet[i]) + + resources.getString("AbstractCompanyGenerator.company.text")); + campaign.addForce(company, originForce); + for (int y = 0; y < getOptions().getLancesPerCompany(); y++) { + createLance(campaign, company, personnel, alphabet[y], background); + } + + if (getOptions().isGenerateForceIcons()) { + createLayeredForceIcon(campaign, company, false, background); + } + } + + // Create Individual Lances + for (int i = 0 ; i < getOptions().getIndividualLanceCount(); i++) { + createLance(campaign, originForce, personnel, alphabet[i], background); + } + } + + private void createLance(final Campaign campaign, final Force head, final List personnel, + final Alphabet alphabet, final String background) { + createLance(campaign, head, personnel, + getOptions().getForceNamingType().getValue(alphabet) + + resources.getString("AbstractCompanyGenerator.lance.text"), + background); + } + + private Force createLance(final Campaign campaign, final Force head,final List personnel, + final String name, final String background) { + Force lance = new Force(name); + campaign.addForce(lance, head); + for (int i = 0; (i < getOptions().getLanceSize()) && !personnel.isEmpty(); i++) { + campaign.addUnitToForce(personnel.remove(0).getUnit(), lance); + } + + if (getOptions().isGenerateForceIcons()) { + createLayeredForceIcon(campaign, lance, true, background); + } + return lance; + } + + private void createLayeredForceIcon(final Campaign campaign, final Force force, + final boolean isLance, final String background) { + if (MHQStaticDirectoryManager.getForceIcons() == null) { + return; + } + + final LinkedHashMap> iconMap = new LinkedHashMap<>(); + + // Type + final int weightClass = determineLanceWeightClass(campaign, force, isLance); + final String weightClassName = (weightClass == EntityWeightClass.WEIGHT_SUPER_HEAVY) + ? "Superheavy" : EntityWeightClass.getClassName(weightClass); + String filename = String.format("BattleMech %s.png", weightClassName); + if (!MHQStaticDirectoryManager.getForceIcons().getItems().containsKey(filename)) { + filename = "BattleMech.png"; + } + iconMap.put(LayeredForceIcon.TYPE.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.TYPE.getLayerPath()).add(filename); + + // Formation + iconMap.put(LayeredForceIcon.FORMATION.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.FORMATION.getLayerPath()).add(isLance ? "04 Lance.png" : "06 Company.png"); + + // Background + if (!background.isEmpty()) { + iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); + } + + // Frame + iconMap.put(LayeredForceIcon.FRAME.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.FRAME.getLayerPath()).add("Frame.png"); + } + + /** + * This determines the weight class of a force (lance or company) based on the + * @param campaign the campaign to determine based on + * @param force the force to determine the weight class for + * @param isLance whether the force is a lance or a company + * @return the weight class of the force + */ + private int determineLanceWeightClass(final Campaign campaign, final Force force, + final boolean isLance) { + double weight = 0.0; + for (UUID unitId : force.getAllUnits(true)) { + final Unit unit = campaign.getUnit(unitId); + if ((unit != null) && (unit.getEntity() != null)) { + weight += unit.getEntity().getWeight(); + } + } + + weight = weight * 4.0 / (getOptions().getLanceSize() * (isLance ? 1 : getOptions().getLancesPerCompany())); + if (weight < 40) { + return EntityWeightClass.WEIGHT_ULTRA_LIGHT; + } else if (weight > 130) { + return EntityWeightClass.WEIGHT_MEDIUM; + } else if (weight > 200) { + return EntityWeightClass.WEIGHT_HEAVY; + } else if (weight > 280) { + return EntityWeightClass.WEIGHT_ASSAULT; + } else if (weight > 390) { + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } else { // 40 <= weight <= 130 + return EntityWeightClass.WEIGHT_LIGHT; + } + } + //endregion Unit + + //region Finances + private void processFinances(final Campaign campaign, final List personnel) { + if (getOptions().isPayForSetup()) { + Money unitCosts = calculateUnitCosts(); + Money hiringCosts = calculateHiringCosts(personnel); + Money partCosts = calculatePartCosts(); + Money ammunitionCosts = calculateAmmunitionCosts(); + } + } + private Money calculateUnitCosts() { + if (!getOptions().isPayForUnits()) { + return Money.zero(); + } + + return Money.zero(); + } + + private Money calculateHiringCosts(List personnel) { + if (!getOptions().isPayForPersonnel()) { + return Money.zero(); + } + + Money hiringCosts = Money.zero(); + for (Person person : personnel) { + hiringCosts = hiringCosts.plus(person.getSalary().multipliedBy(2)); + } + return hiringCosts; + } + + private Money calculatePartCosts() { + if (!getOptions().isPayForParts()) { + return Money.zero(); + } + + return Money.zero(); + } + + private Money calculateAmmunitionCosts() { + if (!getOptions().isPayForAmmunition()) { + return Money.zero(); + } + + return Money.zero(); + } + + //endregion Finances + + public void applyToCampaign(final Campaign campaign, final List combatPersonnel, + final List supportPersonnel) { + generateUnit(campaign, sortPersonnelIntoLances(combatPersonnel)); + + List personnel = new ArrayList<>(supportPersonnel); + personnel.addAll(combatPersonnel); + + if (getOptions().isPoolAssistants()) { + campaign.fillAstechPool(); + campaign.fillMedicPool(); + } else { + for (int i = 0; i < campaign.getAstechNeed(); i++) { + personnel.add(campaign.newPerson(Person.T_ASTECH)); + } + for (int i = 0; i < campaign.getMedicsNeed(); i++) { + personnel.add(campaign.newPerson(Person.T_MEDIC)); + } + } + + processFinances(campaign, personnel); + } } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java index 77102bf756..cb079b4d63 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java @@ -18,57 +18,114 @@ */ package mekhq.campaign.universe.generators.companyGeneration; +import mekhq.campaign.personnel.Person; import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.Factions; +import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.campaign.universe.enums.ForceNamingType; +import java.util.HashMap; import java.util.Map; public class CompanyGenerationOptions { //region Variable Declarations - // Unit Setup - private Faction faction; + // Base Information + private Faction faction; // Done private int companyCount; private int individualLanceCount; + private boolean generateMercenaryCompanyCommandLance; + private int lancesPerCompany; + private int lanceSize; // Personnel - private Map supportPersonnel; - private boolean poolAssistants; - private boolean generateCompanyCommander; - private boolean generateOfficers; + private Map supportPersonnel; // Done + private boolean poolAssistants; // Done + private boolean generateCompanyCommanders; // Done /** * If the company commander counts as one of the lance officers (reduces officer generation by 1 if true) */ - private boolean companyCommanderLanceOfficer; - private boolean applyOfficerStatBonusToWorstSkill; - private boolean assignBestOfficers; - private boolean automaticallyAssignRanks; + private boolean companyCommanderLanceOfficer; // Done + private boolean applyOfficerStatBonusToWorstSkill; // Done + private boolean assignBestOfficers; // Done + private boolean automaticallyAssignRanks; // Done + + // Units + private boolean generateUnitsAsAttached; + private boolean assignBestRollToUnitCommander; + private boolean groupByWeight; + + // Unit + private ForceNamingType forceNamingType; + private boolean generateForceIcons; // Finances private int startingCash; private boolean randomizeStartingCash; private boolean startingLoan; private boolean payForSetup; + private boolean payForUnits; + private boolean payForPersonnel; + private boolean payForParts; + private boolean payForAmmunition; //endregion Variable Declarations //region Constructors - public CompanyGenerationOptions() { - // Unit Setup + public CompanyGenerationOptions(CompanyGenerationType type) { + // Base Information setFaction(Factions.getInstance().getFaction("MERC")); + setCompanyCount(1); + setIndividualLanceCount(0); + setGenerateMercenaryCompanyCommandLance(false); + setLancesPerCompany(3); + setLanceSize(4); // Personnel + Map supportPersonnel = new HashMap<>(); + if (type.isWindchild()) { + supportPersonnel.put(Person.T_MECH_TECH, 5); + supportPersonnel.put(Person.T_MECHANIC, 1); + supportPersonnel.put(Person.T_AERO_TECH, 1); + supportPersonnel.put(Person.T_DOCTOR, 1); + supportPersonnel.put(Person.T_ADMIN_COM, 1); + supportPersonnel.put(Person.T_ADMIN_LOG, 1); + supportPersonnel.put(Person.T_ADMIN_TRA, 1); + supportPersonnel.put(Person.T_ADMIN_HR, 1); + } else { // Defaults to AtB + supportPersonnel.put(Person.T_MECH_TECH, 10); + supportPersonnel.put(Person.T_DOCTOR, 1); + supportPersonnel.put(Person.T_ADMIN_LOG, 1); + } + setSupportPersonnel(supportPersonnel); setPoolAssistants(true); - setGenerateCompanyCommander(true); - setGenerateOfficers(true); - setCompanyCommanderLanceOfficer(false); - setAutomaticallyAssignRanks(false); + setGenerateCompanyCommanders(type.isWindchild()); + setCompanyCommanderLanceOfficer(type.isWindchild()); + setApplyOfficerStatBonusToWorstSkill(type.isWindchild()); + setAssignBestOfficers(type.isWindchild()); + setAutomaticallyAssignRanks(true); + + // Units + setGenerateUnitsAsAttached(type.isAtB()); + setAssignBestRollToUnitCommander(type.isWindchild()); + setGroupByWeight(true); + + // Unit + setForceNamingType(ForceNamingType.CCB_1943); + setGenerateForceIcons(true); // Finances - setStartingLoan(false); + setStartingCash(0); + setRandomizeStartingCash(type.isWindchild()); + setStartingLoan(type.isWindchild()); + setPayForSetup(type.isWindchild()); + setPayForUnits(type.isWindchild()); + setPayForPersonnel(type.isWindchild()); + setPayForParts(type.isWindchild()); + setPayForAmmunition(type.isWindchild()); } //endregion Constructors //region Getters/Setters - //region Unit Setup + //region Base Information public Faction getFaction() { return faction; } @@ -92,7 +149,31 @@ public int getIndividualLanceCount() { public void setIndividualLanceCount(int individualLanceCount) { this.individualLanceCount = individualLanceCount; } - //endregion Unit Setup + + public boolean isGenerateMercenaryCompanyCommandLance() { + return generateMercenaryCompanyCommandLance; + } + + public void setGenerateMercenaryCompanyCommandLance(boolean generateMercenaryCompanyCommandLance) { + this.generateMercenaryCompanyCommandLance = generateMercenaryCompanyCommandLance; + } + + public int getLanceSize() { + return lanceSize; + } + + public void setLanceSize(int lanceSize) { + this.lanceSize = lanceSize; + } + + public int getLancesPerCompany() { + return lancesPerCompany; + } + + public void setLancesPerCompany(int lancesPerCompany) { + this.lancesPerCompany = lancesPerCompany; + } + //endregion Base Information //region Personnel public Map getSupportPersonnel() { @@ -111,20 +192,12 @@ public void setPoolAssistants(boolean poolAssistants) { this.poolAssistants = poolAssistants; } - public boolean isGenerateCompanyCommander() { - return generateCompanyCommander; - } - - public void setGenerateCompanyCommander(boolean generateCompanyCommander) { - this.generateCompanyCommander = generateCompanyCommander; + public boolean isGenerateCompanyCommanders() { + return generateCompanyCommanders; } - public boolean isGenerateOfficers() { - return generateOfficers; - } - - public void setGenerateOfficers(boolean generateOfficers) { - this.generateOfficers = generateOfficers; + public void setGenerateCompanyCommanders(boolean generateCompanyCommanders) { + this.generateCompanyCommanders = generateCompanyCommanders; } public boolean isCompanyCommanderLanceOfficer() { @@ -160,6 +233,50 @@ public void setAutomaticallyAssignRanks(boolean automaticallyAssignRanks) { } //endregion Personnel + //region Units + public boolean isGenerateUnitsAsAttached() { + return generateUnitsAsAttached; + } + + public void setGenerateUnitsAsAttached(boolean generateUnitsAsAttached) { + this.generateUnitsAsAttached = generateUnitsAsAttached; + } + + public boolean isAssignBestRollToUnitCommander() { + return assignBestRollToUnitCommander; + } + + public void setAssignBestRollToUnitCommander(boolean assignBestRollToUnitCommander) { + this.assignBestRollToUnitCommander = assignBestRollToUnitCommander; + } + + public boolean isGroupByWeight() { + return groupByWeight; + } + + public void setGroupByWeight(boolean groupByWeight) { + this.groupByWeight = groupByWeight; + } + //endregion Units + + //region Unit + public ForceNamingType getForceNamingType() { + return forceNamingType; + } + + public void setForceNamingType(ForceNamingType forceNamingType) { + this.forceNamingType = forceNamingType; + } + + public boolean isGenerateForceIcons() { + return generateForceIcons; + } + + public void setGenerateForceIcons(boolean generateForceIcons) { + this.generateForceIcons = generateForceIcons; + } + //endregion Unit + //region Finances public int getStartingCash() { return startingCash; @@ -192,6 +309,38 @@ public boolean isPayForSetup() { public void setPayForSetup(boolean payForSetup) { this.payForSetup = payForSetup; } + + public boolean isPayForUnits() { + return payForUnits; + } + + public void setPayForUnits(boolean payForUnits) { + this.payForUnits = payForUnits; + } + + public boolean isPayForPersonnel() { + return payForPersonnel; + } + + public void setPayForPersonnel(boolean payForPersonnel) { + this.payForPersonnel = payForPersonnel; + } + + public boolean isPayForParts() { + return payForParts; + } + + public void setPayForParts(boolean payForParts) { + this.payForParts = payForParts; + } + + public boolean isPayForAmmunition() { + return payForAmmunition; + } + + public void setPayForAmmunition(boolean payForAmmunition) { + this.payForAmmunition = payForAmmunition; + } //endregion Finances //endregion Getters/Setters } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java index 26ee427dc0..1df41b6a78 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java @@ -18,6 +18,9 @@ */ package mekhq.campaign.universe.generators.companyGeneration; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.personnel.SkillType; +import mekhq.campaign.personnel.ranks.Ranks; import mekhq.campaign.universe.enums.CompanyGenerationType; public class WindchildCompanyGenerator extends AbstractCompanyGenerator { @@ -26,4 +29,24 @@ public WindchildCompanyGenerator() { super(CompanyGenerationType.WINDCHILD); } //endregion Constructors + + @Override + protected void generateCommandingOfficer(Person commandingOfficer, int numMechWarriors) { + commandingOfficer.setCommander(true); + commandingOfficer.improveSkill(SkillType.S_GUN_MECH); + commandingOfficer.improveSkill(SkillType.S_PILOT_MECH); + assignRandomOfficerSkillIncrease(commandingOfficer, 2); + + if (getOptions().isAutomaticallyAssignRanks()) { + if (numMechWarriors > 36) { + commandingOfficer.setRankLevel(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); + } else if (numMechWarriors > 12) { + commandingOfficer.setRankLevel(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 5)); + } else if (numMechWarriors > 4) { + commandingOfficer.setRankLevel(Ranks.RWO_MAX + 4); + } else { + commandingOfficer.setRankLevel(Ranks.RWO_MAX + 3); + } + } + } } diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 06c1b48573..4a8a9c5f38 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -19,26 +19,27 @@ package mekhq.gui.dialog; import mekhq.campaign.Campaign; -import mekhq.campaign.finances.Money; -import mekhq.campaign.personnel.Person; import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; -import java.util.ArrayList; -import java.util.List; +import javax.swing.*; -public class CompanyGenerationDialog { +public class CompanyGenerationDialog extends JDialog { //region Variable Declarations private Campaign campaign; private AbstractCompanyGenerator companyGenerator; //endregion Variable Declarations //region Constructors - public CompanyGenerationDialog(Campaign campaign, AbstractCompanyGenerator companyGenerator) { + public CompanyGenerationDialog(JFrame frame, Campaign campaign, AbstractCompanyGenerator companyGenerator) { + super(frame); + setCampaign(campaign); setCompanyGenerator(companyGenerator); + initialize(); } //endregion Constructors + //region Getters/Setters public Campaign getCampaign() { return campaign; @@ -57,27 +58,14 @@ public void setCompanyGenerator(AbstractCompanyGenerator companyGenerator) { } //endregion Getters/Setters - private void applyToCampaign() { - List personnel = new ArrayList<>(); - if (getCompanyGenerator().getOptions().isPoolAssistants()) { - getCampaign().fillAstechPool(); - getCampaign().fillMedicPool(); - } else { - for (int i = 0; i < getCampaign().getAstechNeed(); i++) { - personnel.add(getCompanyGenerator().generatePerson(Person.T_ASTECH)); - } - for (int i = 0; i < getCampaign().getMedicsNeed(); i++) { - personnel.add(getCompanyGenerator().generatePerson(Person.T_MEDIC)); - } - } + //region Initialization + private void initialize() { + + } + //endregion Initialization - if (getCompanyGenerator().getOptions().isPayForSetup()) { - Money unitCosts = Money.zero(); - Money hiringCosts = Money.zero(); - Money partCosts = Money.zero(); - for (Person person : personnel) { - hiringCosts = hiringCosts.plus(person.getSalary().multipliedBy(2)); - } - } + private boolean validateData() { + // ensure you have a minimum of 1 lance or company generated + return true; } } From 50d74c591ba7b25978e91a326e3d0ce53513c6cd Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 7 Feb 2021 16:50:13 -0700 Subject: [PATCH 003/115] Continuing to implement company generation and its options --- .../mekhq/resources/CampaignGUI.properties | 13 +- .../CampaignOptionsDialog.properties | 4 + .../mekhq/resources/GMToolsDialog.properties | 52 - .../resources/mekhq/resources/GUI.properties | 198 +++ .../mekhq/resources/GUIEnums.properties | 75 -- .../resources/MekHqOptionsDialog.properties | 8 +- .../mekhq/resources/Universe.properties | 7 +- MekHQ/src/mekhq/MekHQOptions.java | 36 +- MekHQ/src/mekhq/MekHqConstants.java | 6 +- MekHQ/src/mekhq/Utilities.java | 14 +- MekHQ/src/mekhq/campaign/Campaign.java | 10 + MekHQ/src/mekhq/campaign/CampaignOptions.java | 31 +- MekHQ/src/mekhq/campaign/unit/Unit.java | 4 + .../universe/DefaultFactionSelector.java | 43 +- .../universe/enums/CompanyGenerationType.java | 7 +- .../AbstractCompanyGenerator.java | 700 +++++++++-- .../AtBCompanyGenerator.java | 120 +- .../CompanyGenerationOptions.java | 644 +++++++++- .../WindchildCompanyGenerator.java | 133 +- MekHQ/src/mekhq/gui/CampaignGUI.java | 26 +- MekHQ/src/mekhq/gui/FileDialogs.java | 28 +- .../gui/dialog/CampaignOptionsDialog.java | 27 +- .../gui/dialog/CompanyGenerationDialog.java | 124 +- MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java | 34 +- .../mekhq/gui/dialog/MekHqOptionsDialog.java | 57 +- .../src/mekhq/gui/enums/LayeredForceIcon.java | 27 +- .../src/mekhq/gui/enums/PersonnelFilter.java | 8 +- .../mekhq/gui/enums/PersonnelFilterStyle.java | 14 +- .../src/mekhq/gui/enums/PersonnelTabView.java | 13 +- .../view/CompanyGenerationOptionsPanel.java | 1091 +++++++++++++++++ .../gui/view/CompanyGenerationPanel.java | 94 ++ 31 files changed, 3281 insertions(+), 367 deletions(-) delete mode 100644 MekHQ/resources/mekhq/resources/GMToolsDialog.properties create mode 100644 MekHQ/resources/mekhq/resources/GUI.properties delete mode 100644 MekHQ/resources/mekhq/resources/GUIEnums.properties create mode 100644 MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java create mode 100644 MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java diff --git a/MekHQ/resources/mekhq/resources/CampaignGUI.properties b/MekHQ/resources/mekhq/resources/CampaignGUI.properties index 59fb031378..af8a00eb69 100644 --- a/MekHQ/resources/mekhq/resources/CampaignGUI.properties +++ b/MekHQ/resources/mekhq/resources/CampaignGUI.properties @@ -68,19 +68,16 @@ miCargoReport.text=Cargo Report... # View Menu menuView.text=View miShowHistoricalReportLog.text=Historical Daily Report Log -miDetachLog.text=Detach Daily Report Log -miAttachLog.text=Attach Daily Report Log -miBloodnameDialog.text=Bloodname Dialog... miRetirementDefectionDialog.text=Retirement/Defection Dialog... -miShowOverview.text=Overview Tab # Manage Campaign Menu menuManageCampaign.text=Manage Campaign -miGMToolsDialog.text=GM Tools Dialog -miAdvanceMultipleDays.text=Advance Multiple Days +miGMToolsDialog.text=GM Tools Dialog... +miAdvanceMultipleDays.text=Advance Multiple Days... miRandomBloodnames.text=Bloodname Randomization for All Personnel -miBatchXP.text=Mass Personnel Training -miScenarioEditor.text=Scenario Template Editor +miBatchXP.text=Mass Personnel Training... +miScenarioEditor.text=Scenario Template Editor... +miCompanyGenerator.text=Company Generator... # Help Menu menuHelp.text=Help diff --git a/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties b/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties index 0a245d1304..085533ee19 100644 --- a/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties @@ -400,3 +400,7 @@ chkContractMarketReportRefresh.text=Display a report when contract market refres chkUnitMarketReportRefresh.text=Display a report when unit market refreshes chkAssignPortraitOnRoleChange.text=Automatically assign portrait on role change chkAssignPortraitOnRoleChange.toolTipText=With this enabled, a person without a portrait will automatically gain a random portrait when their primary role is switched to one of those selected below + +#start Company Generation Options Tab +companyGenerationOptionsPanel.title=Company Generation +#end Company Generation Options Tab diff --git a/MekHQ/resources/mekhq/resources/GMToolsDialog.properties b/MekHQ/resources/mekhq/resources/GMToolsDialog.properties deleted file mode 100644 index 16d80e59cf..0000000000 --- a/MekHQ/resources/mekhq/resources/GMToolsDialog.properties +++ /dev/null @@ -1,52 +0,0 @@ -# GM Tools Dialog Resource Strings -# Dice Panel -dicePanel.text=Dice Roller -sides.text=d -totalDiceResultsLabel.text=Result: -totalDiceResult.text=%5d -diceRoll.text=Roll -individualDiceResultsLabel.text=Individual Results: - -# RAT Panel -ratPanel.text=RAT Roller -yearLabel.text=Year -factionLabel.text=Faction -qualityLabel.text=Quality -unitTypeLabel.text=Unit Type -unitWeightLabel.text=Weight -ratRoll.text=Roll For RAT -addRandomUnit.text=Add Random Unit -invalidYear.error=Please enter a valid year -noValidUnit.error=No unit matching criteria and purchase restrictions. -entityLoadFailure.error=Failed to load entity - -# Name Panel -namePanel.text=Name Generator -genderLabel.text=Gender -originFactionLabel.text=Origin Faction -factionWeighted.text=Faction Weighted -historicalEthnicityLabel.text=Historical Ethnicity -clannerLabel.text=Clanner -currentNameLabel.text=Current Name: -nameGeneratedLabel.text=Generated Name: -generateNameButton.text=Generate Name -assignNameButton.text=Assign Name - -# Callsign Panel -callsignPanel.text=Callsign Generator -currentCallsignLabel.text=Current Callsign: -callsignGeneratedLabel.text=Generated Callsign: -generateCallsignButton.text=Generate Callsign -assignCallsignButton.text=Assign Callsign - -# Bloodname Panel -bloodnamePanel.text=Bloodname Generator -originClanLabel.text=Clan -bloodnameEraLabel.text=Year -phenotypeLabel.text=Phenotype -currentBloodnameLabel.text=Current Bloodname: -bloodnameGeneratedLabel.text=Generated Bloodname: -originClanGeneratedLabel.text=Generated Clan -phenotypeGeneratedLabel.text=Generated Phenotype -generateBloodnameButton.text=Generate Bloodname -assignBloodnameButton.text=Assign Bloodname diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties new file mode 100644 index 0000000000..d98b21af22 --- /dev/null +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -0,0 +1,198 @@ +# This is used to store any mekhq/gui Resources + +## General GUI Resources +Apply=Apply +Cancel=Cancel +Export=Export +Generate=Generate +Import=Import +RestoreDefaults=Restore Defaults + +## Dialog +# CompanyGenerationDialog Class +CompanyGenerationDialog.title=Company Generator + +# GMToolsDialog +# Dice Panel +dicePanel.text=Dice Roller +rolls.text=rolls of\u0020 +sides.text=d +totalDiceResultsLabel.text=Result: +totalDiceResult.text=%5d +diceRoll.text=Roll +individualDiceResultsLabel.text=Individual Results: +# RAT Panel +ratPanel.text=RAT Roller +yearLabel.text=Year +factionLabel.text=Faction +qualityLabel.text=Quality +unitTypeLabel.text=Unit Type +unitWeightLabel.text=Weight +ratRoll.text=Roll For RAT +addRandomUnit.text=Add Random Unit +invalidYear.error=Please enter a valid year +noValidUnit.error=No unit matching criteria and purchase restrictions. +entityLoadFailure.error=Failed to load entity +# Name Panel +namePanel.text=Name Generator +genderLabel.text=Gender +originFactionLabel.text=Origin Faction +factionWeighted.text=Faction Weighted +historicalEthnicityLabel.text=Historical Ethnicity +clannerLabel.text=Clanner +currentNameLabel.text=Current Name: +nameGeneratedLabel.text=Generated Name: +generateNameButton.text=Generate Name +assignNameButton.text=Assign Name +# Callsign Panel +callsignPanel.text=Callsign Generator +currentCallsignLabel.text=Current Callsign: +callsignGeneratedLabel.text=Generated Callsign: +generateCallsignButton.text=Generate Callsign +assignCallsignButton.text=Assign Callsign +# Bloodname Panel +bloodnamePanel.text=Bloodname Generator +originClanLabel.text=Clan +bloodnameEraLabel.text=Year +phenotypeLabel.text=Phenotype +currentBloodnameLabel.text=Current Bloodname: +bloodnameGeneratedLabel.text=Generated Bloodname: +originClanGeneratedLabel.text=Generated Clan +phenotypeGeneratedLabel.text=Generated Phenotype +generateBloodnameButton.text=Generate Bloodname +assignBloodnameButton.text=Assign Bloodname + +## Enums +# LayeredForceIcon Enum +LayeredForceIcon.types.text=Types +LayeredForceIcon.formations.text=Formations +LayeredForceIcon.adjustments.text=Adjustments +LayeredForceIcon.alphanumerics.text=Alphanumerics +LayeredForceIcon.special.text=Special +LayeredForceIcon.backgrounds.text=Backgrounds +LayeredForceIcon.frame.text=Frames +LayeredForceIcon.logos.text=Logos + +# PersonnelFilter Enum +PersonnelFilter.ALL=All Personnel +PersonnelFilter.ACTIVE=Active Personnel +PersonnelFilter.COMBAT=Combat Personnel +PersonnelFilter.SUPPORT=Support Personnel +PersonnelFilter.MECHWARRIOR=MechWarriors +PersonnelFilter.VEHICLE_CREWMEMBER=Vehicle Crews +PersonnelFilter.GROUND_VEHICLE_DRIVER=Vehicle Drivers +PersonnelFilter.NAVAL_VEHICLE_DRIVER=Naval Drivers +PersonnelFilter.VEHICLE_GUNNER=Vehicle Gunners +PersonnelFilter.VEHICLE_CREW=Vehicle Crew +PersonnelFilter.VTOL_PILOT=VTOL Pilots +PersonnelFilter.AEROSPACE_PILOT=Aerospace Pilots +PersonnelFilter.CONVENTIONAL_AIRCRAFT_PILOT=Conventional Pilots +PersonnelFilter.PROTOMECH_PILOT=ProtoMech Pilots +PersonnelFilter.BATTLE_ARMOUR=Battle Armor Infantry +PersonnelFilter.SOLDIER=Soldiers +PersonnelFilter.VESSEL_CREWMEMBER=Large Vessel Crews +PersonnelFilter.VESSEL_PILOT=Vessel Pilots +PersonnelFilter.VESSEL_CREW=Vessel Crew +PersonnelFilter.VESSEL_GUNNER=Vessel Gunners +PersonnelFilter.VESSEL_NAVIGATOR=Hyperspace Navigators +PersonnelFilter.TECH=Techs +PersonnelFilter.MECH_TECH=Mech Techs +PersonnelFilter.MECHANIC=Mechanics +PersonnelFilter.AERO_TECH=Aero Techs +PersonnelFilter.BA_TECH=Battle Armour Techs +PersonnelFilter.ASTECH=Astechs +PersonnelFilter.MEDICAL=Medical Staff +PersonnelFilter.DOCTOR=Doctors +PersonnelFilter.MEDIC=Medics +PersonnelFilter.ADMINISTRATOR=Administrators +PersonnelFilter.ADMINISTRATOR_COMMAND=Administrators (Command) +PersonnelFilter.ADMINISTRATOR_LOGISTICS=Administrators (Logistics) +PersonnelFilter.ADMINISTRATOR_TRANSPORT=Administrators (Transport) +PersonnelFilter.ADMINISTRATOR_HR=Administrators (HR) +PersonnelFilter.DEPENDENT=Dependents +PersonnelFilter.FOUNDER=Founders +PersonnelFilter.PRISONER=Prisoners +PersonnelFilter.INACTIVE=Inactive Personnel +PersonnelFilter.RETIRED=Retired Personnel +PersonnelFilter.MIA=Missing in Action Personnel +PersonnelFilter.KIA=Rolls of Honor +PersonnelFilter.DEAD=Cemetery + +# PersonnelFilterStyle Enum +PersonnelFilterStyle.STANDARD.text=Standard +PersonnelFilterStyle.STANDARD.toolTipText=This is the standard filter style for MekHQ, which groups less commonly used but related personnel roles into a single filter (e.g. Doctors and Medics are grouped as Medical Staff) +PersonnelFilterStyle.INDIVIDUAL_ROLE.text=Individual Role +PersonnelFilterStyle.INDIVIDUAL_ROLE.toolTipText=This filter style provides filters that allow one to filter personnel by each individual role, without the filter groupings as seen previously. +PersonnelFilterStyle.ALL.text=All +PersonnelFilterStyle.ALL.toolTipText=This filter style provides all of the standard AND individual role filters. + +# PersonnelTabView Enum +PersonnelTabView.GRAPHIC=Graphic +PersonnelTabView.GENERAL=General +PersonnelTabView.PILOT_GUNNERY_SKILLS=Piloting/Gunnery Skills +PersonnelTabView.INFANTRY_SKILLS=Infantry Skills +PersonnelTabView.TACTICAL_SKILLS=Tactical Skills +PersonnelTabView.TECHNICAL_SKILLS=Tech Skills +PersonnelTabView.ADMINISTRATIVE_SKILLS=Admin Skills +PersonnelTabView.BIOGRAPHICAL=Biographical Information +PersonnelTabView.FLUFF=Fluff Information + +## View +# CompanyGenerationOptionsPanel Class +baseInformationPanel.title=Base Information +lblCompanyGenerationType.text=Company Generation Type +lblFaction.text=Faction +lblCompanyCount.text=Company Count +lblIndividualLanceCount.text=Individual Lance Count +chkGenerateMercenaryCompanyCommandLance.text=Generate Company Command Lance +lblLancesPerCompany.text=Lances per Company +lblLanceSize.text=BattleMechs per Lance + +personnelPanel.title=Personnel +lblTotalSupportPersonnel.text=Number of Support Personnel: %d +supportPersonnelNumbersPanel.title=Support Personnel Assignment +chkPoolAssistants.text=Pool Assistants +chkPoolAssistants.toolTipText=If selected the unit pool is automatically filled, otherwise they are hired as permanent members of the unit. +chkGenerateCaptains.text=Generate Captains +chkGenerateCaptains.toolTipText=This creates Captains for every company after the first, or for every company when using a mercenary company command lance. They have two officer skill increases, and are assigned the rank of Captain. +chkCompanyCommanderLanceOfficer.text=Generate Company Commander as Lance Officer +chkCompanyCommanderLanceOfficer.toolTipText=When enabled the company commander has their own lance without any other officers. Otherwise, the lance containing the company commander will also contain a Lieutenant. +chkApplyOfficerStatBonusToWorstSkill.text=Apply Officer Stat Bonus to Weaker Skill +chkAssignBestOfficers.text=Assign Best Officers +chkAutomaticallyAssignRanks.text=Automatically Assign Ranks + +unitsPanel.title=Units +chkGenerateUnitsAsAttached.text=Generate Units as Attached +chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules. These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MW when they retire (provided the campaign options are enabled). +chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander +chkAssignBestRollToUnitCommander.toolTipText= +chkGroupByWeight.text=Group Units by Weight +chkGroupByWeight.toolTipText= + +unitPanel.title=Unit +lblForceNamingType.text=Force Naming Type +chkGenerateForceIcons.text=Generate Force Icons + +financesPanel.title=Finances +lblStartingCash.text=Starting C-Bills +chkRandomizeStartingCash.text=Randomize Starting C-Bills +chkRandomizeStartingCash.toolTipText=This addition assigns a random +lblMinimumStartingFloat.text=Minimum Starting Float +lblMinimumStartingFloat.toolTipText= +chkPayForSetup.text=Pay for Setup +chkPayForSetup.toolTipText=This enables paying for the generated unit from the starting cash, to a minimum of the starting float. +chkStartingLoan.text=Starting Loan +chkStartingLoan.toolTipText= +chkPayForPersonnel.text=Pay for Personnel +chkPayForPersonnel.toolTipText= +chkPayForUnits.text=Pay for Units +chkPayForUnits.toolTipText= +chkPayForParts.text=Pay for Parts +chkPayForParts.toolTipText= +chkPayForAmmunition.text=Pay for Ammunition +chkPayForAmmunition.toolTipText= + +# CompanyGenerationPanel Class +CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? +CompanyGenerationPanel.ImmediateApplicationWarning.text=Confirm immediate generation and application to campaign? +CompanyGenerationPanel.OverwriteGenerationWarning.text=The new generation will overwrite the current generation. The previous data is not recoverable. Confirm generation? diff --git a/MekHQ/resources/mekhq/resources/GUIEnums.properties b/MekHQ/resources/mekhq/resources/GUIEnums.properties deleted file mode 100644 index 5d690d9211..0000000000 --- a/MekHQ/resources/mekhq/resources/GUIEnums.properties +++ /dev/null @@ -1,75 +0,0 @@ -# This is used to store any Resources for the MekHQ/src/mekhq/gui/enums Enums - -# LayeredForceIcon Enum -LayeredForceIcon.types=Types -LayeredForceIcon.formations=Formations -LayeredForceIcon.adjustments=Adjustments -LayeredForceIcon.alphanumerics=Alphanumerics -LayeredForceIcon.special=Special -LayeredForceIcon.backgrounds=Backgrounds -LayeredForceIcon.frame=Frames -LayeredForceIcon.logos=Logos - -# PersonnelFilter Enum -PersonnelFilter.ALL=All Personnel -PersonnelFilter.ACTIVE=Active Personnel -PersonnelFilter.COMBAT=Combat Personnel -PersonnelFilter.SUPPORT=Support Personnel -PersonnelFilter.MECHWARRIOR=MechWarriors -PersonnelFilter.VEHICLE_CREWMEMBER=Vehicle Crews -PersonnelFilter.GROUND_VEHICLE_DRIVER=Vehicle Drivers -PersonnelFilter.NAVAL_VEHICLE_DRIVER=Naval Drivers -PersonnelFilter.VEHICLE_GUNNER=Vehicle Gunners -PersonnelFilter.VEHICLE_CREW=Vehicle Crew -PersonnelFilter.VTOL_PILOT=VTOL Pilots -PersonnelFilter.AEROSPACE_PILOT=Aerospace Pilots -PersonnelFilter.CONVENTIONAL_AIRCRAFT_PILOT=Conventional Pilots -PersonnelFilter.PROTOMECH_PILOT=ProtoMech Pilots -PersonnelFilter.BATTLE_ARMOUR=Battle Armor Infantry -PersonnelFilter.SOLDIER=Soldiers -PersonnelFilter.VESSEL_CREWMEMBER=Large Vessel Crews -PersonnelFilter.VESSEL_PILOT=Vessel Pilots -PersonnelFilter.VESSEL_CREW=Vessel Crew -PersonnelFilter.VESSEL_GUNNER=Vessel Gunners -PersonnelFilter.VESSEL_NAVIGATOR=Hyperspace Navigators -PersonnelFilter.TECH=Techs -PersonnelFilter.MECH_TECH=Mech Techs -PersonnelFilter.MECHANIC=Mechanics -PersonnelFilter.AERO_TECH=Aero Techs -PersonnelFilter.BA_TECH=Battle Armour Techs -PersonnelFilter.ASTECH=Astechs -PersonnelFilter.MEDICAL=Medical Staff -PersonnelFilter.DOCTOR=Doctors -PersonnelFilter.MEDIC=Medics -PersonnelFilter.ADMINISTRATOR=Administrators -PersonnelFilter.ADMINISTRATOR_COMMAND=Administrators (Command) -PersonnelFilter.ADMINISTRATOR_LOGISTICS=Administrators (Logistics) -PersonnelFilter.ADMINISTRATOR_TRANSPORT=Administrators (Transport) -PersonnelFilter.ADMINISTRATOR_HR=Administrators (HR) -PersonnelFilter.DEPENDENT=Dependents -PersonnelFilter.FOUNDER=Founders -PersonnelFilter.PRISONER=Prisoners -PersonnelFilter.INACTIVE=Inactive Personnel -PersonnelFilter.RETIRED=Retired Personnel -PersonnelFilter.MIA=Missing in Action Personnel -PersonnelFilter.KIA=Rolls of Honor -PersonnelFilter.DEAD=Cemetery - -# PersonnelFilterStyle Enum -PersonnelFilterStyle.STANDARD.text=Standard -PersonnelFilterStyle.STANDARD.toolTipText=This is the standard filter style for MekHQ, which groups less commonly used but related personnel roles into a single filter (e.g. Doctors and Medics are grouped as Medical Staff) -PersonnelFilterStyle.INDIVIDUAL_ROLE.text=Individual Role -PersonnelFilterStyle.INDIVIDUAL_ROLE.toolTipText=This filter style provides filters that allow one to filter personnel by each individual role, without the filter groupings as seen previously. -PersonnelFilterStyle.ALL.text=All -PersonnelFilterStyle.ALL.toolTipText=This filter style provides all of the standard AND individual role filters. - -# PersonnelTabView Enum -PersonnelTabView.GRAPHIC=Graphic -PersonnelTabView.GENERAL=General -PersonnelTabView.PILOT_GUNNERY_SKILLS=Piloting/Gunnery Skills -PersonnelTabView.INFANTRY_SKILLS=Infantry Skills -PersonnelTabView.TACTICAL_SKILLS=Tactical Skills -PersonnelTabView.TECHNICAL_SKILLS=Tech Skills -PersonnelTabView.ADMINISTRATIVE_SKILLS=Admin Skills -PersonnelTabView.BIOGRAPHICAL=Biographical Information -PersonnelTabView.FLUFF=Fluff Information diff --git a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties index 3274e777d1..d076b4e68f 100644 --- a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties @@ -7,8 +7,12 @@ displayTab.title=Display Options labelDisplayDateFormat.text=Display Date Format labelLongDisplayDateFormat.text=Long Display Date Format invalidDateFormat.error=Invalid Date Format -optionHistoricalDailyLog.text=Temporarily retain daily log history +optionHistoricalDailyLog.text=Temporarily Retain Daily Log History optionHistoricalDailyLog.toolTipText=Keeps a limited historical daily report in-memory during the gaming session. May result in increased memory usage. +optionShowCompanyGenerator.text=Show Company Generator +optionShowCompanyGenerator.toolTipText=This option adds a company generator menu item under the Manage Campaign header on the menu bar +labelDefaultCompanyGenerationType.text=Default Company Generation Type +labelDefaultCompanyGenerationType.toolTipText=This is the default company generation type to be used on load. labelCommandCenterDisplay.text=Command Center Display Options optionCommandCenterUseUnitMarket.text=Find Units Links to Unit Market (if enabled) @@ -42,6 +46,8 @@ optionPreferGzippedOutput.toolTipText=When selected MekHQ will save the campaign optionWriteCustomsToXML.text=Write Custom Units to Campaign XML optionSaveMothballState.text=Save Unit State Before Mothballing optionSaveMothballState.toolTipText=This option allows you to disable saving of the unit's crew and force before being mothballed for restoration post-mothball. +optionSaveCompanyGenerationOptions.text=Save Company Generation Options with Campaign Options +optionSaveCompanyGenerationOptions.toolTipText=This option allows you to save your company generation options with the campaign options. #Miscellaneous Tab miscellaneousTab.title=Miscellaneous Options diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 5df357d7dd..c244512ad6 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -96,6 +96,7 @@ ForceNamingType.GREEK_ALPHABET.text=Greek Alphabet ## Generators # AbstractCompanyGenerator -AbstractCompanyGenerator.commandLance.text= Command Lance -AbstractCompanyGenerator.company.text= Company -AbstractCompanyGenerator.lance.text= Lance +AbstractCompanyGenerator.commandLance.text=\u0020Command Lance +AbstractCompanyGenerator.company.text=\u0020Company +AbstractCompanyGenerator.lance.text=\u0020Lance +AbstractCompanyGenerator..report= diff --git a/MekHQ/src/mekhq/MekHQOptions.java b/MekHQ/src/mekhq/MekHQOptions.java index fada84f211..de106bd13f 100644 --- a/MekHQ/src/mekhq/MekHQOptions.java +++ b/MekHQ/src/mekhq/MekHQOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - The MekHQ Team. All Rights Reserved. + * Copyright (c) 2020-2021 - The MekHQ Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -18,6 +18,7 @@ */ package mekhq; +import mekhq.campaign.universe.enums.CompanyGenerationType; import mekhq.gui.enums.PersonnelFilterStyle; import java.time.LocalDate; @@ -64,6 +65,23 @@ public void setHistoricalDailyLog(boolean value) { userPreferences.node(MekHqConstants.DISPLAY_NODE).putBoolean(MekHqConstants.HISTORICAL_DAILY_LOG, value); } + public boolean getShowCompanyGenerator() { + return userPreferences.node(MekHqConstants.DISPLAY_NODE).getBoolean(MekHqConstants.SHOW_COMPANY_GENERATOR, false); + } + + public void setShowCompanyGenerator(boolean value) { + userPreferences.node(MekHqConstants.DISPLAY_NODE).putBoolean(MekHqConstants.SHOW_COMPANY_GENERATOR, value); + } + + public CompanyGenerationType getDefaultCompanyGenerationType() { + return CompanyGenerationType.valueOf(userPreferences.node(MekHqConstants.DISPLAY_NODE) + .get(MekHqConstants.DEFAULT_COMPANY_GENERATION_TYPE, CompanyGenerationType.AGAINST_THE_BOT.name())); + } + + public void setDefaultCompanyGenerationType(CompanyGenerationType value) { + userPreferences.node(MekHqConstants.DISPLAY_NODE).put(MekHqConstants.DEFAULT_COMPANY_GENERATION_TYPE, value.name()); + } + //region Command Center Display public boolean getCommandCenterUseUnitMarket() { return userPreferences.node(MekHqConstants.DISPLAY_NODE).getBoolean(MekHqConstants.COMMAND_CENTER_USE_UNIT_MARKET, true); @@ -205,6 +223,14 @@ public boolean getSaveMothballState() { public void setSaveMothballState(boolean value) { userPreferences.node(MekHqConstants.XML_SAVES_NODE).putBoolean(MekHqConstants.SAVE_MOTHBALL_STATE, value); } + + public boolean getSaveCompanyGenerationOptions() { + return userPreferences.node(MekHqConstants.XML_SAVES_NODE).getBoolean(MekHqConstants.SAVE_COMPANY_GENERATION_OPTIONS, false); + } + + public void setSaveCompanyGenerationOptions(boolean value) { + userPreferences.node(MekHqConstants.XML_SAVES_NODE).putBoolean(MekHqConstants.SAVE_COMPANY_GENERATION_OPTIONS, value); + } //endregion Campaign XML Save Options //region File Paths @@ -215,6 +241,14 @@ public String getAwardsDirectoryPath() { public void setAwardsDirectoryPath(String value) { userPreferences.node(MekHqConstants.FILE_PATH_NODE).put(MekHqConstants.AWARDS_DIRECTORY_PATH, value); } + + public String getCompanyGenerationDirectoryPath() { + return userPreferences.node(MekHqConstants.FILE_PATH_NODE).get(MekHqConstants.COMPANY_GENERATION_DIRECTORY_PATH, "mmconf/mhqCompanyGenerationPresets/"); + } + + public void setCompanyGenerationDirectoryPath(String value) { + userPreferences.node(MekHqConstants.FILE_PATH_NODE).put(MekHqConstants.COMPANY_GENERATION_DIRECTORY_PATH, value); + } //endregion File Paths //region Miscellaneous Options diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index 9d3aff5e37..d850563f2b 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -1,7 +1,7 @@ /* * MekHqConstants.java * - * Copyright (c) 2019 - The MegaMek Team. All rights reserved. + * Copyright (c) 2019-2021 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -28,6 +28,8 @@ public final class MekHqConstants { public static final String LONG_DISPLAY_DATE_FORMAT = "longDisplayDateFormat"; public static final String HISTORICAL_DAILY_LOG = "historicalDailyLog"; public static final int MAX_HISTORICAL_LOG_DAYS = 120; // max number of days that will be stored in the history, also used as a limit in the UI + public static final String SHOW_COMPANY_GENERATOR = "showCompanyGenerator"; + public static final String DEFAULT_COMPANY_GENERATION_TYPE = "defaultCompanyGenerationType"; // region Command Center public static final String COMMAND_CENTER_USE_UNIT_MARKET = "commandCenterUseUnitMarket"; @@ -62,11 +64,13 @@ public final class MekHqConstants { public static final String PREFER_GZIPPED_CAMPAIGN_FILE = "preferGzippedCampaignFile"; public static final String WRITE_CUSTOMS_TO_XML = "writeCustomsToXML"; public static final String SAVE_MOTHBALL_STATE = "saveMothballState"; + public static final String SAVE_COMPANY_GENERATION_OPTIONS = "saveCompanyGenerationOptions"; //endregion Campaign XML Save Options //region File Paths public static final String FILE_PATH_NODE = "mekhq/prefs/filepaths"; public static final String AWARDS_DIRECTORY_PATH = "awardsDirectoryPath"; + public static final String COMPANY_GENERATION_DIRECTORY_PATH = "companyGenerationDirectoryPath"; //endregion File Paths //region Miscellaneous Options diff --git a/MekHQ/src/mekhq/Utilities.java b/MekHQ/src/mekhq/Utilities.java index 3a9f3e2117..a696480bf3 100644 --- a/MekHQ/src/mekhq/Utilities.java +++ b/MekHQ/src/mekhq/Utilities.java @@ -147,17 +147,23 @@ public static int dice(int num, int faces) { } /** - * @param num the number of dice to roll + * c ndf, so this handles 10 rolls of 2d6 + * + * @param count the number of sets of dice to roll + * @param number the number of dice to roll for each * @param faces the number of faces on those dice * @return an Integer list of every dice roll, with index 0 containing the summed result */ - public static List individualDice(int num, int faces) { + public static List individualDice(int count, int number, int faces) { List individualRolls = new ArrayList<>(); int result = 0, roll; individualRolls.add(result); - for (int i = 0; i < num; i++) { - roll = Compute.randomInt(faces) + 1; + for (int x = 0; x < count; x++) { + roll = 0; + for (int y = 0; y < number; y++) { + roll += Compute.randomInt(faces) + 1; + } individualRolls.add(roll); result += roll; } diff --git a/MekHQ/src/mekhq/campaign/Campaign.java b/MekHQ/src/mekhq/campaign/Campaign.java index bb52fdc2a3..a4d9f65ffd 100644 --- a/MekHQ/src/mekhq/campaign/Campaign.java +++ b/MekHQ/src/mekhq/campaign/Campaign.java @@ -1225,6 +1225,16 @@ public Person newPerson(int type, int secondary, AbstractFactionSelector faction return newPerson(type, secondary, personnelGenerator, gender); } + /** + * Generate a new {@link Person} of the given type, using the supplied {@link AbstractPersonnelGenerator} + * @param type The primary role of the {@link Person}. + * @param personnelGenerator The {@link AbstractPersonnelGenerator} to use when creating the {@link Person}. + * @return A new {@link Person} configured using {@code personnelGenerator}. + */ + public Person newPerson(final int type, final AbstractPersonnelGenerator personnelGenerator) { + return newPerson(type, Person.T_NONE, personnelGenerator, Gender.RANDOMIZE); + } + /** * Generate a new {@link Person} of the given type, using the supplied {@link AbstractPersonnelGenerator} * @param type The primary role of the {@link Person}. diff --git a/MekHQ/src/mekhq/campaign/CampaignOptions.java b/MekHQ/src/mekhq/campaign/CampaignOptions.java index a7b0eff91b..2651f3b0a5 100644 --- a/MekHQ/src/mekhq/campaign/CampaignOptions.java +++ b/MekHQ/src/mekhq/campaign/CampaignOptions.java @@ -24,12 +24,14 @@ import java.util.ArrayList; import java.util.List; +import megamek.common.annotations.Nullable; import mekhq.Version; import mekhq.campaign.againstTheBot.enums.AtBLanceRole; import mekhq.campaign.parts.enums.PartRepairType; import mekhq.campaign.personnel.enums.FamilialRelationshipDisplayLevel; import mekhq.campaign.personnel.enums.Phenotype; import mekhq.campaign.personnel.enums.PrisonerCaptureStyle; +import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; import mekhq.service.MassRepairOption; import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Node; @@ -396,6 +398,10 @@ public class CampaignOptions implements Serializable { private boolean useLightConditions; private boolean usePlanetaryConditions; //endregion Against the Bot Tab + + //region Company Generation Options + private CompanyGenerationOptions companyGenerationOptions; + //endregion Company Generation Options //endregion Variable Declarations //region Constructors @@ -791,6 +797,10 @@ public CampaignOptions() { useLightConditions = true; usePlanetaryConditions = false; //endregion Against the Bot Tab + + //region Company Generation Options + setCompanyGenerationOptions(null); + //endregion Company Generation Options } //endregion Constructors @@ -3027,6 +3037,16 @@ public int getOpforLocalUnitChance() { return opforLocalUnitChance; } + //region Company Generation Options + public CompanyGenerationOptions getCompanyGenerationOptions() { + return companyGenerationOptions; + } + + public void setCompanyGenerationOptions(@Nullable CompanyGenerationOptions companyGenerationOptions) { + this.companyGenerationOptions = companyGenerationOptions; + } + //endregion Company Generation Options + public void writeToXml(PrintWriter pw1, int indent) { pw1.println(MekHqXmlUtil.indentStr(indent) + ""); //region General Tab @@ -3339,6 +3359,13 @@ public void writeToXml(PrintWriter pw1, int indent) { pw1.println(MekHqXmlUtil.indentStr(indent) + ""); } //endregion AtB Options + + //region Company Generation Options + if ((getCompanyGenerationOptions() != null) + && (MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions())) { + getCompanyGenerationOptions().writeToXML(pw1, indent); + } + //endregion Company Generation Options MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw1, --indent, "campaignOptions"); } @@ -3928,6 +3955,8 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve retVal.massRepairReplacePod = Boolean.parseBoolean(wn2.getTextContent().trim()); } else if (wn2.getNodeName().equalsIgnoreCase("massRepairOptions")) { retVal.setMassRepairOptions(MassRepairOption.parseListFromXML(wn2, version)); + } else if (wn2.getNodeName().equals("companyGenerationOptions")) { + retVal.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn2)); } } @@ -3943,7 +3972,7 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve * @param retVal the return CampaignOptions * @param values the values to migrate */ - private static void migrateMarriageSurnameWeights(CampaignOptions retVal, String[] values) { + private static void migrateMarriageSurnameWeights(CampaignOptions retVal, String... values) { int[] weights = new int[values.length]; for (int i = 0; i < weights.length; i++) { diff --git a/MekHQ/src/mekhq/campaign/unit/Unit.java b/MekHQ/src/mekhq/campaign/unit/Unit.java index ba3b477317..5ff186d820 100644 --- a/MekHQ/src/mekhq/campaign/unit/Unit.java +++ b/MekHQ/src/mekhq/campaign/unit/Unit.java @@ -3367,6 +3367,10 @@ public Image getImage(Component component) { return commander; } + public boolean hasCommander() { + return getCommander() != null; + } + public void resetPilotAndEntity() { entity.getCrew().resetGameState(); if (entity.getCrew().getSlotCount() > 1) { diff --git a/MekHQ/src/mekhq/campaign/universe/DefaultFactionSelector.java b/MekHQ/src/mekhq/campaign/universe/DefaultFactionSelector.java index b2274a9c49..5984e93b69 100644 --- a/MekHQ/src/mekhq/campaign/universe/DefaultFactionSelector.java +++ b/MekHQ/src/mekhq/campaign/universe/DefaultFactionSelector.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 MegaMek team + * Copyright (C) 2019-2021 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -10,44 +10,63 @@ * * MekHQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . + * along with MekHQ. If not, see . */ package mekhq.campaign.universe; +import megamek.common.annotations.Nullable; import mekhq.campaign.Campaign; /** * Selects a {@link Faction} object. */ public class DefaultFactionSelector extends AbstractFactionSelector { - private String factionCode; + //region Variable Declarations + private Faction faction; + //endregion Variable Declarations + //region Constructors /** * Creates a new DefaultFactionSelector class which uses * {@link Campaign#getFaction()} to select the faction. */ public DefaultFactionSelector() { + } /** - * Creates a new DefaultFactionSelector using the specified - * faction. + * Creates a new DefaultFactionSelector using the specified faction code. * @param factionCode The short name of the {@link Faction}. */ public DefaultFactionSelector(String factionCode) { - this.factionCode = factionCode; + setFaction((factionCode == null) ? null : Factions.getInstance().getFaction(factionCode)); + } + + /** + * Creates a new DefaultFactionSelector using the specified faction + * @param faction The {@link Faction}. + */ + public DefaultFactionSelector(Faction faction) { + setFaction(faction); + } + //endregion Constructors + + //region Getters/Setters + public @Nullable Faction getFaction() { + return faction; + } + + public void setFaction(@Nullable Faction faction) { + this.faction = faction; } + //endregion Getters/Setters @Override public Faction selectFaction(Campaign campaign) { - if (factionCode != null) { - return Factions.getInstance().getFaction(factionCode); - } else { - return campaign.getFaction(); - } + return (getFaction() != null) ? getFaction() : campaign.getFaction(); } } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java index 2a280a88c5..102c2c4f16 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java @@ -19,6 +19,7 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.campaign.Campaign; import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; import mekhq.campaign.universe.generators.companyGeneration.AtBCompanyGenerator; import mekhq.campaign.universe.generators.companyGeneration.WindchildCompanyGenerator; @@ -61,13 +62,13 @@ public boolean isWindchild() { } //endregion Boolean Comparisons - public AbstractCompanyGenerator getGenerator() { + public AbstractCompanyGenerator getGenerator(final Campaign campaign) { switch (this) { case WINDCHILD: - return new WindchildCompanyGenerator(); + return new WindchildCompanyGenerator(campaign); case AGAINST_THE_BOT: default: - return new AtBCompanyGenerator(); + return new AtBCompanyGenerator(campaign); } } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java index 9a24663bc5..8653799b5e 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java @@ -18,18 +18,35 @@ */ package mekhq.campaign.universe.generators.companyGeneration; +import megamek.common.Entity; import megamek.common.EntityWeightClass; +import megamek.common.MechFileParser; +import megamek.common.MechSummary; +import megamek.common.UnitType; +import megamek.common.annotations.Nullable; import megamek.common.util.EncodeControl; import mekhq.MHQStaticDirectoryManager; +import mekhq.MekHQ; import mekhq.Utilities; import mekhq.campaign.Campaign; import mekhq.campaign.finances.Money; +import mekhq.campaign.finances.Transaction; import mekhq.campaign.force.Force; +import mekhq.campaign.mission.Contract; +import mekhq.campaign.parts.AmmoStorage; +import mekhq.campaign.parts.Part; import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.Skill; import mekhq.campaign.personnel.SkillType; +import mekhq.campaign.personnel.generator.AbstractPersonnelGenerator; import mekhq.campaign.personnel.ranks.Ranks; import mekhq.campaign.unit.Unit; +import mekhq.campaign.universe.AbstractFactionSelector; +import mekhq.campaign.universe.AbstractPlanetSelector; +import mekhq.campaign.universe.DefaultFactionSelector; +import mekhq.campaign.universe.DefaultPlanetSelector; +import mekhq.campaign.universe.RangedFactionSelector; +import mekhq.campaign.universe.RangedPlanetSelector; import mekhq.campaign.universe.enums.Alphabet; import mekhq.campaign.universe.enums.CompanyGenerationType; import mekhq.gui.enums.LayeredForceIcon; @@ -42,9 +59,58 @@ import java.util.ResourceBundle; import java.util.UUID; import java.util.Vector; +import java.util.function.Predicate; import java.util.stream.Collectors; -public class AbstractCompanyGenerator { +/** + * Ideas: + * Finances: Randomize is a base 8d6 million C-Bill option, creates a nice curve averaging around 28m c-bills, + * which is a company plus likely a slight float. Recommended 10d6 for 3067 in the notes + * + * First panel is the options panel + * Second panel is the generated personnel panel, where you can customize and reroll personnel + * Third panel is the generated units panel, where you can customize applicable units + * Fourth panel is the parts list, which is customizable + * Fifth panel is a view generated pairings, and allows the reorder of the preset lances + * + * Second to Last panel of the dialog should be the contract market when coming from quickstart, to select starting contract + * Final panel is the starting finances overview + * + * Button that lets you pop out the options panel with everything disabled + * + * TODO : + * Mercenaries may customize their mechs, with clantech if enabled only post-3055 + * Unit weight sorting needs more options and variants... like an isolate SL units, keep SL units to highest ranked officers, that kind of thing + * Finish the personnel randomization overrides + * Cleanup the dialog, have it disable and enable based on variable values + * Implement: + * assignBestRollToUnitCommander + * startingPlanet + * centerPlanet + * assignTechsToUnits + * generateMothballedSpareUnits + * sparesPercentOfActiveUnits + * generateSpareParts // 1 for every 3 (round normally) parts in inventory? + * startingArmourWeight + * generateSpareAmmunition + * numberReloadsPerWeapon + * generateFractionalMachineGunAmmunition // 50 rounds per machine gun in force? + * selectStartingContract + * startCourseToContractPlanet + * + * FIXME : + * Backgrounds don't work + * Weighted Type for force icons don't work + * Dialog x doesn't work + * Dialog Buttons look odd and need fixing + * Dialog Modify the buttons, and have them appear or disappear based on the current panel + * Panel has odd whitespace usage + * + * Class Notes: + * {{@link AbstractCompanyGenerator#applyToCampaign}} takes the campaign and applies all changes to + * it. No method not directly called from there may alter the campaign. + */ +public abstract class AbstractCompanyGenerator { //region Variable Declarations private CompanyGenerationType type; private CompanyGenerationOptions options; @@ -53,8 +119,8 @@ public class AbstractCompanyGenerator { //endregion Variable Declarations //region Constructors - protected AbstractCompanyGenerator(final CompanyGenerationType type) { - this(type, new CompanyGenerationOptions(type)); + protected AbstractCompanyGenerator(final CompanyGenerationType type, final Campaign campaign) { + this(type, new CompanyGenerationOptions(type, campaign)); } protected AbstractCompanyGenerator(final CompanyGenerationType type, final CompanyGenerationOptions options) { @@ -82,18 +148,28 @@ public void setOptions(final CompanyGenerationOptions options) { //endregion Getters/Setters //region Determination Methods + /** + * @return the number of lances to generate + */ private int determineNumberLances() { return (getOptions().getCompanyCount() * getOptions().getLancesPerCompany()) + getOptions().getIndividualLanceCount() + (getOptions().isGenerateMercenaryCompanyCommandLance() ? 1 : 0); } - private int determineNumberCompanyCommanders() { - return getOptions().isGenerateCompanyCommanders() - ? getOptions().getCompanyCount() - (getOptions().isGenerateMercenaryCompanyCommandLance() ? 0 : 1) + /** + * @return the number of Captains + */ + private int determineNumberCaptains() { + return getOptions().isGenerateCaptains() + ? Math.max((getOptions().getCompanyCount() + - (getOptions().isGenerateMercenaryCompanyCommandLance() ? 0 : 1)), 0) : 0; } + /** + * @return the index of the first non-officer + */ private int determineFirstNonOfficer() { return determineNumberLances() + (getOptions().isCompanyCommanderLanceOfficer() ? 0 : 1); } @@ -101,18 +177,25 @@ private int determineFirstNonOfficer() { //region Personnel //region Combat Personnel - private List generateCombatPersonnel(final Campaign campaign) { + /** + * @param campaign the campaign to use to generate the combat personnel + * @return the list of generated combat personnel + */ + public List generateCombatPersonnel(final Campaign campaign) { List combatPersonnel = new ArrayList<>(); final int numMechWarriors = determineNumberLances() * getOptions().getLanceSize(); + final AbstractPersonnelGenerator personnelGenerator = createPersonnelGenerator(campaign); + for (int i = 0; i < numMechWarriors; i++) { - combatPersonnel.add(campaign.newPerson(Person.T_MECHWARRIOR)); + combatPersonnel.add(campaign.newPerson(Person.T_MECHWARRIOR, personnelGenerator)); } if (getOptions().isAssignBestOfficers()) { combatPersonnel = combatPersonnel.stream() - .sorted(Comparator.comparingInt(o -> o.getExperienceLevel(false))) - .sorted(Comparator.comparingInt(o -> o.getSkillLevel(SkillType.S_LEADER) - + o.getSkillLevel(SkillType.S_STRATEGY) + o.getSkillLevel(SkillType.S_TACTICS))) + .sorted(Comparator.comparingInt((Person p) -> p.getExperienceLevel(false)) + .reversed() + .thenComparingInt(p -> p.getSkillLevel(SkillType.S_LEADER) + + p.getSkillLevel(SkillType.S_STRATEGY) + p.getSkillLevel(SkillType.S_TACTICS))) .collect(Collectors.toList()); } @@ -127,7 +210,7 @@ private List generateCombatPersonnel(final Campaign campaign) { /** * Turns a person into the commanding officer of the force being generated - * 1) Assigns the Commander flag + * 1) Assigns the Commander flag (if that option is true) * 2) Improves Gunnery and Piloting by one level * 3) Gets two random officer skill increases * 4) Gets the highest rank possible assigned to them @@ -135,44 +218,42 @@ private List generateCombatPersonnel(final Campaign campaign) { * @param commandingOfficer the commanding officer * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ - protected void generateCommandingOfficer(final Person commandingOfficer, final int numMechWarriors) { - commandingOfficer.setCommander(true); + private void generateCommandingOfficer(final Person commandingOfficer, final int numMechWarriors) { + commandingOfficer.setCommander(getOptions().isAssignCompanyCommanderFlag()); commandingOfficer.improveSkill(SkillType.S_GUN_MECH); commandingOfficer.improveSkill(SkillType.S_PILOT_MECH); assignRandomOfficerSkillIncrease(commandingOfficer, 2); if (getOptions().isAutomaticallyAssignRanks()) { - if (numMechWarriors >= 36) { - commandingOfficer.setRankLevel(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); - } else if (numMechWarriors >= 12) { - commandingOfficer.setRankLevel(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 5)); - } else if (numMechWarriors >= 4) { - commandingOfficer.setRankLevel(Ranks.RWO_MAX + 4); - } else { - commandingOfficer.setRankLevel(Ranks.RWO_MAX + 3); - } + generateCommandingOfficerRank(commandingOfficer, numMechWarriors); } } + /** + * @param commandingOfficer the commanding officer + * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank + */ + protected abstract void generateCommandingOfficerRank(final Person commandingOfficer, final int numMechWarriors); + /** * This generates officers based on the provided options. * * Custom addition for larger generation: * For every company (with a mercenary company command lance) or for every company * after the first (as the mercenary company commander is the leader of that company) you - * generate a O4 - Captain, provided that company commander generation is enabled. These get + * generate a O4 - Captain, provided that captain generation is enabled. These get * two officer skill boosts instead of 1, and the rank of O4 - Captain instead of O3 - Lieutenant. * * An Officer gets: * 1) An increase of one to either the highest or lowest skill of gunnery or piloting, depending * on the set options - * 2) Two random officer skill increases if they are a company commander, otherwise they get one - * 3) A rank of O4 - Captain for Company Commanders, otherwise O3 - Lieutenant + * 2) Two random officer skill increases if they are a Captain, otherwise they get one + * 3) A rank of O4 - Captain for Captains, otherwise O3 - Lieutenant * * @param personnel the list of all generated personnel */ private void generateOfficers(final List personnel) { - int companyCommanders = determineNumberCompanyCommanders(); + int captains = determineNumberCaptains(); // Starting at 1, as 0 is the mercenary company commander for (int i = 1; i < determineFirstNonOfficer(); i++) { final Person officer = personnel.get(i); @@ -194,24 +275,24 @@ && getOptions().isApplyOfficerStatBonusToWorstSkill() ? piloting : gunnery) .getType().getName()); } - if (companyCommanders > 0) { + if (captains > 0) { // Assign Random Officer Skill Increase assignRandomOfficerSkillIncrease(officer, 2); if (getOptions().isAutomaticallyAssignRanks()) { // Assign Rank of O4 - Captain - officer.setRankLevel(Ranks.RWO_MAX + 4); + officer.setRankNumeric(Ranks.RWO_MAX + 4); } - // Decrement the number of company commanders - companyCommanders--; + // Decrement the number of captains left to generate + captains--; } else { // Assign Random Officer Skill Increase assignRandomOfficerSkillIncrease(officer, 1); if (getOptions().isAutomaticallyAssignRanks()) { // Assign Rank of O3 - Lieutenant - officer.setRankLevel(Ranks.RWO_MAX + 3); + officer.setRankNumeric(Ranks.RWO_MAX + 3); } } } @@ -225,7 +306,7 @@ && getOptions().isApplyOfficerStatBonusToWorstSkill() ? piloting : gunnery) * @param person the person to assign the skill increases to * @param boosts the number of boosts to apply */ - protected void assignRandomOfficerSkillIncrease(final Person person, final int boosts) { + private void assignRandomOfficerSkillIncrease(final Person person, final int boosts) { for (int i = 0; i < boosts; i++) { switch (Utilities.dice(1, 3)) { case 0: @@ -260,7 +341,7 @@ private void generateStandardMechWarriors(final List personnel) { || getOptions().getFaction().isClan(); for (int i = determineFirstNonOfficer(); i < personnel.size(); i++) { if (getOptions().isAutomaticallyAssignRanks()) { - personnel.get(i).setRankLevel(isClanComStarOrWoB ? 4 : 12); + personnel.get(i).setRankNumeric(isClanComStarOrWoB ? 4 : 12); } } } @@ -271,11 +352,13 @@ private void generateStandardMechWarriors(final List personnel) { * @param campaign the campaign to generate from * @return a list of all support personnel */ - private List generateSupportPersonnel(final Campaign campaign) { - List supportPersonnel = new ArrayList<>(); - for (Map.Entry entry : getOptions().getSupportPersonnel().entrySet()) { + public List generateSupportPersonnel(final Campaign campaign) { + final List supportPersonnel = new ArrayList<>(); + final AbstractPersonnelGenerator personnelGenerator = createPersonnelGenerator(campaign); + + for (final Map.Entry entry : getOptions().getSupportPersonnel().entrySet()) { for (int i = 0; i < entry.getValue(); i++) { - final Person person = campaign.newPerson(entry.getKey()); + final Person person = campaign.newPerson(entry.getKey(), personnelGenerator); // All support personnel get assigned is their rank if (getOptions().isAutomaticallyAssignRanks()) { switch (campaign.getRanks().getRankSystem()) { @@ -285,10 +368,10 @@ private List generateSupportPersonnel(final Campaign campaign) { case Ranks.RS_COM: case Ranks.RS_WOB: case Ranks.RS_MOC: - person.setRankLevel(4); + person.setRankNumeric(4); break; default: - person.setRankLevel(8); + person.setRankNumeric(8); break; } } @@ -297,19 +380,285 @@ private List generateSupportPersonnel(final Campaign campaign) { } return supportPersonnel; } + + /** + * @param campaign the campaign to use in creating the assistants + * @param personnel the list of personnel to add the newly created assistants to + */ + private void generateAssistants(final Campaign campaign, final List personnel) { + // If you don't want to use pooled assistants, then this generates them as personnel instead + if (!getOptions().isPoolAssistants()) { + final AbstractPersonnelGenerator personnelGenerator = createPersonnelGenerator(campaign); + for (int i = 0; i < campaign.getAstechNeed(); i++) { + personnel.add(campaign.newPerson(Person.T_ASTECH, personnelGenerator)); + } + for (int i = 0; i < campaign.getMedicsNeed(); i++) { + personnel.add(campaign.newPerson(Person.T_MEDIC, personnelGenerator)); + } + } + } //endregion Support Personnel + + /** + * @param campaign the Campaign to generate using + * @return the Personnel Generator to use in generation + */ + private AbstractPersonnelGenerator createPersonnelGenerator(final Campaign campaign) { + final AbstractFactionSelector factionSelector; + final AbstractPlanetSelector planetSelector; + + if (getOptions().isRandomizeOrigin()) { + factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); + ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); + + planetSelector = new RangedPlanetSelector(getOptions().getOriginSearchRadius(), + getOptions().isExtraRandomOrigin()); + ((RangedPlanetSelector) planetSelector).setDistanceScale(getOptions().getOriginDistanceScale()); + } else { + factionSelector = new DefaultFactionSelector(getOptions().getFaction()); + planetSelector = new DefaultPlanetSelector(); + } + return campaign.getPersonnelGenerator(factionSelector, planetSelector); + } //endregion Personnel //region Units + /** + * @param campaign the campaign to generate for + * @param combatPersonnel the list of all combat personnel + * @return the list of all generated entities, with null holding spaces without 'Mechs + */ + public List generateUnits(final Campaign campaign, List combatPersonnel) { + final int firstNonOfficer = determineFirstNonOfficer(); + final List parameters = createUnitGenerationParameters(combatPersonnel, firstNonOfficer); + + // This parses through all combat personnel and checks if the roll is SL. + // If it is, reroll the weight with a max value of 12 + for (int i = 0; i < combatPersonnel.size(); i++) { + if (parameters.get(i).isStarLeague()) { + parameters.get(i).setWeight(determineBattleMechWeight(Math.max(Utilities.dice(2, 6) + + ((i == 0) ? 2 : ((i < firstNonOfficer) ? 1 : 0)), 12))); + } + } + + // TODO : Add a sort SL units first option + if (getOptions().isGroupByWeight()) { + if (getOptions().isKeepOfficerRollsSeparate()) { + parameters.subList(0, firstNonOfficer) + .sort(Comparator.comparingInt(RandomMechParameters::getWeight).reversed()); + parameters.subList(firstNonOfficer, parameters.size()) + .sort(Comparator.comparingInt(RandomMechParameters::getWeight).reversed()); + } else { + parameters.sort(Comparator.comparingInt(RandomMechParameters::getWeight).reversed()); + combatPersonnel = sortPersonnelIntoLances(combatPersonnel); + } + } + + if (getOptions().isAssignBestRollToUnitCommander()) { + // TODO : Implement + } + + return generateEntities(campaign, parameters, combatPersonnel); + } + + /** + * @param combatPersonnel the list of all combat personnel + * @param firstNonOfficer the index of the first non-officer + * @return a list of RandomMechParameters + */ + protected List createUnitGenerationParameters( + final List combatPersonnel, final int firstNonOfficer) { + List parameters = new ArrayList<>(); + for (int i = 0; i < combatPersonnel.size(); i++) { + final int modifier = (i == 0) ? 2 : ((i < firstNonOfficer) ? 1 : 0); + parameters.add(new RandomMechParameters( + determineBattleMechWeight(Utilities.dice(2, 6) + modifier), + determineBattleMechQuality(Utilities.dice(2, 6) + modifier) + )); + } + return parameters; + } + + /** + * @param roll the modified roll to use + * @return the generated EntityWeightClass magic int + * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, + * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables + */ + protected abstract int determineBattleMechWeight(int roll); + + /** + * @param roll the modified roll to use + * @return the generated IUnitRating magic int for Dragoon Quality + */ + protected abstract int determineBattleMechQuality(int roll); + + /** + * @param campaign the campaign to generate for + * @param parameters the list of all parameters to use in generation + * @param combatPersonnel the list of all combat personnel + * @return the list of all generated entities, with null holding spaces without 'Mechs + */ + private List generateEntities(final Campaign campaign, + final List parameters, + final List combatPersonnel) { + List entities = new ArrayList<>(); + for (int i = 0; i < parameters.size(); i++) { + entities.add(generateEntity(campaign, parameters.get(i), combatPersonnel.get(i))); + } + return entities; + } + + /** + * This generates a single entity, thus allowing for individual rerolls + * @param campaign the campaign to generate for + * @param parameters the parameters to use in generation + * @param pilot the pilot to generate the Entity for + * @return the entity generated, or null otherwise + */ + public @Nullable Entity generateEntity(final Campaign campaign, + final RandomMechParameters parameters, + final Person pilot) { + // Ultra-Light means no mech generated + if (parameters.getWeight() == EntityWeightClass.WEIGHT_ULTRA_LIGHT) { + return null; + } + + final MechSummary mechSummary = generateMechSummary(campaign, parameters, pilot); + + try { + return new MechFileParser(mechSummary.getSourceFile(), mechSummary.getEntryName()).getEntity(); + } catch (Exception e) { + MekHQ.getLogger().error("Failed to generate entity", e); + } + + return null; + } + + /** + * @param campaign the campaign to generate for + * @param parameters the parameters to use in generation + * @param person the person to generate the mech for + * @return the MechSummary generated from the provided parameters + */ + protected abstract MechSummary generateMechSummary(final Campaign campaign, + final RandomMechParameters parameters, + final Person person); + + /** + * @param campaign the campaign to generate for + * @param parameters the parameters to use in generation + * @param faction the faction code to use in generation + * @param year the year to use in generation + * @return the MechSummary generated from the provided parameters + */ + protected MechSummary generateMechSummary(final Campaign campaign, + final RandomMechParameters parameters, + final String faction, int year) { + Predicate filter = ms -> + (!campaign.getCampaignOptions().limitByYear() || (year > ms.getYear())) + && (!ms.isClan() || campaign.getCampaignOptions().allowClanPurchases()) + && (ms.isClan() || campaign.getCampaignOptions().allowISPurchases()); + return campaign.getUnitGenerator().generate(faction, UnitType.MEK, + parameters.getWeight(), year, parameters.getQuality(), filter); + } + + /** + * @param campaign the campaign to add the units to + * @param combatPersonnel the list of combat personnel to assign to units + * @param entities the list of generated entities, with null holding spaces without 'Mechs + * @return the list of created units + */ + private List createUnits(final Campaign campaign, final List combatPersonnel, + final List entities) { + List units = new ArrayList<>(); + for (int i = 0; i < entities.size(); i++) { + if (entities.get(i) != null) { + final Unit unit = campaign.addNewUnit(entities.get(i), false, 0); + if (i < combatPersonnel.size()) { + unit.addPilotOrSoldier(combatPersonnel.get(i)); + if (getOptions().isGenerateUnitsAsAttached()) { + combatPersonnel.get(i).setOriginalUnit(unit); + } + } + units.add(unit); + } + } + return units; + } + + /** + * @param supportPersonnel the list of support personnel including the techs to assign to units + * @param units the list of units to have techs assigned to + */ + private void assignTechsToUnits(final List supportPersonnel, final List units) { + if (getOptions().isAssignTechsToUnits()) { + // TODO : Implement me + } + } //endregion Units //region Unit + /** + * @param personnel the combat personnel to sort into their lances + * @return a new List containing the sorted personnel + */ private List sortPersonnelIntoLances(final List personnel) { final Person commander = personnel.get(0); List officers = new ArrayList<>(personnel.subList(1, determineFirstNonOfficer())); - List standardMechWarriors = new ArrayList<>(personnel.subList(determineFirstNonOfficer(), personnel.size())); + final List standardMechWarriors = new ArrayList<>(personnel.subList(determineFirstNonOfficer(), personnel.size())); + final List sortedPersonnel = new ArrayList<>(); + + // Sort Command Lance + sortedPersonnel.add(commander); + if (!getOptions().isCompanyCommanderLanceOfficer()) { + // This removes the first non-Captain officer, as Captains each get their own companies + sortedPersonnel.add(officers.remove(determineNumberCaptains())); + } + for (int i = sortedPersonnel.size() - 1; i < getOptions().getLanceSize(); i++) { + sortedPersonnel.add(standardMechWarriors.remove(0)); + } - return new ArrayList<>(personnel); + // If the command lance is part of a company, we sort the rest of that company immediately + if (!getOptions().isGenerateMercenaryCompanyCommandLance() && (getOptions().getCompanyCount() > 0)) { + for (int i = 1; i < getOptions().getLancesPerCompany(); i++) { + // This removes the first non-Captain officer, as Captains each get their own companies + sortedPersonnel.add(officers.remove(determineNumberCaptains())); + for (int y = 1; (y < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); y++) { + sortedPersonnel.add(standardMechWarriors.remove(0)); + } + } + } + + // Sort into Companies + int numberCaptains = determineNumberCaptains(); + for (int i = 0; i < determineNumberCaptains(); i++) { + // Assign the Captain's Lance + sortedPersonnel.add(officers.remove(0)); + numberCaptains--; + for (int y = 1; (y < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); y++) { + sortedPersonnel.add(standardMechWarriors.remove(0)); + } + // Then assign the other lances + for (int y = 1; y < getOptions().getLancesPerCompany(); y++) { + // This removes the first non-Captain officer, as Captains each get their own companies + sortedPersonnel.add(officers.remove(numberCaptains)); + for (int z = 1; (z < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); z++) { + sortedPersonnel.add(standardMechWarriors.remove(0)); + } + } + } + + // Sort any individual lances + final int originalOfficersSize = officers.size(); + for (int i = 0; i < originalOfficersSize; i++) { + sortedPersonnel.add(officers.remove(0)); + for (int y = 1; (y < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); y++) { + sortedPersonnel.add(standardMechWarriors.remove(0)); + } + } + + return sortedPersonnel; } /** @@ -324,15 +673,19 @@ private void generateUnit(final Campaign campaign, final List personnel) String background = ""; if (getOptions().isGenerateForceIcons() && (MHQStaticDirectoryManager.getForceIcons() != null)) { + // FIXME: We need a new way to handle this form of search... just default to CSR for now + background = "CSR.png"; + /* if (MHQStaticDirectoryManager.getForceIcons().getItems().keySet().stream() .anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getFullName(campaign.getGameYear())))) { background = getOptions().getFaction().getFullName(campaign.getGameYear()); } - if (background.isEmpty() && (MHQStaticDirectoryManager.getForceIcons().getItems().keySet() + if (background.isBlank() && (MHQStaticDirectoryManager.getForceIcons().getItems().keySet() .stream().anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getShortName())))) { background = getOptions().getFaction().getShortName(); } + */ } // Create the Origin Force Icon, if we are generating force icons and the origin icon has @@ -348,8 +701,10 @@ private void generateUnit(final Campaign campaign, final List personnel) iconMap.get(LayeredForceIcon.TYPE.getLayerPath()).add("BattleMech.png"); // Background - iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); + if (!background.isBlank()) { + iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); + } // Frame iconMap.put(LayeredForceIcon.FRAME.getLayerPath(), new Vector<>()); @@ -382,10 +737,18 @@ private void generateUnit(final Campaign campaign, final List personnel) // Create Individual Lances for (int i = 0 ; i < getOptions().getIndividualLanceCount(); i++) { - createLance(campaign, originForce, personnel, alphabet[i], background); + createLance(campaign, originForce, personnel, alphabet[i + getOptions().getCompanyCount()], background); } } + /** + * This creates a lance with a standard name + * @param campaign the campaign to generate the unit within + * @param head the force to append the new lance to + * @param personnel the list of personnel, properly ordered to be assigned to the lance + * @param alphabet the alphabet value to determine the lance name from + * @param background the background filename + */ private void createLance(final Campaign campaign, final Force head, final List personnel, final Alphabet alphabet, final String background) { createLance(campaign, head, personnel, @@ -394,7 +757,15 @@ private void createLance(final Campaign campaign, final Force head, final List

personnel, + /** + * @param campaign the campaign to generate the unit within + * @param head the force to append the new lance to + * @param personnel the list of personnel, properly ordered to be assigned to the lance + * @param name the lance's name + * @param background the background filename + * @return the newly created lance + */ + private Force createLance(final Campaign campaign, final Force head, final List personnel, final String name, final String background) { Force lance = new Force(name); campaign.addForce(lance, head); @@ -408,6 +779,13 @@ private Force createLance(final Campaign campaign, final Force head,final List

> iconMap = new LinkedHashMap<>(); // Type + // FIXME : I'm not working properly to determine the filename final int weightClass = determineLanceWeightClass(campaign, force, isLance); - final String weightClassName = (weightClass == EntityWeightClass.WEIGHT_SUPER_HEAVY) - ? "Superheavy" : EntityWeightClass.getClassName(weightClass); + final String weightClassName = EntityWeightClass.getClassName(weightClass); String filename = String.format("BattleMech %s.png", weightClassName); + MekHQ.getLogger().warning(filename); if (!MHQStaticDirectoryManager.getForceIcons().getItems().containsKey(filename)) { filename = "BattleMech.png"; } @@ -432,7 +811,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, iconMap.get(LayeredForceIcon.FORMATION.getLayerPath()).add(isLance ? "04 Lance.png" : "06 Company.png"); // Background - if (!background.isEmpty()) { + if (!background.isBlank()) { iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); } @@ -440,6 +819,8 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, // Frame iconMap.put(LayeredForceIcon.FRAME.getLayerPath(), new Vector<>()); iconMap.get(LayeredForceIcon.FRAME.getLayerPath()).add("Frame.png"); + + force.setIconMap(iconMap); } /** @@ -452,7 +833,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, private int determineLanceWeightClass(final Campaign campaign, final Force force, final boolean isLance) { double weight = 0.0; - for (UUID unitId : force.getAllUnits(true)) { + for (final UUID unitId : force.getAllUnits(true)) { final Unit unit = campaign.getUnit(unitId); if ((unit != null) && (unit.getEntity() != null)) { weight += unit.getEntity().getWeight(); @@ -476,72 +857,233 @@ private int determineLanceWeightClass(final Campaign campaign, final Force force } //endregion Unit + //region Spares + public List generateSpareParts() { + // TODO : Implement me + return new ArrayList<>(); + } + + public List generateAmmunition() { + // TODO : Implement me + return new ArrayList<>(); + } + //endregion Spares + + //region Contract + private void processContract(final Campaign campaign, final @Nullable Contract contract) { + if (getOptions().isStartCourseToContractPlanet()) { + // TODO : implement me + } + } + //endregion Contract + //region Finances - private void processFinances(final Campaign campaign, final List personnel) { + private void processFinances(final Campaign campaign, final List personnel, + final List units, final List parts, + final List ammunition, + final @Nullable Contract contract) { + Money startingCash = getOptions().isRandomizeStartingCash() ? rollRandomStartingCash() + : Money.of(getOptions().getStartingCash()); + final Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); if (getOptions().isPayForSetup()) { - Money unitCosts = calculateUnitCosts(); - Money hiringCosts = calculateHiringCosts(personnel); - Money partCosts = calculatePartCosts(); - Money ammunitionCosts = calculateAmmunitionCosts(); + final Money hiringCosts = calculateHiringCosts(personnel); + final Money unitCosts = calculateUnitCosts(units); + final Money partCosts = calculatePartCosts(parts); + final Money ammunitionCosts = calculateAmmunitionCosts(ammunition); + // TODO : Finish implementation + } else { + campaign.addReport(""); + startingCash = startingCash.isGreaterOrEqualThan(minimumStartingFloat) ? startingCash + : minimumStartingFloat; + if (!startingCash.isZero()) { + campaign.getFinances().credit(startingCash, Transaction.C_START, + resources.getString(""), campaign.getLocalDate()); + } } } - private Money calculateUnitCosts() { - if (!getOptions().isPayForUnits()) { - return Money.zero(); - } - return Money.zero(); + /** + * @return the option dice count d6 million c-bills, or zero if randomize starting cash is disabled + */ + private Money rollRandomStartingCash() { + return getOptions().isRandomizeStartingCash() + ? Money.of(10^6).multipliedBy(Utilities.dice(getOptions().getRandomStartingCashDiceCount(), 6)) + : Money.zero(); } - private Money calculateHiringCosts(List personnel) { + /** + * @param personnel the list of personnel to get the hiring cost for + * @return the cost of hiring the personnel, or zero if you aren't paying for hiring costs + */ + private Money calculateHiringCosts(final List personnel) { if (!getOptions().isPayForPersonnel()) { return Money.zero(); } Money hiringCosts = Money.zero(); - for (Person person : personnel) { + for (final Person person : personnel) { hiringCosts = hiringCosts.plus(person.getSalary().multipliedBy(2)); } return hiringCosts; } - private Money calculatePartCosts() { + /** + * @param units the list of units to get the cost for + * @return the cost of the units, or zero if you aren't paying for units + */ + private Money calculateUnitCosts(final List units) { + if (!getOptions().isPayForUnits()) { + return Money.zero(); + } + + Money unitCosts = Money.zero(); + + for (final Unit unit : units) { + if (unit.hasCommander() && getOptions().isGenerateUnitsAsAttached()) { + unitCosts = unitCosts.plus(unit.getBuyCost().dividedBy(2)); + } else { + unitCosts = unitCosts.plus(unit.getBuyCost()); + } + } + + return unitCosts; + } + + /** + * @param parts the list of parts to get the cost for + * @return the cost of the parts, or zero if you aren't paying for parts + */ + private Money calculatePartCosts(final List parts) { if (!getOptions().isPayForParts()) { return Money.zero(); } - return Money.zero(); + Money partCosts = Money.zero(); + for (final Part part : parts) { + partCosts = partCosts.plus(part.getStickerPrice()); + } + return partCosts; } - private Money calculateAmmunitionCosts() { + /** + * @param ammunition the list of ammunition to get the cost for + * @return the cost of the ammunition, or zero if you aren't paying for ammunition + */ + private Money calculateAmmunitionCosts(final List ammunition) { if (!getOptions().isPayForAmmunition()) { return Money.zero(); } - return Money.zero(); - } + Money ammunitionCosts = Money.zero(); + for (final AmmoStorage ammoStorage : ammunition) { + ammunitionCosts = ammunitionCosts.plus(ammoStorage.getStickerPrice()); + } + return ammunitionCosts; + } //endregion Finances + /** + * This method takes the campaign and applies all changes to it. No method not directly + * called from here may alter the campaign. + * + * @param campaign the campaign to apply the generation to + * @param combatPersonnel the list of generated combat personnel + * @param supportPersonnel the list of generated support personnel + * @param entities the list of generated entities, with null holding spaces without 'Mechs + * @param parts the list of generated parts + * @param ammunition the list of generated ammunition + * @param contract the selected contract, or null if one has not been selected + */ public void applyToCampaign(final Campaign campaign, final List combatPersonnel, - final List supportPersonnel) { - generateUnit(campaign, sortPersonnelIntoLances(combatPersonnel)); - + final List supportPersonnel, final List entities, + final List parts, final List ammunition, + final @Nullable Contract contract) { + // Process Personnel List personnel = new ArrayList<>(supportPersonnel); personnel.addAll(combatPersonnel); + // If we aren't using the pool, generate all of the Astechs and Medics required + generateAssistants(campaign, personnel); + + // Recruit all of the personnel, GM-style so that the initial hiring cost is calculated as + // part of the financial model + personnel.forEach(p -> campaign.recruitPerson(p, true)); + + // We can only fill the pool after recruiting our support personnel if (getOptions().isPoolAssistants()) { campaign.fillAstechPool(); campaign.fillMedicPool(); - } else { - for (int i = 0; i < campaign.getAstechNeed(); i++) { - personnel.add(campaign.newPerson(Person.T_ASTECH)); - } - for (int i = 0; i < campaign.getMedicsNeed(); i++) { - personnel.add(campaign.newPerson(Person.T_MEDIC)); - } } - processFinances(campaign, personnel); + // Process Units + final List units = createUnits(campaign, combatPersonnel, entities); + + // Assign Techs to Units + assignTechsToUnits(supportPersonnel, units); + + // Generate the Forces and Assign Units to them + generateUnit(campaign, sortPersonnelIntoLances(combatPersonnel)); + + // Process Contract + processContract(campaign, contract); + + // Process Finances + processFinances(campaign, personnel, units, parts, ammunition, contract); + + // Process Parts - After finances because we want to merge parts together + parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); + + // Process Ammunition - After finances because we want to merge the ammunition together when + // possible + ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); + } + + //region Local Classes + /** + * This class contains the parameters used to generate a random mech, and allows sorting and + * swapping the order of rolled parameters while keeping them connected. + */ + protected static class RandomMechParameters { + //region Variable Declarations + private int weight; + private int quality; + private boolean starLeague; + //endregion Variable Declarations + + //region Constructors + public RandomMechParameters(final int weight, final int quality) { + setWeight(weight); + setQuality(quality); + setStarLeague(weight == EntityWeightClass.WEIGHT_SUPER_HEAVY); + } + //endregion Constructors + + //region Getters/Setters + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } + + public int getQuality() { + return quality; + } + + public void setQuality(int quality) { + this.quality = quality; + } + + public boolean isStarLeague() { + return starLeague; + } + + public void setStarLeague(boolean starLeague) { + this.starLeague = starLeague; + } + //endregion Getters/Setters } + //endregion Local Classes } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java index 5094b53539..28b0404e1d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java @@ -18,12 +18,128 @@ */ package mekhq.campaign.universe.generators.companyGeneration; +import megamek.common.EntityWeightClass; +import megamek.common.MechSummary; +import mekhq.campaign.Campaign; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.personnel.ranks.Ranks; +import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.CompanyGenerationType; public class AtBCompanyGenerator extends AbstractCompanyGenerator { //region Constructors - public AtBCompanyGenerator() { - super(CompanyGenerationType.AGAINST_THE_BOT); + public AtBCompanyGenerator(final Campaign campaign) { + super(CompanyGenerationType.AGAINST_THE_BOT, campaign); } //endregion Constructors + + //region Personnel + /** + * @param commandingOfficer the commanding officer + * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank + */ + @Override + protected void generateCommandingOfficerRank(final Person commandingOfficer, final int numMechWarriors) { + if (numMechWarriors >= 36) { + commandingOfficer.setRankNumeric(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); + } else if (numMechWarriors >= 12) { + commandingOfficer.setRankNumeric(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 5)); + } else if (numMechWarriors >= 4) { + commandingOfficer.setRankNumeric(Ranks.RWO_MAX + 4); + } else { + commandingOfficer.setRankNumeric(Ranks.RWO_MAX + 3); + } + } + //endregion Personnel + + //region Units + /** + * @param roll the modified roll to use + * @return the generated EntityWeightClass + * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, + * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables + */ + @Override + protected int determineBattleMechWeight(int roll) { + switch (roll) { + case 2: + case 3: + return EntityWeightClass.WEIGHT_ULTRA_LIGHT; + case 4: + case 5: + case 6: + return EntityWeightClass.WEIGHT_LIGHT; + case 7: + case 8: + case 9: + return EntityWeightClass.WEIGHT_MEDIUM; + case 10: + case 11: + return EntityWeightClass.WEIGHT_HEAVY; + case 12: + return EntityWeightClass.WEIGHT_ASSAULT; + default: + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } + } + + /** + * @param roll the modified roll to use + * @return the generated IUnitRating magic int for Dragoon Quality + */ + @Override + protected int determineBattleMechQuality(int roll) { + switch (roll) { + case 2: + case 3: + case 4: + case 5: + return IUnitRating.DRAGOON_F; + case 6: + case 7: + case 8: + return IUnitRating.DRAGOON_D; + case 9: + case 10: + return IUnitRating.DRAGOON_C; + case 11: + return IUnitRating.DRAGOON_B; + case 12: + return IUnitRating.DRAGOON_A; + default: + return IUnitRating.DRAGOON_ASTAR; + } + } + + /** + * @param campaign the campaign to generate for + * @param parameters the parameters to use in generation + * @param person the person to generate the mech for + * @return the MechSummary generated from the provided parameters + */ + @Override + protected MechSummary generateMechSummary(final Campaign campaign, + final RandomMechParameters parameters, + final Person person) { + if (parameters.isStarLeague() && !person.getOriginFaction().isComStarOrWoB()) { + final String faction; + if (person.isClanner()) { + // Clanners generate from Front Line tables instead of Star League + faction = person.getOriginFaction().getShortName(); + parameters.setQuality(IUnitRating.DRAGOON_B); + } else { + // Roll on the Star League Royal table if you get a SL mech with A* Rating + faction = ((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"); + } + return generateMechSummary(campaign, parameters, faction, getOptions().getStarLeagueYear()); + } else { + // Clanners Generate from 2nd Line Tables + if (person.isClanner()) { + parameters.setQuality(IUnitRating.DRAGOON_C); + } + return generateMechSummary(campaign, parameters, person.getOriginFaction().getShortName(), + campaign.getGameYear()); + } + } + //endregion Units } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java index cb079b4d63..560a9c435d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java @@ -18,19 +18,41 @@ */ package mekhq.campaign.universe.generators.companyGeneration; +import mekhq.MekHQ; +import mekhq.MekHqXmlUtil; +import mekhq.campaign.Campaign; import mekhq.campaign.personnel.Person; import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.Factions; +import mekhq.campaign.universe.Planet; +import mekhq.campaign.universe.Systems; import mekhq.campaign.universe.enums.CompanyGenerationType; import mekhq.campaign.universe.enums.ForceNamingType; - +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; -public class CompanyGenerationOptions { +public class CompanyGenerationOptions implements Serializable { //region Variable Declarations + private static final long serialVersionUID = 3034123423672457769L; + // Base Information - private Faction faction; // Done + private CompanyGenerationType type; + private Faction faction; + private Planet startingPlanet; private int companyCount; private int individualLanceCount; private boolean generateMercenaryCompanyCommandLance; @@ -38,41 +60,72 @@ public class CompanyGenerationOptions { private int lanceSize; // Personnel - private Map supportPersonnel; // Done - private boolean poolAssistants; // Done - private boolean generateCompanyCommanders; // Done - /** - * If the company commander counts as one of the lance officers (reduces officer generation by 1 if true) - */ - private boolean companyCommanderLanceOfficer; // Done - private boolean applyOfficerStatBonusToWorstSkill; // Done - private boolean assignBestOfficers; // Done - private boolean automaticallyAssignRanks; // Done + private Map supportPersonnel; + private boolean poolAssistants; + private boolean generateCaptains; + private boolean assignCompanyCommanderFlag; + private boolean companyCommanderLanceOfficer; + private boolean applyOfficerStatBonusToWorstSkill; + private boolean assignBestOfficers; + private boolean automaticallyAssignRanks; + + // Personnel Randomization + private boolean randomizeOrigin; + private Planet centralPlanet; + private int originSearchRadius; + private boolean extraRandomOrigin; + private double originDistanceScale; // Units private boolean generateUnitsAsAttached; private boolean assignBestRollToUnitCommander; private boolean groupByWeight; + private boolean keepOfficerRollsSeparate; + private int starLeagueYear; + private boolean assignTechsToUnits; // Unit private ForceNamingType forceNamingType; private boolean generateForceIcons; + // Spares + private boolean generateMothballedSpareUnits; + private int sparesPercentOfActiveUnits; + private boolean generateSpareParts; + private int startingArmourWeight; + private boolean generateSpareAmmunition; + private int numberReloadsPerWeapon; + private boolean generateFractionalMachineGunAmmunition; + + // Contracts + private boolean selectStartingContract; + private boolean startCourseToContractPlanet; + // Finances private int startingCash; private boolean randomizeStartingCash; - private boolean startingLoan; + private int randomStartingCashDiceCount; + private int minimumStartingFloat; private boolean payForSetup; - private boolean payForUnits; + private boolean startingLoan; private boolean payForPersonnel; + private boolean payForUnits; private boolean payForParts; private boolean payForAmmunition; //endregion Variable Declarations //region Constructors - public CompanyGenerationOptions(CompanyGenerationType type) { + public CompanyGenerationOptions() { + + } + + public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign campaign) { // Base Information - setFaction(Factions.getInstance().getFaction("MERC")); + setType(type); + setFaction(campaign.getFaction()); + setStartingPlanet(Systems.getInstance().getSystems().getOrDefault( + getFaction().getStartingPlanet(campaign.getLocalDate()), + Systems.getInstance().getSystems().get("Terra")).getPrimaryPlanet()); setCompanyCount(1); setIndividualLanceCount(0); setGenerateMercenaryCompanyCommandLance(false); @@ -81,7 +134,7 @@ public CompanyGenerationOptions(CompanyGenerationType type) { // Personnel Map supportPersonnel = new HashMap<>(); - if (type.isWindchild()) { + if (getType().isWindchild()) { supportPersonnel.put(Person.T_MECH_TECH, 5); supportPersonnel.put(Person.T_MECHANIC, 1); supportPersonnel.put(Person.T_AERO_TECH, 1); @@ -97,28 +150,54 @@ public CompanyGenerationOptions(CompanyGenerationType type) { } setSupportPersonnel(supportPersonnel); setPoolAssistants(true); - setGenerateCompanyCommanders(type.isWindchild()); + setGenerateCaptains(type.isWindchild()); + setAssignCompanyCommanderFlag(true); setCompanyCommanderLanceOfficer(type.isWindchild()); setApplyOfficerStatBonusToWorstSkill(type.isWindchild()); setAssignBestOfficers(type.isWindchild()); setAutomaticallyAssignRanks(true); + // Personnel Randomization + setRandomizeOrigin(true); + setCentralPlanet(Systems.getInstance().getSystems().get("Terra").getPrimaryPlanet()); + setOriginSearchRadius(45); + setExtraRandomOrigin(false); + setOriginDistanceScale(0.6); + // Units setGenerateUnitsAsAttached(type.isAtB()); setAssignBestRollToUnitCommander(type.isWindchild()); setGroupByWeight(true); + setKeepOfficerRollsSeparate(type.isAtB()); + setStarLeagueYear(2765); + setAssignTechsToUnits(true); // Unit setForceNamingType(ForceNamingType.CCB_1943); setGenerateForceIcons(true); + // Spares + setGenerateMothballedSpareUnits(false); + setSparesPercentOfActiveUnits(10); + setGenerateSpareParts(type.isWindchild()); + setStartingArmourWeight(25); + setGenerateSpareAmmunition(type.isWindchild()); + setNumberReloadsPerWeapon(4); + setGenerateFractionalMachineGunAmmunition(true); + + // Contracts + setSelectStartingContract(true); + setStartCourseToContractPlanet(true); + // Finances setStartingCash(0); setRandomizeStartingCash(type.isWindchild()); - setStartingLoan(type.isWindchild()); + setRandomStartingCashDiceCount(8); + setMinimumStartingFloat(type.isWindchild() ? 3500000 : 0); setPayForSetup(type.isWindchild()); - setPayForUnits(type.isWindchild()); + setStartingLoan(type.isWindchild()); setPayForPersonnel(type.isWindchild()); + setPayForUnits(type.isWindchild()); setPayForParts(type.isWindchild()); setPayForAmmunition(type.isWindchild()); } @@ -126,6 +205,14 @@ public CompanyGenerationOptions(CompanyGenerationType type) { //region Getters/Setters //region Base Information + public CompanyGenerationType getType() { + return type; + } + + public void setType(CompanyGenerationType type) { + this.type = type; + } + public Faction getFaction() { return faction; } @@ -134,6 +221,14 @@ public void setFaction(Faction faction) { this.faction = faction; } + public Planet getStartingPlanet() { + return startingPlanet; + } + + public void setStartingPlanet(Planet startingPlanet) { + this.startingPlanet = startingPlanet; + } + public int getCompanyCount() { return companyCount; } @@ -192,12 +287,20 @@ public void setPoolAssistants(boolean poolAssistants) { this.poolAssistants = poolAssistants; } - public boolean isGenerateCompanyCommanders() { - return generateCompanyCommanders; + public boolean isGenerateCaptains() { + return generateCaptains; + } + + public void setGenerateCaptains(boolean generateCaptains) { + this.generateCaptains = generateCaptains; } - public void setGenerateCompanyCommanders(boolean generateCompanyCommanders) { - this.generateCompanyCommanders = generateCompanyCommanders; + public boolean isAssignCompanyCommanderFlag() { + return assignCompanyCommanderFlag; + } + + public void setAssignCompanyCommanderFlag(boolean assignCompanyCommanderFlag) { + this.assignCompanyCommanderFlag = assignCompanyCommanderFlag; } public boolean isCompanyCommanderLanceOfficer() { @@ -233,6 +336,48 @@ public void setAutomaticallyAssignRanks(boolean automaticallyAssignRanks) { } //endregion Personnel + //region Personnel Randomization + public boolean isRandomizeOrigin() { + return randomizeOrigin; + } + + public void setRandomizeOrigin(boolean randomizeOrigin) { + this.randomizeOrigin = randomizeOrigin; + } + + public Planet getCentralPlanet() { + return centralPlanet; + } + + public void setCentralPlanet(Planet centralPlanet) { + this.centralPlanet = centralPlanet; + } + + public int getOriginSearchRadius() { + return originSearchRadius; + } + + public void setOriginSearchRadius(int originSearchRadius) { + this.originSearchRadius = originSearchRadius; + } + + public boolean isExtraRandomOrigin() { + return extraRandomOrigin; + } + + public void setExtraRandomOrigin(boolean extraRandomOrigin) { + this.extraRandomOrigin = extraRandomOrigin; + } + + public double getOriginDistanceScale() { + return originDistanceScale; + } + + public void setOriginDistanceScale(double originDistanceScale) { + this.originDistanceScale = originDistanceScale; + } + //endregion Personnel Randomization + //region Units public boolean isGenerateUnitsAsAttached() { return generateUnitsAsAttached; @@ -257,6 +402,30 @@ public boolean isGroupByWeight() { public void setGroupByWeight(boolean groupByWeight) { this.groupByWeight = groupByWeight; } + + public boolean isKeepOfficerRollsSeparate() { + return keepOfficerRollsSeparate; + } + + public void setKeepOfficerRollsSeparate(boolean keepOfficerRollsSeparate) { + this.keepOfficerRollsSeparate = keepOfficerRollsSeparate; + } + + public int getStarLeagueYear() { + return starLeagueYear; + } + + public void setStarLeagueYear(int starLeagueYear) { + this.starLeagueYear = starLeagueYear; + } + + public boolean isAssignTechsToUnits() { + return assignTechsToUnits; + } + + public void setAssignTechsToUnits(boolean assignTechsToUnits) { + this.assignTechsToUnits = assignTechsToUnits; + } //endregion Units //region Unit @@ -277,6 +446,82 @@ public void setGenerateForceIcons(boolean generateForceIcons) { } //endregion Unit + //region Spares + public boolean isGenerateMothballedSpareUnits() { + return generateMothballedSpareUnits; + } + + public void setGenerateMothballedSpareUnits(boolean generateMothballedSpareUnits) { + this.generateMothballedSpareUnits = generateMothballedSpareUnits; + } + + public int getSparesPercentOfActiveUnits() { + return sparesPercentOfActiveUnits; + } + + public void setSparesPercentOfActiveUnits(int sparesPercentOfActiveUnits) { + this.sparesPercentOfActiveUnits = sparesPercentOfActiveUnits; + } + + public boolean isGenerateSpareParts() { + return generateSpareParts; + } + + public void setGenerateSpareParts(boolean generateSpareParts) { + this.generateSpareParts = generateSpareParts; + } + + public int getStartingArmourWeight() { + return startingArmourWeight; + } + + public void setStartingArmourWeight(int startingArmourWeight) { + this.startingArmourWeight = startingArmourWeight; + } + + public boolean isGenerateSpareAmmunition() { + return generateSpareAmmunition; + } + + public void setGenerateSpareAmmunition(boolean generateSpareAmmunition) { + this.generateSpareAmmunition = generateSpareAmmunition; + } + + public int getNumberReloadsPerWeapon() { + return numberReloadsPerWeapon; + } + + public void setNumberReloadsPerWeapon(int numberReloadsPerWeapon) { + this.numberReloadsPerWeapon = numberReloadsPerWeapon; + } + + public boolean isGenerateFractionalMachineGunAmmunition() { + return generateFractionalMachineGunAmmunition; + } + + public void setGenerateFractionalMachineGunAmmunition(boolean generateFractionalMachineGunAmmunition) { + this.generateFractionalMachineGunAmmunition = generateFractionalMachineGunAmmunition; + } + //endregion Spares + + //region Contracts + public boolean isSelectStartingContract() { + return selectStartingContract; + } + + public void setSelectStartingContract(boolean selectStartingContract) { + this.selectStartingContract = selectStartingContract; + } + + public boolean isStartCourseToContractPlanet() { + return startCourseToContractPlanet; + } + + public void setStartCourseToContractPlanet(boolean startCourseToContractPlanet) { + this.startCourseToContractPlanet = startCourseToContractPlanet; + } + //endregion Contracts + //region Finances public int getStartingCash() { return startingCash; @@ -294,12 +539,20 @@ public void setRandomizeStartingCash(boolean randomizeStartingCash) { this.randomizeStartingCash = randomizeStartingCash; } - public boolean isStartingLoan() { - return startingLoan; + public int getRandomStartingCashDiceCount() { + return randomStartingCashDiceCount; } - public void setStartingLoan(boolean startingLoan) { - this.startingLoan = startingLoan; + public void setRandomStartingCashDiceCount(int randomStartingCashDiceCount) { + this.randomStartingCashDiceCount = randomStartingCashDiceCount; + } + + public int getMinimumStartingFloat() { + return minimumStartingFloat; + } + + public void setMinimumStartingFloat(int minimumStartingFloat) { + this.minimumStartingFloat = minimumStartingFloat; } public boolean isPayForSetup() { @@ -310,12 +563,12 @@ public void setPayForSetup(boolean payForSetup) { this.payForSetup = payForSetup; } - public boolean isPayForUnits() { - return payForUnits; + public boolean isStartingLoan() { + return startingLoan; } - public void setPayForUnits(boolean payForUnits) { - this.payForUnits = payForUnits; + public void setStartingLoan(boolean startingLoan) { + this.startingLoan = startingLoan; } public boolean isPayForPersonnel() { @@ -326,6 +579,14 @@ public void setPayForPersonnel(boolean payForPersonnel) { this.payForPersonnel = payForPersonnel; } + public boolean isPayForUnits() { + return payForUnits; + } + + public void setPayForUnits(boolean payForUnits) { + this.payForUnits = payForUnits; + } + public boolean isPayForParts() { return payForParts; } @@ -343,4 +604,321 @@ public void setPayForAmmunition(boolean payForAmmunition) { } //endregion Finances //endregion Getters/Setters + + //region File IO + public void writeToFile(File file) { + if (file == null) { + return; + } + String path = file.getPath(); + if (!path.endsWith(".xml")) { + path += ".xml"; + file = new File(path); + } + try (OutputStream fos = new FileOutputStream(file); + OutputStream bos = new BufferedOutputStream(fos); + OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8); + PrintWriter pw = new PrintWriter(osw)) { + // Then save it out to that file. + writeToXML(pw); + } catch (Exception e) { + MekHQ.getLogger().error(e); + } + } + + public void writeToXML(final PrintWriter pw) { + writeToXML(pw, 0); + } + + public void writeToXML(final PrintWriter pw, int indent) { + MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "companyGenerationOptions"); + // Base Information + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "type", getType().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "faction", getFaction().getShortName()); + MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "startingPlanet", "systemId", + getStartingPlanet().getParentSystem().getId(), getStartingPlanet().getId()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "companyCount", getCompanyCount()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "individualLanceCount", getIndividualLanceCount()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMercenaryCompanyCommandLance", isGenerateMercenaryCompanyCommandLance()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lancesPerCompany", getLancesPerCompany()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lanceSize", getLanceSize()); + + // Personnel + MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "supportPersonnel"); + for (Map.Entry entry : getSupportPersonnel().entrySet()) { + MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "supportRole"); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "role", entry.getKey()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "number", entry.getValue()); + MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "supportRole"); + } + MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "supportPersonnel"); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "poolAssistants", isPoolAssistants()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateCaptains", isGenerateCaptains()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignCompanyCommanderFlag", isAssignCompanyCommanderFlag()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "companyCommanderLanceOfficer", isCompanyCommanderLanceOfficer()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "applyOfficerStatBonusToWorstSkill", isApplyOfficerStatBonusToWorstSkill()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestOfficers", isAssignBestOfficers()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "automaticallyAssignRanks", isAutomaticallyAssignRanks()); + + // Personnel Randomization + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeOrigin", isRandomizeOrigin()); + MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "centralPlanet", "systemId", + getCentralPlanet().getParentSystem().getId(), getCentralPlanet().getId()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originSearchRadius", getOriginSearchRadius()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "extraRandomOrigin", isExtraRandomOrigin()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originDistanceScale", getOriginDistanceScale()); + + // Units + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToUnitCommander", isAssignBestRollToUnitCommander()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByWeight", isGroupByWeight()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "keepOfficerRollsSeparate", isKeepOfficerRollsSeparate()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "starLeagueYear", getStarLeagueYear()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignTechsToUnits", isAssignTechsToUnits()); + + // Unit + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "forceNamingType", getForceNamingType().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateForceIcons", isGenerateForceIcons()); + + // Spares + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMothballedSpareUnits", isGenerateMothballedSpareUnits()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sparesPercentOfActiveUnits", getSparesPercentOfActiveUnits()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSpareParts", isGenerateSpareParts()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingArmourWeight", getStartingArmourWeight()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSpareAmmunition", isGenerateSpareAmmunition()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "numberReloadsPerWeapon", getNumberReloadsPerWeapon()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateFractionalMachineGunAmmunition", isGenerateFractionalMachineGunAmmunition()); + + // Contracts + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "selectStartingContract", isSelectStartingContract()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startCourseToContractPlanet", isStartCourseToContractPlanet()); + + // Finances + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingCash", getStartingCash()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeStartingCash", isRandomizeStartingCash()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomStartingCashDiceCount", getRandomStartingCashDiceCount()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "minimumStartingFloat", getMinimumStartingFloat()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForSetup", isPayForSetup()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingLoan", isStartingLoan()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForPersonnel", isPayForPersonnel()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForUnits", isPayForUnits()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForParts", isPayForParts()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForAmmunition", isPayForAmmunition()); + MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "companyGenerationOptions"); + } + + public static CompanyGenerationOptions parseFromXML(final File file, final Campaign campaign) { + if (file == null) { + MekHQ.getLogger().error("Received a null file, returning the default AtB options"); + return new CompanyGenerationOptions(CompanyGenerationType.AGAINST_THE_BOT, campaign); + } + Element element; + + // Open up the file. + try (InputStream is = new FileInputStream(file)) { + element = MekHqXmlUtil.newSafeDocumentBuilder().parse(is).getDocumentElement(); + } catch (Exception e) { + MekHQ.getLogger().error("Failed to open file, returning the default AtB options", e); + return new CompanyGenerationOptions(CompanyGenerationType.AGAINST_THE_BOT, campaign); + } + element.normalize(); + NodeList nl = element.getChildNodes(); + for (int i = 0; i < nl.getLength(); i++) { + Node wn = nl.item(i); + if ("companyGenerationOptions".equals(wn.getNodeName())) { + return parseFromXML(wn); + } + } + MekHQ.getLogger().error("Failed to parse file, returning the default AtB options"); + return new CompanyGenerationOptions(CompanyGenerationType.AGAINST_THE_BOT, campaign); + } + + public static CompanyGenerationOptions parseFromXML(final Node wn) { + final NodeList nl = wn.getChildNodes(); + final CompanyGenerationOptions options = new CompanyGenerationOptions(); + + try { + for (int x = 0; x < nl.getLength(); x++) { + final Node wn2 = nl.item(x); + switch (wn2.getNodeName()) { + case "type": + options.setType(CompanyGenerationType.valueOf(wn2.getTextContent().trim())); + break; + case "faction": + options.setFaction(Factions.getInstance().getFaction(wn2.getTextContent().trim())); + break; + case "startingPlanet": + String startingPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); + String startingPlanetPlanetId = wn2.getTextContent().trim(); + options.setStartingPlanet(Systems.getInstance().getSystemById(startingPlanetSystemId).getPlanetById(startingPlanetPlanetId)); + break; + case "companyCount": + options.setCompanyCount(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "individualLanceCount": + options.setIndividualLanceCount(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "generateMercenaryCompanyCommandLance": + options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "lancesPerCompany": + options.setLancesPerCompany(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "lanceSize": + options.setLanceSize(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "supportPersonnel": { + options.setSupportPersonnel(new HashMap<>()); + final NodeList nl2 = wn.getChildNodes(); + for (int y = 0; y < nl2.getLength(); y++) { + final Node wn3 = nl2.item(y); + if ("supportRole".equals(wn3.getNodeName())) { + final NodeList nl3 = wn3.getChildNodes(); + int role = -1; + int number = -1; + for (int z = 0; z < nl3.getLength(); z++) { + final Node wn4 = nl3.item(z); + switch (wn4.getNodeName()) { + case "role": + role = Integer.parseInt(wn4.getTextContent().trim()); + break; + case "number": + number = Integer.parseInt(wn4.getTextContent().trim()); + break; + } + } + if ((role != -1) && (number != -1)) { + options.getSupportPersonnel().put(role, number); + } + } + } + break; + } + case "poolAssistants": + options.setPoolAssistants(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "generateCaptains": + options.setGenerateCaptains(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "assignCompanyCommanderFlag": + options.setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "companyCommanderLanceOfficer": + options.setCompanyCommanderLanceOfficer(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "applyOfficerStatBonusToWorstSkill": + options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "assignBestOfficers": + options.setAssignBestOfficers(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "automaticallyAssignRanks": + options.setAutomaticallyAssignRanks(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "randomizeOrigin": + options.setRandomizeOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "centralPlanet": + String centralPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); + String centralPlanetPlanetId = wn2.getTextContent().trim(); + options.setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); + break; + case "originSearchRadius": + options.setOriginSearchRadius(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "extraRandomOrigin": + options.setExtraRandomOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "originDistanceScale": + options.setOriginDistanceScale(Double.parseDouble(wn2.getTextContent().trim())); + break; + case "generateUnitsAsAttached": + options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "assignBestRollToUnitCommander": + options.setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "groupByWeight": + options.setGroupByWeight(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "keepOfficerRollsSeparate": + options.setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "starLeagueYear": + options.setStarLeagueYear(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "assignTechsToUnits": + options.setAssignTechsToUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "forceNamingType": + options.setForceNamingType(ForceNamingType.valueOf(wn2.getTextContent().trim())); + break; + case "generateForceIcons": + options.setGenerateForceIcons(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "generateMothballedSpareUnits": + options.setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "sparesPercentOfActiveUnits": + options.setSparesPercentOfActiveUnits(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "generateSpareParts": + options.setGenerateSpareParts(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "startingArmourWeight": + options.setStartingArmourWeight(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "generateSpareAmmunition": + options.setGenerateSpareAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "numberReloadsPerWeapon": + options.setNumberReloadsPerWeapon(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "generateFractionalMachineGunAmmunition": + options.setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "selectStartingContract": + options.setSelectStartingContract(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "startCourseToContractPlanet": + options.setStartCourseToContractPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "startingCash": + options.setStartingCash(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "randomizeStartingCash": + options.setRandomizeStartingCash(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "randomStartingCashDiceCount": + options.setRandomStartingCashDiceCount(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "minimumStartingFloat": + options.setMinimumStartingFloat(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "payForSetup": + options.setPayForSetup(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "startingLoan": + options.setStartingLoan(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "payForPersonnel": + options.setPayForPersonnel(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "payForUnits": + options.setPayForUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "payForParts": + options.setPayForParts(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "payForAmmunition": + options.setPayForAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + } + } + } catch (Exception e) { + MekHQ.getLogger().error(e); + } + return options; + } + //endregion File IO } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java index 1df41b6a78..7b55fb80e5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java @@ -18,35 +18,136 @@ */ package mekhq.campaign.universe.generators.companyGeneration; +import megamek.common.EntityWeightClass; +import megamek.common.MechSummary; +import mekhq.campaign.Campaign; import mekhq.campaign.personnel.Person; -import mekhq.campaign.personnel.SkillType; import mekhq.campaign.personnel.ranks.Ranks; +import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.CompanyGenerationType; public class WindchildCompanyGenerator extends AbstractCompanyGenerator { //region Constructors - public WindchildCompanyGenerator() { - super(CompanyGenerationType.WINDCHILD); + public WindchildCompanyGenerator(final Campaign campaign) { + super(CompanyGenerationType.WINDCHILD, campaign); } //endregion Constructors + //region Personnel + /** + * Set based on greater than instead of the greater than or equal to of AtB + * @param commandingOfficer the commanding officer + * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank + */ @Override - protected void generateCommandingOfficer(Person commandingOfficer, int numMechWarriors) { - commandingOfficer.setCommander(true); - commandingOfficer.improveSkill(SkillType.S_GUN_MECH); - commandingOfficer.improveSkill(SkillType.S_PILOT_MECH); - assignRandomOfficerSkillIncrease(commandingOfficer, 2); + protected void generateCommandingOfficerRank(Person commandingOfficer, int numMechWarriors) { + if (numMechWarriors > 36) { + commandingOfficer.setRankNumeric(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); + } else if (numMechWarriors > 12) { + commandingOfficer.setRankNumeric(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 5)); + } else if (numMechWarriors > 4) { + commandingOfficer.setRankNumeric(Ranks.RWO_MAX + 4); + } else { + commandingOfficer.setRankNumeric(Ranks.RWO_MAX + 3); + } + } + //endregion Personnel + + //region Units + /** + * This guarantees a BattleMech, and rolls an overall heavier lance + * + * @param roll the modified roll to use + * @return the generated EntityWeightClass + * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, + * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables + */ + @Override + protected int determineBattleMechWeight(int roll) { + switch (roll) { + case 2: + case 3: + case 4: + return EntityWeightClass.WEIGHT_LIGHT; + case 5: + case 6: + case 7: + return EntityWeightClass.WEIGHT_MEDIUM; + case 8: + case 9: + case 10: + return EntityWeightClass.WEIGHT_HEAVY; + case 11: + case 12: + return EntityWeightClass.WEIGHT_ASSAULT; + default: + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } + } - if (getOptions().isAutomaticallyAssignRanks()) { - if (numMechWarriors > 36) { - commandingOfficer.setRankLevel(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); - } else if (numMechWarriors > 12) { - commandingOfficer.setRankLevel(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 5)); - } else if (numMechWarriors > 4) { - commandingOfficer.setRankLevel(Ranks.RWO_MAX + 4); + /** + * This generates a slightly higher average quality rating + * @param roll the modified roll to use + * @return the generated IUnitRating magic int for Dragoon Quality + */ + @Override + protected int determineBattleMechQuality(int roll) { + switch (roll) { + case 2: + case 3: + case 4: + return IUnitRating.DRAGOON_F; + case 5: + case 6: + return IUnitRating.DRAGOON_D; + case 7: + case 8: + return IUnitRating.DRAGOON_C; + case 9: + case 10: + return IUnitRating.DRAGOON_B; + case 11: + case 12: + return IUnitRating.DRAGOON_A; + default: + return IUnitRating.DRAGOON_ASTAR; + } + } + + /** + * This generates clan mech differently, so you can get any of the quality ratings for clanners + * + * @param campaign the campaign to generate for + * @param parameters the parameters to use in generation + * @param person the person to generate the mech for + * @return the MechSummary generated from the provided parameters + */ + @Override + protected MechSummary generateMechSummary(final Campaign campaign, + final RandomMechParameters parameters, + final Person person) { + if (parameters.isStarLeague()) { + final String faction; + if (person.isClanner()) { + faction = person.getOriginFaction().getShortName(); + // Clanners generate using the Keshik Table if they roll A*, otherwise they roll on + // the Front Line tables + parameters.setQuality((parameters.getQuality() < IUnitRating.DRAGOON_ASTAR) + ? IUnitRating.DRAGOON_B : parameters.getQuality()); } else { - commandingOfficer.setRankLevel(Ranks.RWO_MAX + 3); + // Roll on the Star League Royal table if you get a SL mech with A* Rating + faction = ((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"); + } + return generateMechSummary(campaign, parameters, faction, getOptions().getStarLeagueYear()); + } else { + // Clanners Generate from 2nd Line (or lesser) Tables (core AtB is just 2nd Line, + // but this is more interesting) + if (person.isClanner() && (parameters.getQuality() > IUnitRating.DRAGOON_C)) { + parameters.setQuality(IUnitRating.DRAGOON_C); } + return generateMechSummary(campaign, parameters, person.getOriginFaction().getShortName(), + campaign.getGameYear()); } } + //endregion Units } diff --git a/MekHQ/src/mekhq/gui/CampaignGUI.java b/MekHQ/src/mekhq/gui/CampaignGUI.java index bf12525173..df236725a4 100644 --- a/MekHQ/src/mekhq/gui/CampaignGUI.java +++ b/MekHQ/src/mekhq/gui/CampaignGUI.java @@ -39,6 +39,7 @@ import megamek.client.ui.swing.dialog.AbstractUnitSelectorDialog; import megamek.common.*; import mekhq.MekHqConstants; +import mekhq.campaign.event.MekHQOptionsChangedEvent; import mekhq.campaign.finances.Money; import mekhq.gui.dialog.*; import mekhq.gui.preferences.JWindowPreference; @@ -128,6 +129,7 @@ public class CampaignGUI extends JPanel { private JMenuItem miShipSearch; private JMenuItem miRetirementDefectionDialog; private JMenuItem miAdvanceMultipleDays; + private JMenuItem miCompanyGenerator; private EnumMap standardTabs; @@ -195,10 +197,8 @@ null, getCampaign().getRetirementDefectionTracker() * Show a dialog indicating that the user must resolve overdue loans before advanching the day */ public void showOverdueLoansDialog() { - JOptionPane.showMessageDialog(null, "You must resolve overdue loans before advancing the day", "Overdue loans", JOptionPane.WARNING_MESSAGE); - } public void showAdvanceMultipleDays(boolean isHost) { @@ -918,7 +918,7 @@ private void initMenu() { //region Manage Campaign Menu // The Manage Campaign menu uses the following Mnemonic keys as of 19-March-2020: - // A, B, G, M, S + // A, B, C, G, M, S JMenu menuManage = new JMenu(resourceMap.getString("menuManageCampaign.text")); menuManage.setMnemonic(KeyEvent.VK_C); menuManage.setName("manageMenu"); @@ -952,15 +952,22 @@ private void initMenu() { }); menuManage.add(miScenarioEditor); + miCompanyGenerator = new JMenuItem(resourceMap.getString("miCompanyGenerator.text")); + miCompanyGenerator.setMnemonic(KeyEvent.VK_C); + miCompanyGenerator.setVisible(MekHQ.getMekHQOptions().getShowCompanyGenerator()); + miCompanyGenerator.addActionListener(evt -> + new CompanyGenerationDialog(getFrame(), getCampaign()).setVisible(true)); + menuManage.add(miCompanyGenerator); + menuBar.add(menuManage); //endregion Manage Campaign Menu //region Help Menu // The Help menu uses the following Mnemonic keys as of 19-March-2020: // A - JMenu menuHelp = new JMenu(resourceMap.getString("menuHelp.text")); // NOI18N + JMenu menuHelp = new JMenu(resourceMap.getString("menuHelp.text")); menuHelp.setMnemonic(KeyEvent.VK_SLASH); - menuHelp.setName("helpMenu"); // NOI18N + menuHelp.setName("helpMenu"); JMenuItem menuAboutItem = new JMenuItem(resourceMap.getString("menuAbout.text")); menuAboutItem.setMnemonic(KeyEvent.VK_A); @@ -1266,7 +1273,7 @@ public void showShipSearch() { } private void menuSaveXmlActionPerformed(ActionEvent evt) { - MekHQ.getLogger().info(this, "Saving campaign..."); + MekHQ.getLogger().info("Saving campaign..."); // Choose a file... File file = selectSaveCampaignFile(); if (file == null) { @@ -2228,7 +2235,7 @@ protected void loadPartsFile() { protected void loadOptionsFile() { Optional maybeFile = FileDialogs.openCampaignOptions(frame); - if (!maybeFile.isPresent()) { + if (maybeFile.isEmpty()) { return; } @@ -2601,6 +2608,11 @@ public void handlePersonUpdate(PersonEvent ev) { } } + @Subscribe + public void handle(MekHQOptionsChangedEvent evt) { + miCompanyGenerator.setVisible(MekHQ.getMekHQOptions().getShowCompanyGenerator()); + } + public void refreshLocation() { lblLocation.setText(getCampaign().getLocation().getReport(getCampaign().getLocalDate())); } diff --git a/MekHQ/src/mekhq/gui/FileDialogs.java b/MekHQ/src/mekhq/gui/FileDialogs.java index e09b675faf..60d847194a 100644 --- a/MekHQ/src/mekhq/gui/FileDialogs.java +++ b/MekHQ/src/mekhq/gui/FileDialogs.java @@ -238,7 +238,6 @@ public static Optional openScenarioTemplate(JFrame frame) { * @return the file selected, if any */ public static Optional saveScenarioTemplate(JFrame frame, ScenarioTemplate template) { - String fileName = String.format( "%s.xml", //$NON-NLS-1$ template.name); @@ -286,4 +285,31 @@ public static Optional saveStarMap(JFrame frame) { value.ifPresent(x -> MekHQ.getStarMapsDirectory().setValue(x.getParent())); return value; } + + /** + * Displays a dialog window from which the user can select an .xml file to open. + * + * @return the file selected, if any + */ + public static Optional openCompanyGenerationOptions(JFrame frame) { + Optional value = GUI.fileDialogOpen(frame, "Load Company Generation Options", + FileType.XML, MekHQ.getMekHQOptions().getCompanyGenerationDirectoryPath()); + + value.ifPresent(x -> MekHQ.getMekHQOptions().setCompanyGenerationDirectoryPath(x.getParent())); + return value; + } + + /** + * Displays a dialog window from which the user can select a .xml file to save to. + * + * @return the file selected, if any + */ + public static Optional saveCompanyGenerationOptions(JFrame frame) { + Optional value = GUI.fileDialogSave(frame, "Save Company Generation Options", + FileType.XML, MekHQ.getMekHQOptions().getCompanyGenerationDirectoryPath(), + "myoptions.xml"); + + value.ifPresent(x -> MekHQ.getMekHQOptions().setCompanyGenerationDirectoryPath(x.getParent())); + return value; + } } diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index d67af1ca9a..6d87426655 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -106,6 +106,7 @@ import mekhq.gui.model.SortedComboBoxModel; import mekhq.gui.preferences.JWindowPreference; import mekhq.gui.utilities.TableCellListener; +import mekhq.gui.view.CompanyGenerationOptionsPanel; import mekhq.module.PersonnelMarketServiceManager; import mekhq.module.api.PersonnelMarketMethod; import mekhq.preferences.PreferencesNode; @@ -490,6 +491,10 @@ public class CampaignOptionsDialog extends JDialog { private JCheckBox chkUseLightConditions; private JCheckBox chkUsePlanetaryConditions; //endregion Against the Bot Tab + + //region Company Generation Options + private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; + //endregion Company Generation Options //endregion Variable Declarations public CampaignOptionsDialog(JFrame parent, boolean modal, Campaign c) { @@ -4202,12 +4207,19 @@ public void actionPerformed(ActionEvent e) { enableAtBComponents(panAtB, chkUseAtB.isSelected()); enableAtBComponents(panSubAtBRat, chkUseAtB.isSelected() && btnStaticRATs.isSelected()); - javax.swing.SwingUtilities.invokeLater(() -> { + SwingUtilities.invokeLater(() -> { scrSPA.getVerticalScrollBar().setValue(0); scrAtB.getVerticalScrollBar().setValue(0); }); //endregion Against the Bot Tab + //region Company Generation Options + if (MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()) { + companyGenerationOptionsPanel = new CompanyGenerationOptionsPanel(frame, campaign); + tabOptions.addTab(resourceMap.getString("companyGenerationOptionsPanel.title"), companyGenerationOptionsPanel); + } + //endregion Company Generation Options + gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; @@ -4692,6 +4704,13 @@ public void setOptions(CampaignOptions options, RandomSkillPreferences randomSki chkUseLightConditions.setSelected(options.getUseLightConditions()); chkUsePlanetaryConditions.setSelected(options.getUsePlanetaryConditions()); //endregion Against the Bot Tab + + //region Company Generation Options + // Only trigger this if there are saved options and the panel has been initialized + if ((companyGenerationOptionsPanel != null) && (options.getCompanyGenerationOptions() != null)) { + companyGenerationOptionsPanel.setOptions(options.getCompanyGenerationOptions()); + } + //endregion Company Generation Options } public static String[][] getSkillCostsArray(Hashtable skillHash) { @@ -5153,6 +5172,12 @@ private void updateOptions() { options.setUnitMarketReportRefresh(chkUnitMarketReportRefresh.isSelected()); // End Against the Bot + //region Company Generation Options + if (companyGenerationOptionsPanel != null) { + options.setCompanyGenerationOptions(companyGenerationOptionsPanel.createOptionsFromPanel()); + } + //endregion Company Generation Options + campaign.setCampaignOptions(options); MekHQ.triggerEvent(new OptionsChangedEvent(campaign, options)); diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 4a8a9c5f38..994e1b4ba6 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -18,54 +18,132 @@ */ package mekhq.gui.dialog; +import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import mekhq.campaign.Campaign; -import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; +import mekhq.campaign.event.OrganizationChangedEvent; +import mekhq.gui.preferences.JWindowPreference; +import mekhq.gui.view.CompanyGenerationOptionsPanel; +import mekhq.preferences.PreferencesNode; import javax.swing.*; +import java.awt.*; +import java.util.ResourceBundle; public class CompanyGenerationDialog extends JDialog { //region Variable Declarations - private Campaign campaign; - private AbstractCompanyGenerator companyGenerator; + private JFrame frame; + private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations //region Constructors - public CompanyGenerationDialog(JFrame frame, Campaign campaign, AbstractCompanyGenerator companyGenerator) { - super(frame); - - setCampaign(campaign); - setCompanyGenerator(companyGenerator); - initialize(); + public CompanyGenerationDialog(final JFrame frame, final Campaign campaign) { + super(frame, "", ModalityType.APPLICATION_MODAL); + setTitle(resources.getString("CompanyGenerationDialog.title")); + setFrame(frame); + initialize(campaign); + managePreferences(); } //endregion Constructors - //region Getters/Setters - public Campaign getCampaign() { - return campaign; + public JFrame getFrame() { + return frame; } - public void setCampaign(Campaign campaign) { - this.campaign = campaign; + public void setFrame(JFrame frame) { + this.frame = frame; } - public AbstractCompanyGenerator getCompanyGenerator() { - return companyGenerator; + public CompanyGenerationOptionsPanel getCompanyGenerationOptionsPanel() { + return companyGenerationOptionsPanel; } - public void setCompanyGenerator(AbstractCompanyGenerator companyGenerator) { - this.companyGenerator = companyGenerator; + public void setCompanyGenerationOptionsPanel(final CompanyGenerationOptionsPanel companyGenerationOptionsPanel) { + this.companyGenerationOptionsPanel = companyGenerationOptionsPanel; } //endregion Getters/Setters //region Initialization - private void initialize() { + private void initialize(final Campaign campaign) { + setLayout(new BorderLayout()); + add(initializeCompanyGenerationOptionsPanel(campaign), BorderLayout.CENTER); + add(initializeButtons(), BorderLayout.PAGE_END); + setMinimumSize(new Dimension(480, 240)); + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); } - //endregion Initialization - private boolean validateData() { - // ensure you have a minimum of 1 lance or company generated - return true; + private JPanel initializeCompanyGenerationOptionsPanel(final Campaign campaign) { + setCompanyGenerationOptionsPanel(new CompanyGenerationOptionsPanel(getFrame(), campaign)); + return getCompanyGenerationOptionsPanel(); + } + + private JPanel initializeButtons() { + JButton btnCancel = new JButton(resources.getString("Cancel")); + btnCancel.addActionListener(evt -> setVisible(false)); + + JButton btnExport = new JButton(resources.getString("Export")); + btnExport.addActionListener(evt -> getCompanyGenerationOptionsPanel().exportOptionsToXML()); + + JButton btnGenerate = new JButton(resources.getString("Generate")); + btnGenerate.addActionListener(evt -> getCompanyGenerationOptionsPanel().generate()); + + JButton btnRestore = new JButton(resources.getString("RestoreDefaults")); + btnRestore.addActionListener(evt -> getCompanyGenerationOptionsPanel().setOptions( + MekHQ.getMekHQOptions().getDefaultCompanyGenerationType())); + + JButton btnImport = new JButton(resources.getString("Import")); + btnImport.addActionListener(evt -> getCompanyGenerationOptionsPanel().importOptionsFromXML()); + + JButton btnApply = new JButton(resources.getString("Apply")); + btnApply.addActionListener(evt -> { + getCompanyGenerationOptionsPanel().apply(); + MekHQ.triggerEvent(new OrganizationChangedEvent(getCompanyGenerationOptionsPanel().getCampaign().getForces())); + setVisible(false); + }); + + // Layout the UI + JPanel panel = new JPanel(); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(btnCancel) + .addComponent(btnExport) + .addComponent(btnGenerate, GroupLayout.Alignment.TRAILING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(btnRestore) + .addComponent(btnImport) + .addComponent(btnApply, GroupLayout.Alignment.TRAILING)) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.CENTER) + .addGroup(layout.createSequentialGroup() + .addComponent(btnCancel) + .addComponent(btnExport) + .addComponent(btnGenerate)) + .addGroup(layout.createSequentialGroup() + .addComponent(btnRestore) + .addComponent(btnImport) + .addComponent(btnApply)) + ); + + return panel; } + + private void managePreferences() { + PreferencesNode preferences = MekHQ.getPreferences().forClass(getClass()); + + preferences.manage(new JWindowPreference(this)); + } + //endregion Initialization } diff --git a/MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java b/MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java index 5bc487e83a..ff59e37d10 100644 --- a/MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java @@ -67,7 +67,8 @@ public class GMToolsDialog extends JDialog { private static final long serialVersionUID = 7724064095803583812L; //region GUI Variables - private JSpinner numDice; + private JSpinner countDice; + private JSpinner numberDice; private JSpinner sizeDice; private JLabel totalDiceResult; private JTextPane individualDiceResults; @@ -139,7 +140,7 @@ public class GMToolsDialog extends JDialog { private static final Integer[] ERAS = {2807, 2825, 2850, 2900, 2950, 3000, 3050, 3060, 3075, 3085, 3100}; //endregion Constants - private static final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GMToolsDialog", new EncodeControl()); + private static final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations //region Constructors @@ -183,16 +184,22 @@ private void initComponents() { //region Dice Panel Initialization private JPanel getDiceRoller() { - int gridx = 0, gridy = 0; + int gridx = 0, gridy = 0, gridyMax; JPanel dicePanel = new JPanel(new GridBagLayout()); dicePanel.setName("dicePanel"); dicePanel.setBorder(BorderFactory.createTitledBorder(resources.getString("dicePanel.text"))); - numDice = new JSpinner(new SpinnerNumberModel(2, 1, 100, 1)); - numDice.setName("numDice"); - ((JSpinner.DefaultEditor) numDice.getEditor()).getTextField().setEditable(true); - dicePanel.add(numDice, newGridBagConstraints(gridx++, gridy)); + countDice = new JSpinner(new SpinnerNumberModel(2, 1, 100, 1)); + countDice.setName("countDice"); + dicePanel.add(countDice, newGridBagConstraints(gridx++, gridy)); + + JLabel rolls = new JLabel(resources.getString("rolls.text")); + dicePanel.add(rolls, newGridBagConstraints(gridx++, gridy)); + + numberDice = new JSpinner(new SpinnerNumberModel(2, 1, 100, 1)); + numberDice.setName("numberDice"); + dicePanel.add(numberDice, newGridBagConstraints(gridx++, gridy)); JLabel sides = new JLabel(resources.getString("sides.text")); sides.setName("sides"); @@ -203,6 +210,7 @@ private JPanel getDiceRoller() { ((JSpinner.DefaultEditor) sizeDice.getEditor()).getTextField().setEditable(true); dicePanel.add(sizeDice, newGridBagConstraints(gridx++, gridy++)); + gridyMax = --gridx; gridx = 0; JLabel totalDiceResultLabel = new JLabel(resources.getString("totalDiceResultsLabel.text")); @@ -216,7 +224,7 @@ private JPanel getDiceRoller() { JButton diceRoll = new JButton(resources.getString("diceRoll.text")); diceRoll.setName("diceRoll"); diceRoll.addActionListener(evt -> performDiceRoll()); - dicePanel.add(diceRoll, newGridBagConstraints(gridx++, gridy++, 2, 1)); + dicePanel.add(diceRoll, newGridBagConstraints(gridyMax--, gridy++, 2, 1)); gridx = 0; @@ -228,7 +236,7 @@ private JPanel getDiceRoller() { individualDiceResults.setText("-"); individualDiceResults.setName("individualDiceResults"); individualDiceResults.setEditable(false); - dicePanel.add(individualDiceResults, newGridBagConstraints(gridx++, gridy, 3, 1)); + dicePanel.add(individualDiceResults, newGridBagConstraints(gridx++, gridy, 5, 1)); return dicePanel; } @@ -602,7 +610,9 @@ private List getFactionChoices(int year) { private void setUserPreferences() { PreferencesNode preferences = MekHQ.getPreferences().forClass(GMToolsDialog.class); - preferences.manage(new JIntNumberSpinnerPreference(numDice)); + preferences.manage(new JIntNumberSpinnerPreference(countDice)); + + preferences.manage(new JIntNumberSpinnerPreference(numberDice)); preferences.manage(new JIntNumberSpinnerPreference(sizeDice)); @@ -787,8 +797,8 @@ public void setLastGeneratedBloodname(String lastGeneratedBloodname) { //region ActionEvent Handlers public void performDiceRoll() { - List individualDice = Utilities.individualDice((Integer) numDice.getValue(), - (Integer) sizeDice.getValue()); + List individualDice = Utilities.individualDice((Integer) countDice.getValue(), + (Integer) numberDice.getValue(), (Integer) sizeDice.getValue()); totalDiceResult.setText(String.format(resources.getString("totalDiceResult.text"), individualDice.get(0))); StringBuilder sb = new StringBuilder(); diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index eb57880ff2..585281d038 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -1,7 +1,7 @@ /* * MekHqOptionsDialog.java * - * Copyright (c) 2019-2020 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2019-2021 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -22,6 +22,7 @@ import mekhq.MekHQ; import mekhq.campaign.event.MekHQOptionsChangedEvent; +import mekhq.campaign.universe.enums.CompanyGenerationType; import mekhq.gui.enums.PersonnelFilterStyle; import javax.swing.*; @@ -33,13 +34,13 @@ import java.util.ResourceBundle; public class MekHqOptionsDialog extends BaseDialog { - //region Variable Declaration - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog"); - + //region Variable Declarations //region Display private JTextField optionDisplayDateFormat; private JTextField optionLongDisplayDateFormat; private JCheckBox optionHistoricalDailyLog; + private JCheckBox optionShowCompanyGenerator; + private JComboBox optionDefaultCompanyGenerationType; //region Command Center Display private JCheckBox optionCommandCenterUseUnitMarket; @@ -70,12 +71,15 @@ public class MekHqOptionsDialog extends BaseDialog { private JCheckBox optionPreferGzippedOutput; private JCheckBox optionWriteCustomsToXML; private JCheckBox optionSaveMothballState; + private JCheckBox optionSaveCompanyGenerationOptions; //endregion Campaign XML Save //region Miscellaneous private JSpinner optionStartGameDelay; //endregion Miscellaneous - //endregion Variable Declaration + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog"); + //endregion Variable Declarations //region Constructors public MekHqOptionsDialog(JFrame parent) { @@ -125,6 +129,26 @@ private JPanel createDisplayTab() { optionHistoricalDailyLog = new JCheckBox(resources.getString("optionHistoricalDailyLog.text")); optionHistoricalDailyLog.setToolTipText(resources.getString("optionHistoricalDailyLog.toolTipText")); + optionShowCompanyGenerator = new JCheckBox(resources.getString("optionShowCompanyGenerator.text")); + optionShowCompanyGenerator.setToolTipText(resources.getString("optionShowCompanyGenerator.toolTipText")); + optionShowCompanyGenerator.setName("optionShowCompanyGenerator"); + + JLabel labelDefaultCompanyGenerationType = new JLabel(resources.getString("labelDefaultCompanyGenerationType.text")); + labelDefaultCompanyGenerationType.setToolTipText(resources.getString("labelDefaultCompanyGenerationType.toolTipText")); + optionDefaultCompanyGenerationType = new JComboBox<>(CompanyGenerationType.values()); + optionDefaultCompanyGenerationType.setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (isSelected && (index > -1)) { + list.setToolTipText((list.getSelectedValue() instanceof CompanyGenerationType) + ? ((CompanyGenerationType) list.getSelectedValue()).getToolTipText() : ""); + } + return this; + } + }); + //region Command Center Display JLabel labelCommandCenterDisplay = new JLabel(resources.getString("labelCommandCenterDisplay.text")); @@ -143,8 +167,6 @@ private JPanel createDisplayTab() { optionPersonnelFilterStyle = new JComboBox<>(PersonnelFilterStyle.values()); optionPersonnelFilterStyle.setRenderer(new DefaultListCellRenderer() { - private static final long serialVersionUID = -543354619818226314L; - @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { @@ -153,7 +175,6 @@ public Component getListCellRendererComponent(JList list, Object value, int i list.setToolTipText((list.getSelectedValue() instanceof PersonnelFilterStyle) ? ((PersonnelFilterStyle) list.getSelectedValue()).getToolTipText() : ""); } - return this; } }); @@ -182,6 +203,10 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(optionLongDisplayDateFormat) .addComponent(labelLongDisplayDateFormatExample, GroupLayout.Alignment.TRAILING)) .addComponent(optionHistoricalDailyLog) + .addComponent(optionShowCompanyGenerator) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(labelDefaultCompanyGenerationType) + .addComponent(optionDefaultCompanyGenerationType)) .addComponent(labelCommandCenterDisplay) .addComponent(optionCommandCenterUseUnitMarket) .addComponent(optionCommandCenterMRMS) @@ -204,6 +229,10 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(optionLongDisplayDateFormat) .addComponent(labelLongDisplayDateFormatExample)) .addComponent(optionHistoricalDailyLog) + .addComponent(optionShowCompanyGenerator) + .addGroup(layout.createSequentialGroup() + .addComponent(labelDefaultCompanyGenerationType) + .addComponent(optionDefaultCompanyGenerationType)) .addComponent(labelCommandCenterDisplay) .addComponent(optionCommandCenterUseUnitMarket) .addComponent(optionCommandCenterMRMS) @@ -329,6 +358,10 @@ private JPanel createCampaignXMLSaveTab() { optionSaveMothballState = new JCheckBox(resources.getString("optionSaveMothballState.text")); optionSaveMothballState.setToolTipText(resources.getString("optionSaveMothballState.toolTipText")); optionSaveMothballState.setMnemonic(KeyEvent.VK_U); + + optionSaveCompanyGenerationOptions = new JCheckBox(resources.getString("optionSaveCompanyGenerationOptions.text")); + optionSaveCompanyGenerationOptions.setToolTipText(resources.getString("optionSaveCompanyGenerationOptions.toolTipText")); + optionSaveCompanyGenerationOptions.setName("optionSaveCompanyGenerationOptions"); //endregion Create Graphical Components //region Layout @@ -345,6 +378,7 @@ private JPanel createCampaignXMLSaveTab() { .addComponent(optionPreferGzippedOutput) .addComponent(optionWriteCustomsToXML) .addComponent(optionSaveMothballState) + .addComponent(optionSaveCompanyGenerationOptions) ); layout.setHorizontalGroup( @@ -352,6 +386,7 @@ private JPanel createCampaignXMLSaveTab() { .addComponent(optionPreferGzippedOutput) .addComponent(optionWriteCustomsToXML) .addComponent(optionSaveMothballState) + .addComponent(optionSaveCompanyGenerationOptions) ); //endregion Layout @@ -405,6 +440,8 @@ protected void okAction() { MekHQ.getMekHQOptions().setLongDisplayDateFormat(optionLongDisplayDateFormat.getText()); } MekHQ.getMekHQOptions().setHistoricalDailyLog(optionHistoricalDailyLog.isSelected()); + MekHQ.getMekHQOptions().setShowCompanyGenerator(optionShowCompanyGenerator.isSelected()); + MekHQ.getMekHQOptions().setDefaultCompanyGenerationType((CompanyGenerationType) Objects.requireNonNull(optionDefaultCompanyGenerationType.getSelectedItem())); MekHQ.getMekHQOptions().setCommandCenterUseUnitMarket(optionCommandCenterUseUnitMarket.isSelected()); MekHQ.getMekHQOptions().setCommandCenterMRMS(optionCommandCenterMRMS.isSelected()); MekHQ.getMekHQOptions().setPersonnelFilterStyle((PersonnelFilterStyle) Objects.requireNonNull(optionPersonnelFilterStyle.getSelectedItem())); @@ -423,6 +460,7 @@ protected void okAction() { MekHQ.getMekHQOptions().setPreferGzippedOutput(optionPreferGzippedOutput.isSelected()); MekHQ.getMekHQOptions().setWriteCustomsToXML(optionWriteCustomsToXML.isSelected()); MekHQ.getMekHQOptions().setSaveMothballState(optionSaveMothballState.isSelected()); + MekHQ.getMekHQOptions().setSaveCompanyGenerationOptions(optionSaveCompanyGenerationOptions.isSelected()); MekHQ.getMekHQOptions().setStartGameDelay((Integer) optionStartGameDelay.getValue()); @@ -433,6 +471,8 @@ private void setInitialState() { optionDisplayDateFormat.setText(MekHQ.getMekHQOptions().getDisplayDateFormat()); optionLongDisplayDateFormat.setText(MekHQ.getMekHQOptions().getLongDisplayDateFormat()); optionHistoricalDailyLog.setSelected(MekHQ.getMekHQOptions().getHistoricalDailyLog()); + optionShowCompanyGenerator.setSelected(MekHQ.getMekHQOptions().getShowCompanyGenerator()); + optionDefaultCompanyGenerationType.setSelectedItem(MekHQ.getMekHQOptions().getDefaultCompanyGenerationType()); optionCommandCenterUseUnitMarket.setSelected(MekHQ.getMekHQOptions().getCommandCenterUseUnitMarket()); optionCommandCenterMRMS.setSelected(MekHQ.getMekHQOptions().getCommandCenterMRMS()); optionPersonnelFilterStyle.setSelectedItem(MekHQ.getMekHQOptions().getPersonnelFilterStyle()); @@ -451,6 +491,7 @@ private void setInitialState() { optionPreferGzippedOutput.setSelected(MekHQ.getMekHQOptions().getPreferGzippedOutput()); optionWriteCustomsToXML.setSelected(MekHQ.getMekHQOptions().getWriteCustomsToXML()); optionSaveMothballState.setSelected(MekHQ.getMekHQOptions().getSaveMothballState()); + optionSaveCompanyGenerationOptions.setSelected(MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()); optionStartGameDelay.setValue(MekHQ.getMekHQOptions().getStartGameDelay()); } diff --git a/MekHQ/src/mekhq/gui/enums/LayeredForceIcon.java b/MekHQ/src/mekhq/gui/enums/LayeredForceIcon.java index 8fb5cb4db3..3516c68c09 100644 --- a/MekHQ/src/mekhq/gui/enums/LayeredForceIcon.java +++ b/MekHQ/src/mekhq/gui/enums/LayeredForceIcon.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - The MegaMek Team. All Rights Reserved + * Copyright (c) 2020-2021 - The MegaMek Team. All Rights Reserved * * This file is part of MekHQ. * @@ -27,14 +27,14 @@ public enum LayeredForceIcon { //region Enum Declarations - TYPE("LayeredForceIcon.types", "Pieces/Type/", "tableTypes", ListSelectionModel.SINGLE_SELECTION), - FORMATION("LayeredForceIcon.formations", "Pieces/Formations/", "tableFormations", ListSelectionModel.SINGLE_SELECTION), - ADJUSTMENT("LayeredForceIcon.adjustments", "Pieces/Adjustments/", "tableAdjustments", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION), - ALPHANUMERIC("LayeredForceIcon.alphanumerics", "Pieces/Alphanumerics/", "tableAlphanumerics", ListSelectionModel.SINGLE_SELECTION), - SPECIAL_MODIFIER("LayeredForceIcon.special", "Pieces/Special Modifiers/", "tableSpecialModifiers", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION), - BACKGROUND("LayeredForceIcon.backgrounds", "Pieces/Backgrounds/", "tableBackgrounds", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION), - FRAME("LayeredForceIcon.frame", "Pieces/Frames/", "tableFrames", ListSelectionModel.SINGLE_SELECTION), - LOGO("LayeredForceIcon.logos", "Pieces/Logos/", "tableLogos", ListSelectionModel.SINGLE_SELECTION); + TYPE("LayeredForceIcon.types.text", "Pieces/Type/", "tableTypes", ListSelectionModel.SINGLE_SELECTION), + FORMATION("LayeredForceIcon.formations.text", "Pieces/Formations/", "tableFormations", ListSelectionModel.SINGLE_SELECTION), + ADJUSTMENT("LayeredForceIcon.adjustments.text", "Pieces/Adjustments/", "tableAdjustments", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION), + ALPHANUMERIC("LayeredForceIcon.alphanumerics.text", "Pieces/Alphanumerics/", "tableAlphanumerics", ListSelectionModel.SINGLE_SELECTION), + SPECIAL_MODIFIER("LayeredForceIcon.special.text", "Pieces/Special Modifiers/", "tableSpecialModifiers", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION), + BACKGROUND("LayeredForceIcon.backgrounds.text", "Pieces/Backgrounds/", "tableBackgrounds", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION), + FRAME("LayeredForceIcon.frame.text", "Pieces/Frames/", "tableFrames", ListSelectionModel.SINGLE_SELECTION), + LOGO("LayeredForceIcon.logos.text", "Pieces/Logos/", "tableLogos", ListSelectionModel.SINGLE_SELECTION); //endregion Enum Declarations //region Variable Declarations @@ -42,16 +42,20 @@ public enum LayeredForceIcon { private final String layerPath; // The String containing the individual layer's path private final String tableName; // The String used in JTable::setName for accessibility purposes private final int listSelectionModel; // The int used to determine how the selection + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations + //region Constructors LayeredForceIcon(String name, String layerPath, String tableName, int listSelectionModel) { - this.name = ResourceBundle.getBundle("mekhq.resources.GUIEnums", new EncodeControl()) - .getString(name); + this.name = resources.getString(name); this.layerPath = layerPath; this.tableName = tableName; this.listSelectionModel = listSelectionModel; } + //endregion Constructors + //region Getters public String getLayerPath() { return layerPath; } @@ -63,6 +67,7 @@ public String getTableName() { public int getListSelectionModel() { return listSelectionModel; } + //endregion Getters /** * @return the layered force icon enum values in the order they are drawn in diff --git a/MekHQ/src/mekhq/gui/enums/PersonnelFilter.java b/MekHQ/src/mekhq/gui/enums/PersonnelFilter.java index 5e194767b0..42db0ec357 100644 --- a/MekHQ/src/mekhq/gui/enums/PersonnelFilter.java +++ b/MekHQ/src/mekhq/gui/enums/PersonnelFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - The MegaMek Team. All Rights Reserved + * Copyright (c) 2020-2021 - The MegaMek Team. All Rights Reserved * * This file is part of MekHQ. * @@ -28,7 +28,7 @@ import java.util.ResourceBundle; public enum PersonnelFilter { - //region Personnel Filters + //region Enum Declarations //region Standard Personnel Filters ALL("PersonnelFilter.ALL"), ACTIVE("PersonnelFilter.ACTIVE"), @@ -77,7 +77,7 @@ public enum PersonnelFilter { KIA("PersonnelFilter.KIA", false, false), DEAD("PersonnelFilter.DEAD", false, false); //endregion Expanded Personnel Tab Filters - //endregion Personnel Filters + //endregion Enum Declarations //region Variable Declarations private final String name; @@ -85,7 +85,7 @@ public enum PersonnelFilter { private final boolean standard; private final boolean individualRole; - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUIEnums", new EncodeControl()); + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations //region Constructors diff --git a/MekHQ/src/mekhq/gui/enums/PersonnelFilterStyle.java b/MekHQ/src/mekhq/gui/enums/PersonnelFilterStyle.java index be8f3d48de..5b3b0d4b6d 100644 --- a/MekHQ/src/mekhq/gui/enums/PersonnelFilterStyle.java +++ b/MekHQ/src/mekhq/gui/enums/PersonnelFilterStyle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2020-2021 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -34,7 +34,7 @@ public enum PersonnelFilterStyle { private final String name; private final String toolTipText; - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUIEnums", new EncodeControl()); + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations //region Constructors @@ -44,6 +44,12 @@ public enum PersonnelFilterStyle { } //endregion Constructors + //region Getters + public String getToolTipText() { + return toolTipText; + } + //endregion Getters + public List getFilters(boolean standard) { switch (this) { case INDIVIDUAL_ROLE: @@ -59,10 +65,6 @@ public List getFilters(boolean standard) { } } - public String getToolTipText() { - return toolTipText; - } - @Override public String toString() { return name; diff --git a/MekHQ/src/mekhq/gui/enums/PersonnelTabView.java b/MekHQ/src/mekhq/gui/enums/PersonnelTabView.java index bd5e91df69..f9795c066c 100644 --- a/MekHQ/src/mekhq/gui/enums/PersonnelTabView.java +++ b/MekHQ/src/mekhq/gui/enums/PersonnelTabView.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 - The MegaMek Team. All Rights Reserved + * Copyright (c) 2020-2021 - The MegaMek Team. All Rights Reserved * * This file is part of MekHQ. * @@ -23,6 +23,7 @@ import java.util.ResourceBundle; public enum PersonnelTabView { + //region Enum Declarations GRAPHIC("PersonnelTabView.GRAPHIC"), GENERAL("PersonnelTabView.GENERAL"), PILOT_GUNNERY_SKILLS("PersonnelTabView.PILOT_GUNNERY_SKILLS"), @@ -32,13 +33,19 @@ public enum PersonnelTabView { ADMINISTRATIVE_SKILLS("PersonnelTabView.ADMINISTRATIVE_SKILLS"), BIOGRAPHICAL("PersonnelTabView.BIOGRAPHICAL"), FLUFF("PersonnelTabView.FLUFF"); + //endregion Enum Declarations + //region Variable Declarations private final String name; + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); + //endregion Variable Declarations + + //region Constructors PersonnelTabView(String name) { - this.name = ResourceBundle.getBundle("mekhq.resources.GUIEnums", new EncodeControl()) - .getString(name); + this.name = resources.getString(name); } + //endregion Constructors @Override public String toString() { diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java new file mode 100644 index 0000000000..f4acdc4fc8 --- /dev/null +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -0,0 +1,1091 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.view; + +import megamek.common.util.EncodeControl; +import megamek.common.util.sorter.NaturalOrderComparator; +import mekhq.MekHQ; +import mekhq.campaign.Campaign; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.universe.Faction; +import mekhq.campaign.universe.Factions; +import mekhq.campaign.universe.Planet; +import mekhq.campaign.universe.PlanetarySystem; +import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.campaign.universe.enums.ForceNamingType; +import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; +import mekhq.gui.FileDialogs; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.ResourceBundle; + +public class CompanyGenerationOptionsPanel extends JPanel { + //region Variable Declarations + private JFrame frame; + private Campaign campaign; + + // GUI Variables + // Base Information + private JComboBox comboCompanyGenerationType; + private JComboBox comboFaction; + private JComboBox comboStartingSystem; + private JComboBox comboStartingPlanet; + private JSpinner spnCompanyCount; + private JSpinner spnIndividualLanceCount; + private JCheckBox chkGenerateMercenaryCompanyCommandLance; + private JSpinner spnLancesPerCompany; + private JSpinner spnLanceSize; + + // Personnel + private JLabel lblTotalSupportPersonnel; + private RoleToSpinner[] spnSupportPersonnelNumbers; + private JCheckBox chkPoolAssistants; + private JCheckBox chkGenerateCaptains; + private JCheckBox chkAssignCompanyCommanderFlag; + private JCheckBox chkCompanyCommanderLanceOfficer; + private JCheckBox chkApplyOfficerStatBonusToWorstSkill; + private JCheckBox chkAssignBestOfficers; + private JCheckBox chkAutomaticallyAssignRanks; + + // Personnel Randomization + private JCheckBox chkRandomizeOrigin; + private JComboBox comboCentralSystem; + private JComboBox comboCentralPlanet; + private JSpinner spnOriginSearchRadius; + private JCheckBox chkExtraRandomOrigin; + private JSpinner spnOriginDistanceScale; + + // Units + private JCheckBox chkGenerateUnitsAsAttached; + private JCheckBox chkAssignBestRollToUnitCommander; + private JCheckBox chkGroupByWeight; + private JCheckBox chkKeepOfficerRollsSeparate; + private JSpinner spnStarLeagueYear; + private JCheckBox chkAssignTechsToUnits; + + // Unit + private JComboBox comboForceNamingType; + private JCheckBox chkGenerateForceIcons; + + // Spares + private JCheckBox ckhGenerateMothballedSpareUnits; + private JSpinner spnSparesPercentOfActiveUnits; + private JCheckBox chkGenerateSpareParts; + private JSpinner spnStartingArmourWeight; + private JCheckBox chkGenerateSpareAmmunition; + private JSpinner spnNumberReloadsPerWeapon; + private JCheckBox chkGenerateFractionalMachineGunAmmunition; + + // Contracts + private JCheckBox chkSelectStartingContract; + private JCheckBox chkStartCourseToContractPlanet; + + // Finances + private JSpinner spnStartingCash; + private JCheckBox chkRandomizeStartingCash; + private JSpinner spnRandomStartingCashDiceCount; + private JSpinner spnMinimumStartingFloat; + private JCheckBox chkPayForSetup; + private JCheckBox chkStartingLoan; + private JCheckBox chkPayForPersonnel; + private JCheckBox chkPayForUnits; + private JCheckBox chkPayForParts; + private JCheckBox chkPayForAmmunition; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); + //endregion Variable Declarations + + //region Constructors + public CompanyGenerationOptionsPanel(final JFrame frame, final Campaign campaign) { + setFrame(frame); + setCampaign(campaign); + + initialize(); + + if (campaign.getCampaignOptions().getCompanyGenerationOptions() == null) { + setOptions(MekHQ.getMekHQOptions().getDefaultCompanyGenerationType()); + } else { + setOptions(campaign.getCampaignOptions().getCompanyGenerationOptions()); + } + } + //endregion Constructors + + //region Getters/Setters + public JFrame getFrame() { + return frame; + } + + public void setFrame(JFrame frame) { + this.frame = frame; + } + + public Campaign getCampaign() { + return campaign; + } + + public void setCampaign(Campaign campaign) { + this.campaign = campaign; + } + + //region GUI Variables + //region Base Information + public JComboBox getComboCompanyGenerationType() { + return comboCompanyGenerationType; + } + + public CompanyGenerationType getCompanyGenerationType() { + return (CompanyGenerationType) Objects.requireNonNull(getComboCompanyGenerationType().getSelectedItem()); + } + + public void setComboCompanyGenerationType(JComboBox comboCompanyGenerationType) { + this.comboCompanyGenerationType = comboCompanyGenerationType; + } + + public JComboBox getComboFaction() { + return comboFaction; + } + + public Faction getFaction() { + return ((FactionChoice) Objects.requireNonNull(getComboFaction().getSelectedItem())).getFaction(); + } + + public void setComboFaction(JComboBox comboFaction) { + this.comboFaction = comboFaction; + } + + public JSpinner getSpnCompanyCount() { + return spnCompanyCount; + } + + public void setSpnCompanyCount(JSpinner spnCompanyCount) { + this.spnCompanyCount = spnCompanyCount; + } + + public JSpinner getSpnIndividualLanceCount() { + return spnIndividualLanceCount; + } + + public void setSpnIndividualLanceCount(JSpinner spnIndividualLanceCount) { + this.spnIndividualLanceCount = spnIndividualLanceCount; + } + + public JCheckBox getChkGenerateMercenaryCompanyCommandLance() { + return chkGenerateMercenaryCompanyCommandLance; + } + + public void setChkGenerateMercenaryCompanyCommandLance(JCheckBox chkGenerateMercenaryCompanyCommandLance) { + this.chkGenerateMercenaryCompanyCommandLance = chkGenerateMercenaryCompanyCommandLance; + } + + public JSpinner getSpnLancesPerCompany() { + return spnLancesPerCompany; + } + + public void setSpnLancesPerCompany(JSpinner spnLancesPerCompany) { + this.spnLancesPerCompany = spnLancesPerCompany; + } + + public JSpinner getSpnLanceSize() { + return spnLanceSize; + } + + public void setSpnLanceSize(JSpinner spnLanceSize) { + this.spnLanceSize = spnLanceSize; + } + //endregion Base Information + + //region Personnel + public JLabel getLblTotalSupportPersonnel() { + return lblTotalSupportPersonnel; + } + + public void updateLblTotalSupportPersonnel() { + updateLblTotalSupportPersonnel(((getChkGenerateMercenaryCompanyCommandLance().isSelected() ? 1 : 0) + + ((int) getSpnCompanyCount().getValue() * (int) getSpnLancesPerCompany().getValue()) + + (int) getSpnIndividualLanceCount().getValue()) * (int) getSpnLanceSize().getValue()); + } + + public void updateLblTotalSupportPersonnel(int numSupportPersonnel) { + getLblTotalSupportPersonnel().setText(String.format( + resources.getString("lblTotalSupportPersonnel.text"), numSupportPersonnel)); + } + + public void setLblTotalSupportPersonnel(JLabel lblTotalSupportPersonnel) { + this.lblTotalSupportPersonnel = lblTotalSupportPersonnel; + } + + public RoleToSpinner[] getSpnSupportPersonnelNumbers() { + return spnSupportPersonnelNumbers; + } + + public Map getSupportPersonnelNumbers() { + Map supportPersonnelNumbers = new HashMap<>(); + for (RoleToSpinner rts : getSpnSupportPersonnelNumbers()) { + if (rts.getValue() > 0) { + supportPersonnelNumbers.put(rts.getRole(), rts.getValue()); + } + } + return supportPersonnelNumbers; + } + + public void setSpnSupportPersonnelNumbers(RoleToSpinner... spnSupportPersonnelNumbers) { + this.spnSupportPersonnelNumbers = spnSupportPersonnelNumbers; + } + + public void setSupportPersonnelNumbers(Map supportPersonnelNumbers) { + for (RoleToSpinner rts : getSpnSupportPersonnelNumbers()) { + rts.getSpinner().setValue(supportPersonnelNumbers.getOrDefault(rts.getRole(), 0)); + } + } + + public JCheckBox getChkPoolAssistants() { + return chkPoolAssistants; + } + + public void setChkPoolAssistants(JCheckBox chkPoolAssistants) { + this.chkPoolAssistants = chkPoolAssistants; + } + + public JCheckBox getChkGenerateCaptains() { + return chkGenerateCaptains; + } + + public void setChkGenerateCaptains(JCheckBox chkGenerateCaptains) { + this.chkGenerateCaptains = chkGenerateCaptains; + } + + public JCheckBox getChkCompanyCommanderLanceOfficer() { + return chkCompanyCommanderLanceOfficer; + } + + public void setChkCompanyCommanderLanceOfficer(JCheckBox chkCompanyCommanderLanceOfficer) { + this.chkCompanyCommanderLanceOfficer = chkCompanyCommanderLanceOfficer; + } + + public JCheckBox getChkApplyOfficerStatBonusToWorstSkill() { + return chkApplyOfficerStatBonusToWorstSkill; + } + + public void setChkApplyOfficerStatBonusToWorstSkill(JCheckBox chkApplyOfficerStatBonusToWorstSkill) { + this.chkApplyOfficerStatBonusToWorstSkill = chkApplyOfficerStatBonusToWorstSkill; + } + + public JCheckBox getChkAssignBestOfficers() { + return chkAssignBestOfficers; + } + + public void setChkAssignBestOfficers(JCheckBox chkAssignBestOfficers) { + this.chkAssignBestOfficers = chkAssignBestOfficers; + } + + public JCheckBox getChkAutomaticallyAssignRanks() { + return chkAutomaticallyAssignRanks; + } + + public void setChkAutomaticallyAssignRanks(JCheckBox chkAutomaticallyAssignRanks) { + this.chkAutomaticallyAssignRanks = chkAutomaticallyAssignRanks; + } + //endregion Personnel + + //region Units + public JCheckBox getChkGenerateUnitsAsAttached() { + return chkGenerateUnitsAsAttached; + } + + public void setChkGenerateUnitsAsAttached(JCheckBox chkGenerateUnitsAsAttached) { + this.chkGenerateUnitsAsAttached = chkGenerateUnitsAsAttached; + } + + public JCheckBox getChkAssignBestRollToUnitCommander() { + return chkAssignBestRollToUnitCommander; + } + + public void setChkAssignBestRollToUnitCommander(JCheckBox chkAssignBestRollToUnitCommander) { + this.chkAssignBestRollToUnitCommander = chkAssignBestRollToUnitCommander; + } + + public JCheckBox getChkGroupByWeight() { + return chkGroupByWeight; + } + + public void setChkGroupByWeight(JCheckBox chkGroupByWeight) { + this.chkGroupByWeight = chkGroupByWeight; + } + //endregion Units + + //region Unit + public JComboBox getComboForceNamingType() { + return comboForceNamingType; + } + + public ForceNamingType getForceNamingType() { + return (ForceNamingType) Objects.requireNonNull(getComboForceNamingType().getSelectedItem()); + } + + public void setComboForceNamingType(JComboBox comboForceNamingType) { + this.comboForceNamingType = comboForceNamingType; + } + + public JCheckBox getChkGenerateForceIcons() { + return chkGenerateForceIcons; + } + + public void setChkGenerateForceIcons(JCheckBox chkGenerateForceIcons) { + this.chkGenerateForceIcons = chkGenerateForceIcons; + } + //endregion Unit + + //region Finances + public JSpinner getSpnStartingCash() { + return spnStartingCash; + } + + public void setSpnStartingCash(JSpinner spnStartingCash) { + this.spnStartingCash = spnStartingCash; + } + + public JCheckBox getChkRandomizeStartingCash() { + return chkRandomizeStartingCash; + } + + public void setChkRandomizeStartingCash(JCheckBox chkRandomizeStartingCash) { + this.chkRandomizeStartingCash = chkRandomizeStartingCash; + } + + public JSpinner getSpnMinimumStartingFloat() { + return spnMinimumStartingFloat; + } + + public void setSpnMinimumStartingFloat(JSpinner spnMinimumStartingFloat) { + this.spnMinimumStartingFloat = spnMinimumStartingFloat; + } + + public JCheckBox getChkPayForSetup() { + return chkPayForSetup; + } + + public void setChkPayForSetup(JCheckBox chkPayForSetup) { + this.chkPayForSetup = chkPayForSetup; + } + + public JCheckBox getChkStartingLoan() { + return chkStartingLoan; + } + + public void setChkStartingLoan(JCheckBox chkStartingLoan) { + this.chkStartingLoan = chkStartingLoan; + } + + public JCheckBox getChkPayForPersonnel() { + return chkPayForPersonnel; + } + + public void setChkPayForPersonnel(JCheckBox chkPayForPersonnel) { + this.chkPayForPersonnel = chkPayForPersonnel; + } + + public JCheckBox getChkPayForUnits() { + return chkPayForUnits; + } + + public void setChkPayForUnits(JCheckBox chkPayForUnits) { + this.chkPayForUnits = chkPayForUnits; + } + + public JCheckBox getChkPayForParts() { + return chkPayForParts; + } + + public void setChkPayForParts(JCheckBox chkPayForParts) { + this.chkPayForParts = chkPayForParts; + } + + public JCheckBox getChkPayForAmmunition() { + return chkPayForAmmunition; + } + + public void setChkPayForAmmunition(JCheckBox chkPayForAmmunition) { + this.chkPayForAmmunition = chkPayForAmmunition; + } + //endregion Finances + //endregion GUI Variables + //endregion Getters/Setters + + //region Initialization + private void initialize() { + setName("companyGenerationOptionsPanel"); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.fill = GridBagConstraints.HORIZONTAL; + add(createBaseInformationPanel(), gbc); + + gbc.gridx++; + add(createPersonnelPanel(), gbc); + + gbc.gridx = 0; + gbc.gridy++; + add(createUnitsPanel(), gbc); + + gbc.gridx++; + add(createUnitPanel(), gbc); + + gbc.gridx = 0; + gbc.gridy++; + add(createFinancesPanel(), gbc); + } + + private JPanel createBaseInformationPanel() { + JLabel lblCompanyGenerationType = new JLabel(resources.getString("lblCompanyGenerationType.text")); + lblCompanyGenerationType.setName("lblCompanyGenerationType"); + + setComboCompanyGenerationType(new JComboBox<>(CompanyGenerationType.values())); + getComboCompanyGenerationType().setName("comboCompanyGenerationType"); + + JLabel lblFaction = new JLabel(resources.getString("lblFaction.text")); + lblFaction.setName("lblFaction"); + + setComboFaction(new JComboBox<>(getFactionChoices().toArray(new FactionChoice[]{}))); + getComboFaction().setName("comboFaction"); + + setChkGenerateMercenaryCompanyCommandLance(new JCheckBox(resources.getString("chkGenerateMercenaryCompanyCommandLance.text"))); + getChkGenerateMercenaryCompanyCommandLance().setName("chkGenerateMercenaryCompanyCommandLance"); + + JLabel lblCompanyCount = new JLabel(resources.getString("lblCompanyCount.text")); + lblCompanyCount.setName("lblCompanyCount"); + + setSpnCompanyCount(new JSpinner(new SpinnerNumberModel(0, 0, 3, 1))); + getSpnCompanyCount().setName("spnCompanyCount"); + + JLabel lblIndividualLanceCount = new JLabel(resources.getString("lblIndividualLanceCount.text")); + lblIndividualLanceCount.setName("lblIndividualLanceCount"); + + setSpnIndividualLanceCount(new JSpinner(new SpinnerNumberModel(0, 0, 2, 1))); + getSpnIndividualLanceCount().setName("spnIndividualLanceCount"); + + JLabel lblLancesPerCompany = new JLabel(resources.getString("lblLancesPerCompany.text")); + lblLancesPerCompany.setName("lblLancesPerCompany"); + + setSpnLancesPerCompany(new JSpinner(new SpinnerNumberModel(3, 2, 5, 1))); + getSpnLancesPerCompany().setName("spnLancesPerCompany"); + + JLabel lblLanceSize = new JLabel(resources.getString("lblLanceSize.text")); + lblLanceSize.setName("lblLanceSize"); + + setSpnLanceSize(new JSpinner(new SpinnerNumberModel(4, 3, 6, 1))); + getSpnLanceSize().setName("spnLanceSize"); + + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("baseInformationPanel.title"))); + panel.setName("baseInformationPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblCompanyGenerationType) + .addComponent(getComboCompanyGenerationType(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblFaction) + .addComponent(getComboFaction()) + .addComponent(getChkGenerateMercenaryCompanyCommandLance(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblCompanyCount) + .addComponent(getSpnCompanyCount()) + .addComponent(lblIndividualLanceCount) + .addComponent(getSpnIndividualLanceCount(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblLancesPerCompany) + .addComponent(getSpnLancesPerCompany()) + .addComponent(lblLanceSize) + .addComponent(getSpnLanceSize(), GroupLayout.Alignment.LEADING)) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(lblCompanyGenerationType) + .addComponent(getComboCompanyGenerationType())) + .addGroup(layout.createSequentialGroup() + .addComponent(lblFaction) + .addComponent(getComboFaction()) + .addComponent(getChkGenerateMercenaryCompanyCommandLance())) + .addGroup(layout.createSequentialGroup() + .addComponent(lblCompanyCount) + .addComponent(getSpnCompanyCount()) + .addComponent(lblIndividualLanceCount) + .addComponent(getSpnIndividualLanceCount())) + .addGroup(layout.createSequentialGroup() + .addComponent(lblLancesPerCompany) + .addComponent(getSpnLancesPerCompany()) + .addComponent(lblLanceSize) + .addComponent(getSpnLanceSize())) + ); + return panel; + } + + private JPanel createPersonnelPanel() { + setLblTotalSupportPersonnel(new JLabel()); + updateLblTotalSupportPersonnel(0); + getLblTotalSupportPersonnel().setName("lblTotalSupportPersonnel"); + + JPanel supportPersonnelNumbersPanel = createSupportPersonnelNumbersPanel(); + + setChkPoolAssistants(new JCheckBox(resources.getString("chkPoolAssistants.text"))); + getChkPoolAssistants().setToolTipText(resources.getString("chkPoolAssistants.toolTipText")); + getChkPoolAssistants().setName("chkPoolAssistants"); + + setChkGenerateCaptains(new JCheckBox(resources.getString("chkGenerateCaptains.text"))); + getChkGenerateCaptains().setToolTipText(resources.getString("chkGenerateCaptains.toolTipText")); + getChkGenerateCaptains().setName("chkGenerateCaptains"); + + setChkCompanyCommanderLanceOfficer(new JCheckBox(resources.getString("chkCompanyCommanderLanceOfficer.text"))); + getChkCompanyCommanderLanceOfficer().setToolTipText(resources.getString("chkCompanyCommanderLanceOfficer.toolTipText")); + getChkCompanyCommanderLanceOfficer().setName("chkCompanyCommanderLanceOfficer"); + + setChkApplyOfficerStatBonusToWorstSkill(new JCheckBox(resources.getString("chkApplyOfficerStatBonusToWorstSkill.text"))); + getChkApplyOfficerStatBonusToWorstSkill().setName("chkApplyOfficerStatBonusToWorstSkill"); + + setChkAssignBestOfficers(new JCheckBox(resources.getString("chkAssignBestOfficers.text"))); + getChkAssignBestOfficers().setName("chkAssignBestOfficers"); + + setChkAutomaticallyAssignRanks(new JCheckBox(resources.getString("chkAutomaticallyAssignRanks.text"))); + getChkAutomaticallyAssignRanks().setName("chkAutomaticallyAssignRanks"); + + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("personnelPanel.title"))); + panel.setName("personnelPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getLblTotalSupportPersonnel()) + .addComponent(supportPersonnelNumbersPanel) + .addComponent(getChkPoolAssistants()) + .addComponent(getChkGenerateCaptains()) + .addComponent(getChkCompanyCommanderLanceOfficer()) + .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) + .addComponent(getChkAssignBestOfficers()) + .addComponent(getChkAutomaticallyAssignRanks()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(getLblTotalSupportPersonnel()) + .addComponent(supportPersonnelNumbersPanel) + .addComponent(getChkPoolAssistants()) + .addComponent(getChkGenerateCaptains()) + .addComponent(getChkCompanyCommanderLanceOfficer()) + .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) + .addComponent(getChkAssignBestOfficers()) + .addComponent(getChkAutomaticallyAssignRanks()) + ); + return panel; + } + + private JPanel createSupportPersonnelNumbersPanel() { + // This nasty array and panel must currently be created manually, for now at least + final RoleToSpinner[] rtsArray = new RoleToSpinner[9]; + final JLabel[] rtsLabelArray = new JLabel[9]; + + String roleName = Person.getRoleDesc(Person.T_MECH_TECH, false); + rtsLabelArray[0] = new JLabel(roleName); + rtsLabelArray[0].setName("lbl" + roleName); + rtsArray[0] = new RoleToSpinner(Person.T_MECH_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[0].getSpinner().setName("spn" + roleName); + + roleName = Person.getRoleDesc(Person.T_MECHANIC, false); + rtsLabelArray[1] = new JLabel(roleName); + rtsLabelArray[1].setName("lbl" + roleName); + rtsArray[1] = new RoleToSpinner(Person.T_MECHANIC, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[1].getSpinner().setName("spn" + roleName); + + roleName = Person.getRoleDesc(Person.T_AERO_TECH, false); + rtsLabelArray[2] = new JLabel(roleName); + rtsLabelArray[2].setName("lbl" + roleName); + rtsArray[2] = new RoleToSpinner(Person.T_AERO_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[2].getSpinner().setName("spn" + roleName); + + roleName = Person.getRoleDesc(Person.T_BA_TECH, false); + rtsLabelArray[3] = new JLabel(roleName); + rtsLabelArray[3].setName("lbl" + roleName); + rtsArray[3] = new RoleToSpinner(Person.T_BA_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[3].getSpinner().setName("spn" + roleName); + + roleName = Person.getRoleDesc(Person.T_DOCTOR, false); + rtsLabelArray[4] = new JLabel(roleName); + rtsLabelArray[4].setName("lbl" + roleName); + rtsArray[4] = new RoleToSpinner(Person.T_DOCTOR, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[4].getSpinner().setName("spn" + roleName); + + roleName = Person.getRoleDesc(Person.T_ADMIN_COM, false); + rtsLabelArray[5] = new JLabel(roleName); + rtsLabelArray[5].setName("lbl" + roleName); + rtsArray[5] = new RoleToSpinner(Person.T_ADMIN_COM, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[5].getSpinner().setName("spn" + roleName); + + roleName = Person.getRoleDesc(Person.T_ADMIN_LOG, false); + rtsLabelArray[6] = new JLabel(roleName); + rtsLabelArray[6].setName("lbl" + roleName); + rtsArray[6] = new RoleToSpinner(Person.T_ADMIN_LOG, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[6].getSpinner().setName("spn" + roleName); + + roleName = Person.getRoleDesc(Person.T_ADMIN_TRA, false); + rtsLabelArray[7] = new JLabel(roleName); + rtsLabelArray[7].setName("lbl" + roleName); + rtsArray[7] = new RoleToSpinner(Person.T_ADMIN_TRA, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[7].getSpinner().setName("spn" + roleName); + + roleName = Person.getRoleDesc(Person.T_ADMIN_HR, false); + rtsLabelArray[8] = new JLabel(roleName); + rtsLabelArray[8].setName("lbl" + roleName); + rtsArray[8] = new RoleToSpinner(Person.T_ADMIN_HR, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[8].getSpinner().setName("spn" + roleName); + setSpnSupportPersonnelNumbers(rtsArray); + + // Layout the UI + JPanel panel = new JPanel(new GridLayout(6, 3)); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("supportPersonnelNumbersPanel.title"))); + panel.setName("supportPersonnelNumbersPanel"); + + for (int i = 0; i < 3; i++) { + panel.add(rtsLabelArray[i]); + } + for (int i = 0; i < 3; i++) { + panel.add(rtsArray[i].getSpinner()); + } + for (int i = 3; i < 6; i++) { + panel.add(rtsLabelArray[i]); + } + for (int i = 3; i < 6; i++) { + panel.add(rtsArray[i].getSpinner()); + } + for (int i = 6; i < rtsLabelArray.length; i++) { + panel.add(rtsLabelArray[i]); + } + for (int i = 6; i < rtsArray.length; i++) { + panel.add(rtsArray[i].getSpinner()); + } + return panel; + } + + private JPanel createUnitsPanel() { + setChkGenerateUnitsAsAttached(new JCheckBox(resources.getString("chkGenerateUnitsAsAttached.text"))); + getChkGenerateUnitsAsAttached().setToolTipText(resources.getString("chkGenerateUnitsAsAttached.toolTipText")); + getChkGenerateUnitsAsAttached().setName("chkGenerateUnitsAsAttached"); + + setChkAssignBestRollToUnitCommander(new JCheckBox(resources.getString("chkAssignBestRollToUnitCommander.text"))); + getChkAssignBestRollToUnitCommander().setToolTipText(resources.getString("chkAssignBestRollToUnitCommander.toolTipText")); + getChkAssignBestRollToUnitCommander().setName("chkAssignBestRollToUnitCommander"); + + setChkGroupByWeight(new JCheckBox(resources.getString("chkGroupByWeight.text"))); + getChkGroupByWeight().setToolTipText(resources.getString("chkGroupByWeight.toolTipText")); + getChkGroupByWeight().setName("chkGroupByWeight"); + + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitsPanel.title"))); + panel.setName("unitsPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getChkGenerateUnitsAsAttached()) + .addComponent(getChkAssignBestRollToUnitCommander()) + .addComponent(getChkGroupByWeight()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(getChkGenerateUnitsAsAttached()) + .addComponent(getChkAssignBestRollToUnitCommander()) + .addComponent(getChkGroupByWeight()) + ); + return panel; + } + + private JPanel createUnitPanel() { + JLabel lblForceNamingType = new JLabel(resources.getString("lblForceNamingType.text")); + lblForceNamingType.setName("lblForceNamingType"); + + setComboForceNamingType(new JComboBox<>(ForceNamingType.values())); + getComboForceNamingType().setName("comboForceNamingType"); + + setChkGenerateForceIcons(new JCheckBox(resources.getString("chkGenerateForceIcons.text"))); + getChkGenerateForceIcons().setName("chkGenerateForceIcons"); + + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitPanel.title"))); + panel.setName("unitPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblForceNamingType) + .addComponent(getComboForceNamingType(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkGenerateForceIcons()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(lblForceNamingType) + .addComponent(getComboForceNamingType())) + .addComponent(getChkGenerateForceIcons()) + ); + return panel; + } + + private JPanel createFinancesPanel() { + JLabel lblStartingCash = new JLabel(resources.getString("lblStartingCash.text")); + lblStartingCash.setName("lblStartingCash"); + + setSpnStartingCash(new JSpinner(new SpinnerNumberModel(0, 0, 200000000, 100000))); + getSpnStartingCash().setName("spnStartingCash"); + + setChkRandomizeStartingCash(new JCheckBox(resources.getString("chkRandomizeStartingCash.text"))); + getChkRandomizeStartingCash().setToolTipText(resources.getString("chkRandomizeStartingCash.toolTipText")); + getChkRandomizeStartingCash().setName("chkRandomizeStartingCash"); + + JLabel lblMinimumStartingFloat = new JLabel(resources.getString("lblMinimumStartingFloat.text")); + lblMinimumStartingFloat.setToolTipText(resources.getString("lblMinimumStartingFloat.toolTipText")); + lblMinimumStartingFloat.setName("lblMinimumStartingFloat"); + + setSpnMinimumStartingFloat(new JSpinner(new SpinnerNumberModel(0, 0, 10000000, 100000))); + getSpnMinimumStartingFloat().setToolTipText("lblMinimumStartingFloat.toolTipText"); + getSpnMinimumStartingFloat().setName("spnMinimumStartingFloat"); + + setChkPayForSetup(new JCheckBox(resources.getString("chkPayForSetup.text"))); + getChkPayForSetup().setToolTipText(resources.getString("chkPayForSetup.toolTipText")); + getChkPayForSetup().setName("chkPayForSetup"); + + setChkStartingLoan(new JCheckBox(resources.getString("chkStartingLoan.text"))); + getChkStartingLoan().setToolTipText(resources.getString("chkStartingLoan.toolTipText")); + getChkStartingLoan().setName("chkStartingLoan"); + + setChkPayForPersonnel(new JCheckBox(resources.getString("chkPayForPersonnel.text"))); + getChkPayForPersonnel().setToolTipText(resources.getString("chkPayForPersonnel.toolTipText")); + getChkPayForPersonnel().setName("chkPayForPersonnel"); + + setChkPayForUnits(new JCheckBox(resources.getString("chkPayForUnits.text"))); + getChkPayForUnits().setToolTipText(resources.getString("chkPayForUnits.toolTipText")); + getChkPayForUnits().setName("chkPayForUnits"); + + setChkPayForParts(new JCheckBox(resources.getString("chkPayForParts.text"))); + getChkPayForParts().setToolTipText(resources.getString("chkPayForParts.toolTipText")); + getChkPayForParts().setName("chkPayForParts"); + + setChkPayForAmmunition(new JCheckBox(resources.getString("chkPayForAmmunition.text"))); + getChkPayForAmmunition().setToolTipText(resources.getString("chkPayForAmmunition.toolTipText")); + getChkPayForAmmunition().setName("chkPayForAmmunition"); + + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financesPanel.title"))); + panel.setName("financesPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblStartingCash) + .addComponent(getSpnStartingCash(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkRandomizeStartingCash()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblMinimumStartingFloat) + .addComponent(getSpnMinimumStartingFloat(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkPayForSetup()) + .addComponent(getChkStartingLoan()) + .addComponent(getChkPayForPersonnel()) + .addComponent(getChkPayForUnits()) + .addComponent(getChkPayForParts()) + .addComponent(getChkPayForAmmunition()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(lblStartingCash) + .addComponent(getSpnStartingCash())) + .addComponent(getChkRandomizeStartingCash()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblMinimumStartingFloat) + .addComponent(getSpnMinimumStartingFloat())) + .addComponent(getChkPayForSetup()) + .addComponent(getChkStartingLoan()) + .addComponent(getChkPayForPersonnel()) + .addComponent(getChkPayForUnits()) + .addComponent(getChkPayForParts()) + .addComponent(getChkPayForAmmunition()) + ); + return panel; + } + + private List getFactionChoices() { + final List factionChoices = new ArrayList<>(); + + for (Faction faction : Factions.getInstance().getFactions()) { + factionChoices.add(new FactionChoice(faction, getCampaign().getGameYear())); + } + + final NaturalOrderComparator noc = new NaturalOrderComparator(); + factionChoices.sort((a, b) -> noc.compare(a.toString(), b.toString())); + + return factionChoices; + } + //endregion Initialization + + //region Options + public void setOptions() { + setOptions(getCompanyGenerationType()); + } + + public void setOptions(final CompanyGenerationType type) { + getComboCompanyGenerationType().setSelectedItem(type); + setOptions(new CompanyGenerationOptions(type, getCampaign())); + } + + public void setOptions(final CompanyGenerationOptions options) { + // Base Information + getComboCompanyGenerationType().setSelectedItem(options.getType()); + + getComboFaction().setSelectedIndex(0); // default to 0 + final List factionChoices = getFactionChoices(); + for (int i = 0; i < factionChoices.size(); i++) { + if (options.getFaction().equals(factionChoices.get(i).getFaction())) { + getComboFaction().setSelectedIndex(i); + break; + } + } + + getSpnCompanyCount().setValue(options.getCompanyCount()); + getSpnIndividualLanceCount().setValue(options.getIndividualLanceCount()); + getChkGenerateMercenaryCompanyCommandLance().setSelected(options.isGenerateMercenaryCompanyCommandLance()); + getSpnLancesPerCompany().setValue(options.getLancesPerCompany()); + getSpnLanceSize().setValue(options.getLanceSize()); + + // Personnel + updateLblTotalSupportPersonnel(); + setSupportPersonnelNumbers(options.getSupportPersonnel()); + getChkPoolAssistants().setSelected(options.isPoolAssistants()); + getChkGenerateCaptains().setSelected(options.isGenerateCaptains()); + getChkCompanyCommanderLanceOfficer().setSelected(options.isCompanyCommanderLanceOfficer()); + getChkApplyOfficerStatBonusToWorstSkill().setSelected(options.isApplyOfficerStatBonusToWorstSkill()); + getChkAssignBestOfficers().setSelected(options.isAssignBestOfficers()); + getChkAutomaticallyAssignRanks().setSelected(options.isAutomaticallyAssignRanks()); + + // Units + getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); + getChkAssignBestRollToUnitCommander().setSelected(options.isAssignBestRollToUnitCommander()); + getChkGroupByWeight().setSelected(options.isGroupByWeight()); + + // Unit + getComboForceNamingType().setSelectedItem(options.getForceNamingType()); + getChkGenerateForceIcons().setSelected(options.isGenerateForceIcons()); + + // Finances + getSpnStartingCash().setValue(options.getStartingCash()); + getChkRandomizeStartingCash().setSelected(options.isRandomizeStartingCash()); + getSpnMinimumStartingFloat().setValue(options.getMinimumStartingFloat()); + getChkPayForSetup().setSelected(options.isPayForSetup()); + getChkStartingLoan().setSelected(options.isStartingLoan()); + getChkPayForPersonnel().setSelected(options.isPayForPersonnel()); + getChkPayForUnits().setSelected(options.isPayForUnits()); + getChkPayForParts().setSelected(options.isPayForParts()); + getChkPayForAmmunition().setSelected(options.isPayForAmmunition()); + } + + /** + * @return the CompanyGenerationOptions created from the current panel + */ + public CompanyGenerationOptions createOptionsFromPanel() { + final CompanyGenerationOptions options = new CompanyGenerationOptions(); + // Base Information + options.setType(getCompanyGenerationType()); + options.setFaction(getFaction()); + options.setCompanyCount((Integer) getSpnCompanyCount().getValue()); + options.setIndividualLanceCount((Integer) getSpnIndividualLanceCount().getValue()); + options.setGenerateMercenaryCompanyCommandLance(getChkGenerateMercenaryCompanyCommandLance().isSelected()); + options.setLancesPerCompany((Integer) getSpnLancesPerCompany().getValue()); + options.setLanceSize((Integer) getSpnLanceSize().getValue()); + + // Personnel + options.setSupportPersonnel(getSupportPersonnelNumbers()); + options.setPoolAssistants(getChkPoolAssistants().isSelected()); + options.setGenerateCaptains(getChkGenerateCaptains().isSelected()); + options.setCompanyCommanderLanceOfficer(getChkCompanyCommanderLanceOfficer().isSelected()); + options.setApplyOfficerStatBonusToWorstSkill(getChkApplyOfficerStatBonusToWorstSkill().isSelected()); + options.setAssignBestOfficers(getChkAssignBestOfficers().isSelected()); + options.setAutomaticallyAssignRanks(getChkAutomaticallyAssignRanks().isSelected()); + + // Units + options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); + options.setAssignBestRollToUnitCommander(getChkAssignBestRollToUnitCommander().isSelected()); + options.setGroupByWeight(getChkGroupByWeight().isSelected()); + + // Unit + options.setForceNamingType(getForceNamingType()); + options.setGenerateForceIcons(getChkGenerateForceIcons().isSelected()); + + // Finances + options.setStartingCash((Integer) getSpnStartingCash().getValue()); + options.setRandomizeStartingCash(getChkRandomizeStartingCash().isSelected()); + options.setMinimumStartingFloat((Integer) getSpnMinimumStartingFloat().getValue()); + options.setPayForSetup(getChkPayForSetup().isSelected()); + options.setStartingLoan(getChkStartingLoan().isSelected()); + options.setPayForPersonnel(getChkPayForPersonnel().isSelected()); + options.setPayForUnits(getChkPayForUnits().isSelected()); + options.setPayForParts(getChkPayForParts().isSelected()); + options.setPayForAmmunition(getChkPayForAmmunition().isSelected()); + + return options; + } + + public boolean validateOptions() { + return ((int) getSpnCompanyCount().getValue() + (int) getSpnIndividualLanceCount().getValue()) > 0; + } + //endregion Options + + //region File I/O + public void importOptionsFromXML() { + File file = FileDialogs.openCompanyGenerationOptions(getFrame()).orElse(null); + setOptions(CompanyGenerationOptions.parseFromXML(file, getCampaign())); + } + + public void exportOptionsToXML() { + File file = FileDialogs.saveCompanyGenerationOptions(getFrame()).orElse(null); + createOptionsFromPanel().writeToFile(file); + } + //endregion File I/O + + //region Static Classes + private static class FactionChoice { + //region Variable Declarations + private Faction faction; + private int year; + private String displayName; + //endregion Variable Declarations + + //region Constructors + public FactionChoice(Faction faction, int year) { + setFaction(faction); + setYear(year); + setDisplayName(); + } + //endregion Constructors + + //region Getters/Setters + public Faction getFaction() { + return faction; + } + + public void setFaction(Faction faction) { + this.faction = faction; + } + + public int getYear() { + return year; + } + + public void setYear(int year) { + this.year = year; + } + + private void setDisplayName() { + this.displayName = String.format("%s [%s]", getFaction().getFullName(getYear()), + getFaction().getShortName()); + } + //endregion Getters/Setters + + @Override + public String toString() { + return displayName; + } + } + + private static class RoleToSpinner { + //region Variable Declarations + private int role; + private JSpinner spinner; + //endregion Variable Declarations + + //region Constructors + public RoleToSpinner(final int role, final JSpinner spinner) { + setRole(role); + setSpinner(spinner); + } + //endregion Constructors + + //region Getters/Setters + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public JSpinner getSpinner() { + return spinner; + } + + public int getValue() { + return (Integer) getSpinner().getValue(); + } + + public void setSpinner(JSpinner spinner) { + this.spinner = spinner; + } + //endregion Getters/Setters + } + //endregion Static Classes +} diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java new file mode 100644 index 0000000000..2cf79e0850 --- /dev/null +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java @@ -0,0 +1,94 @@ +package mekhq.gui.view; + +import megamek.common.Entity; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; + +import javax.swing.*; +import java.util.List; + +public class CompanyGenerationPanel { + //region Variable Declarations + private AbstractCompanyGenerator companyGenerator = null; + + // Data + private List combatPersonnel; + private List supportPersonnel; + private List entities; + //endregion Variable Declarations + + //region Getters/Setters + public AbstractCompanyGenerator getCompanyGenerator() { + return companyGenerator; + } + + public void setCompanyGenerator(AbstractCompanyGenerator companyGenerator) { + this.companyGenerator = companyGenerator; + } + + //region Data + public List getCombatPersonnel() { + return combatPersonnel; + } + + public void setCombatPersonnel(List combatPersonnel) { + this.combatPersonnel = combatPersonnel; + } + + public List getSupportPersonnel() { + return supportPersonnel; + } + + public void setSupportPersonnel(List supportPersonnel) { + this.supportPersonnel = supportPersonnel; + } + + public List getEntities() { + return entities; + } + + public void setEntities(List entities) { + this.entities = entities; + } + //endregion Data + //endregion Getters/Setters + + + public void generate() { + if ((getCompanyGenerator() != null) && (JOptionPane.showConfirmDialog(getFrame(), + resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.text"), + resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.title"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { + return; + } else if (!validateOptions()) { + return; + } + + setCompanyGenerator(getCompanyGenerationType().getGenerator(getCampaign())); + getCompanyGenerator().setOptions(createOptionsFromPanel()); + + setCombatPersonnel(getCompanyGenerator().generateCombatPersonnel(getCampaign())); + setSupportPersonnel(getCompanyGenerator().generateSupportPersonnel(getCampaign())); + setEntities(getCompanyGenerator().generateUnits(getCampaign(), getCombatPersonnel())); + } + + public void apply() { + if (getCompanyGenerator() == null) { + if (JOptionPane.showConfirmDialog(getFrame(), + resources.getString("CompanyGenerationPanel.ImmediateApplicationWarning.text"), + resources.getString("CompanyGenerationPanel.ImmediateApplicationWarning.title"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { + generate(); + // Catch statement for bad data + if (getCompanyGenerator() == null) { + return; + } + } else { + return; + } + } + + getCompanyGenerator().applyToCampaign(getCampaign(), getCombatPersonnel(), + getSupportPersonnel(), getEntities()); + } +} From a10e2c174a8177023436956d565b793f223fd139 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 7 Feb 2021 17:27:41 -0700 Subject: [PATCH 004/115] Applying changes from intermediate review --- .../resources/mekhq/resources/GUI.properties | 2 +- .../mekhq/resources/Universe.properties | 204 +++++++++--------- 2 files changed, 103 insertions(+), 103 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index d98b21af22..43677db071 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -176,7 +176,7 @@ chkGenerateForceIcons.text=Generate Force Icons financesPanel.title=Finances lblStartingCash.text=Starting C-Bills chkRandomizeStartingCash.text=Randomize Starting C-Bills -chkRandomizeStartingCash.toolTipText=This addition assigns a random +chkRandomizeStartingCash.toolTipText=This overrides the starting C-Bills with a random roll of nd6 million C-Bills, with the n specified below. lblMinimumStartingFloat.text=Minimum Starting Float lblMinimumStartingFloat.toolTipText= chkPayForSetup.text=Pay for Setup diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index c244512ad6..121a20d2a1 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -1,102 +1,102 @@ -# This is used to store any mekhq/campaign/universe Resources - -## General Universe Resources - -## Enums -# Alphabet Enum -Alphabets.A.ccb1943.text=Able -Alphabets.B.ccb1943.text=Baker -Alphabets.C.ccb1943.text=Charlie -Alphabets.D.ccb1943.text=Dog -Alphabets.E.ccb1943.text=Easy -Alphabets.F.ccb1943.text=Fox -Alphabets.G.ccb1943.text=George -Alphabets.H.ccb1943.text=How -Alphabets.I.ccb1943.text=Item -Alphabets.J.ccb1943.text=Jig -Alphabets.K.ccb1943.text=King -Alphabets.L.ccb1943.text=Love -Alphabets.M.ccb1943.text=Mike -Alphabets.N.ccb1943.text=Nan -Alphabets.O.ccb1943.text=Oboe -Alphabets.P.ccb1943.text=Peter -Alphabets.Q.ccb1943.text=Queen -Alphabets.R.ccb1943.text=Roger -Alphabets.S.ccb1943.text=Sugar -Alphabets.T.ccb1943.text=Tare -Alphabets.U.ccb1943.text=Uncle -Alphabets.V.ccb1943.text=Victor -Alphabets.W.ccb1943.text=William -Alphabets.X.ccb1943.text=Xray -Alphabets.Y.ccb1943.text=Yoke -Alphabets.Z.ccb1943.text=Zebra -Alphabets.A.icao1956.text=Alfa -Alphabets.B.icao1956.text=Bravo -Alphabets.C.icao1956.text=Charlie -Alphabets.D.icao1956.text=Delta -Alphabets.E.icao1956.text=Echo -Alphabets.F.icao1956.text=Foxtrot -Alphabets.G.icao1956.text=Golf -Alphabets.H.icao1956.text=Hotel -Alphabets.I.icao1956.text=India -Alphabets.J.icao1956.text=Juliett -Alphabets.K.icao1956.text=Kilo -Alphabets.L.icao1956.text=Lima -Alphabets.M.icao1956.text=Mike -Alphabets.N.icao1956.text=November -Alphabets.O.icao1956.text=Oscar -Alphabets.P.icao1956.text=Papa -Alphabets.Q.icao1956.text=Quebec -Alphabets.R.icao1956.text=Romeo -Alphabets.S.icao1956.text=Sierra -Alphabets.T.icao1956.text=Tango -Alphabets.U.icao1956.text=Uniform -Alphabets.V.icao1956.text=Victor -Alphabets.W.icao1956.text=Whisky -Alphabets.X.icao1956.text=Xray -Alphabets.Y.icao1956.text=Yankee -Alphabets.Z.icao1956.text=Zulu -Alphabets.A.greek.text=Alpha -Alphabets.B.greek.text=Beta -Alphabets.C.greek.text=Gamma -Alphabets.D.greek.text=Delta -Alphabets.E.greek.text=Epsilon -Alphabets.F.greek.text=Zeta -Alphabets.G.greek.text=Eta -Alphabets.H.greek.text=Theta -Alphabets.I.greek.text=Iota -Alphabets.J.greek.text=Kappa -Alphabets.K.greek.text=Lambda -Alphabets.L.greek.text=Mu -Alphabets.M.greek.text=Nu -Alphabets.N.greek.text=Xi -Alphabets.O.greek.text=Omicron -Alphabets.P.greek.text=Pi -Alphabets.Q.greek.text=Rho -Alphabets.R.greek.text=Sigma -Alphabets.S.greek.text=Tau -Alphabets.T.greek.text=Upsilon -Alphabets.U.greek.text=Phi -Alphabets.V.greek.text=Chi -Alphabets.W.greek.text=Psi -Alphabets.X.greek.text=Omega -Alphabets.Y.greek.text=Ena -Alphabets.Z.greek.text=Dio - -# CompanyGenerationType Enum -CompanyGenerationType.AGAINST_THE_BOT.text=AtB -CompanyGenerationType.AGAINST_THE_BOT.toolTipText=This follows the AtB rules to generate a mercenary company. -CompanyGenerationType.WINDCHILD.text=Windchild -CompanyGenerationType.WINDCHILD.toolTipText=This is a variant that ensures all personnel have units and creates a heavier force. - -# ForceNamingType Enum -ForceNamingType.CCB_1943.text=CCB (1943) -ForceNamingType.ICAO_1956.text=ICAO (1956) -ForceNamingType.GREEK_ALPHABET.text=Greek Alphabet - -## Generators -# AbstractCompanyGenerator -AbstractCompanyGenerator.commandLance.text=\u0020Command Lance -AbstractCompanyGenerator.company.text=\u0020Company -AbstractCompanyGenerator.lance.text=\u0020Lance -AbstractCompanyGenerator..report= +# This is used to store any mekhq/campaign/universe Resources + +## General Universe Resources + +## Enums +# Alphabet Enum +Alphabets.A.ccb1943.text=Able +Alphabets.B.ccb1943.text=Baker +Alphabets.C.ccb1943.text=Charlie +Alphabets.D.ccb1943.text=Dog +Alphabets.E.ccb1943.text=Easy +Alphabets.F.ccb1943.text=Fox +Alphabets.G.ccb1943.text=George +Alphabets.H.ccb1943.text=How +Alphabets.I.ccb1943.text=Item +Alphabets.J.ccb1943.text=Jig +Alphabets.K.ccb1943.text=King +Alphabets.L.ccb1943.text=Love +Alphabets.M.ccb1943.text=Mike +Alphabets.N.ccb1943.text=Nan +Alphabets.O.ccb1943.text=Oboe +Alphabets.P.ccb1943.text=Peter +Alphabets.Q.ccb1943.text=Queen +Alphabets.R.ccb1943.text=Roger +Alphabets.S.ccb1943.text=Sugar +Alphabets.T.ccb1943.text=Tare +Alphabets.U.ccb1943.text=Uncle +Alphabets.V.ccb1943.text=Victor +Alphabets.W.ccb1943.text=William +Alphabets.X.ccb1943.text=Xray +Alphabets.Y.ccb1943.text=Yoke +Alphabets.Z.ccb1943.text=Zebra +Alphabets.A.icao1956.text=Alfa +Alphabets.B.icao1956.text=Bravo +Alphabets.C.icao1956.text=Charlie +Alphabets.D.icao1956.text=Delta +Alphabets.E.icao1956.text=Echo +Alphabets.F.icao1956.text=Foxtrot +Alphabets.G.icao1956.text=Golf +Alphabets.H.icao1956.text=Hotel +Alphabets.I.icao1956.text=India +Alphabets.J.icao1956.text=Juliett +Alphabets.K.icao1956.text=Kilo +Alphabets.L.icao1956.text=Lima +Alphabets.M.icao1956.text=Mike +Alphabets.N.icao1956.text=November +Alphabets.O.icao1956.text=Oscar +Alphabets.P.icao1956.text=Papa +Alphabets.Q.icao1956.text=Quebec +Alphabets.R.icao1956.text=Romeo +Alphabets.S.icao1956.text=Sierra +Alphabets.T.icao1956.text=Tango +Alphabets.U.icao1956.text=Uniform +Alphabets.V.icao1956.text=Victor +Alphabets.W.icao1956.text=Whisky +Alphabets.X.icao1956.text=Xray +Alphabets.Y.icao1956.text=Yankee +Alphabets.Z.icao1956.text=Zulu +Alphabets.A.greek.text=Alpha +Alphabets.B.greek.text=Beta +Alphabets.C.greek.text=Gamma +Alphabets.D.greek.text=Delta +Alphabets.E.greek.text=Epsilon +Alphabets.F.greek.text=Zeta +Alphabets.G.greek.text=Eta +Alphabets.H.greek.text=Theta +Alphabets.I.greek.text=Iota +Alphabets.J.greek.text=Kappa +Alphabets.K.greek.text=Lambda +Alphabets.L.greek.text=Mu +Alphabets.M.greek.text=Nu +Alphabets.N.greek.text=Xi +Alphabets.O.greek.text=Omicron +Alphabets.P.greek.text=Pi +Alphabets.Q.greek.text=Rho +Alphabets.R.greek.text=Sigma +Alphabets.S.greek.text=Tau +Alphabets.T.greek.text=Upsilon +Alphabets.U.greek.text=Phi +Alphabets.V.greek.text=Chi +Alphabets.W.greek.text=Psi +Alphabets.X.greek.text=Omega +Alphabets.Y.greek.text=Ena +Alphabets.Z.greek.text=Dio + +# CompanyGenerationType Enum +CompanyGenerationType.AGAINST_THE_BOT.text=AtB +CompanyGenerationType.AGAINST_THE_BOT.toolTipText=This follows the AtB rules to generate a mercenary company. +CompanyGenerationType.WINDCHILD.text=Windchild +CompanyGenerationType.WINDCHILD.toolTipText=This is a variant that ensures all personnel have units and creates a heavier force. + +# ForceNamingType Enum +ForceNamingType.CCB_1943.text=CCB (1943) +ForceNamingType.ICAO_1956.text=ICAO (1956) +ForceNamingType.GREEK_ALPHABET.text=Greek Alphabet + +## Generators +# AbstractCompanyGenerator +AbstractCompanyGenerator.commandLance.text=\u0020Command Lance +AbstractCompanyGenerator.company.text=\u0020Company +AbstractCompanyGenerator.lance.text=\u0020Lance +AbstractCompanyGenerator.StartingFunds.report= From 71224e62a6d490a71b9be8c896f5bb99a4c3c0e7 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 8 Feb 2021 12:25:46 -0700 Subject: [PATCH 005/115] Working on Company Generation Options and ensuring they are editable --- .../resources/mekhq/resources/GUI.properties | 460 +++++++------ .../mekhq/resources/Universe.properties | 5 +- .../universe/enums/CompanyGenerationType.java | 8 +- .../universe/enums/ForceNamingType.java | 18 +- .../AbstractCompanyGenerator.java | 109 +-- .../AtBCompanyGenerator.java | 4 +- .../CompanyGenerationOptions.java | 26 +- .../WindchildCompanyGenerator.java | 4 +- .../gui/dialog/CampaignOptionsDialog.java | 2 +- .../gui/dialog/CompanyGenerationDialog.java | 2 +- .../gui/dialog/CustomizePersonDialog.java | 16 +- MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java | 2 +- .../src/mekhq/gui/enums/PersonnelTabView.java | 18 +- .../view/CompanyGenerationOptionsPanel.java | 633 +++++++++++++++++- .../gui/view/CompanyGenerationPanel.java | 3 +- 15 files changed, 1008 insertions(+), 302 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 43677db071..aaf6254c56 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -1,198 +1,262 @@ -# This is used to store any mekhq/gui Resources - -## General GUI Resources -Apply=Apply -Cancel=Cancel -Export=Export -Generate=Generate -Import=Import -RestoreDefaults=Restore Defaults - -## Dialog -# CompanyGenerationDialog Class -CompanyGenerationDialog.title=Company Generator - -# GMToolsDialog -# Dice Panel -dicePanel.text=Dice Roller -rolls.text=rolls of\u0020 -sides.text=d -totalDiceResultsLabel.text=Result: -totalDiceResult.text=%5d -diceRoll.text=Roll -individualDiceResultsLabel.text=Individual Results: -# RAT Panel -ratPanel.text=RAT Roller -yearLabel.text=Year -factionLabel.text=Faction -qualityLabel.text=Quality -unitTypeLabel.text=Unit Type -unitWeightLabel.text=Weight -ratRoll.text=Roll For RAT -addRandomUnit.text=Add Random Unit -invalidYear.error=Please enter a valid year -noValidUnit.error=No unit matching criteria and purchase restrictions. -entityLoadFailure.error=Failed to load entity -# Name Panel -namePanel.text=Name Generator -genderLabel.text=Gender -originFactionLabel.text=Origin Faction -factionWeighted.text=Faction Weighted -historicalEthnicityLabel.text=Historical Ethnicity -clannerLabel.text=Clanner -currentNameLabel.text=Current Name: -nameGeneratedLabel.text=Generated Name: -generateNameButton.text=Generate Name -assignNameButton.text=Assign Name -# Callsign Panel -callsignPanel.text=Callsign Generator -currentCallsignLabel.text=Current Callsign: -callsignGeneratedLabel.text=Generated Callsign: -generateCallsignButton.text=Generate Callsign -assignCallsignButton.text=Assign Callsign -# Bloodname Panel -bloodnamePanel.text=Bloodname Generator -originClanLabel.text=Clan -bloodnameEraLabel.text=Year -phenotypeLabel.text=Phenotype -currentBloodnameLabel.text=Current Bloodname: -bloodnameGeneratedLabel.text=Generated Bloodname: -originClanGeneratedLabel.text=Generated Clan -phenotypeGeneratedLabel.text=Generated Phenotype -generateBloodnameButton.text=Generate Bloodname -assignBloodnameButton.text=Assign Bloodname - -## Enums -# LayeredForceIcon Enum -LayeredForceIcon.types.text=Types -LayeredForceIcon.formations.text=Formations -LayeredForceIcon.adjustments.text=Adjustments -LayeredForceIcon.alphanumerics.text=Alphanumerics -LayeredForceIcon.special.text=Special -LayeredForceIcon.backgrounds.text=Backgrounds -LayeredForceIcon.frame.text=Frames -LayeredForceIcon.logos.text=Logos - -# PersonnelFilter Enum -PersonnelFilter.ALL=All Personnel -PersonnelFilter.ACTIVE=Active Personnel -PersonnelFilter.COMBAT=Combat Personnel -PersonnelFilter.SUPPORT=Support Personnel -PersonnelFilter.MECHWARRIOR=MechWarriors -PersonnelFilter.VEHICLE_CREWMEMBER=Vehicle Crews -PersonnelFilter.GROUND_VEHICLE_DRIVER=Vehicle Drivers -PersonnelFilter.NAVAL_VEHICLE_DRIVER=Naval Drivers -PersonnelFilter.VEHICLE_GUNNER=Vehicle Gunners -PersonnelFilter.VEHICLE_CREW=Vehicle Crew -PersonnelFilter.VTOL_PILOT=VTOL Pilots -PersonnelFilter.AEROSPACE_PILOT=Aerospace Pilots -PersonnelFilter.CONVENTIONAL_AIRCRAFT_PILOT=Conventional Pilots -PersonnelFilter.PROTOMECH_PILOT=ProtoMech Pilots -PersonnelFilter.BATTLE_ARMOUR=Battle Armor Infantry -PersonnelFilter.SOLDIER=Soldiers -PersonnelFilter.VESSEL_CREWMEMBER=Large Vessel Crews -PersonnelFilter.VESSEL_PILOT=Vessel Pilots -PersonnelFilter.VESSEL_CREW=Vessel Crew -PersonnelFilter.VESSEL_GUNNER=Vessel Gunners -PersonnelFilter.VESSEL_NAVIGATOR=Hyperspace Navigators -PersonnelFilter.TECH=Techs -PersonnelFilter.MECH_TECH=Mech Techs -PersonnelFilter.MECHANIC=Mechanics -PersonnelFilter.AERO_TECH=Aero Techs -PersonnelFilter.BA_TECH=Battle Armour Techs -PersonnelFilter.ASTECH=Astechs -PersonnelFilter.MEDICAL=Medical Staff -PersonnelFilter.DOCTOR=Doctors -PersonnelFilter.MEDIC=Medics -PersonnelFilter.ADMINISTRATOR=Administrators -PersonnelFilter.ADMINISTRATOR_COMMAND=Administrators (Command) -PersonnelFilter.ADMINISTRATOR_LOGISTICS=Administrators (Logistics) -PersonnelFilter.ADMINISTRATOR_TRANSPORT=Administrators (Transport) -PersonnelFilter.ADMINISTRATOR_HR=Administrators (HR) -PersonnelFilter.DEPENDENT=Dependents -PersonnelFilter.FOUNDER=Founders -PersonnelFilter.PRISONER=Prisoners -PersonnelFilter.INACTIVE=Inactive Personnel -PersonnelFilter.RETIRED=Retired Personnel -PersonnelFilter.MIA=Missing in Action Personnel -PersonnelFilter.KIA=Rolls of Honor -PersonnelFilter.DEAD=Cemetery - -# PersonnelFilterStyle Enum -PersonnelFilterStyle.STANDARD.text=Standard -PersonnelFilterStyle.STANDARD.toolTipText=This is the standard filter style for MekHQ, which groups less commonly used but related personnel roles into a single filter (e.g. Doctors and Medics are grouped as Medical Staff) -PersonnelFilterStyle.INDIVIDUAL_ROLE.text=Individual Role -PersonnelFilterStyle.INDIVIDUAL_ROLE.toolTipText=This filter style provides filters that allow one to filter personnel by each individual role, without the filter groupings as seen previously. -PersonnelFilterStyle.ALL.text=All -PersonnelFilterStyle.ALL.toolTipText=This filter style provides all of the standard AND individual role filters. - -# PersonnelTabView Enum -PersonnelTabView.GRAPHIC=Graphic -PersonnelTabView.GENERAL=General -PersonnelTabView.PILOT_GUNNERY_SKILLS=Piloting/Gunnery Skills -PersonnelTabView.INFANTRY_SKILLS=Infantry Skills -PersonnelTabView.TACTICAL_SKILLS=Tactical Skills -PersonnelTabView.TECHNICAL_SKILLS=Tech Skills -PersonnelTabView.ADMINISTRATIVE_SKILLS=Admin Skills -PersonnelTabView.BIOGRAPHICAL=Biographical Information -PersonnelTabView.FLUFF=Fluff Information - -## View -# CompanyGenerationOptionsPanel Class -baseInformationPanel.title=Base Information -lblCompanyGenerationType.text=Company Generation Type -lblFaction.text=Faction -lblCompanyCount.text=Company Count -lblIndividualLanceCount.text=Individual Lance Count -chkGenerateMercenaryCompanyCommandLance.text=Generate Company Command Lance -lblLancesPerCompany.text=Lances per Company -lblLanceSize.text=BattleMechs per Lance - -personnelPanel.title=Personnel -lblTotalSupportPersonnel.text=Number of Support Personnel: %d -supportPersonnelNumbersPanel.title=Support Personnel Assignment -chkPoolAssistants.text=Pool Assistants -chkPoolAssistants.toolTipText=If selected the unit pool is automatically filled, otherwise they are hired as permanent members of the unit. -chkGenerateCaptains.text=Generate Captains -chkGenerateCaptains.toolTipText=This creates Captains for every company after the first, or for every company when using a mercenary company command lance. They have two officer skill increases, and are assigned the rank of Captain. -chkCompanyCommanderLanceOfficer.text=Generate Company Commander as Lance Officer -chkCompanyCommanderLanceOfficer.toolTipText=When enabled the company commander has their own lance without any other officers. Otherwise, the lance containing the company commander will also contain a Lieutenant. -chkApplyOfficerStatBonusToWorstSkill.text=Apply Officer Stat Bonus to Weaker Skill -chkAssignBestOfficers.text=Assign Best Officers -chkAutomaticallyAssignRanks.text=Automatically Assign Ranks - -unitsPanel.title=Units -chkGenerateUnitsAsAttached.text=Generate Units as Attached -chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules. These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MW when they retire (provided the campaign options are enabled). -chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander -chkAssignBestRollToUnitCommander.toolTipText= -chkGroupByWeight.text=Group Units by Weight -chkGroupByWeight.toolTipText= - -unitPanel.title=Unit -lblForceNamingType.text=Force Naming Type -chkGenerateForceIcons.text=Generate Force Icons - -financesPanel.title=Finances -lblStartingCash.text=Starting C-Bills -chkRandomizeStartingCash.text=Randomize Starting C-Bills -chkRandomizeStartingCash.toolTipText=This overrides the starting C-Bills with a random roll of nd6 million C-Bills, with the n specified below. -lblMinimumStartingFloat.text=Minimum Starting Float -lblMinimumStartingFloat.toolTipText= -chkPayForSetup.text=Pay for Setup -chkPayForSetup.toolTipText=This enables paying for the generated unit from the starting cash, to a minimum of the starting float. -chkStartingLoan.text=Starting Loan -chkStartingLoan.toolTipText= -chkPayForPersonnel.text=Pay for Personnel -chkPayForPersonnel.toolTipText= -chkPayForUnits.text=Pay for Units -chkPayForUnits.toolTipText= -chkPayForParts.text=Pay for Parts -chkPayForParts.toolTipText= -chkPayForAmmunition.text=Pay for Ammunition -chkPayForAmmunition.toolTipText= - -# CompanyGenerationPanel Class -CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? -CompanyGenerationPanel.ImmediateApplicationWarning.text=Confirm immediate generation and application to campaign? -CompanyGenerationPanel.OverwriteGenerationWarning.text=The new generation will overwrite the current generation. The previous data is not recoverable. Confirm generation? +# This is used to store any mekhq/gui Resources + +### General GUI Resources - These are used multiple times across the GUI to mean the same thing +Apply=Apply +Cancel=Cancel +Export=Export +Faction=Faction +FactionSpecific=Faction Specific +Generate=Generate +Import=Import +RestoreDefaults=Restore Defaults + +### Dialog +## CompanyGenerationDialog Class +CompanyGenerationDialog.title=Company Generator + +## GMToolsDialog +# Dice Panel +dicePanel.text=Dice Roller +rolls.text=rolls of\u0020 +sides.text=d +totalDiceResultsLabel.text=Result: +totalDiceResult.text=%5d +diceRoll.text=Roll +individualDiceResultsLabel.text=Individual Results: +# RAT Panel +ratPanel.text=RAT Roller +yearLabel.text=Year +qualityLabel.text=Quality +unitTypeLabel.text=Unit Type +unitWeightLabel.text=Weight +ratRoll.text=Roll For RAT +addRandomUnit.text=Add Random Unit +invalidYear.error=Please enter a valid year +noValidUnit.error=No unit matching criteria and purchase restrictions. +entityLoadFailure.error=Failed to load entity +# Name Panel +namePanel.text=Name Generator +genderLabel.text=Gender +originFactionLabel.text=Origin Faction +factionWeighted.text=Faction Weighted +historicalEthnicityLabel.text=Historical Ethnicity +clannerLabel.text=Clanner +currentNameLabel.text=Current Name: +nameGeneratedLabel.text=Generated Name: +generateNameButton.text=Generate Name +assignNameButton.text=Assign Name +# Callsign Panel +callsignPanel.text=Callsign Generator +currentCallsignLabel.text=Current Callsign: +callsignGeneratedLabel.text=Generated Callsign: +generateCallsignButton.text=Generate Callsign +assignCallsignButton.text=Assign Callsign +# Bloodname Panel +bloodnamePanel.text=Bloodname Generator +originClanLabel.text=Clan +bloodnameEraLabel.text=Year +phenotypeLabel.text=Phenotype +currentBloodnameLabel.text=Current Bloodname: +bloodnameGeneratedLabel.text=Generated Bloodname: +originClanGeneratedLabel.text=Generated Clan +phenotypeGeneratedLabel.text=Generated Phenotype +generateBloodnameButton.text=Generate Bloodname +assignBloodnameButton.text=Assign Bloodname + +### Enums +## LayeredForceIcon Enum +LayeredForceIcon.types.text=Types +LayeredForceIcon.formations.text=Formations +LayeredForceIcon.adjustments.text=Adjustments +LayeredForceIcon.alphanumerics.text=Alphanumerics +LayeredForceIcon.special.text=Special +LayeredForceIcon.backgrounds.text=Backgrounds +LayeredForceIcon.frame.text=Frames +LayeredForceIcon.logos.text=Logos + +## PersonnelFilter Enum +PersonnelFilter.ALL=All Personnel +PersonnelFilter.ACTIVE=Active Personnel +PersonnelFilter.COMBAT=Combat Personnel +PersonnelFilter.SUPPORT=Support Personnel +PersonnelFilter.MECHWARRIOR=MechWarriors +PersonnelFilter.VEHICLE_CREWMEMBER=Vehicle Crews +PersonnelFilter.GROUND_VEHICLE_DRIVER=Vehicle Drivers +PersonnelFilter.NAVAL_VEHICLE_DRIVER=Naval Drivers +PersonnelFilter.VEHICLE_GUNNER=Vehicle Gunners +PersonnelFilter.VEHICLE_CREW=Vehicle Crew +PersonnelFilter.VTOL_PILOT=VTOL Pilots +PersonnelFilter.AEROSPACE_PILOT=Aerospace Pilots +PersonnelFilter.CONVENTIONAL_AIRCRAFT_PILOT=Conventional Pilots +PersonnelFilter.PROTOMECH_PILOT=ProtoMech Pilots +PersonnelFilter.BATTLE_ARMOUR=Battle Armor Infantry +PersonnelFilter.SOLDIER=Soldiers +PersonnelFilter.VESSEL_CREWMEMBER=Large Vessel Crews +PersonnelFilter.VESSEL_PILOT=Vessel Pilots +PersonnelFilter.VESSEL_CREW=Vessel Crew +PersonnelFilter.VESSEL_GUNNER=Vessel Gunners +PersonnelFilter.VESSEL_NAVIGATOR=Hyperspace Navigators +PersonnelFilter.TECH=Techs +PersonnelFilter.MECH_TECH=Mech Techs +PersonnelFilter.MECHANIC=Mechanics +PersonnelFilter.AERO_TECH=Aero Techs +PersonnelFilter.BA_TECH=Battle Armour Techs +PersonnelFilter.ASTECH=Astechs +PersonnelFilter.MEDICAL=Medical Staff +PersonnelFilter.DOCTOR=Doctors +PersonnelFilter.MEDIC=Medics +PersonnelFilter.ADMINISTRATOR=Administrators +PersonnelFilter.ADMINISTRATOR_COMMAND=Administrators (Command) +PersonnelFilter.ADMINISTRATOR_LOGISTICS=Administrators (Logistics) +PersonnelFilter.ADMINISTRATOR_TRANSPORT=Administrators (Transport) +PersonnelFilter.ADMINISTRATOR_HR=Administrators (HR) +PersonnelFilter.DEPENDENT=Dependents +PersonnelFilter.FOUNDER=Founders +PersonnelFilter.PRISONER=Prisoners +PersonnelFilter.INACTIVE=Inactive Personnel +PersonnelFilter.RETIRED=Retired Personnel +PersonnelFilter.MIA=Missing in Action Personnel +PersonnelFilter.KIA=Rolls of Honor +PersonnelFilter.DEAD=Cemetery + +## PersonnelFilterStyle Enum +PersonnelFilterStyle.STANDARD.text=Standard +PersonnelFilterStyle.STANDARD.toolTipText=This is the standard filter style for MekHQ, which groups less commonly used but related personnel roles into a single filter (e.g. Doctors and Medics are grouped as Medical Staff) +PersonnelFilterStyle.INDIVIDUAL_ROLE.text=Individual Role +PersonnelFilterStyle.INDIVIDUAL_ROLE.toolTipText=This filter style provides filters that allow one to filter personnel by each individual role, without the filter groupings as seen previously. +PersonnelFilterStyle.ALL.text=All +PersonnelFilterStyle.ALL.toolTipText=This filter style provides all of the standard AND individual role filters. + +## PersonnelTabView Enum +PersonnelTabView.GRAPHIC.text=Graphic +PersonnelTabView.GENERAL.text=General +PersonnelTabView.PILOT_GUNNERY_SKILLS.text=Piloting/Gunnery Skills +PersonnelTabView.INFANTRY_SKILLS.text=Infantry Skills +PersonnelTabView.TACTICAL_SKILLS.text=Tactical Skills +PersonnelTabView.TECHNICAL_SKILLS.text=Tech Skills +PersonnelTabView.ADMINISTRATIVE_SKILLS.text=Admin Skills +PersonnelTabView.BIOGRAPHICAL.text=Biographical Information +PersonnelTabView.FLUFF.text=Fluff Information + +### View +## CompanyGenerationOptionsPanel Class +# Base Information Panel +baseInformationPanel.title=Base Information +lblCompanyGenerationType.text=Company Generation Type +lblCompanyGenerationType.toolTipText=This is the type of company generator to use. These have hardcoded differences described in their tooltips. +lblFaction.toolTipText=\u0020 +chkStartingSystemFactionSpecific.toolTipText=Filter the starting planet options so they are specific to the faction selected. +lblStartingPlanet.text=Starting Planet +lblStartingPlanet.toolTipText=This is the planet that the company starts at. This should normally be kept at the default value, but is customizable for RP reasons. +chkGenerateMercenaryCompanyCommandLance.text=Generate Company Command Lance +chkGenerateMercenaryCompanyCommandLance.toolTipText=This generates a lance containing the company commander to lead the mercenary company. Otherwise, the company commander leads the first lance generate, either first company or the first independent lance. +lblCompanyCount.text=Company Count +lblCompanyCount.toolTipText=The number of companies to generate, from 0 to 5. +lblIndividualLanceCount.text=Individual Lance Count +lblIndividualLanceCount.toolTipText=The number of individual lances to generate, from 0 to 2. +lblLancesPerCompany.text=Lances per Company +lblLancesPerCompany.toolTipText=The number of lances generated per company, from 2 to 6. +lblLanceSize.text=BattleMechs per Lance +lblLanceSize.toolTipText=The number of BattleMechs to generate per lance, from 3 to 6. +# Personnel Panel +personnelPanel.title=Personnel +lblTotalSupportPersonnel.text=Number of Support Personnel: %d +lblTotalSupportPersonnel.toolTipText=This is the maximum number of starting support personnel for the force. This does not include assistants. +supportPersonnelNumbersPanel.title=Support Personnel Assignment +supportPersonnelNumber.toolTipText=The number of %s(s) to hire. +chkPoolAssistants.text=Pool Assistants +chkPoolAssistants.toolTipText=Automatically fills the unit's astech and medic pools, otherwise they are hired as permanent members of the unit. +chkGenerateCaptains.text=Generate Captains +chkGenerateCaptains.toolTipText=This creates Captains for every company after the first, or for every company when using a mercenary company command lance. They have two officer skill increases, and are assigned the rank of Captain. +chkAssignCompanyCommanderFlag.text=Assign Commander Flag +chkAssignCompanyCommanderFlag.toolTipText=This assigns the Commander flag to the generated Company Commander, designating them as the overall commander for the mercenary company. +chkCompanyCommanderLanceOfficer.text=Generate Company Commander as Lance Officer +chkCompanyCommanderLanceOfficer.toolTipText=When enabled the company commander has their own lance without any other officers. Otherwise, the lance containing the company commander will also contain a Lieutenant. +chkApplyOfficerStatBonusToWorstSkill.text=Apply Officer Stat Bonus to Weaker Skill +chkApplyOfficerStatBonusToWorstSkill.toolTipText=This applies the worst +chkAssignBestOfficers.text=Assign Best Officers +chkAssignBestOfficers.toolTipText= +chkAutomaticallyAssignRanks.text=Automatically Assign Ranks +chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command while . +# Personnel Randomization Panel +personnelRandomizationPanel.title=Personnel Randomization +chkRandomizeOrigin.text=Randomize Origin +chkRandomizeOrigin.toolTipText=This randomizes the personnel origin. If disabled this will roll all 'Mechs on the current campaign faction's RAT. +lblCentralPlanet.text=Central Planet +chkCentralSystemFactionSpecific.toolTipText=Filter the central planet options so they are specific to the faction selected. +lblCentralPlanet.toolTipText=This is the central planet around which personnel are randomized. +lblOriginSearchRadius.text=\u0020 +lblOriginSearchRadius.toolTipText=\u0020 +chkExtraRandomOrigin.text=\u0020 +chkExtraRandomOrigin.toolTipText=\u0020 +lblOriginDistanceScale.text=\u0020 +lblOriginDistanceScale.toolTipText=\u0020 +# Units Panel +unitsPanel.title=Units +chkGenerateUnitsAsAttached.text=Generate Units as Attached +chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules. These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MW when they retire (provided the campaign options are enabled). +chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander +chkAssignBestRollToUnitCommander.toolTipText=This assigns the best rolled unit to the unit commander. The heaviest Star League weight class will be assigned to them if a Star League 'Mech is rolled, or otherwise they will be assigned the heaviest 'Mech. +chkGroupByWeight.text=Group Units by Weight +chkGroupByWeight.toolTipText=This groups the rolls so that the 'Mechs are sorted into lances (largely) by weight class. Otherwise, you can expect lances to have highly varied weight classes +chkKeepOfficerRollsSeparate.text=Keep Officer Rolls Separate +chkKeepOfficerRollsSeparate.toolTipText=When grouping the rolls by weight, this separates out the officer rolls. This follows the spirit of the AtB rules, but means that officers will in general have heavier 'Mechs. +lblStarLeagueYear.text=Star League Year +lblStarLeagueYear.toolTipText=This is the year to use when rolling for Star League 'Mechs. Valid years are 2571 to 2780, with 2765 being the default. +chkAssignTechsToUnits.text=Assign Techs to Units +chkAssignTechsToUnits.toolTipText=This automatically assigns techs to units during company generation. +# Unit Panel +unitPanel.title=Unit +lblForceNamingType.text=Force Naming Type +lblForceNamingType.toolTipText=This is the naming type used for lance and company names, producing names like "Baker Company", "Bravo Company", and "Beta Company". +chkGenerateForceIcons.text=Generate Force Icons +chkGenerateForceIcons.toolTipText=This will automatically create force icons for generated lances and companies, displaying the weight class, type, formation, and using the selected faction for background if possible. +# Spares Panel +sparesPanel.title=Spares +chkGenerateMothballedSpareUnits.text=Generate Mothballed Spare Units +chkGenerateMothballedSpareUnits.toolTipText=This generates the specified percentage of active units as mothballed spares kept by the company to replace destroyed 'Mechs. +lblSparesPercentOfActiveUnits.text=Generated Percentage of Active Units +lblSparesPercentOfActiveUnits.toolTipText=This is the percentage of active units for which a mothballed unit will be generated. +chkGenerateSpareParts.text=Generate Spare Parts +chkGenerateSpareParts.toolTipText=This generates spare parts for the unit based on the parts used by the unit. +lblStartingArmourWeight.text=Starting Armour Weight +lblStartingArmourWeight.toolTipText=This is the weight of starting standard armour to generate. +chkGenerateSpareAmmunition.text=Generate Spare Ammunition +chkGenerateSpareAmmunition.toolTipText=This generates spare standard ammunition for any weapons in the force. +lblNumberReloadsPerWeapon.text=Reloads per Weapon +lblNumberReloadsPerWeapon.toolTipText=This is the number of reloads to generate per weapon requiring the specified ammunition type. +chkGenerateFractionalMachineGunAmmunition.text=Generate Fractional Machine Gun Ammunition +chkGenerateFractionalMachineGunAmmunition.toolTipText=Generate 50 rounds of machine gun ammunition per machine gun instead of the full ammunition bin of 200. +# Contracts Panel +contractsPanel.title=Contracts +chkSelectStartingContract.text=Select Starting Contract +chkSelectStartingContract.toolTipText=This enables a panel where the company's starting contract can be selected. (This panel will only show when there is not an active contract and the AtB contract market is enabled). +chkStartCourseToContractPlanet.text=Start Course to Contract Planet +chkStartCourseToContractPlanet.toolTipText=This automatically charts and starts the company's travel towards the planet of the selected contract. +# Finances Panel +financesPanel.title=Finances +lblStartingCash.text=Starting C-Bills +lblStartingCash.toolTipText=The number of C-Bills to start with, minus expenses, if not randomizing the starting cash. +chkRandomizeStartingCash.text=Randomize Starting C-Bills +chkRandomizeStartingCash.toolTipText=This overrides the starting C-Bills with a random roll of nd6 million C-Bills, with the n specified below. +lblRandomStartingCashDiceCount.text=Random Starting C-Bills d6 Count +lblRandomStartingCashDiceCount.toolTipText=This is the number of d6s rolled to generate the random starting C-Bills when randomizing starting funds. The base value of 8 will generate approximately 28m C-Bills, which is enough for a company in 3025 with a small float. For later eras 10 to 12 per company is recommended. +lblMinimumStartingFloat.text=Minimum Starting Float +lblMinimumStartingFloat.toolTipText=This is the minimum number of available C-Bills the company will start with following generation. +chkPayForSetup.text=Pay for Setup +chkPayForSetup.toolTipText=Pay for the generated unit from the starting cash, to a minimum of the starting float. +chkStartingLoan.text=Starting Loan +chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended, leaving the starting float as available C-Bills. +chkPayForPersonnel.text=Pay for Personnel +chkPayForPersonnel.toolTipText=Pay to hire personnel, at a rate of +chkPayForUnits.text=Pay for Units +chkPayForUnits.toolTipText=\u0020 +chkPayForParts.text=Pay for Parts +chkPayForParts.toolTipText=\u0020 +chkPayForAmmunition.text=Pay for Ammunition +chkPayForAmmunition.toolTipText=\u0020 + +## CompanyGenerationPanel Class +CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? +CompanyGenerationPanel.ImmediateApplicationWarning.text=Confirm immediate generation and application to campaign? +CompanyGenerationPanel.OverwriteGenerationWarning.text=The new generation will overwrite the current generation. The previous data is not recoverable. Confirm generation? diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 121a20d2a1..13f735d635 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -52,7 +52,7 @@ Alphabets.S.icao1956.text=Sierra Alphabets.T.icao1956.text=Tango Alphabets.U.icao1956.text=Uniform Alphabets.V.icao1956.text=Victor -Alphabets.W.icao1956.text=Whisky +Alphabets.W.icao1956.text=Whiskey Alphabets.X.icao1956.text=Xray Alphabets.Y.icao1956.text=Yankee Alphabets.Z.icao1956.text=Zulu @@ -91,8 +91,11 @@ CompanyGenerationType.WINDCHILD.toolTipText=This is a variant that ensures all p # ForceNamingType Enum ForceNamingType.CCB_1943.text=CCB (1943) +ForceNamingType.CCB_1943.toolTipText=This generates names using the Combined Communications Board's WW2 calling alphabet as settled upon in 1943. Produces names like "Able Lance", "Charlie Company", and "Easy Company". ForceNamingType.ICAO_1956.text=ICAO (1956) +ForceNamingType.ICAO_1956.toolTipText=This generates names using the International Radiotelephony Spelling Alphabet, also known as the NATO phonetic alphabet. Produces names like "Bravo Lance", "Charlie Company", and "Hotel Lance" ForceNamingType.GREEK_ALPHABET.text=Greek Alphabet +ForceNamingType.GREEK_ALPHABET.toolTipText=This generates names using the Greek Alphabet, with one and two taking the place of the final two characters as Greek only has 24 characters. Produces names like "Alpha Lance", "Beta Company", and "Omega Lance". ## Generators # AbstractCompanyGenerator diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java index 102c2c4f16..a23922a94f 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java @@ -22,6 +22,7 @@ import mekhq.campaign.Campaign; import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; import mekhq.campaign.universe.generators.companyGeneration.AtBCompanyGenerator; +import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; import mekhq.campaign.universe.generators.companyGeneration.WindchildCompanyGenerator; import java.util.ResourceBundle; @@ -62,13 +63,14 @@ public boolean isWindchild() { } //endregion Boolean Comparisons - public AbstractCompanyGenerator getGenerator(final Campaign campaign) { + public AbstractCompanyGenerator getGenerator(final Campaign campaign, + final CompanyGenerationOptions options) { switch (this) { case WINDCHILD: - return new WindchildCompanyGenerator(campaign); + return new WindchildCompanyGenerator(campaign, options); case AGAINST_THE_BOT: default: - return new AtBCompanyGenerator(campaign); + return new AtBCompanyGenerator(campaign, options); } } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java index 43323840b6..186ee9347c 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java @@ -24,24 +24,32 @@ public enum ForceNamingType { //region Enum Declarations - CCB_1943("ForceNamingType.CCB_1943.text"), - ICAO_1956("ForceNamingType.ICAO_1956.text"), - GREEK_ALPHABET("ForceNamingType.GREEK_ALPHABET.text"); + CCB_1943("ForceNamingType.CCB_1943.text", "ForceNamingType.CCB_1943.toolTipText"), + ICAO_1956("ForceNamingType.ICAO_1956.text", "ForceNamingType.ICAO_1956.toolTipText"), + GREEK_ALPHABET("ForceNamingType.GREEK_ALPHABET.text", "ForceNamingType.GREEK_ALPHABET.toolTipText"); //endregion Enum Declarations //region Variable Declarations private final String name; + private final String toolTipText; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors - ForceNamingType(String name) { + ForceNamingType(final String name, final String toolTipText) { this.name = resources.getString(name); + this.toolTipText = resources.getString(toolTipText); } //endregion Constructors - public String getValue(Alphabet alphabet) { + //region Getters + public String getToolTipText() { + return toolTipText; + } + //endregion Getters + + public String getValue(final Alphabet alphabet) { switch (this) { case ICAO_1956: return alphabet.getICAO1956(); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java index 8653799b5e..dd109d18fd 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java @@ -64,9 +64,6 @@ /** * Ideas: - * Finances: Randomize is a base 8d6 million C-Bill option, creates a nice curve averaging around 28m c-bills, - * which is a company plus likely a slight float. Recommended 10d6 for 3067 in the notes - * * First panel is the options panel * Second panel is the generated personnel panel, where you can customize and reroll personnel * Third panel is the generated units panel, where you can customize applicable units @@ -114,18 +111,17 @@ public abstract class AbstractCompanyGenerator { //region Variable Declarations private CompanyGenerationType type; private CompanyGenerationOptions options; + private AbstractPersonnelGenerator personnelGenerator; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors - protected AbstractCompanyGenerator(final CompanyGenerationType type, final Campaign campaign) { - this(type, new CompanyGenerationOptions(type, campaign)); - } - - protected AbstractCompanyGenerator(final CompanyGenerationType type, final CompanyGenerationOptions options) { + protected AbstractCompanyGenerator(final Campaign campaign, final CompanyGenerationType type, + final CompanyGenerationOptions options) { setType(type); setOptions(options); + createPersonnelGenerator(campaign); } //endregion Constructors @@ -134,7 +130,10 @@ public CompanyGenerationType getType() { return type; } - public void setType(final CompanyGenerationType type) { + /** + * This is ONLY to be called by constructors + */ + protected void setType(final CompanyGenerationType type) { this.type = type; } @@ -142,9 +141,42 @@ public CompanyGenerationOptions getOptions() { return options; } - public void setOptions(final CompanyGenerationOptions options) { + /** + * This is ONLY to be called by constructors + */ + protected void setOptions(final CompanyGenerationOptions options) { this.options = options; } + + public AbstractPersonnelGenerator getPersonnelGenerator() { + return personnelGenerator; + } + + public void setPersonnelGenerator(final AbstractPersonnelGenerator personnelGenerator) { + this.personnelGenerator = personnelGenerator; + } + + /** + * This creates the personnel generator to use with the generator's options + * @param campaign the Campaign to generate using + */ + private void createPersonnelGenerator(final Campaign campaign) { + final AbstractFactionSelector factionSelector; + final AbstractPlanetSelector planetSelector; + + if (getOptions().isRandomizeOrigin()) { + factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); + ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); + + planetSelector = new RangedPlanetSelector(getOptions().getOriginSearchRadius(), + getOptions().isExtraRandomOrigin()); + ((RangedPlanetSelector) planetSelector).setDistanceScale(getOptions().getOriginDistanceScale()); + } else { + factionSelector = new DefaultFactionSelector(getOptions().getFaction()); + planetSelector = new DefaultPlanetSelector(); + } + setPersonnelGenerator(campaign.getPersonnelGenerator(factionSelector, planetSelector)); + } //endregion Getters/Setters //region Determination Methods @@ -184,10 +216,9 @@ private int determineFirstNonOfficer() { public List generateCombatPersonnel(final Campaign campaign) { List combatPersonnel = new ArrayList<>(); final int numMechWarriors = determineNumberLances() * getOptions().getLanceSize(); - final AbstractPersonnelGenerator personnelGenerator = createPersonnelGenerator(campaign); for (int i = 0; i < numMechWarriors; i++) { - combatPersonnel.add(campaign.newPerson(Person.T_MECHWARRIOR, personnelGenerator)); + combatPersonnel.add(campaign.newPerson(Person.T_MECHWARRIOR, getPersonnelGenerator())); } if (getOptions().isAssignBestOfficers()) { @@ -354,11 +385,10 @@ private void generateStandardMechWarriors(final List personnel) { */ public List generateSupportPersonnel(final Campaign campaign) { final List supportPersonnel = new ArrayList<>(); - final AbstractPersonnelGenerator personnelGenerator = createPersonnelGenerator(campaign); for (final Map.Entry entry : getOptions().getSupportPersonnel().entrySet()) { for (int i = 0; i < entry.getValue(); i++) { - final Person person = campaign.newPerson(entry.getKey(), personnelGenerator); + final Person person = campaign.newPerson(entry.getKey(), getPersonnelGenerator()); // All support personnel get assigned is their rank if (getOptions().isAutomaticallyAssignRanks()) { switch (campaign.getRanks().getRankSystem()) { @@ -388,38 +418,39 @@ public List generateSupportPersonnel(final Campaign campaign) { private void generateAssistants(final Campaign campaign, final List personnel) { // If you don't want to use pooled assistants, then this generates them as personnel instead if (!getOptions().isPoolAssistants()) { - final AbstractPersonnelGenerator personnelGenerator = createPersonnelGenerator(campaign); + final int assistantRank; + switch (campaign.getRanks().getRankSystem()) { + case Ranks.RS_CCWH: + case Ranks.RS_CL: + assistantRank = 0; + break; + case Ranks.RS_COM: + case Ranks.RS_WOB: + case Ranks.RS_MOC: + assistantRank = 4; + break; + default: + assistantRank = 2; + break; + } + for (int i = 0; i < campaign.getAstechNeed(); i++) { - personnel.add(campaign.newPerson(Person.T_ASTECH, personnelGenerator)); + final Person astech = campaign.newPerson(Person.T_ASTECH, getPersonnelGenerator()); + if (getOptions().isAutomaticallyAssignRanks()) { + astech.setRankNumeric(assistantRank); + } + personnel.add(astech); } for (int i = 0; i < campaign.getMedicsNeed(); i++) { - personnel.add(campaign.newPerson(Person.T_MEDIC, personnelGenerator)); + final Person medic = campaign.newPerson(Person.T_MEDIC, getPersonnelGenerator()); + if (getOptions().isAutomaticallyAssignRanks()) { + medic.setRankNumeric(assistantRank); + } + personnel.add(medic); } } } //endregion Support Personnel - - /** - * @param campaign the Campaign to generate using - * @return the Personnel Generator to use in generation - */ - private AbstractPersonnelGenerator createPersonnelGenerator(final Campaign campaign) { - final AbstractFactionSelector factionSelector; - final AbstractPlanetSelector planetSelector; - - if (getOptions().isRandomizeOrigin()) { - factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); - ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); - - planetSelector = new RangedPlanetSelector(getOptions().getOriginSearchRadius(), - getOptions().isExtraRandomOrigin()); - ((RangedPlanetSelector) planetSelector).setDistanceScale(getOptions().getOriginDistanceScale()); - } else { - factionSelector = new DefaultFactionSelector(getOptions().getFaction()); - planetSelector = new DefaultPlanetSelector(); - } - return campaign.getPersonnelGenerator(factionSelector, planetSelector); - } //endregion Personnel //region Units diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java index 28b0404e1d..4437c82409 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java @@ -28,8 +28,8 @@ public class AtBCompanyGenerator extends AbstractCompanyGenerator { //region Constructors - public AtBCompanyGenerator(final Campaign campaign) { - super(CompanyGenerationType.AGAINST_THE_BOT, campaign); + public AtBCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { + super(campaign, CompanyGenerationType.AGAINST_THE_BOT, options); } //endregion Constructors diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java index 560a9c435d..2039a4328f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java @@ -53,9 +53,9 @@ public class CompanyGenerationOptions implements Serializable { private CompanyGenerationType type; private Faction faction; private Planet startingPlanet; + private boolean generateMercenaryCompanyCommandLance; private int companyCount; private int individualLanceCount; - private boolean generateMercenaryCompanyCommandLance; private int lancesPerCompany; private int lanceSize; @@ -229,6 +229,14 @@ public void setStartingPlanet(Planet startingPlanet) { this.startingPlanet = startingPlanet; } + public boolean isGenerateMercenaryCompanyCommandLance() { + return generateMercenaryCompanyCommandLance; + } + + public void setGenerateMercenaryCompanyCommandLance(boolean generateMercenaryCompanyCommandLance) { + this.generateMercenaryCompanyCommandLance = generateMercenaryCompanyCommandLance; + } + public int getCompanyCount() { return companyCount; } @@ -245,14 +253,6 @@ public void setIndividualLanceCount(int individualLanceCount) { this.individualLanceCount = individualLanceCount; } - public boolean isGenerateMercenaryCompanyCommandLance() { - return generateMercenaryCompanyCommandLance; - } - - public void setGenerateMercenaryCompanyCommandLance(boolean generateMercenaryCompanyCommandLance) { - this.generateMercenaryCompanyCommandLance = generateMercenaryCompanyCommandLance; - } - public int getLanceSize() { return lanceSize; } @@ -637,9 +637,9 @@ public void writeToXML(final PrintWriter pw, int indent) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "faction", getFaction().getShortName()); MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "startingPlanet", "systemId", getStartingPlanet().getParentSystem().getId(), getStartingPlanet().getId()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMercenaryCompanyCommandLance", isGenerateMercenaryCompanyCommandLance()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "companyCount", getCompanyCount()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "individualLanceCount", getIndividualLanceCount()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMercenaryCompanyCommandLance", isGenerateMercenaryCompanyCommandLance()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lancesPerCompany", getLancesPerCompany()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lanceSize", getLanceSize()); @@ -752,15 +752,15 @@ public static CompanyGenerationOptions parseFromXML(final Node wn) { String startingPlanetPlanetId = wn2.getTextContent().trim(); options.setStartingPlanet(Systems.getInstance().getSystemById(startingPlanetSystemId).getPlanetById(startingPlanetPlanetId)); break; + case "generateMercenaryCompanyCommandLance": + options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; case "companyCount": options.setCompanyCount(Integer.parseInt(wn2.getTextContent().trim())); break; case "individualLanceCount": options.setIndividualLanceCount(Integer.parseInt(wn2.getTextContent().trim())); break; - case "generateMercenaryCompanyCommandLance": - options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn2.getTextContent().trim())); - break; case "lancesPerCompany": options.setLancesPerCompany(Integer.parseInt(wn2.getTextContent().trim())); break; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java index 7b55fb80e5..e74fddd57e 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java @@ -28,8 +28,8 @@ public class WindchildCompanyGenerator extends AbstractCompanyGenerator { //region Constructors - public WindchildCompanyGenerator(final Campaign campaign) { - super(CompanyGenerationType.WINDCHILD, campaign); + public WindchildCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { + super(campaign, CompanyGenerationType.WINDCHILD, options); } //endregion Constructors diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index 6d87426655..0348b5080d 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -4216,7 +4216,7 @@ public void actionPerformed(ActionEvent e) { //region Company Generation Options if (MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()) { companyGenerationOptionsPanel = new CompanyGenerationOptionsPanel(frame, campaign); - tabOptions.addTab(resourceMap.getString("companyGenerationOptionsPanel.title"), companyGenerationOptionsPanel); + tabOptions.addTab(resourceMap.getString("companyGenerationOptionsPanel.title"), new JScrollPane(companyGenerationOptionsPanel)); } //endregion Company Generation Options diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 994e1b4ba6..b9661543a8 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -69,7 +69,7 @@ public void setCompanyGenerationOptionsPanel(final CompanyGenerationOptionsPanel //region Initialization private void initialize(final Campaign campaign) { setLayout(new BorderLayout()); - add(initializeCompanyGenerationOptionsPanel(campaign), BorderLayout.CENTER); + add(new JScrollPane(initializeCompanyGenerationOptionsPanel(campaign)), BorderLayout.CENTER); add(initializeButtons(), BorderLayout.PAGE_END); setMinimumSize(new Dimension(480, 240)); diff --git a/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java b/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java index 47dd596d1e..018c254218 100644 --- a/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java @@ -29,6 +29,7 @@ import megamek.client.generator.RandomNameGenerator; import megamek.client.generator.RandomCallsignGenerator; +import megamek.common.annotations.Nullable; import megamek.common.enums.Gender; import megamek.client.ui.swing.DialogOptionComponent; import megamek.client.ui.swing.DialogOptionListener; @@ -417,7 +418,7 @@ public Component getListCellRendererComponent(final JList list, } choiceSystem.addActionListener(evt -> { // Update the clan check box based on the new selected faction - PlanetarySystem selectedSystem = (PlanetarySystem)choiceSystem.getSelectedItem(); + PlanetarySystem selectedSystem = (PlanetarySystem) choiceSystem.getSelectedItem(); choicePlanet.setSelectedIndex(-1); updatePlanetsComboBoxModel(planetsModel, selectedSystem); @@ -895,10 +896,10 @@ private DefaultComboBoxModel getPlanetarySystemsComboBoxModel(F } private void filterPlanetarySystemsForOurFaction(boolean onlyOurFaction) { - PlanetarySystem selectedSystem = (PlanetarySystem)choiceSystem.getSelectedItem(); - Planet selectedPlanet = (Planet)choicePlanet.getSelectedItem(); + PlanetarySystem selectedSystem = (PlanetarySystem) choiceSystem.getSelectedItem(); + Planet selectedPlanet = (Planet) choicePlanet.getSelectedItem(); if (onlyOurFaction && choiceFaction.getSelectedItem() != null) { - Faction faction = (Faction)choiceFaction.getSelectedItem(); + Faction faction = (Faction) choiceFaction.getSelectedItem(); DefaultComboBoxModel model = getPlanetarySystemsComboBoxModel(faction); if (model.getIndexOf(selectedSystem) < 0) { @@ -906,18 +907,19 @@ private void filterPlanetarySystemsForOurFaction(boolean onlyOurFaction) { selectedPlanet = null; } - updatePlanetsComboBoxModel((DefaultComboBoxModel)choicePlanet.getModel(), null); + updatePlanetsComboBoxModel((DefaultComboBoxModel) choicePlanet.getModel(), null); choiceSystem.setModel(model); } else { choiceSystem.setModel(allSystems); } choiceSystem.setSelectedItem(selectedSystem); - updatePlanetsComboBoxModel((DefaultComboBoxModel)choicePlanet.getModel(), selectedSystem); + updatePlanetsComboBoxModel((DefaultComboBoxModel) choicePlanet.getModel(), selectedSystem); choicePlanet.setSelectedItem(selectedPlanet); } - private void updatePlanetsComboBoxModel(DefaultComboBoxModel planetsModel, PlanetarySystem planetarySystem) { + private void updatePlanetsComboBoxModel(DefaultComboBoxModel planetsModel, + @Nullable PlanetarySystem planetarySystem) { planetsModel.removeAllElements(); if (planetarySystem != null) { planetsModel.addElement(planetarySystem.getPrimaryPlanet()); diff --git a/MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java b/MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java index ff59e37d10..5b083c9eb2 100644 --- a/MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/GMToolsDialog.java @@ -257,7 +257,7 @@ private JPanel getRATRoller() { yearPicker.setName("yearPicker"); ratPanel.add(yearPicker, newGridBagConstraints(0, 1)); - JLabel factionLabel = new JLabel(resources.getString("factionLabel.text")); + JLabel factionLabel = new JLabel(resources.getString("Faction")); factionLabel.setName("factionLabel"); ratPanel.add(factionLabel, newGridBagConstraints(1, 0, 2, 1)); diff --git a/MekHQ/src/mekhq/gui/enums/PersonnelTabView.java b/MekHQ/src/mekhq/gui/enums/PersonnelTabView.java index f9795c066c..53791966b5 100644 --- a/MekHQ/src/mekhq/gui/enums/PersonnelTabView.java +++ b/MekHQ/src/mekhq/gui/enums/PersonnelTabView.java @@ -24,15 +24,15 @@ public enum PersonnelTabView { //region Enum Declarations - GRAPHIC("PersonnelTabView.GRAPHIC"), - GENERAL("PersonnelTabView.GENERAL"), - PILOT_GUNNERY_SKILLS("PersonnelTabView.PILOT_GUNNERY_SKILLS"), - INFANTRY_SKILLS("PersonnelTabView.INFANTRY_SKILLS"), - TACTICAL_SKILLS("PersonnelTabView.TACTICAL_SKILLS"), - TECHNICAL_SKILLS("PersonnelTabView.TECHNICAL_SKILLS"), - ADMINISTRATIVE_SKILLS("PersonnelTabView.ADMINISTRATIVE_SKILLS"), - BIOGRAPHICAL("PersonnelTabView.BIOGRAPHICAL"), - FLUFF("PersonnelTabView.FLUFF"); + GRAPHIC("PersonnelTabView.GRAPHIC.text"), + GENERAL("PersonnelTabView.GENERAL.text"), + PILOT_GUNNERY_SKILLS("PersonnelTabView.PILOT_GUNNERY_SKILLS.text"), + INFANTRY_SKILLS("PersonnelTabView.INFANTRY_SKILLS.text"), + TACTICAL_SKILLS("PersonnelTabView.TACTICAL_SKILLS.text"), + TECHNICAL_SKILLS("PersonnelTabView.TECHNICAL_SKILLS.text"), + ADMINISTRATIVE_SKILLS("PersonnelTabView.ADMINISTRATIVE_SKILLS.text"), + BIOGRAPHICAL("PersonnelTabView.BIOGRAPHICAL.text"), + FLUFF("PersonnelTabView.FLUFF.text"); //endregion Enum Declarations //region Variable Declarations diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java index f4acdc4fc8..e6e2b5e52f 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -18,6 +18,7 @@ */ package mekhq.gui.view; +import megamek.common.annotations.Nullable; import megamek.common.util.EncodeControl; import megamek.common.util.sorter.NaturalOrderComparator; import mekhq.MekHQ; @@ -36,11 +37,13 @@ import java.awt.*; import java.io.File; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.ResourceBundle; +import java.util.stream.Collectors; public class CompanyGenerationOptionsPanel extends JPanel { //region Variable Declarations @@ -51,11 +54,12 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Base Information private JComboBox comboCompanyGenerationType; private JComboBox comboFaction; + private JCheckBox chkStartingSystemFactionSpecific; private JComboBox comboStartingSystem; private JComboBox comboStartingPlanet; + private JCheckBox chkGenerateMercenaryCompanyCommandLance; private JSpinner spnCompanyCount; private JSpinner spnIndividualLanceCount; - private JCheckBox chkGenerateMercenaryCompanyCommandLance; private JSpinner spnLancesPerCompany; private JSpinner spnLanceSize; @@ -72,6 +76,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Personnel Randomization private JCheckBox chkRandomizeOrigin; + private JCheckBox chkCentralSystemFactionSpecific; private JComboBox comboCentralSystem; private JComboBox comboCentralPlanet; private JSpinner spnOriginSearchRadius; @@ -91,7 +96,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkGenerateForceIcons; // Spares - private JCheckBox ckhGenerateMothballedSpareUnits; + private JCheckBox chkGenerateMothballedSpareUnits; private JSpinner spnSparesPercentOfActiveUnits; private JCheckBox chkGenerateSpareParts; private JSpinner spnStartingArmourWeight; @@ -176,20 +181,45 @@ public void setComboFaction(JComboBox comboFaction) { this.comboFaction = comboFaction; } - public JSpinner getSpnCompanyCount() { - return spnCompanyCount; + public JCheckBox getChkStartingSystemFactionSpecific() { + return chkStartingSystemFactionSpecific; } - public void setSpnCompanyCount(JSpinner spnCompanyCount) { - this.spnCompanyCount = spnCompanyCount; + public void setChkStartingSystemFactionSpecific(JCheckBox chkStartingSystemFactionSpecific) { + this.chkStartingSystemFactionSpecific = chkStartingSystemFactionSpecific; } - public JSpinner getSpnIndividualLanceCount() { - return spnIndividualLanceCount; + public JComboBox getComboStartingSystem() { + return comboStartingSystem; } - public void setSpnIndividualLanceCount(JSpinner spnIndividualLanceCount) { - this.spnIndividualLanceCount = spnIndividualLanceCount; + public PlanetarySystem getStartingSystem() { + return (PlanetarySystem) Objects.requireNonNull(getComboStartingSystem().getSelectedItem()); + } + + public void setComboStartingSystem(JComboBox comboStartingSystem) { + this.comboStartingSystem = comboStartingSystem; + } + + private void updateComboStartingSystem() { + getComboStartingSystem().removeAllItems(); + getComboStartingSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( + getChkStartingSystemFactionSpecific().isSelected() ? getFaction() : null))); + getComboStartingSystem().setSelectedIndex(0); + getComboStartingPlanet().setModel(new DefaultComboBoxModel<>( + getStartingSystem().getPlanets().toArray(new Planet[]{}))); + } + + public JComboBox getComboStartingPlanet() { + return comboStartingPlanet; + } + + public Planet getStartingPlanet() { + return (Planet) Objects.requireNonNull(getComboStartingPlanet().getSelectedItem()); + } + + public void setComboStartingPlanet(JComboBox comboStartingPlanet) { + this.comboStartingPlanet = comboStartingPlanet; } public JCheckBox getChkGenerateMercenaryCompanyCommandLance() { @@ -200,6 +230,22 @@ public void setChkGenerateMercenaryCompanyCommandLance(JCheckBox chkGenerateMerc this.chkGenerateMercenaryCompanyCommandLance = chkGenerateMercenaryCompanyCommandLance; } + public JSpinner getSpnCompanyCount() { + return spnCompanyCount; + } + + public void setSpnCompanyCount(JSpinner spnCompanyCount) { + this.spnCompanyCount = spnCompanyCount; + } + + public JSpinner getSpnIndividualLanceCount() { + return spnIndividualLanceCount; + } + + public void setSpnIndividualLanceCount(JSpinner spnIndividualLanceCount) { + this.spnIndividualLanceCount = spnIndividualLanceCount; + } + public JSpinner getSpnLancesPerCompany() { return spnLancesPerCompany; } @@ -277,6 +323,14 @@ public void setChkGenerateCaptains(JCheckBox chkGenerateCaptains) { this.chkGenerateCaptains = chkGenerateCaptains; } + public JCheckBox getChkAssignCompanyCommanderFlag() { + return chkAssignCompanyCommanderFlag; + } + + public void setChkAssignCompanyCommanderFlag(JCheckBox chkAssignCompanyCommanderFlag) { + this.chkAssignCompanyCommanderFlag = chkAssignCompanyCommanderFlag; + } + public JCheckBox getChkCompanyCommanderLanceOfficer() { return chkCompanyCommanderLanceOfficer; } @@ -310,6 +364,81 @@ public void setChkAutomaticallyAssignRanks(JCheckBox chkAutomaticallyAssignRanks } //endregion Personnel + //region Personnel Randomization + public JCheckBox getChkRandomizeOrigin() { + return chkRandomizeOrigin; + } + + public void setChkRandomizeOrigin(JCheckBox chkRandomizeOrigin) { + this.chkRandomizeOrigin = chkRandomizeOrigin; + } + + public JCheckBox getChkCentralSystemFactionSpecific() { + return chkCentralSystemFactionSpecific; + } + + public void setChkCentralSystemFactionSpecific(JCheckBox chkCentralSystemFactionSpecific) { + this.chkCentralSystemFactionSpecific = chkCentralSystemFactionSpecific; + } + + public JComboBox getComboCentralSystem() { + return comboCentralSystem; + } + + public PlanetarySystem getCentralSystem() { + return (PlanetarySystem) Objects.requireNonNull(getComboCentralSystem().getSelectedItem()); + } + + public void setComboCentralSystem(JComboBox comboCentralSystem) { + this.comboCentralSystem = comboCentralSystem; + } + + private void updateComboCentralSystem() { + getComboCentralSystem().removeAllItems(); + getComboCentralSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( + getChkCentralSystemFactionSpecific().isSelected() ? getFaction() : null))); + getComboCentralSystem().setSelectedIndex(0); + getComboCentralPlanet().setModel(new DefaultComboBoxModel<>( + getCentralSystem().getPlanets().toArray(new Planet[]{}))); + } + + public JComboBox getComboCentralPlanet() { + return comboCentralPlanet; + } + + public Planet getCentralPlanet() { + return (Planet) Objects.requireNonNull(getComboCentralPlanet().getSelectedItem()); + } + + public void setComboCentralPlanet(JComboBox comboCentralPlanet) { + this.comboCentralPlanet = comboCentralPlanet; + } + + public JSpinner getSpnOriginSearchRadius() { + return spnOriginSearchRadius; + } + + public void setSpnOriginSearchRadius(JSpinner spnOriginSearchRadius) { + this.spnOriginSearchRadius = spnOriginSearchRadius; + } + + public JCheckBox getChkExtraRandomOrigin() { + return chkExtraRandomOrigin; + } + + public void setChkExtraRandomOrigin(JCheckBox chkExtraRandomOrigin) { + this.chkExtraRandomOrigin = chkExtraRandomOrigin; + } + + public JSpinner getSpnOriginDistanceScale() { + return spnOriginDistanceScale; + } + + public void setSpnOriginDistanceScale(JSpinner spnOriginDistanceScale) { + this.spnOriginDistanceScale = spnOriginDistanceScale; + } + //endregion Personnel Randomization + //region Units public JCheckBox getChkGenerateUnitsAsAttached() { return chkGenerateUnitsAsAttached; @@ -334,6 +463,30 @@ public JCheckBox getChkGroupByWeight() { public void setChkGroupByWeight(JCheckBox chkGroupByWeight) { this.chkGroupByWeight = chkGroupByWeight; } + + public JCheckBox getChkKeepOfficerRollsSeparate() { + return chkKeepOfficerRollsSeparate; + } + + public void setChkKeepOfficerRollsSeparate(JCheckBox chkKeepOfficerRollsSeparate) { + this.chkKeepOfficerRollsSeparate = chkKeepOfficerRollsSeparate; + } + + public JSpinner getSpnStarLeagueYear() { + return spnStarLeagueYear; + } + + public void setSpnStarLeagueYear(JSpinner spnStarLeagueYear) { + this.spnStarLeagueYear = spnStarLeagueYear; + } + + public JCheckBox getChkAssignTechsToUnits() { + return chkAssignTechsToUnits; + } + + public void setChkAssignTechsToUnits(JCheckBox chkAssignTechsToUnits) { + this.chkAssignTechsToUnits = chkAssignTechsToUnits; + } //endregion Units //region Unit @@ -358,6 +511,82 @@ public void setChkGenerateForceIcons(JCheckBox chkGenerateForceIcons) { } //endregion Unit + //region Spares + public JCheckBox getChkGenerateMothballedSpareUnits() { + return chkGenerateMothballedSpareUnits; + } + + public void setChkGenerateMothballedSpareUnits(JCheckBox chkGenerateMothballedSpareUnits) { + this.chkGenerateMothballedSpareUnits = chkGenerateMothballedSpareUnits; + } + + public JSpinner getSpnSparesPercentOfActiveUnits() { + return spnSparesPercentOfActiveUnits; + } + + public void setSpnSparesPercentOfActiveUnits(JSpinner spnSparesPercentOfActiveUnits) { + this.spnSparesPercentOfActiveUnits = spnSparesPercentOfActiveUnits; + } + + public JCheckBox getChkGenerateSpareParts() { + return chkGenerateSpareParts; + } + + public void setChkGenerateSpareParts(JCheckBox chkGenerateSpareParts) { + this.chkGenerateSpareParts = chkGenerateSpareParts; + } + + public JSpinner getSpnStartingArmourWeight() { + return spnStartingArmourWeight; + } + + public void setSpnStartingArmourWeight(JSpinner spnStartingArmourWeight) { + this.spnStartingArmourWeight = spnStartingArmourWeight; + } + + public JCheckBox getChkGenerateSpareAmmunition() { + return chkGenerateSpareAmmunition; + } + + public void setChkGenerateSpareAmmunition(JCheckBox chkGenerateSpareAmmunition) { + this.chkGenerateSpareAmmunition = chkGenerateSpareAmmunition; + } + + public JSpinner getSpnNumberReloadsPerWeapon() { + return spnNumberReloadsPerWeapon; + } + + public void setSpnNumberReloadsPerWeapon(JSpinner spnNumberReloadsPerWeapon) { + this.spnNumberReloadsPerWeapon = spnNumberReloadsPerWeapon; + } + + public JCheckBox getChkGenerateFractionalMachineGunAmmunition() { + return chkGenerateFractionalMachineGunAmmunition; + } + + public void setChkGenerateFractionalMachineGunAmmunition(JCheckBox chkGenerateFractionalMachineGunAmmunition) { + this.chkGenerateFractionalMachineGunAmmunition = chkGenerateFractionalMachineGunAmmunition; + } + //endregion Spares + + //region Contracts + public JCheckBox getChkSelectStartingContract() { + return chkSelectStartingContract; + } + + public void setChkSelectStartingContract(JCheckBox chkSelectStartingContract) { + this.chkSelectStartingContract = chkSelectStartingContract; + } + + public JCheckBox getChkStartCourseToContractPlanet() { + return chkStartCourseToContractPlanet; + } + + public void setChkStartCourseToContractPlanet(JCheckBox chkStartCourseToContractPlanet) { + this.chkStartCourseToContractPlanet = chkStartCourseToContractPlanet; + } + //endregion Contracts + //region Finances public JSpinner getSpnStartingCash() { return spnStartingCash; @@ -375,6 +604,14 @@ public void setChkRandomizeStartingCash(JCheckBox chkRandomizeStartingCash) { this.chkRandomizeStartingCash = chkRandomizeStartingCash; } + public JSpinner getSpnRandomStartingCashDiceCount() { + return spnRandomStartingCashDiceCount; + } + + public void setSpnRandomStartingCashDiceCount(JSpinner spnRandomStartingCashDiceCount) { + this.spnRandomStartingCashDiceCount = spnRandomStartingCashDiceCount; + } + public JSpinner getSpnMinimumStartingFloat() { return spnMinimumStartingFloat; } @@ -462,42 +699,82 @@ private void initialize() { private JPanel createBaseInformationPanel() { JLabel lblCompanyGenerationType = new JLabel(resources.getString("lblCompanyGenerationType.text")); + lblCompanyGenerationType.setToolTipText(resources.getString("lblCompanyGenerationType.toolTipText")); lblCompanyGenerationType.setName("lblCompanyGenerationType"); setComboCompanyGenerationType(new JComboBox<>(CompanyGenerationType.values())); getComboCompanyGenerationType().setName("comboCompanyGenerationType"); + getComboCompanyGenerationType().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (isSelected && (index > -1)) { + list.setToolTipText((list.getSelectedValue() instanceof CompanyGenerationType) + ? ((CompanyGenerationType) list.getSelectedValue()).getToolTipText() : ""); + } + return this; + } + }); - JLabel lblFaction = new JLabel(resources.getString("lblFaction.text")); + JLabel lblFaction = new JLabel(resources.getString("Faction")); + lblFaction.setToolTipText(resources.getString("lblFaction.toolTipText")); lblFaction.setName("lblFaction"); setComboFaction(new JComboBox<>(getFactionChoices().toArray(new FactionChoice[]{}))); + getComboFaction().setToolTipText(resources.getString("lblFaction.toolTipText")); getComboFaction().setName("comboFaction"); + setChkStartingSystemFactionSpecific(new JCheckBox(resources.getString("FactionSpecific"))); + getChkStartingSystemFactionSpecific().setToolTipText("chkStartingSystemFactionSpecific.toolTipText"); + getChkStartingSystemFactionSpecific().setName("chkStartingSystemFactionSpecific"); + + JLabel lblStartingPlanet = new JLabel(resources.getString("lblStartingPlanet.text")); + lblStartingPlanet.setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); + lblStartingPlanet.setName("lblStartingPlanet"); + + setComboStartingSystem(new JComboBox<>()); + getComboStartingSystem().setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); + getComboStartingSystem().setName("comboStartingSystem"); + + setComboStartingPlanet(new JComboBox<>()); + getComboStartingPlanet().setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); + getComboStartingPlanet().setName("comboStartingPlanet"); + setChkGenerateMercenaryCompanyCommandLance(new JCheckBox(resources.getString("chkGenerateMercenaryCompanyCommandLance.text"))); + getChkGenerateMercenaryCompanyCommandLance().setToolTipText(resources.getString("chkGenerateMercenaryCompanyCommandLance.toolTipText")); getChkGenerateMercenaryCompanyCommandLance().setName("chkGenerateMercenaryCompanyCommandLance"); JLabel lblCompanyCount = new JLabel(resources.getString("lblCompanyCount.text")); + lblCompanyCount.setToolTipText(resources.getString("lblCompanyCount.toolTipText")); lblCompanyCount.setName("lblCompanyCount"); - setSpnCompanyCount(new JSpinner(new SpinnerNumberModel(0, 0, 3, 1))); + setSpnCompanyCount(new JSpinner(new SpinnerNumberModel(0, 0, 5, 1))); + getSpnCompanyCount().setToolTipText(resources.getString("lblCompanyCount.toolTipText")); getSpnCompanyCount().setName("spnCompanyCount"); JLabel lblIndividualLanceCount = new JLabel(resources.getString("lblIndividualLanceCount.text")); + lblIndividualLanceCount.setToolTipText(resources.getString("lblIndividualLanceCount.toolTipText")); lblIndividualLanceCount.setName("lblIndividualLanceCount"); setSpnIndividualLanceCount(new JSpinner(new SpinnerNumberModel(0, 0, 2, 1))); + getSpnIndividualLanceCount().setToolTipText(resources.getString("lblIndividualLanceCount.toolTipText")); getSpnIndividualLanceCount().setName("spnIndividualLanceCount"); JLabel lblLancesPerCompany = new JLabel(resources.getString("lblLancesPerCompany.text")); + lblLancesPerCompany.setToolTipText(resources.getString("lblLancesPerCompany.toolTipText")); lblLancesPerCompany.setName("lblLancesPerCompany"); - setSpnLancesPerCompany(new JSpinner(new SpinnerNumberModel(3, 2, 5, 1))); + setSpnLancesPerCompany(new JSpinner(new SpinnerNumberModel(3, 2, 6, 1))); + getSpnLancesPerCompany().setToolTipText(resources.getString("lblLancesPerCompany.toolTipText")); getSpnLancesPerCompany().setName("spnLancesPerCompany"); JLabel lblLanceSize = new JLabel(resources.getString("lblLanceSize.text")); + lblLanceSize.setToolTipText(resources.getString("lblLanceSize.toolTipText")); lblLanceSize.setName("lblLanceSize"); setSpnLanceSize(new JSpinner(new SpinnerNumberModel(4, 3, 6, 1))); + getSpnLanceSize().setToolTipText(resources.getString("lblLanceSize.toolTipText")); getSpnLanceSize().setName("spnLanceSize"); // Layout the UI @@ -518,7 +795,12 @@ private JPanel createBaseInformationPanel() { .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblFaction) .addComponent(getComboFaction()) - .addComponent(getChkGenerateMercenaryCompanyCommandLance(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkStartingSystemFactionSpecific(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblStartingPlanet) + .addComponent(getComboStartingSystem()) + .addComponent(getComboStartingPlanet(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkGenerateMercenaryCompanyCommandLance()) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblCompanyCount) .addComponent(getSpnCompanyCount()) @@ -539,7 +821,12 @@ private JPanel createBaseInformationPanel() { .addGroup(layout.createSequentialGroup() .addComponent(lblFaction) .addComponent(getComboFaction()) - .addComponent(getChkGenerateMercenaryCompanyCommandLance())) + .addComponent(getChkStartingSystemFactionSpecific())) + .addGroup(layout.createSequentialGroup() + .addComponent(lblStartingPlanet) + .addComponent(getComboStartingSystem()) + .addComponent(getComboStartingPlanet())) + .addComponent(getChkGenerateMercenaryCompanyCommandLance()) .addGroup(layout.createSequentialGroup() .addComponent(lblCompanyCount) .addComponent(getSpnCompanyCount()) @@ -557,6 +844,7 @@ private JPanel createBaseInformationPanel() { private JPanel createPersonnelPanel() { setLblTotalSupportPersonnel(new JLabel()); updateLblTotalSupportPersonnel(0); + getLblTotalSupportPersonnel().setToolTipText(resources.getString("lblTotalSupportPersonnel.toolTipText")); getLblTotalSupportPersonnel().setName("lblTotalSupportPersonnel"); JPanel supportPersonnelNumbersPanel = createSupportPersonnelNumbersPanel(); @@ -569,17 +857,24 @@ private JPanel createPersonnelPanel() { getChkGenerateCaptains().setToolTipText(resources.getString("chkGenerateCaptains.toolTipText")); getChkGenerateCaptains().setName("chkGenerateCaptains"); + setChkAssignCompanyCommanderFlag(new JCheckBox(resources.getString("chkAssignCompanyCommanderFlag.text"))); + getChkAssignCompanyCommanderFlag().setToolTipText(resources.getString("chkAssignCompanyCommanderFlag.toolTipText")); + getChkAssignCompanyCommanderFlag().setName("chkAssignCompanyCommanderFlag"); + setChkCompanyCommanderLanceOfficer(new JCheckBox(resources.getString("chkCompanyCommanderLanceOfficer.text"))); getChkCompanyCommanderLanceOfficer().setToolTipText(resources.getString("chkCompanyCommanderLanceOfficer.toolTipText")); getChkCompanyCommanderLanceOfficer().setName("chkCompanyCommanderLanceOfficer"); setChkApplyOfficerStatBonusToWorstSkill(new JCheckBox(resources.getString("chkApplyOfficerStatBonusToWorstSkill.text"))); + getChkApplyOfficerStatBonusToWorstSkill().setToolTipText(resources.getString("chkApplyOfficerStatBonusToWorstSkill.toolTipText")); getChkApplyOfficerStatBonusToWorstSkill().setName("chkApplyOfficerStatBonusToWorstSkill"); setChkAssignBestOfficers(new JCheckBox(resources.getString("chkAssignBestOfficers.text"))); + getChkAssignBestOfficers().setToolTipText(resources.getString("chkAssignBestOfficers.toolTipText")); getChkAssignBestOfficers().setName("chkAssignBestOfficers"); setChkAutomaticallyAssignRanks(new JCheckBox(resources.getString("chkAutomaticallyAssignRanks.text"))); + getChkAutomaticallyAssignRanks().setToolTipText(resources.getString("chkAutomaticallyAssignRanks.toolTipText")); getChkAutomaticallyAssignRanks().setName("chkAutomaticallyAssignRanks"); // Layout the UI @@ -598,6 +893,7 @@ private JPanel createPersonnelPanel() { .addComponent(supportPersonnelNumbersPanel) .addComponent(getChkPoolAssistants()) .addComponent(getChkGenerateCaptains()) + .addComponent(getChkAssignCompanyCommanderFlag()) .addComponent(getChkCompanyCommanderLanceOfficer()) .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) .addComponent(getChkAssignBestOfficers()) @@ -610,6 +906,7 @@ private JPanel createPersonnelPanel() { .addComponent(supportPersonnelNumbersPanel) .addComponent(getChkPoolAssistants()) .addComponent(getChkGenerateCaptains()) + .addComponent(getChkAssignCompanyCommanderFlag()) .addComponent(getChkCompanyCommanderLanceOfficer()) .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) .addComponent(getChkAssignBestOfficers()) @@ -624,58 +921,86 @@ private JPanel createSupportPersonnelNumbersPanel() { final JLabel[] rtsLabelArray = new JLabel[9]; String roleName = Person.getRoleDesc(Person.T_MECH_TECH, false); + String toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[0] = new JLabel(roleName); + rtsLabelArray[0].setToolTipText(toolTipText); rtsLabelArray[0].setName("lbl" + roleName); rtsArray[0] = new RoleToSpinner(Person.T_MECH_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[0].getSpinner().setToolTipText(toolTipText); rtsArray[0].getSpinner().setName("spn" + roleName); roleName = Person.getRoleDesc(Person.T_MECHANIC, false); + toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[1] = new JLabel(roleName); + rtsLabelArray[1].setToolTipText(toolTipText); rtsLabelArray[1].setName("lbl" + roleName); rtsArray[1] = new RoleToSpinner(Person.T_MECHANIC, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[1].getSpinner().setToolTipText(toolTipText); rtsArray[1].getSpinner().setName("spn" + roleName); roleName = Person.getRoleDesc(Person.T_AERO_TECH, false); + toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[2] = new JLabel(roleName); + rtsLabelArray[2].setToolTipText(toolTipText); rtsLabelArray[2].setName("lbl" + roleName); rtsArray[2] = new RoleToSpinner(Person.T_AERO_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[2].getSpinner().setToolTipText(toolTipText); rtsArray[2].getSpinner().setName("spn" + roleName); roleName = Person.getRoleDesc(Person.T_BA_TECH, false); + toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[3] = new JLabel(roleName); + rtsLabelArray[3].setToolTipText(toolTipText); rtsLabelArray[3].setName("lbl" + roleName); rtsArray[3] = new RoleToSpinner(Person.T_BA_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[3].getSpinner().setToolTipText(toolTipText); rtsArray[3].getSpinner().setName("spn" + roleName); roleName = Person.getRoleDesc(Person.T_DOCTOR, false); + toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[4] = new JLabel(roleName); + rtsLabelArray[4].setToolTipText(toolTipText); rtsLabelArray[4].setName("lbl" + roleName); rtsArray[4] = new RoleToSpinner(Person.T_DOCTOR, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[4].getSpinner().setToolTipText(toolTipText); rtsArray[4].getSpinner().setName("spn" + roleName); roleName = Person.getRoleDesc(Person.T_ADMIN_COM, false); + toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[5] = new JLabel(roleName); + rtsLabelArray[5].setToolTipText(toolTipText); rtsLabelArray[5].setName("lbl" + roleName); rtsArray[5] = new RoleToSpinner(Person.T_ADMIN_COM, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[5].getSpinner().setToolTipText(toolTipText); rtsArray[5].getSpinner().setName("spn" + roleName); roleName = Person.getRoleDesc(Person.T_ADMIN_LOG, false); + toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[6] = new JLabel(roleName); + rtsLabelArray[6].setToolTipText(toolTipText); rtsLabelArray[6].setName("lbl" + roleName); rtsArray[6] = new RoleToSpinner(Person.T_ADMIN_LOG, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[6].getSpinner().setToolTipText(toolTipText); rtsArray[6].getSpinner().setName("spn" + roleName); roleName = Person.getRoleDesc(Person.T_ADMIN_TRA, false); + toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[7] = new JLabel(roleName); + rtsLabelArray[7].setToolTipText(toolTipText); rtsLabelArray[7].setName("lbl" + roleName); rtsArray[7] = new RoleToSpinner(Person.T_ADMIN_TRA, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[7].getSpinner().setToolTipText(toolTipText); rtsArray[7].getSpinner().setName("spn" + roleName); roleName = Person.getRoleDesc(Person.T_ADMIN_HR, false); + toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); rtsLabelArray[8] = new JLabel(roleName); + rtsLabelArray[8].setToolTipText(toolTipText); rtsLabelArray[8].setName("lbl" + roleName); rtsArray[8] = new RoleToSpinner(Person.T_ADMIN_HR, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + rtsArray[8].getSpinner().setToolTipText(toolTipText); rtsArray[8].getSpinner().setName("spn" + roleName); + setSpnSupportPersonnelNumbers(rtsArray); // Layout the UI @@ -704,6 +1029,93 @@ private JPanel createSupportPersonnelNumbersPanel() { return panel; } + private JPanel createPersonnelRandomizationPanel() { + setChkRandomizeOrigin(new JCheckBox("chkRandomizeOrigin.text")); + getChkRandomizeOrigin().setToolTipText(resources.getString("chkRandomizeOrigin.toolTipText")); + getChkRandomizeOrigin().setName("chkRandomizeOrigin"); + + setChkCentralSystemFactionSpecific(new JCheckBox(resources.getString("FactionSpecific"))); + getChkCentralSystemFactionSpecific().setToolTipText(resources.getString("chkCentralSystemFactionSpecific.toolTipText")); + getChkCentralSystemFactionSpecific().setName("chkCentralSystemFactionSpecific"); + + JLabel lblCentralPlanet = new JLabel(resources.getString("lblCentralPlanet.text")); + lblCentralPlanet.setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); + lblCentralPlanet.setName("lblCentralPlanet"); + + setComboCentralSystem(new JComboBox<>()); + getComboCentralSystem().setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); + getComboCentralSystem().setName("comboCentralSystem"); + + setComboCentralPlanet(new JComboBox<>()); + getComboCentralPlanet().setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); + getComboCentralPlanet().setName("comboCentralPlanet"); + + JLabel lblOriginSearchRadius = new JLabel(resources.getString("lblOriginSearchRadius.text")); + lblOriginSearchRadius.setToolTipText(resources.getString("lblOriginSearchRadius.toolTipText")); + lblOriginSearchRadius.setName("lblOriginSearchRadius"); + + setSpnOriginSearchRadius(new JSpinner(new SpinnerNumberModel(0, 0, 0, 0))); + getSpnOriginSearchRadius().setToolTipText(resources.getString("lblOriginSearchRadius.toolTipText")); + getSpnOriginSearchRadius().setName("spnOriginSearchRadius"); + + setChkExtraRandomOrigin(new JCheckBox(resources.getString("chkExtraRandomOrigin.text"))); + getChkExtraRandomOrigin().setToolTipText(resources.getString("chkExtraRandomOrigin.toolTipText")); + getChkExtraRandomOrigin().setName("chkExtraRandomOrigin"); + + JLabel lblOriginDistanceScale = new JLabel(resources.getString("lblOriginDistanceScale.text")); + lblOriginDistanceScale.setToolTipText(resources.getString("lblOriginDistanceScale.toolTipText")); + lblOriginDistanceScale.setName("lblOriginDistanceScale"); + + setSpnOriginDistanceScale(new JSpinner(new SpinnerNumberModel(0, 0, 0, 0))); + getSpnOriginDistanceScale().setToolTipText(resources.getString("lblOriginDistanceScale.toolTipText")); + getSpnOriginDistanceScale().setName("spnOriginDistanceScale"); + + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("personnelRandomizationPanel.title"))); + panel.setName("personnelRandomizationPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getChkRandomizeOrigin()) + .addComponent(getChkCentralSystemFactionSpecific()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblCentralPlanet) + .addComponent(getComboCentralSystem()) + .addComponent(getComboCentralPlanet(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblOriginSearchRadius) + .addComponent(getSpnOriginSearchRadius(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkExtraRandomOrigin()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblOriginDistanceScale) + .addComponent(getSpnOriginDistanceScale(), GroupLayout.Alignment.LEADING)) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(getChkRandomizeOrigin()) + .addComponent(getChkCentralSystemFactionSpecific()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblCentralPlanet) + .addComponent(getComboCentralSystem()) + .addComponent(getComboCentralPlanet())) + .addGroup(layout.createSequentialGroup() + .addComponent(lblOriginSearchRadius) + .addComponent(getSpnOriginSearchRadius())) + .addComponent(getChkExtraRandomOrigin()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblOriginDistanceScale) + .addComponent(getSpnOriginDistanceScale())) + ); + return panel; + } + private JPanel createUnitsPanel() { setChkGenerateUnitsAsAttached(new JCheckBox(resources.getString("chkGenerateUnitsAsAttached.text"))); getChkGenerateUnitsAsAttached().setToolTipText(resources.getString("chkGenerateUnitsAsAttached.toolTipText")); @@ -717,6 +1129,22 @@ private JPanel createUnitsPanel() { getChkGroupByWeight().setToolTipText(resources.getString("chkGroupByWeight.toolTipText")); getChkGroupByWeight().setName("chkGroupByWeight"); + setChkKeepOfficerRollsSeparate(new JCheckBox(resources.getString("chkKeepOfficerRollsSeparate.text"))); + getChkKeepOfficerRollsSeparate().setToolTipText(resources.getString("chkKeepOfficerRollsSeparate.toolTipText")); + getChkKeepOfficerRollsSeparate().setName("chkKeepOfficerRollsSeparate"); + + JLabel lblStarLeagueYear = new JLabel(resources.getString("lblStarLeagueYear.text")); + lblStarLeagueYear.setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); + lblStarLeagueYear.setName("lblStarLeagueYear"); + + setSpnStarLeagueYear(new JSpinner(new SpinnerNumberModel(2765, 2571, 2780, 1))); + getSpnStarLeagueYear().setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); + getSpnStarLeagueYear().setName("spnStarLeagueYear"); + + setChkAssignTechsToUnits(new JCheckBox(resources.getString("chkAssignTechsToUnits.text"))); + getChkAssignTechsToUnits().setToolTipText(resources.getString("chkAssignTechsToUnits.toolTipText")); + getChkAssignTechsToUnits().setName("chkAssignTechsToUnits"); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitsPanel.title"))); @@ -732,6 +1160,11 @@ private JPanel createUnitsPanel() { .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) .addComponent(getChkGroupByWeight()) + .addComponent(getChkKeepOfficerRollsSeparate()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblStarLeagueYear) + .addComponent(getSpnStarLeagueYear(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkAssignTechsToUnits()) ); layout.setHorizontalGroup( @@ -739,18 +1172,37 @@ private JPanel createUnitsPanel() { .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) .addComponent(getChkGroupByWeight()) + .addComponent(getChkKeepOfficerRollsSeparate()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblStarLeagueYear) + .addComponent(getSpnStarLeagueYear())) + .addComponent(getChkAssignTechsToUnits()) ); return panel; } private JPanel createUnitPanel() { JLabel lblForceNamingType = new JLabel(resources.getString("lblForceNamingType.text")); + lblForceNamingType.setToolTipText(resources.getString("lblForceNamingType.toolTipText")); lblForceNamingType.setName("lblForceNamingType"); setComboForceNamingType(new JComboBox<>(ForceNamingType.values())); getComboForceNamingType().setName("comboForceNamingType"); + getComboForceNamingType().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (isSelected && (index > -1)) { + list.setToolTipText((list.getSelectedValue() instanceof ForceNamingType) + ? ((ForceNamingType) list.getSelectedValue()).getToolTipText() : ""); + } + return this; + } + }); setChkGenerateForceIcons(new JCheckBox(resources.getString("chkGenerateForceIcons.text"))); + getChkGenerateForceIcons().setToolTipText(resources.getString("chkGenerateForceIcons.toolTipText")); getChkGenerateForceIcons().setName("chkGenerateForceIcons"); // Layout the UI @@ -781,17 +1233,89 @@ private JPanel createUnitPanel() { return panel; } + private JPanel createSparesPanel() { + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitPanel.title"))); + panel.setName("unitPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblForceNamingType) + .addComponent(getComboForceNamingType(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkGenerateForceIcons()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(lblForceNamingType) + .addComponent(getComboForceNamingType())) + .addComponent(getChkGenerateForceIcons()) + ); + return panel; + } + + private JPanel createContractsPanel() { + setChkSelectStartingContract(new JCheckBox(resources.getString("chkSelectStartingContract.text"))); + getChkSelectStartingContract().setToolTipText(resources.getString("chkSelectStartingContract.toolTipText")); + getChkSelectStartingContract().setName("chkSelectStartingContract"); + + setChkStartCourseToContractPlanet(new JCheckBox(resources.getString("chkStartCourseToContractPlanet.text"))); + getChkStartCourseToContractPlanet().setToolTipText(resources.getString("chkStartCourseToContractPlanet.toolTipText")); + getChkStartCourseToContractPlanet().setName("chkStartCourseToContractPlanet"); + + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("contractsPanel.title"))); + panel.setName("contractsPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getChkSelectStartingContract()) + .addComponent(getChkStartCourseToContractPlanet()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(getChkSelectStartingContract()) + .addComponent(getChkStartCourseToContractPlanet()) + ); + return panel; + } + private JPanel createFinancesPanel() { JLabel lblStartingCash = new JLabel(resources.getString("lblStartingCash.text")); + lblStartingCash.setToolTipText(resources.getString("lblStartingCash.toolTipText")); lblStartingCash.setName("lblStartingCash"); setSpnStartingCash(new JSpinner(new SpinnerNumberModel(0, 0, 200000000, 100000))); + getSpnStartingCash().setToolTipText(resources.getString("lblStartingCash.toolTipText")); getSpnStartingCash().setName("spnStartingCash"); setChkRandomizeStartingCash(new JCheckBox(resources.getString("chkRandomizeStartingCash.text"))); getChkRandomizeStartingCash().setToolTipText(resources.getString("chkRandomizeStartingCash.toolTipText")); getChkRandomizeStartingCash().setName("chkRandomizeStartingCash"); + JLabel lblRandomStartingCashDiceCount = new JLabel(resources.getString("lblRandomStartingCashDiceCount.text")); + lblRandomStartingCashDiceCount.setToolTipText(resources.getString("lblRandomStartingCashDiceCount.toolTipText")); + lblRandomStartingCashDiceCount.setName("lblRandomStartingCashDiceCount"); + + setSpnRandomStartingCashDiceCount(new JSpinner(new SpinnerNumberModel(8, 1, 100, 1))); + getSpnRandomStartingCashDiceCount().setToolTipText(resources.getString("lblRandomStartingCashDiceCount.toolTipText")); + getSpnRandomStartingCashDiceCount().setName("spnRandomStartingCashDiceCount"); + JLabel lblMinimumStartingFloat = new JLabel(resources.getString("lblMinimumStartingFloat.text")); lblMinimumStartingFloat.setToolTipText(resources.getString("lblMinimumStartingFloat.toolTipText")); lblMinimumStartingFloat.setName("lblMinimumStartingFloat"); @@ -840,6 +1364,9 @@ private JPanel createFinancesPanel() { .addComponent(lblStartingCash) .addComponent(getSpnStartingCash(), GroupLayout.Alignment.LEADING)) .addComponent(getChkRandomizeStartingCash()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblRandomStartingCashDiceCount) + .addComponent(getSpnRandomStartingCashDiceCount(), GroupLayout.Alignment.LEADING)) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblMinimumStartingFloat) .addComponent(getSpnMinimumStartingFloat(), GroupLayout.Alignment.LEADING)) @@ -857,6 +1384,9 @@ private JPanel createFinancesPanel() { .addComponent(lblStartingCash) .addComponent(getSpnStartingCash())) .addComponent(getChkRandomizeStartingCash()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblRandomStartingCashDiceCount) + .addComponent(getSpnRandomStartingCashDiceCount())) .addGroup(layout.createSequentialGroup() .addComponent(lblMinimumStartingFloat) .addComponent(getSpnMinimumStartingFloat())) @@ -882,6 +1412,13 @@ private List getFactionChoices() { return factionChoices; } + + private PlanetarySystem[] getPlanetarySystems(@Nullable Faction faction) { + return getCampaign().getSystems().stream() + .filter(p -> (faction == null) || p.getFactionSet(getCampaign().getLocalDate()).contains(faction)) + .sorted(Comparator.comparing(p -> p.getName(getCampaign().getLocalDate()))) + .collect(Collectors.toList()).toArray(new PlanetarySystem[]{}); + } //endregion Initialization //region Options @@ -906,10 +1443,15 @@ public void setOptions(final CompanyGenerationOptions options) { break; } } - + if (getChkStartingSystemFactionSpecific().isSelected()) { + getChkStartingSystemFactionSpecific().setSelected(false); + updateComboStartingSystem(); + } + getComboStartingSystem().setSelectedItem(options.getStartingPlanet().getParentSystem()); + getComboStartingPlanet().setSelectedItem(options.getStartingPlanet()); + getChkGenerateMercenaryCompanyCommandLance().setSelected(options.isGenerateMercenaryCompanyCommandLance()); getSpnCompanyCount().setValue(options.getCompanyCount()); getSpnIndividualLanceCount().setValue(options.getIndividualLanceCount()); - getChkGenerateMercenaryCompanyCommandLance().setSelected(options.isGenerateMercenaryCompanyCommandLance()); getSpnLancesPerCompany().setValue(options.getLancesPerCompany()); getSpnLanceSize().setValue(options.getLanceSize()); @@ -918,23 +1460,52 @@ public void setOptions(final CompanyGenerationOptions options) { setSupportPersonnelNumbers(options.getSupportPersonnel()); getChkPoolAssistants().setSelected(options.isPoolAssistants()); getChkGenerateCaptains().setSelected(options.isGenerateCaptains()); + getChkAssignCompanyCommanderFlag().setSelected(options.isAssignCompanyCommanderFlag()); getChkCompanyCommanderLanceOfficer().setSelected(options.isCompanyCommanderLanceOfficer()); getChkApplyOfficerStatBonusToWorstSkill().setSelected(options.isApplyOfficerStatBonusToWorstSkill()); getChkAssignBestOfficers().setSelected(options.isAssignBestOfficers()); getChkAutomaticallyAssignRanks().setSelected(options.isAutomaticallyAssignRanks()); + // Personnel Randomization + getChkRandomizeOrigin().setSelected(options.isRandomizeOrigin()); + if (getChkCentralSystemFactionSpecific().isSelected()) { + getChkCentralSystemFactionSpecific().setSelected(false); + updateComboCentralSystem(); + } + getComboCentralSystem().setSelectedItem(options.getCentralPlanet().getParentSystem()); + getComboCentralPlanet().setSelectedItem(options.getCentralPlanet()); + getSpnOriginSearchRadius().setValue(options.getOriginSearchRadius()); + getChkExtraRandomOrigin().setSelected(options.isExtraRandomOrigin()); + getSpnOriginDistanceScale().setValue(options.getOriginDistanceScale()); + // Units getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); getChkAssignBestRollToUnitCommander().setSelected(options.isAssignBestRollToUnitCommander()); getChkGroupByWeight().setSelected(options.isGroupByWeight()); + getChkKeepOfficerRollsSeparate().setSelected(options.isKeepOfficerRollsSeparate()); + getSpnStarLeagueYear().setValue(options.getStarLeagueYear()); + getChkAssignTechsToUnits().setSelected(options.isAssignTechsToUnits()); // Unit getComboForceNamingType().setSelectedItem(options.getForceNamingType()); getChkGenerateForceIcons().setSelected(options.isGenerateForceIcons()); + // Spares + getChkGenerateMothballedSpareUnits().setSelected(options.isGenerateMothballedSpareUnits()); + getSpnSparesPercentOfActiveUnits().setValue(options.getSparesPercentOfActiveUnits()); + getChkGenerateSpareParts().setSelected(options.isGenerateSpareParts()); + getSpnStartingArmourWeight().setValue(options.getStartingArmourWeight()); + getChkGenerateSpareAmmunition().setSelected(options.isGenerateSpareAmmunition()); + getChkGenerateFractionalMachineGunAmmunition().setSelected(options.isGenerateFractionalMachineGunAmmunition()); + + // Contracts + getChkSelectStartingContract().setSelected(options.isSelectStartingContract()); + getChkStartCourseToContractPlanet().setSelected(options.isStartCourseToContractPlanet()); + // Finances getSpnStartingCash().setValue(options.getStartingCash()); getChkRandomizeStartingCash().setSelected(options.isRandomizeStartingCash()); + getSpnRandomStartingCashDiceCount().setValue(options.getRandomStartingCashDiceCount()); getSpnMinimumStartingFloat().setValue(options.getMinimumStartingFloat()); getChkPayForSetup().setSelected(options.isPayForSetup()); getChkStartingLoan().setSelected(options.isStartingLoan()); @@ -952,9 +1523,10 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Base Information options.setType(getCompanyGenerationType()); options.setFaction(getFaction()); + options.setStartingPlanet(getStartingPlanet()); + options.setGenerateMercenaryCompanyCommandLance(getChkGenerateMercenaryCompanyCommandLance().isSelected()); options.setCompanyCount((Integer) getSpnCompanyCount().getValue()); options.setIndividualLanceCount((Integer) getSpnIndividualLanceCount().getValue()); - options.setGenerateMercenaryCompanyCommandLance(getChkGenerateMercenaryCompanyCommandLance().isSelected()); options.setLancesPerCompany((Integer) getSpnLancesPerCompany().getValue()); options.setLanceSize((Integer) getSpnLanceSize().getValue()); @@ -962,23 +1534,48 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setSupportPersonnel(getSupportPersonnelNumbers()); options.setPoolAssistants(getChkPoolAssistants().isSelected()); options.setGenerateCaptains(getChkGenerateCaptains().isSelected()); + options.setAssignCompanyCommanderFlag(getChkAssignCompanyCommanderFlag().isSelected()); options.setCompanyCommanderLanceOfficer(getChkCompanyCommanderLanceOfficer().isSelected()); options.setApplyOfficerStatBonusToWorstSkill(getChkApplyOfficerStatBonusToWorstSkill().isSelected()); options.setAssignBestOfficers(getChkAssignBestOfficers().isSelected()); options.setAutomaticallyAssignRanks(getChkAutomaticallyAssignRanks().isSelected()); + // Personnel Randomization + options.setRandomizeOrigin(getChkRandomizeOrigin().isSelected()); + options.setCentralPlanet(getCentralPlanet()); + options.setOriginSearchRadius((Integer) getSpnOriginSearchRadius().getValue()); + options.setExtraRandomOrigin(getChkExtraRandomOrigin().isSelected()); + options.setOriginDistanceScale((Double) getSpnOriginDistanceScale().getValue()); + // Units options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); options.setAssignBestRollToUnitCommander(getChkAssignBestRollToUnitCommander().isSelected()); options.setGroupByWeight(getChkGroupByWeight().isSelected()); + options.setKeepOfficerRollsSeparate(getChkKeepOfficerRollsSeparate().isSelected()); + options.setStarLeagueYear((Integer) getSpnStarLeagueYear().getValue()); + options.setAssignTechsToUnits(getChkAssignTechsToUnits().isSelected()); // Unit options.setForceNamingType(getForceNamingType()); options.setGenerateForceIcons(getChkGenerateForceIcons().isSelected()); + // Spares + options.setGenerateMothballedSpareUnits(getChkGenerateMothballedSpareUnits().isSelected()); + options.setSparesPercentOfActiveUnits((Integer) getSpnSparesPercentOfActiveUnits().getValue()); + options.setGenerateSpareParts(getChkGenerateSpareParts().isSelected()); + options.setStartingArmourWeight((Integer) getSpnStartingArmourWeight().getValue()); + options.setGenerateSpareAmmunition(getChkGenerateSpareAmmunition().isSelected()); + options.setNumberReloadsPerWeapon((Integer) getSpnNumberReloadsPerWeapon().getValue()); + options.setGenerateFractionalMachineGunAmmunition(getChkGenerateFractionalMachineGunAmmunition().isSelected()); + + // Contracts + options.setSelectStartingContract(getChkSelectStartingContract().isSelected()); + options.setStartCourseToContractPlanet(getChkStartCourseToContractPlanet().isSelected()); + // Finances options.setStartingCash((Integer) getSpnStartingCash().getValue()); options.setRandomizeStartingCash(getChkRandomizeStartingCash().isSelected()); + options.setRandomStartingCashDiceCount((Integer) getSpnRandomStartingCashDiceCount().getValue()); options.setMinimumStartingFloat((Integer) getSpnMinimumStartingFloat().getValue()); options.setPayForSetup(getChkPayForSetup().isSelected()); options.setStartingLoan(getChkStartingLoan().isSelected()); diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java index 2cf79e0850..c5764c6cc8 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java @@ -64,8 +64,7 @@ public void generate() { return; } - setCompanyGenerator(getCompanyGenerationType().getGenerator(getCampaign())); - getCompanyGenerator().setOptions(createOptionsFromPanel()); + setCompanyGenerator(getCompanyGenerationType().getGenerator(getCampaign(), createOptionsFromPanel())); setCombatPersonnel(getCompanyGenerator().generateCombatPersonnel(getCampaign())); setSupportPersonnel(getCompanyGenerator().generateSupportPersonnel(getCampaign())); From 68dd654d9d5ab752faf1fc7e9e433f0fd9373e9e Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 8 Feb 2021 14:58:03 -0700 Subject: [PATCH 006/115] Fully working options prototype --- .../resources/mekhq/resources/GUI.properties | 110 +++++++++--------- .../resources/MekHqOptionsDialog.properties | 8 +- MekHQ/src/mekhq/MekHQOptions.java | 26 ++--- MekHQ/src/mekhq/MekHqConstants.java | 2 +- .../CompanyGenerationOptions.java | 4 +- .../gui/dialog/CompanyGenerationDialog.java | 4 +- .../mekhq/gui/dialog/MekHqOptionsDialog.java | 70 ++++------- .../src/mekhq/gui/enums/PersonnelFilter.java | 86 +++++++------- .../view/CompanyGenerationOptionsPanel.java | 94 ++++++++++++--- .../gui/view/CompanyGenerationPanel.java | 3 +- 10 files changed, 229 insertions(+), 178 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index aaf6254c56..712290abc6 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -75,49 +75,51 @@ LayeredForceIcon.frame.text=Frames LayeredForceIcon.logos.text=Logos ## PersonnelFilter Enum -PersonnelFilter.ALL=All Personnel -PersonnelFilter.ACTIVE=Active Personnel -PersonnelFilter.COMBAT=Combat Personnel -PersonnelFilter.SUPPORT=Support Personnel -PersonnelFilter.MECHWARRIOR=MechWarriors -PersonnelFilter.VEHICLE_CREWMEMBER=Vehicle Crews -PersonnelFilter.GROUND_VEHICLE_DRIVER=Vehicle Drivers -PersonnelFilter.NAVAL_VEHICLE_DRIVER=Naval Drivers -PersonnelFilter.VEHICLE_GUNNER=Vehicle Gunners -PersonnelFilter.VEHICLE_CREW=Vehicle Crew -PersonnelFilter.VTOL_PILOT=VTOL Pilots -PersonnelFilter.AEROSPACE_PILOT=Aerospace Pilots -PersonnelFilter.CONVENTIONAL_AIRCRAFT_PILOT=Conventional Pilots -PersonnelFilter.PROTOMECH_PILOT=ProtoMech Pilots -PersonnelFilter.BATTLE_ARMOUR=Battle Armor Infantry -PersonnelFilter.SOLDIER=Soldiers -PersonnelFilter.VESSEL_CREWMEMBER=Large Vessel Crews -PersonnelFilter.VESSEL_PILOT=Vessel Pilots -PersonnelFilter.VESSEL_CREW=Vessel Crew -PersonnelFilter.VESSEL_GUNNER=Vessel Gunners -PersonnelFilter.VESSEL_NAVIGATOR=Hyperspace Navigators -PersonnelFilter.TECH=Techs -PersonnelFilter.MECH_TECH=Mech Techs -PersonnelFilter.MECHANIC=Mechanics -PersonnelFilter.AERO_TECH=Aero Techs -PersonnelFilter.BA_TECH=Battle Armour Techs -PersonnelFilter.ASTECH=Astechs -PersonnelFilter.MEDICAL=Medical Staff -PersonnelFilter.DOCTOR=Doctors -PersonnelFilter.MEDIC=Medics -PersonnelFilter.ADMINISTRATOR=Administrators -PersonnelFilter.ADMINISTRATOR_COMMAND=Administrators (Command) -PersonnelFilter.ADMINISTRATOR_LOGISTICS=Administrators (Logistics) -PersonnelFilter.ADMINISTRATOR_TRANSPORT=Administrators (Transport) -PersonnelFilter.ADMINISTRATOR_HR=Administrators (HR) -PersonnelFilter.DEPENDENT=Dependents -PersonnelFilter.FOUNDER=Founders -PersonnelFilter.PRISONER=Prisoners -PersonnelFilter.INACTIVE=Inactive Personnel -PersonnelFilter.RETIRED=Retired Personnel -PersonnelFilter.MIA=Missing in Action Personnel -PersonnelFilter.KIA=Rolls of Honor -PersonnelFilter.DEAD=Cemetery +PersonnelFilter.ALL.text=All Personnel +PersonnelFilter.ACTIVE.text=Active Personnel +PersonnelFilter.COMBAT.text=Combat Personnel +PersonnelFilter.SUPPORT.text=Support Personnel +PersonnelFilter.MECHWARRIORS.text=MechWarriors +PersonnelFilter.MECHWARRIOR.text=MechWarriors +PersonnelFilter.LAM_PILOT.text=LAM Pilots +PersonnelFilter.VEHICLE_CREWMEMBER.text=Vehicle Crews +PersonnelFilter.GROUND_VEHICLE_DRIVER.text=Vehicle Drivers +PersonnelFilter.NAVAL_VEHICLE_DRIVER.text=Naval Drivers +PersonnelFilter.VTOL_PILOT.text=VTOL Pilots +PersonnelFilter.VEHICLE_GUNNER.text=Vehicle Gunners +PersonnelFilter.VEHICLE_CREW.text=Vehicle Crew +PersonnelFilter.AEROSPACE_PILOT.text=Aerospace Pilots +PersonnelFilter.CONVENTIONAL_AIRCRAFT_PILOT.text=Conventional Pilots +PersonnelFilter.PROTOMECH_PILOT.text=ProtoMech Pilots +PersonnelFilter.BATTLE_ARMOUR.text=Battle Armor Infantry +PersonnelFilter.SOLDIER.text=Soldiers +PersonnelFilter.VESSEL_CREWMEMBER.text=Large Vessel Crews +PersonnelFilter.VESSEL_PILOT.text=Vessel Pilots +PersonnelFilter.VESSEL_GUNNER.text=Vessel Gunners +PersonnelFilter.VESSEL_CREW.text=Vessel Crew +PersonnelFilter.VESSEL_NAVIGATOR.text=Hyperspace Navigators +PersonnelFilter.TECH.text=Techs +PersonnelFilter.MECH_TECH.text=Mech Techs +PersonnelFilter.MECHANIC.text=Mechanics +PersonnelFilter.AERO_TECH.text=Aero Techs +PersonnelFilter.BA_TECH.text=Battle Armour Techs +PersonnelFilter.ASTECH.text=Astechs +PersonnelFilter.MEDICAL.text=Medical Staff +PersonnelFilter.DOCTOR.text=Doctors +PersonnelFilter.MEDIC.text=Medics +PersonnelFilter.ADMINISTRATOR.text=Administrators +PersonnelFilter.ADMINISTRATOR_COMMAND.text=Administrators (Command) +PersonnelFilter.ADMINISTRATOR_LOGISTICS.text=Administrators (Logistics) +PersonnelFilter.ADMINISTRATOR_TRANSPORT.text=Administrators (Transport) +PersonnelFilter.ADMINISTRATOR_HR.text=Administrators (HR) +PersonnelFilter.DEPENDENT.text=Dependents +PersonnelFilter.FOUNDER.text=Founders +PersonnelFilter.PRISONER.text=Prisoners +PersonnelFilter.INACTIVE.text=Inactive Personnel +PersonnelFilter.RETIRED.text=Retired Personnel +PersonnelFilter.MIA.text=Missing in Action Personnel +PersonnelFilter.KIA.text=Rolls of Honor +PersonnelFilter.DEAD.text=Cemetery ## PersonnelFilterStyle Enum PersonnelFilterStyle.STANDARD.text=Standard @@ -181,16 +183,16 @@ chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks t # Personnel Randomization Panel personnelRandomizationPanel.title=Personnel Randomization chkRandomizeOrigin.text=Randomize Origin -chkRandomizeOrigin.toolTipText=This randomizes the personnel origin. If disabled this will roll all 'Mechs on the current campaign faction's RAT. +chkRandomizeOrigin.toolTipText=This randomizes the personnel origin. If disabled this will roll all 'Mechs on the faction's RAT. lblCentralPlanet.text=Central Planet chkCentralSystemFactionSpecific.toolTipText=Filter the central planet options so they are specific to the faction selected. lblCentralPlanet.toolTipText=This is the central planet around which personnel are randomized. -lblOriginSearchRadius.text=\u0020 -lblOriginSearchRadius.toolTipText=\u0020 -chkExtraRandomOrigin.text=\u0020 -chkExtraRandomOrigin.toolTipText=\u0020 -lblOriginDistanceScale.text=\u0020 -lblOriginDistanceScale.toolTipText=\u0020 +lblOriginSearchRadius.text=Origin Search Radius +lblOriginSearchRadius.toolTipText=This is the radius that is used to find factions and planets when randomizing a person's origin. +chkExtraRandomOrigin.text=Extra Random Planetary Origin +chkExtraRandomOrigin.toolTipText=When selected random origin is randomized to the planetary level, rather than just randomizing to the system level (with the planet being the primary planet). +lblOriginDistanceScale.text=Origin Distance Scaling Factor +lblOriginDistanceScale.toolTipText=A scaling factor to apply to planetary distances during weighting when randomizing the faction and planetary origins. Values above 1.0 prefer the current location, while values closer to 0.1 spread out the faction selection. # Units Panel unitsPanel.title=Units chkGenerateUnitsAsAttached.text=Generate Units as Attached @@ -248,13 +250,13 @@ chkPayForSetup.toolTipText=Pay for the generated unit from the starting cash, to chkStartingLoan.text=Starting Loan chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended, leaving the starting float as available C-Bills. chkPayForPersonnel.text=Pay for Personnel -chkPayForPersonnel.toolTipText=Pay to hire personnel, at a rate of +chkPayForPersonnel.toolTipText=Pay to hire personnel, at the standard hiring rate of two months salary. chkPayForUnits.text=Pay for Units -chkPayForUnits.toolTipText=\u0020 +chkPayForUnits.toolTipText=Pay for units, at either their full purchase cost or half of it if they are a person's attached unit chkPayForParts.text=Pay for Parts -chkPayForParts.toolTipText=\u0020 +chkPayForParts.toolTipText=Pay for the spare parts generated, if any are generated. chkPayForAmmunition.text=Pay for Ammunition -chkPayForAmmunition.toolTipText=\u0020 +chkPayForAmmunition.toolTipText=Pay for the spare ammunition generated, if any is generated. ## CompanyGenerationPanel Class CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? diff --git a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties index d076b4e68f..ae9ea8d721 100644 --- a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties @@ -10,9 +10,7 @@ invalidDateFormat.error=Invalid Date Format optionHistoricalDailyLog.text=Temporarily Retain Daily Log History optionHistoricalDailyLog.toolTipText=Keeps a limited historical daily report in-memory during the gaming session. May result in increased memory usage. optionShowCompanyGenerator.text=Show Company Generator -optionShowCompanyGenerator.toolTipText=This option adds a company generator menu item under the Manage Campaign header on the menu bar -labelDefaultCompanyGenerationType.text=Default Company Generation Type -labelDefaultCompanyGenerationType.toolTipText=This is the default company generation type to be used on load. +optionShowCompanyGenerator.toolTipText=This option displays the company generator during startup outside of AtB and adds a company generator menu item under the Manage Campaign header on the menu bar. labelCommandCenterDisplay.text=Command Center Display Options optionCommandCenterUseUnitMarket.text=Find Units Links to Unit Market (if enabled) @@ -52,4 +50,6 @@ optionSaveCompanyGenerationOptions.toolTipText=This option allows you to save yo #Miscellaneous Tab miscellaneousTab.title=Miscellaneous Options labelStartGameDelay.text=Delay Timer -optionStartGameDelay.toolTipText=Number of milliseconds to wait before sending another unit. If the application tends to hang when starting a game in MegaMek or does not transfer all units or settings, try increasing this value. +optionStartGameDelay.toolTipText=Number of milliseconds to wait before sending another unit. If the application tends to hang when starting a game in MegaMek or does not transfer all units or settings, try increasing this value. +labelDefaultCompanyGenerationType.text=Default Company Generation Type +labelDefaultCompanyGenerationType.toolTipText=This is the default company generation type to be used on load. diff --git a/MekHQ/src/mekhq/MekHQOptions.java b/MekHQ/src/mekhq/MekHQOptions.java index de106bd13f..377a4aad0e 100644 --- a/MekHQ/src/mekhq/MekHQOptions.java +++ b/MekHQ/src/mekhq/MekHQOptions.java @@ -73,15 +73,6 @@ public void setShowCompanyGenerator(boolean value) { userPreferences.node(MekHqConstants.DISPLAY_NODE).putBoolean(MekHqConstants.SHOW_COMPANY_GENERATOR, value); } - public CompanyGenerationType getDefaultCompanyGenerationType() { - return CompanyGenerationType.valueOf(userPreferences.node(MekHqConstants.DISPLAY_NODE) - .get(MekHqConstants.DEFAULT_COMPANY_GENERATION_TYPE, CompanyGenerationType.AGAINST_THE_BOT.name())); - } - - public void setDefaultCompanyGenerationType(CompanyGenerationType value) { - userPreferences.node(MekHqConstants.DISPLAY_NODE).put(MekHqConstants.DEFAULT_COMPANY_GENERATION_TYPE, value.name()); - } - //region Command Center Display public boolean getCommandCenterUseUnitMarket() { return userPreferences.node(MekHqConstants.DISPLAY_NODE).getBoolean(MekHqConstants.COMMAND_CENTER_USE_UNIT_MARKET, true); @@ -103,7 +94,7 @@ public void setCommandCenterMRMS(boolean value) { //region Personnel Tab Display Options public PersonnelFilterStyle getPersonnelFilterStyle() { return PersonnelFilterStyle.valueOf(userPreferences.node(MekHqConstants.DISPLAY_NODE) - .get(MekHqConstants.PERSONNEL_FILTER_STYLE, "STANDARD")); + .get(MekHqConstants.PERSONNEL_FILTER_STYLE, PersonnelFilterStyle.STANDARD.name())); } public void setPersonnelFilterStyle(PersonnelFilterStyle value) { @@ -238,7 +229,7 @@ public String getAwardsDirectoryPath() { return userPreferences.node(MekHqConstants.FILE_PATH_NODE).get(MekHqConstants.AWARDS_DIRECTORY_PATH, "data/universe/awards/"); } - public void setAwardsDirectoryPath(String value) { + public void setAwardsDirectoryPath(final String value) { userPreferences.node(MekHqConstants.FILE_PATH_NODE).put(MekHqConstants.AWARDS_DIRECTORY_PATH, value); } @@ -246,7 +237,7 @@ public String getCompanyGenerationDirectoryPath() { return userPreferences.node(MekHqConstants.FILE_PATH_NODE).get(MekHqConstants.COMPANY_GENERATION_DIRECTORY_PATH, "mmconf/mhqCompanyGenerationPresets/"); } - public void setCompanyGenerationDirectoryPath(String value) { + public void setCompanyGenerationDirectoryPath(final String value) { userPreferences.node(MekHqConstants.FILE_PATH_NODE).put(MekHqConstants.COMPANY_GENERATION_DIRECTORY_PATH, value); } //endregion File Paths @@ -256,8 +247,17 @@ public int getStartGameDelay() { return userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE).getInt(MekHqConstants.START_GAME_DELAY, 500); } - public void setStartGameDelay(int startGameDelay) { + public void setStartGameDelay(final int startGameDelay) { userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE).putInt(MekHqConstants.START_GAME_DELAY, startGameDelay); } + + public CompanyGenerationType getDefaultCompanyGenerationType() { + return CompanyGenerationType.valueOf(userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE) + .get(MekHqConstants.DEFAULT_COMPANY_GENERATION_TYPE, CompanyGenerationType.AGAINST_THE_BOT.name())); + } + + public void setDefaultCompanyGenerationType(final CompanyGenerationType value) { + userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE).put(MekHqConstants.DEFAULT_COMPANY_GENERATION_TYPE, value.name()); + } //endregion Miscellaneous Options } diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index d850563f2b..0b08c8ffbf 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -29,7 +29,6 @@ public final class MekHqConstants { public static final String HISTORICAL_DAILY_LOG = "historicalDailyLog"; public static final int MAX_HISTORICAL_LOG_DAYS = 120; // max number of days that will be stored in the history, also used as a limit in the UI public static final String SHOW_COMPANY_GENERATOR = "showCompanyGenerator"; - public static final String DEFAULT_COMPANY_GENERATION_TYPE = "defaultCompanyGenerationType"; // region Command Center public static final String COMMAND_CENTER_USE_UNIT_MARKET = "commandCenterUseUnitMarket"; @@ -76,6 +75,7 @@ public final class MekHqConstants { //region Miscellaneous Options public static final String MISCELLANEOUS_NODE = "mekhq/prefs/miscellaneous"; public static final String START_GAME_DELAY = "startGameDelay"; + public static final String DEFAULT_COMPANY_GENERATION_TYPE = "defaultCompanyGenerationType"; //endregion Miscellaneous Options //endregion MekHQ Options diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java index 2039a4328f..b16f596ee2 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java @@ -160,9 +160,9 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign // Personnel Randomization setRandomizeOrigin(true); setCentralPlanet(Systems.getInstance().getSystems().get("Terra").getPrimaryPlanet()); - setOriginSearchRadius(45); + setOriginSearchRadius(1000); setExtraRandomOrigin(false); - setOriginDistanceScale(0.6); + setOriginDistanceScale(0.2); // Units setGenerateUnitsAsAttached(type.isAtB()); diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index b9661543a8..89e215004d 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -89,7 +89,7 @@ private JPanel initializeButtons() { btnExport.addActionListener(evt -> getCompanyGenerationOptionsPanel().exportOptionsToXML()); JButton btnGenerate = new JButton(resources.getString("Generate")); - btnGenerate.addActionListener(evt -> getCompanyGenerationOptionsPanel().generate()); + //btnGenerate.addActionListener(evt -> getCompanyGenerationOptionsPanel().generate()); JButton btnRestore = new JButton(resources.getString("RestoreDefaults")); btnRestore.addActionListener(evt -> getCompanyGenerationOptionsPanel().setOptions( @@ -99,11 +99,13 @@ private JPanel initializeButtons() { btnImport.addActionListener(evt -> getCompanyGenerationOptionsPanel().importOptionsFromXML()); JButton btnApply = new JButton(resources.getString("Apply")); + /* btnApply.addActionListener(evt -> { getCompanyGenerationOptionsPanel().apply(); MekHQ.triggerEvent(new OrganizationChangedEvent(getCompanyGenerationOptionsPanel().getCampaign().getForces())); setVisible(false); }); + */ // Layout the UI JPanel panel = new JPanel(); diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index 585281d038..b894b34105 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -40,7 +40,6 @@ public class MekHqOptionsDialog extends BaseDialog { private JTextField optionLongDisplayDateFormat; private JCheckBox optionHistoricalDailyLog; private JCheckBox optionShowCompanyGenerator; - private JComboBox optionDefaultCompanyGenerationType; //region Command Center Display private JCheckBox optionCommandCenterUseUnitMarket; @@ -76,6 +75,7 @@ public class MekHqOptionsDialog extends BaseDialog { //region Miscellaneous private JSpinner optionStartGameDelay; + private JComboBox optionDefaultCompanyGenerationType; //endregion Miscellaneous private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog"); @@ -109,7 +109,6 @@ protected Container createCustomUI() { } private JPanel createDisplayTab() { - //region Create Graphical Segments JLabel labelDisplayDateFormat = new JLabel(resources.getString("labelDisplayDateFormat.text")); JLabel labelDisplayDateFormatExample = new JLabel(); optionDisplayDateFormat = new JTextField(); @@ -133,22 +132,6 @@ private JPanel createDisplayTab() { optionShowCompanyGenerator.setToolTipText(resources.getString("optionShowCompanyGenerator.toolTipText")); optionShowCompanyGenerator.setName("optionShowCompanyGenerator"); - JLabel labelDefaultCompanyGenerationType = new JLabel(resources.getString("labelDefaultCompanyGenerationType.text")); - labelDefaultCompanyGenerationType.setToolTipText(resources.getString("labelDefaultCompanyGenerationType.toolTipText")); - optionDefaultCompanyGenerationType = new JComboBox<>(CompanyGenerationType.values()); - optionDefaultCompanyGenerationType.setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (isSelected && (index > -1)) { - list.setToolTipText((list.getSelectedValue() instanceof CompanyGenerationType) - ? ((CompanyGenerationType) list.getSelectedValue()).getToolTipText() : ""); - } - return this; - } - }); - //region Command Center Display JLabel labelCommandCenterDisplay = new JLabel(resources.getString("labelCommandCenterDisplay.text")); @@ -181,9 +164,7 @@ public Component getListCellRendererComponent(JList list, Object value, int i optionPersonnelFilterOnPrimaryRole = new JCheckBox(resources.getString("optionPersonnelFilterOnPrimaryRole.text")); //endregion Personnel Tab Display Options - //endregion Create Graphical Components - //region Layout // Layout the UI JPanel body = new JPanel(); GroupLayout layout = new GroupLayout(body); @@ -204,9 +185,6 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(labelLongDisplayDateFormatExample, GroupLayout.Alignment.TRAILING)) .addComponent(optionHistoricalDailyLog) .addComponent(optionShowCompanyGenerator) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(labelDefaultCompanyGenerationType) - .addComponent(optionDefaultCompanyGenerationType)) .addComponent(labelCommandCenterDisplay) .addComponent(optionCommandCenterUseUnitMarket) .addComponent(optionCommandCenterMRMS) @@ -230,9 +208,6 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(labelLongDisplayDateFormatExample)) .addComponent(optionHistoricalDailyLog) .addComponent(optionShowCompanyGenerator) - .addGroup(layout.createSequentialGroup() - .addComponent(labelDefaultCompanyGenerationType) - .addComponent(optionDefaultCompanyGenerationType)) .addComponent(labelCommandCenterDisplay) .addComponent(optionCommandCenterUseUnitMarket) .addComponent(optionCommandCenterMRMS) @@ -242,13 +217,11 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(optionPersonnelFilterStyle)) .addComponent(optionPersonnelFilterOnPrimaryRole) ); - //endregion Layout return body; } private JPanel createAutosaveTab() { - //region Create Graphical Components optionNoSave = new JRadioButton(resources.getString("optionNoSave.text")); optionNoSave.setMnemonic(KeyEvent.VK_N); @@ -277,9 +250,7 @@ private JPanel createAutosaveTab() { JLabel labelSavedGamesCount = new JLabel(resources.getString("labelSavedGamesCount.text")); spinnerSavedGamesCount = new JSpinner(new SpinnerNumberModel(1, 1, 10, 1)); labelSavedGamesCount.setLabelFor(spinnerSavedGamesCount); - //endregion Create Graphical Components - //region Layout // Layout the UI JPanel body = new JPanel(); GroupLayout layout = new GroupLayout(body); @@ -314,17 +285,13 @@ private JPanel createAutosaveTab() { .addComponent(labelSavedGamesCount) .addComponent(spinnerSavedGamesCount)) ); - //endregion Layout return body; } private JPanel createNewDayTab() { - //region Create Graphical Components optionNewDayMRMS = new JCheckBox(resources.getString("optionNewDayMRMS.text")); - //endregion Create Graphical Components - //region Layout // Layout the UI JPanel body = new JPanel(); GroupLayout layout = new GroupLayout(body); @@ -342,13 +309,11 @@ private JPanel createNewDayTab() { layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(optionNewDayMRMS) ); - //endregion Layout return body; } private JPanel createCampaignXMLSaveTab() { - //region Create Graphical Components optionPreferGzippedOutput = new JCheckBox(resources.getString("optionPreferGzippedOutput.text")); optionPreferGzippedOutput.setToolTipText(resources.getString("optionPreferGzippedOutput.toolTipText")); @@ -362,9 +327,7 @@ private JPanel createCampaignXMLSaveTab() { optionSaveCompanyGenerationOptions = new JCheckBox(resources.getString("optionSaveCompanyGenerationOptions.text")); optionSaveCompanyGenerationOptions.setToolTipText(resources.getString("optionSaveCompanyGenerationOptions.toolTipText")); optionSaveCompanyGenerationOptions.setName("optionSaveCompanyGenerationOptions"); - //endregion Create Graphical Components - //region Layout // Layout the UI JPanel body = new JPanel(); GroupLayout layout = new GroupLayout(body); @@ -388,21 +351,33 @@ private JPanel createCampaignXMLSaveTab() { .addComponent(optionSaveMothballState) .addComponent(optionSaveCompanyGenerationOptions) ); - //endregion Layout return body; } private JPanel createMiscellaneousTab() { - //region Create Graphical Components JLabel labelStartGameDelay = new JLabel(resources.getString("labelStartGameDelay.text")); labelStartGameDelay.setToolTipText(resources.getString("optionStartGameDelay.toolTipText")); optionStartGameDelay = new JSpinner(new SpinnerNumberModel(0, 0, 2500, 25)); optionStartGameDelay.setToolTipText(resources.getString("optionStartGameDelay.toolTipText")); - //endregion Create Graphical Components - //region Layout + JLabel labelDefaultCompanyGenerationType = new JLabel(resources.getString("labelDefaultCompanyGenerationType.text")); + labelDefaultCompanyGenerationType.setToolTipText(resources.getString("labelDefaultCompanyGenerationType.toolTipText")); + optionDefaultCompanyGenerationType = new JComboBox<>(CompanyGenerationType.values()); + optionDefaultCompanyGenerationType.setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (isSelected && (index > -1)) { + list.setToolTipText((list.getSelectedValue() instanceof CompanyGenerationType) + ? ((CompanyGenerationType) list.getSelectedValue()).getToolTipText() : ""); + } + return this; + } + }); + // Layout the UI JPanel body = new JPanel(); GroupLayout layout = new GroupLayout(body); @@ -417,6 +392,9 @@ private JPanel createMiscellaneousTab() { .addComponent(labelStartGameDelay) .addComponent(optionStartGameDelay, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, 40)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(labelDefaultCompanyGenerationType) + .addComponent(optionDefaultCompanyGenerationType)) ); layout.setHorizontalGroup( @@ -424,8 +402,10 @@ private JPanel createMiscellaneousTab() { .addGroup(layout.createSequentialGroup() .addComponent(labelStartGameDelay) .addComponent(optionStartGameDelay)) + .addGroup(layout.createSequentialGroup() + .addComponent(labelDefaultCompanyGenerationType) + .addComponent(optionDefaultCompanyGenerationType)) ); - //endregion Layout return body; } @@ -441,7 +421,6 @@ protected void okAction() { } MekHQ.getMekHQOptions().setHistoricalDailyLog(optionHistoricalDailyLog.isSelected()); MekHQ.getMekHQOptions().setShowCompanyGenerator(optionShowCompanyGenerator.isSelected()); - MekHQ.getMekHQOptions().setDefaultCompanyGenerationType((CompanyGenerationType) Objects.requireNonNull(optionDefaultCompanyGenerationType.getSelectedItem())); MekHQ.getMekHQOptions().setCommandCenterUseUnitMarket(optionCommandCenterUseUnitMarket.isSelected()); MekHQ.getMekHQOptions().setCommandCenterMRMS(optionCommandCenterMRMS.isSelected()); MekHQ.getMekHQOptions().setPersonnelFilterStyle((PersonnelFilterStyle) Objects.requireNonNull(optionPersonnelFilterStyle.getSelectedItem())); @@ -463,6 +442,7 @@ protected void okAction() { MekHQ.getMekHQOptions().setSaveCompanyGenerationOptions(optionSaveCompanyGenerationOptions.isSelected()); MekHQ.getMekHQOptions().setStartGameDelay((Integer) optionStartGameDelay.getValue()); + MekHQ.getMekHQOptions().setDefaultCompanyGenerationType((CompanyGenerationType) Objects.requireNonNull(optionDefaultCompanyGenerationType.getSelectedItem())); MekHQ.triggerEvent(new MekHQOptionsChangedEvent()); } @@ -472,7 +452,6 @@ private void setInitialState() { optionLongDisplayDateFormat.setText(MekHQ.getMekHQOptions().getLongDisplayDateFormat()); optionHistoricalDailyLog.setSelected(MekHQ.getMekHQOptions().getHistoricalDailyLog()); optionShowCompanyGenerator.setSelected(MekHQ.getMekHQOptions().getShowCompanyGenerator()); - optionDefaultCompanyGenerationType.setSelectedItem(MekHQ.getMekHQOptions().getDefaultCompanyGenerationType()); optionCommandCenterUseUnitMarket.setSelected(MekHQ.getMekHQOptions().getCommandCenterUseUnitMarket()); optionCommandCenterMRMS.setSelected(MekHQ.getMekHQOptions().getCommandCenterMRMS()); optionPersonnelFilterStyle.setSelectedItem(MekHQ.getMekHQOptions().getPersonnelFilterStyle()); @@ -494,6 +473,7 @@ private void setInitialState() { optionSaveCompanyGenerationOptions.setSelected(MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()); optionStartGameDelay.setValue(MekHQ.getMekHQOptions().getStartGameDelay()); + optionDefaultCompanyGenerationType.setSelectedItem(MekHQ.getMekHQOptions().getDefaultCompanyGenerationType()); } //region Data Validation diff --git a/MekHQ/src/mekhq/gui/enums/PersonnelFilter.java b/MekHQ/src/mekhq/gui/enums/PersonnelFilter.java index 42db0ec357..4519b7a7a2 100644 --- a/MekHQ/src/mekhq/gui/enums/PersonnelFilter.java +++ b/MekHQ/src/mekhq/gui/enums/PersonnelFilter.java @@ -30,52 +30,52 @@ public enum PersonnelFilter { //region Enum Declarations //region Standard Personnel Filters - ALL("PersonnelFilter.ALL"), - ACTIVE("PersonnelFilter.ACTIVE"), - COMBAT("PersonnelFilter.COMBAT"), - SUPPORT("PersonnelFilter.SUPPORT"), - MECHWARRIOR("PersonnelFilter.MECHWARRIOR"), - VEHICLE_CREWMEMBER("PersonnelFilter.VEHICLE_CREWMEMBER", true, false), - GROUND_VEHICLE_DRIVER("PersonnelFilter.GROUND_VEHICLE_DRIVER", false, true), - NAVAL_VEHICLE_DRIVER("PersonnelFilter.NAVAL_VEHICLE_DRIVER", false, true), - VEHICLE_GUNNER("PersonnelFilter.VEHICLE_GUNNER", false, true), - VEHICLE_CREW("PersonnelFilter.VEHICLE_CREW", false, true), - VTOL_PILOT("PersonnelFilter.VTOL_PILOT", false, true), - AEROSPACE_PILOT("PersonnelFilter.AEROSPACE_PILOT"), - CONVENTIONAL_AIRCRAFT_PILOT("PersonnelFilter.CONVENTIONAL_AIRCRAFT_PILOT"), - PROTOMECH_PILOT("PersonnelFilter.PROTOMECH_PILOT"), - BATTLE_ARMOUR("PersonnelFilter.BATTLE_ARMOUR"), - SOLDIER("PersonnelFilter.SOLDIER"), - VESSEL_CREWMEMBER("PersonnelFilter.VESSEL_CREWMEMBER", true, false), - VESSEL_PILOT("PersonnelFilter.VESSEL_PILOT", false, true), - VESSEL_CREW("PersonnelFilter.VESSEL_CREW", false, true), - VESSEL_GUNNER("PersonnelFilter.VESSEL_GUNNER", false, true), - VESSEL_NAVIGATOR("PersonnelFilter.VESSEL_NAVIGATOR", false, true), - TECH("PersonnelFilter.TECH", true, false), - MECH_TECH("PersonnelFilter.MECH_TECH", false, true), - MECHANIC("PersonnelFilter.MECHANIC", false, true), - AERO_TECH("PersonnelFilter.AERO_TECH", false, true), - BA_TECH("PersonnelFilter.BA_TECH", false, true), - ASTECH("PersonnelFilter.ASTECH", false, true), - MEDICAL("PersonnelFilter.MEDICAL", true, false), - DOCTOR("PersonnelFilter.DOCTOR", false, true), - MEDIC("PersonnelFilter.MEDIC", false, true), - ADMINISTRATOR("PersonnelFilter.ADMINISTRATOR", true, false), - ADMINISTRATOR_COMMAND("PersonnelFilter.ADMINISTRATOR_COMMAND", false, true), - ADMINISTRATOR_LOGISTICS("PersonnelFilter.ADMINISTRATOR_LOGISTICS", false, true), - ADMINISTRATOR_TRANSPORT("PersonnelFilter.ADMINISTRATOR_TRANSPORT", false, true), - ADMINISTRATOR_HR("PersonnelFilter.ADMINISTRATOR_HR", false, true), + ALL("PersonnelFilter.ALL.text"), + ACTIVE("PersonnelFilter.ACTIVE.text"), + COMBAT("PersonnelFilter.COMBAT.text"), + SUPPORT("PersonnelFilter.SUPPORT.text"), + MECHWARRIOR("PersonnelFilter.MECHWARRIOR.text"), + VEHICLE_CREWMEMBER("PersonnelFilter.VEHICLE_CREWMEMBER.text", true, false), + GROUND_VEHICLE_DRIVER("PersonnelFilter.GROUND_VEHICLE_DRIVER.text", false, true), + NAVAL_VEHICLE_DRIVER("PersonnelFilter.NAVAL_VEHICLE_DRIVER.text", false, true), + VEHICLE_GUNNER("PersonnelFilter.VEHICLE_GUNNER.text", false, true), + VEHICLE_CREW("PersonnelFilter.VEHICLE_CREW.text", false, true), + VTOL_PILOT("PersonnelFilter.VTOL_PILOT.text", false, true), + AEROSPACE_PILOT("PersonnelFilter.AEROSPACE_PILOT.text"), + CONVENTIONAL_AIRCRAFT_PILOT("PersonnelFilter.CONVENTIONAL_AIRCRAFT_PILOT.text"), + PROTOMECH_PILOT("PersonnelFilter.PROTOMECH_PILOT.text"), + BATTLE_ARMOUR("PersonnelFilter.BATTLE_ARMOUR.text"), + SOLDIER("PersonnelFilter.SOLDIER.text"), + VESSEL_CREWMEMBER("PersonnelFilter.VESSEL_CREWMEMBER.text", true, false), + VESSEL_PILOT("PersonnelFilter.VESSEL_PILOT.text", false, true), + VESSEL_CREW("PersonnelFilter.VESSEL_CREW.text", false, true), + VESSEL_GUNNER("PersonnelFilter.VESSEL_GUNNER.text", false, true), + VESSEL_NAVIGATOR("PersonnelFilter.VESSEL_NAVIGATOR.text", false, true), + TECH("PersonnelFilter.TECH.text", true, false), + MECH_TECH("PersonnelFilter.MECH_TECH.text", false, true), + MECHANIC("PersonnelFilter.MECHANIC.text", false, true), + AERO_TECH("PersonnelFilter.AERO_TECH.text", false, true), + BA_TECH("PersonnelFilter.BA_TECH.text", false, true), + ASTECH("PersonnelFilter.ASTECH.text", false, true), + MEDICAL("PersonnelFilter.MEDICAL.text", true, false), + DOCTOR("PersonnelFilter.DOCTOR.text", false, true), + MEDIC("PersonnelFilter.MEDIC.text", false, true), + ADMINISTRATOR("PersonnelFilter.ADMINISTRATOR.text", true, false), + ADMINISTRATOR_COMMAND("PersonnelFilter.ADMINISTRATOR_COMMAND.text", false, true), + ADMINISTRATOR_LOGISTICS("PersonnelFilter.ADMINISTRATOR_LOGISTICS.text", false, true), + ADMINISTRATOR_TRANSPORT("PersonnelFilter.ADMINISTRATOR_TRANSPORT.text", false, true), + ADMINISTRATOR_HR("PersonnelFilter.ADMINISTRATOR_HR.text", false, true), //endregion Standard Personnel Filters //region Expanded Personnel Tab Filters - DEPENDENT("PersonnelFilter.DEPENDENT", false, false), - FOUNDER("PersonnelFilter.FOUNDER", false, false), - PRISONER("PersonnelFilter.PRISONER", false, false), - INACTIVE("PersonnelFilter.INACTIVE", false, false), - RETIRED("PersonnelFilter.RETIRED", false, false), - MIA("PersonnelFilter.MIA", false, false), - KIA("PersonnelFilter.KIA", false, false), - DEAD("PersonnelFilter.DEAD", false, false); + DEPENDENT("PersonnelFilter.DEPENDENT.text", false, false), + FOUNDER("PersonnelFilter.FOUNDER.text", false, false), + PRISONER("PersonnelFilter.PRISONER.text", false, false), + INACTIVE("PersonnelFilter.INACTIVE.text", false, false), + RETIRED("PersonnelFilter.RETIRED.text", false, false), + MIA("PersonnelFilter.MIA.text", false, false), + KIA("PersonnelFilter.KIA.text", false, false), + DEAD("PersonnelFilter.DEAD.text", false, false); //endregion Expanded Personnel Tab Filters //endregion Enum Declarations diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java index e6e2b5e52f..cbeae659f5 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -50,7 +50,6 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JFrame frame; private Campaign campaign; - // GUI Variables // Base Information private JComboBox comboCompanyGenerationType; private JComboBox comboFaction; @@ -125,6 +124,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { //region Constructors public CompanyGenerationOptionsPanel(final JFrame frame, final Campaign campaign) { + super(new GridBagLayout()); setFrame(frame); setCampaign(campaign); @@ -155,7 +155,6 @@ public void setCampaign(Campaign campaign) { this.campaign = campaign; } - //region GUI Variables //region Base Information public JComboBox getComboCompanyGenerationType() { return comboCompanyGenerationType; @@ -668,7 +667,6 @@ public void setChkPayForAmmunition(JCheckBox chkPayForAmmunition) { this.chkPayForAmmunition = chkPayForAmmunition; } //endregion Finances - //endregion GUI Variables //endregion Getters/Setters //region Initialization @@ -687,13 +685,23 @@ private void initialize() { gbc.gridx = 0; gbc.gridy++; - add(createUnitsPanel(), gbc); + add(createPersonnelRandomizationPanel(), gbc); gbc.gridx++; + add(createUnitsPanel(), gbc); + + gbc.gridx = 0; + gbc.gridy++; add(createUnitPanel(), gbc); + gbc.gridx++; + add(createSparesPanel(), gbc); + gbc.gridx = 0; gbc.gridy++; + add(createContractsPanel(), gbc); + + gbc.gridx++; add(createFinancesPanel(), gbc); } @@ -1054,7 +1062,7 @@ private JPanel createPersonnelRandomizationPanel() { lblOriginSearchRadius.setToolTipText(resources.getString("lblOriginSearchRadius.toolTipText")); lblOriginSearchRadius.setName("lblOriginSearchRadius"); - setSpnOriginSearchRadius(new JSpinner(new SpinnerNumberModel(0, 0, 0, 0))); + setSpnOriginSearchRadius(new JSpinner(new SpinnerNumberModel(0, 0, 2000, 25))); getSpnOriginSearchRadius().setToolTipText(resources.getString("lblOriginSearchRadius.toolTipText")); getSpnOriginSearchRadius().setName("spnOriginSearchRadius"); @@ -1066,7 +1074,7 @@ private JPanel createPersonnelRandomizationPanel() { lblOriginDistanceScale.setToolTipText(resources.getString("lblOriginDistanceScale.toolTipText")); lblOriginDistanceScale.setName("lblOriginDistanceScale"); - setSpnOriginDistanceScale(new JSpinner(new SpinnerNumberModel(0, 0, 0, 0))); + setSpnOriginDistanceScale(new JSpinner(new SpinnerNumberModel(0.6, 0.1, 2.0, 0.1))); getSpnOriginDistanceScale().setToolTipText(resources.getString("lblOriginDistanceScale.toolTipText")); getSpnOriginDistanceScale().setName("spnOriginDistanceScale"); @@ -1234,10 +1242,50 @@ public Component getListCellRendererComponent(JList list, Object value, int i } private JPanel createSparesPanel() { + setChkGenerateMothballedSpareUnits(new JCheckBox(resources.getString("chkGenerateMothballedSpareUnits.text"))); + getChkGenerateMothballedSpareUnits().setToolTipText(resources.getString("chkGenerateMothballedSpareUnits.toolTipText")); + getChkGenerateMothballedSpareUnits().setName("chkGenerateMothballedSpareUnits"); + + JLabel lblSparesPercentOfActiveUnits = new JLabel(resources.getString("lblSparesPercentOfActiveUnits.text")); + lblSparesPercentOfActiveUnits.setToolTipText(resources.getString("lblSparesPercentOfActiveUnits.toolTipText")); + lblSparesPercentOfActiveUnits.setName("lblSparesPercentOfActiveUnits"); + + setSpnSparesPercentOfActiveUnits(new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + getSpnSparesPercentOfActiveUnits().setToolTipText(resources.getString("chkGenerateMothballedSpareUnits.toolTipText")); + getSpnSparesPercentOfActiveUnits().setName("lblGenerateMothballedSpareUnits"); + + setChkGenerateSpareParts(new JCheckBox(resources.getString("chkGenerateSpareParts.text"))); + getChkGenerateSpareParts().setToolTipText(resources.getString("chkGenerateSpareParts.toolTipText")); + getChkGenerateSpareParts().setName("chkGenerateSpareParts"); + + JLabel lblStartingArmourWeight = new JLabel(resources.getString("lblStartingArmourWeight.text")); + lblStartingArmourWeight.setToolTipText(resources.getString("lblStartingArmourWeight.toolTipText")); + lblStartingArmourWeight.setName("lblStartingArmourWeight"); + + setSpnStartingArmourWeight(new JSpinner(new SpinnerNumberModel(0, 0, 500, 1))); + getSpnStartingArmourWeight().setToolTipText(resources.getString("lblStartingArmourWeight.toolTipText")); + getSpnStartingArmourWeight().setName("spnStartingArmourWeight"); + + setChkGenerateSpareAmmunition(new JCheckBox(resources.getString("chkGenerateSpareAmmunition.text"))); + getChkGenerateSpareAmmunition().setToolTipText(resources.getString("chkGenerateSpareAmmunition.toolTipText")); + getChkGenerateSpareAmmunition().setName("chkGenerateSpareAmmunition"); + + JLabel lblNumberReloadsPerWeapon = new JLabel(resources.getString("lblNumberReloadsPerWeapon.text")); + lblNumberReloadsPerWeapon.setToolTipText(resources.getString("lblNumberReloadsPerWeapon.toolTipText")); + lblNumberReloadsPerWeapon.setName("lblNumberReloadsPerWeapon"); + + setSpnNumberReloadsPerWeapon(new JSpinner(new SpinnerNumberModel(0, 0, 25, 1))); + getSpnNumberReloadsPerWeapon().setToolTipText(resources.getString("lblNumberReloadsPerWeapon.toolTipText")); + getSpnNumberReloadsPerWeapon().setName("spnNumberReloadsPerWeapon"); + + setChkGenerateFractionalMachineGunAmmunition(new JCheckBox(resources.getString("chkGenerateFractionalMachineGunAmmunition.text"))); + getChkGenerateFractionalMachineGunAmmunition().setToolTipText(resources.getString("chkGenerateFractionalMachineGunAmmunition.toolTipText")); + getChkGenerateFractionalMachineGunAmmunition().setName("chkGenerateFractionalMachineGunAmmunition"); + // Layout the UI JPanel panel = new JPanel(); - panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitPanel.title"))); - panel.setName("unitPanel"); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("sparesPanel.title"))); + panel.setName("sparesPanel"); GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); @@ -1246,18 +1294,36 @@ private JPanel createSparesPanel() { layout.setVerticalGroup( layout.createSequentialGroup() + .addComponent(getChkGenerateMothballedSpareUnits()) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(lblForceNamingType) - .addComponent(getComboForceNamingType(), GroupLayout.Alignment.LEADING)) - .addComponent(getChkGenerateForceIcons()) + .addComponent(lblSparesPercentOfActiveUnits) + .addComponent(getSpnSparesPercentOfActiveUnits(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkGenerateSpareParts()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblStartingArmourWeight) + .addComponent(getSpnStartingArmourWeight(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkGenerateSpareAmmunition()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblNumberReloadsPerWeapon) + .addComponent(getSpnNumberReloadsPerWeapon(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkGenerateFractionalMachineGunAmmunition()) ); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(getChkGenerateMothballedSpareUnits()) .addGroup(layout.createSequentialGroup() - .addComponent(lblForceNamingType) - .addComponent(getComboForceNamingType())) - .addComponent(getChkGenerateForceIcons()) + .addComponent(lblSparesPercentOfActiveUnits) + .addComponent(getSpnSparesPercentOfActiveUnits())) + .addComponent(getChkGenerateSpareParts()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblStartingArmourWeight) + .addComponent(getSpnStartingArmourWeight())) + .addComponent(getChkGenerateSpareAmmunition()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblNumberReloadsPerWeapon) + .addComponent(getSpnNumberReloadsPerWeapon())) + .addComponent(getChkGenerateFractionalMachineGunAmmunition()) ); return panel; } diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java index c5764c6cc8..ab4756c14c 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java @@ -52,7 +52,7 @@ public void setEntities(List entities) { } //endregion Data //endregion Getters/Setters - +/** public void generate() { if ((getCompanyGenerator() != null) && (JOptionPane.showConfirmDialog(getFrame(), @@ -90,4 +90,5 @@ public void apply() { getCompanyGenerator().applyToCampaign(getCampaign(), getCombatPersonnel(), getSupportPersonnel(), getEntities()); } + */ } From a4ab4f3119f49f7a9f92dd967b93b4996f7480e1 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 12 Feb 2021 16:01:47 -0700 Subject: [PATCH 007/115] Refactoring BaseDialog to be a better basis for the new suite of dialogs --- .../resources/mekhq/resources/GUI.properties | 1 + .../resources/MekHqOptionsDialog.properties | 4 +- MekHQ/src/mekhq/MekHqXmlUtil.java | 48 ++- .../universe/enums/CompanyGenerationType.java | 6 +- .../CompanyGenerationOptions.java | 108 +++---- MekHQ/src/mekhq/gui/dialog/BaseDialog.java | 202 ++++++------ .../gui/dialog/CompanyGenerationDialog.java | 128 ++++---- .../mekhq/gui/dialog/MekHqOptionsDialog.java | 21 +- .../gui/enums/CompanyGenerationPanelType.java | 30 ++ .../view/CompanyGenerationOptionsPanel.java | 295 +++++++++++------- 10 files changed, 506 insertions(+), 337 deletions(-) create mode 100644 MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 712290abc6..55f507bfaa 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -8,6 +8,7 @@ Faction=Faction FactionSpecific=Faction Specific Generate=Generate Import=Import +Ok=Ok RestoreDefaults=Restore Defaults ### Dialog diff --git a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties index ae9ea8d721..471d795eb5 100644 --- a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties @@ -1,6 +1,6 @@ dialog.text=MekHQ Options -okButton.text=Ok -cancelButton.text=Cancel +Ok=Ok +Cancel=Cancel #Display Tab displayTab.title=Display Options diff --git a/MekHQ/src/mekhq/MekHqXmlUtil.java b/MekHQ/src/mekhq/MekHqXmlUtil.java index 220010a4d9..45483dde51 100644 --- a/MekHQ/src/mekhq/MekHqXmlUtil.java +++ b/MekHQ/src/mekhq/MekHqXmlUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2020 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2013-2021 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -18,6 +18,7 @@ */ package mekhq; +import java.io.PrintWriter; import java.io.StringWriter; import java.util.Iterator; import java.util.List; @@ -33,8 +34,9 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import megamek.common.icons.Camouflage; +import megamek.common.annotations.Nullable; import megamek.utils.MegaMekXmlUtil; +import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; @@ -295,8 +297,7 @@ private static String getBombChoiceString(IBomber bomber, int indentLvl) { * Contents copied from megamek.common.EntityListFile.getAeroCritString(...) * Modified to support saving to/from XML for our purposes in MekHQ * - * @param a - * The Aero unit to generate a crit string for. + * @param a The Aero unit to generate a crit string for. * @return The generated crit string. */ private static String getAeroCritString(Aero a, int indentLvl) { @@ -370,8 +371,7 @@ private static String getAeroCritString(Aero a, int indentLvl) { * megamek.common.EntityListFile.getTurretLockedString(...) Modified to * support saving to/from XML for our purposes in MekHQ * - * @param e - * The tank to generate a turret-locked string for. + * @param e The tank to generate a turret-locked string for. * @return The generated string. */ private static String getTurretLockedString(Tank e, int indentLvl) { @@ -386,8 +386,7 @@ private static String getTurretLockedString(Tank e, int indentLvl) { * Contents copied from megamek.common.EntityListFile.getMovementString(...) * Modified to support saving to/from XML for our purposes in MekHQ * - * @param e - * The tank to generate a movement string for. + * @param e The tank to generate a movement string for. * @return The generated string. */ private static String getMovementString(Tank e, int indentLvl) { @@ -425,12 +424,10 @@ private static String getMovementString(Tank e, int indentLvl) { * Contents copied from megamek.common.EntityListFile.getTankCritString(...) * Modified to support saving to/from XML for our purposes in MekHQ * - * @param e - * The tank to generate a movement string for. + * @param e The tank to generate a movement string for. * @return The generated string. */ private static String getTankCritString(Tank e, int indentLvl) { - String retVal = MekHqXmlUtil.indentStr(indentLvl) + " 0) { + final boolean hasAttribute = attributeValue != null; + pw.print(indentStr(indent) + "<" + name); + if (hasAttribute) { + pw.print(" " + attributeName + "=\"" + attributeValue + "\""); + } + pw.print(">" + escape(StringUtils.join(values, ',')) + "\n"); + } + } } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java index a23922a94f..afd218f26a 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java @@ -66,11 +66,11 @@ public boolean isWindchild() { public AbstractCompanyGenerator getGenerator(final Campaign campaign, final CompanyGenerationOptions options) { switch (this) { - case WINDCHILD: - return new WindchildCompanyGenerator(campaign, options); case AGAINST_THE_BOT: - default: return new AtBCompanyGenerator(campaign, options); + case WINDCHILD: + default: + return new WindchildCompanyGenerator(campaign, options); } } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java index b16f596ee2..eac56f5d41 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java @@ -125,7 +125,7 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign setFaction(campaign.getFaction()); setStartingPlanet(Systems.getInstance().getSystems().getOrDefault( getFaction().getStartingPlanet(campaign.getLocalDate()), - Systems.getInstance().getSystems().get("Terra")).getPrimaryPlanet()); + campaign.getSystemByName("Terra")).getPrimaryPlanet()); setCompanyCount(1); setIndividualLanceCount(0); setGenerateMercenaryCompanyCommandLance(false); @@ -159,7 +159,7 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign // Personnel Randomization setRandomizeOrigin(true); - setCentralPlanet(Systems.getInstance().getSystems().get("Terra").getPrimaryPlanet()); + setCentralPlanet(campaign.getSystemByName("Terra").getPrimaryPlanet()); setOriginSearchRadius(1000); setExtraRandomOrigin(false); setOriginDistanceScale(0.2); @@ -209,7 +209,7 @@ public CompanyGenerationType getType() { return type; } - public void setType(CompanyGenerationType type) { + public void setType(final CompanyGenerationType type) { this.type = type; } @@ -217,7 +217,7 @@ public Faction getFaction() { return faction; } - public void setFaction(Faction faction) { + public void setFaction(final Faction faction) { this.faction = faction; } @@ -225,7 +225,7 @@ public Planet getStartingPlanet() { return startingPlanet; } - public void setStartingPlanet(Planet startingPlanet) { + public void setStartingPlanet(final Planet startingPlanet) { this.startingPlanet = startingPlanet; } @@ -233,7 +233,7 @@ public boolean isGenerateMercenaryCompanyCommandLance() { return generateMercenaryCompanyCommandLance; } - public void setGenerateMercenaryCompanyCommandLance(boolean generateMercenaryCompanyCommandLance) { + public void setGenerateMercenaryCompanyCommandLance(final boolean generateMercenaryCompanyCommandLance) { this.generateMercenaryCompanyCommandLance = generateMercenaryCompanyCommandLance; } @@ -241,7 +241,7 @@ public int getCompanyCount() { return companyCount; } - public void setCompanyCount(int companyCount) { + public void setCompanyCount(final int companyCount) { this.companyCount = companyCount; } @@ -249,7 +249,7 @@ public int getIndividualLanceCount() { return individualLanceCount; } - public void setIndividualLanceCount(int individualLanceCount) { + public void setIndividualLanceCount(final int individualLanceCount) { this.individualLanceCount = individualLanceCount; } @@ -257,7 +257,7 @@ public int getLanceSize() { return lanceSize; } - public void setLanceSize(int lanceSize) { + public void setLanceSize(final int lanceSize) { this.lanceSize = lanceSize; } @@ -265,7 +265,7 @@ public int getLancesPerCompany() { return lancesPerCompany; } - public void setLancesPerCompany(int lancesPerCompany) { + public void setLancesPerCompany(final int lancesPerCompany) { this.lancesPerCompany = lancesPerCompany; } //endregion Base Information @@ -275,7 +275,7 @@ public Map getSupportPersonnel() { return supportPersonnel; } - public void setSupportPersonnel(Map supportPersonnel) { + public void setSupportPersonnel(final Map supportPersonnel) { this.supportPersonnel = supportPersonnel; } @@ -283,7 +283,7 @@ public boolean isPoolAssistants() { return poolAssistants; } - public void setPoolAssistants(boolean poolAssistants) { + public void setPoolAssistants(final boolean poolAssistants) { this.poolAssistants = poolAssistants; } @@ -291,7 +291,7 @@ public boolean isGenerateCaptains() { return generateCaptains; } - public void setGenerateCaptains(boolean generateCaptains) { + public void setGenerateCaptains(final boolean generateCaptains) { this.generateCaptains = generateCaptains; } @@ -299,7 +299,7 @@ public boolean isAssignCompanyCommanderFlag() { return assignCompanyCommanderFlag; } - public void setAssignCompanyCommanderFlag(boolean assignCompanyCommanderFlag) { + public void setAssignCompanyCommanderFlag(final boolean assignCompanyCommanderFlag) { this.assignCompanyCommanderFlag = assignCompanyCommanderFlag; } @@ -307,7 +307,7 @@ public boolean isCompanyCommanderLanceOfficer() { return companyCommanderLanceOfficer; } - public void setCompanyCommanderLanceOfficer(boolean companyCommanderLanceOfficer) { + public void setCompanyCommanderLanceOfficer(final boolean companyCommanderLanceOfficer) { this.companyCommanderLanceOfficer = companyCommanderLanceOfficer; } @@ -315,7 +315,7 @@ public boolean isApplyOfficerStatBonusToWorstSkill() { return applyOfficerStatBonusToWorstSkill; } - public void setApplyOfficerStatBonusToWorstSkill(boolean applyOfficerStatBonusToWorstSkill) { + public void setApplyOfficerStatBonusToWorstSkill(final boolean applyOfficerStatBonusToWorstSkill) { this.applyOfficerStatBonusToWorstSkill = applyOfficerStatBonusToWorstSkill; } @@ -323,7 +323,7 @@ public boolean isAssignBestOfficers() { return assignBestOfficers; } - public void setAssignBestOfficers(boolean assignBestOfficers) { + public void setAssignBestOfficers(final boolean assignBestOfficers) { this.assignBestOfficers = assignBestOfficers; } @@ -331,7 +331,7 @@ public boolean isAutomaticallyAssignRanks() { return automaticallyAssignRanks; } - public void setAutomaticallyAssignRanks(boolean automaticallyAssignRanks) { + public void setAutomaticallyAssignRanks(final boolean automaticallyAssignRanks) { this.automaticallyAssignRanks = automaticallyAssignRanks; } //endregion Personnel @@ -341,7 +341,7 @@ public boolean isRandomizeOrigin() { return randomizeOrigin; } - public void setRandomizeOrigin(boolean randomizeOrigin) { + public void setRandomizeOrigin(final boolean randomizeOrigin) { this.randomizeOrigin = randomizeOrigin; } @@ -349,7 +349,7 @@ public Planet getCentralPlanet() { return centralPlanet; } - public void setCentralPlanet(Planet centralPlanet) { + public void setCentralPlanet(final Planet centralPlanet) { this.centralPlanet = centralPlanet; } @@ -357,7 +357,7 @@ public int getOriginSearchRadius() { return originSearchRadius; } - public void setOriginSearchRadius(int originSearchRadius) { + public void setOriginSearchRadius(final int originSearchRadius) { this.originSearchRadius = originSearchRadius; } @@ -365,7 +365,7 @@ public boolean isExtraRandomOrigin() { return extraRandomOrigin; } - public void setExtraRandomOrigin(boolean extraRandomOrigin) { + public void setExtraRandomOrigin(final boolean extraRandomOrigin) { this.extraRandomOrigin = extraRandomOrigin; } @@ -373,7 +373,7 @@ public double getOriginDistanceScale() { return originDistanceScale; } - public void setOriginDistanceScale(double originDistanceScale) { + public void setOriginDistanceScale(final double originDistanceScale) { this.originDistanceScale = originDistanceScale; } //endregion Personnel Randomization @@ -383,7 +383,7 @@ public boolean isGenerateUnitsAsAttached() { return generateUnitsAsAttached; } - public void setGenerateUnitsAsAttached(boolean generateUnitsAsAttached) { + public void setGenerateUnitsAsAttached(final boolean generateUnitsAsAttached) { this.generateUnitsAsAttached = generateUnitsAsAttached; } @@ -391,7 +391,7 @@ public boolean isAssignBestRollToUnitCommander() { return assignBestRollToUnitCommander; } - public void setAssignBestRollToUnitCommander(boolean assignBestRollToUnitCommander) { + public void setAssignBestRollToUnitCommander(final boolean assignBestRollToUnitCommander) { this.assignBestRollToUnitCommander = assignBestRollToUnitCommander; } @@ -399,7 +399,7 @@ public boolean isGroupByWeight() { return groupByWeight; } - public void setGroupByWeight(boolean groupByWeight) { + public void setGroupByWeight(final boolean groupByWeight) { this.groupByWeight = groupByWeight; } @@ -407,7 +407,7 @@ public boolean isKeepOfficerRollsSeparate() { return keepOfficerRollsSeparate; } - public void setKeepOfficerRollsSeparate(boolean keepOfficerRollsSeparate) { + public void setKeepOfficerRollsSeparate(final boolean keepOfficerRollsSeparate) { this.keepOfficerRollsSeparate = keepOfficerRollsSeparate; } @@ -415,7 +415,7 @@ public int getStarLeagueYear() { return starLeagueYear; } - public void setStarLeagueYear(int starLeagueYear) { + public void setStarLeagueYear(final int starLeagueYear) { this.starLeagueYear = starLeagueYear; } @@ -423,7 +423,7 @@ public boolean isAssignTechsToUnits() { return assignTechsToUnits; } - public void setAssignTechsToUnits(boolean assignTechsToUnits) { + public void setAssignTechsToUnits(final boolean assignTechsToUnits) { this.assignTechsToUnits = assignTechsToUnits; } //endregion Units @@ -433,7 +433,7 @@ public ForceNamingType getForceNamingType() { return forceNamingType; } - public void setForceNamingType(ForceNamingType forceNamingType) { + public void setForceNamingType(final ForceNamingType forceNamingType) { this.forceNamingType = forceNamingType; } @@ -441,7 +441,7 @@ public boolean isGenerateForceIcons() { return generateForceIcons; } - public void setGenerateForceIcons(boolean generateForceIcons) { + public void setGenerateForceIcons(final boolean generateForceIcons) { this.generateForceIcons = generateForceIcons; } //endregion Unit @@ -451,7 +451,7 @@ public boolean isGenerateMothballedSpareUnits() { return generateMothballedSpareUnits; } - public void setGenerateMothballedSpareUnits(boolean generateMothballedSpareUnits) { + public void setGenerateMothballedSpareUnits(final boolean generateMothballedSpareUnits) { this.generateMothballedSpareUnits = generateMothballedSpareUnits; } @@ -459,7 +459,7 @@ public int getSparesPercentOfActiveUnits() { return sparesPercentOfActiveUnits; } - public void setSparesPercentOfActiveUnits(int sparesPercentOfActiveUnits) { + public void setSparesPercentOfActiveUnits(final int sparesPercentOfActiveUnits) { this.sparesPercentOfActiveUnits = sparesPercentOfActiveUnits; } @@ -467,7 +467,7 @@ public boolean isGenerateSpareParts() { return generateSpareParts; } - public void setGenerateSpareParts(boolean generateSpareParts) { + public void setGenerateSpareParts(final boolean generateSpareParts) { this.generateSpareParts = generateSpareParts; } @@ -475,7 +475,7 @@ public int getStartingArmourWeight() { return startingArmourWeight; } - public void setStartingArmourWeight(int startingArmourWeight) { + public void setStartingArmourWeight(final int startingArmourWeight) { this.startingArmourWeight = startingArmourWeight; } @@ -483,7 +483,7 @@ public boolean isGenerateSpareAmmunition() { return generateSpareAmmunition; } - public void setGenerateSpareAmmunition(boolean generateSpareAmmunition) { + public void setGenerateSpareAmmunition(final boolean generateSpareAmmunition) { this.generateSpareAmmunition = generateSpareAmmunition; } @@ -491,7 +491,7 @@ public int getNumberReloadsPerWeapon() { return numberReloadsPerWeapon; } - public void setNumberReloadsPerWeapon(int numberReloadsPerWeapon) { + public void setNumberReloadsPerWeapon(final int numberReloadsPerWeapon) { this.numberReloadsPerWeapon = numberReloadsPerWeapon; } @@ -499,7 +499,7 @@ public boolean isGenerateFractionalMachineGunAmmunition() { return generateFractionalMachineGunAmmunition; } - public void setGenerateFractionalMachineGunAmmunition(boolean generateFractionalMachineGunAmmunition) { + public void setGenerateFractionalMachineGunAmmunition(final boolean generateFractionalMachineGunAmmunition) { this.generateFractionalMachineGunAmmunition = generateFractionalMachineGunAmmunition; } //endregion Spares @@ -509,7 +509,7 @@ public boolean isSelectStartingContract() { return selectStartingContract; } - public void setSelectStartingContract(boolean selectStartingContract) { + public void setSelectStartingContract(final boolean selectStartingContract) { this.selectStartingContract = selectStartingContract; } @@ -517,7 +517,7 @@ public boolean isStartCourseToContractPlanet() { return startCourseToContractPlanet; } - public void setStartCourseToContractPlanet(boolean startCourseToContractPlanet) { + public void setStartCourseToContractPlanet(final boolean startCourseToContractPlanet) { this.startCourseToContractPlanet = startCourseToContractPlanet; } //endregion Contracts @@ -527,7 +527,7 @@ public int getStartingCash() { return startingCash; } - public void setStartingCash(int startingCash) { + public void setStartingCash(final int startingCash) { this.startingCash = startingCash; } @@ -535,7 +535,7 @@ public boolean isRandomizeStartingCash() { return randomizeStartingCash; } - public void setRandomizeStartingCash(boolean randomizeStartingCash) { + public void setRandomizeStartingCash(final boolean randomizeStartingCash) { this.randomizeStartingCash = randomizeStartingCash; } @@ -543,7 +543,7 @@ public int getRandomStartingCashDiceCount() { return randomStartingCashDiceCount; } - public void setRandomStartingCashDiceCount(int randomStartingCashDiceCount) { + public void setRandomStartingCashDiceCount(final int randomStartingCashDiceCount) { this.randomStartingCashDiceCount = randomStartingCashDiceCount; } @@ -551,7 +551,7 @@ public int getMinimumStartingFloat() { return minimumStartingFloat; } - public void setMinimumStartingFloat(int minimumStartingFloat) { + public void setMinimumStartingFloat(final int minimumStartingFloat) { this.minimumStartingFloat = minimumStartingFloat; } @@ -559,7 +559,7 @@ public boolean isPayForSetup() { return payForSetup; } - public void setPayForSetup(boolean payForSetup) { + public void setPayForSetup(final boolean payForSetup) { this.payForSetup = payForSetup; } @@ -567,7 +567,7 @@ public boolean isStartingLoan() { return startingLoan; } - public void setStartingLoan(boolean startingLoan) { + public void setStartingLoan(final boolean startingLoan) { this.startingLoan = startingLoan; } @@ -575,7 +575,7 @@ public boolean isPayForPersonnel() { return payForPersonnel; } - public void setPayForPersonnel(boolean payForPersonnel) { + public void setPayForPersonnel(final boolean payForPersonnel) { this.payForPersonnel = payForPersonnel; } @@ -583,7 +583,7 @@ public boolean isPayForUnits() { return payForUnits; } - public void setPayForUnits(boolean payForUnits) { + public void setPayForUnits(final boolean payForUnits) { this.payForUnits = payForUnits; } @@ -591,7 +591,7 @@ public boolean isPayForParts() { return payForParts; } - public void setPayForParts(boolean payForParts) { + public void setPayForParts(final boolean payForParts) { this.payForParts = payForParts; } @@ -599,7 +599,7 @@ public boolean isPayForAmmunition() { return payForAmmunition; } - public void setPayForAmmunition(boolean payForAmmunition) { + public void setPayForAmmunition(final boolean payForAmmunition) { this.payForAmmunition = payForAmmunition; } //endregion Finances @@ -645,7 +645,7 @@ public void writeToXML(final PrintWriter pw, int indent) { // Personnel MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "supportPersonnel"); - for (Map.Entry entry : getSupportPersonnel().entrySet()) { + for (final Map.Entry entry : getSupportPersonnel().entrySet()) { MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "supportRole"); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "role", entry.getKey()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "number", entry.getValue()); @@ -712,7 +712,7 @@ public static CompanyGenerationOptions parseFromXML(final File file, final Campa MekHQ.getLogger().error("Received a null file, returning the default AtB options"); return new CompanyGenerationOptions(CompanyGenerationType.AGAINST_THE_BOT, campaign); } - Element element; + final Element element; // Open up the file. try (InputStream is = new FileInputStream(file)) { @@ -722,9 +722,9 @@ public static CompanyGenerationOptions parseFromXML(final File file, final Campa return new CompanyGenerationOptions(CompanyGenerationType.AGAINST_THE_BOT, campaign); } element.normalize(); - NodeList nl = element.getChildNodes(); + final NodeList nl = element.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { - Node wn = nl.item(i); + final Node wn = nl.item(i); if ("companyGenerationOptions".equals(wn.getNodeName())) { return parseFromXML(wn); } diff --git a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java index 735892c94d..26d725ef98 100644 --- a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java @@ -1,7 +1,7 @@ /* * BaseDialog.java * - * Copyright (c) 2019 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2019-2021 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -20,7 +20,9 @@ */ package mekhq.gui.dialog; +import megamek.common.annotations.Nullable; import mekhq.MekHQ; +import mekhq.campaign.Campaign; import mekhq.gui.preferences.JWindowPreference; import mekhq.preferences.PreferencesNode; @@ -46,162 +48,184 @@ * - cancelButton.text -> text for the cancel button */ public abstract class BaseDialog extends JDialog implements WindowListener { - private ResourceBundle resources; + //region Variable Declarations + private JFrame frame; private DialogResult result; - protected BaseDialog(JFrame parent) { - this(parent, false); - } - - protected BaseDialog(JFrame parent, boolean isModal) { - super(parent); + protected ResourceBundle resources; + //endregion Variable Declarations - this.addWindowListener(this); - this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - this.setModal(isModal); + //region Constructors + protected BaseDialog(final JFrame parent, final ResourceBundle resources) { + this(parent, false, resources, "dialog.text", null); } - /** - * Result of closing the dialog. - * @return - */ - public DialogResult getResult() { - return this.result; + protected BaseDialog(final JFrame parent, final ResourceBundle resources, final String title, + final Campaign campaign) { + this(parent, false, resources, title, campaign); } - /** - * Initializes the dialog UI and preferences. Needs to be called by - * child classes for initial setup. - * @param resources the resources needed for this dialog - */ - protected final void initialize(ResourceBundle resources) { - assert resources != null; + protected BaseDialog(final JFrame parent, final boolean modal, final ResourceBundle resources, + final String title, final @Nullable Campaign campaign) { + super(parent, modal); + setTitle(resources.getString(title)); + setFrame(frame); + setResources(resources); - this.resources = resources; - this.createUI(); + initialize(campaign); + } + //endregion Constructors - this.pack(); - this.setPreferences(); + //region Getters/Setters + public JFrame getFrame() { + return frame; } - /** - * Creates the custom UI (body) for the dialog. - * This custom UI will be placed in the BorderLayout.CENTER. - * @return - */ - protected abstract Container createCustomUI(); + public void setFrame(final JFrame frame) { + this.frame = frame; + } - /** - * Adds custom preferences to this dialog. - * - * By default, this dialog will track preferences related to the size - * and position of the dialog. Other preferences should be added by overriding - * this method. - * @param preferences - */ - protected void setCustomPreferences(PreferencesNode preferences) { + public DialogResult getResult() { + return result; } - /** - * Action performed when the ok button is clicked. - */ - protected void okAction() { + public void setResult(final DialogResult result) { + this.result = result; + } + + private void setResources(final ResourceBundle resources) { + this.resources = resources; } + //endregion Getters/Setters + //region Initialization /** - * Action performed when the cancel button is clicked or - * when the dialog is closed by the X button. + * Initializes the dialog UI and preferences. Needs to be called by + * child classes for initial setup. */ - protected void cancelAction() { + protected void initialize(final @Nullable Campaign campaign) { + setLayout(new BorderLayout()); + add(createCenterPane(campaign), BorderLayout.CENTER); + add(createButtonPanel(), BorderLayout.PAGE_END); + + pack(); + addWindowListener(this); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setPreferences(); } - private void createUI() { - this.setTitle(resources.getString("dialog.text")); + protected abstract Container createCenterPane(final @Nullable Campaign campaign); - // Main body of the dialog - this.getContentPane().add(this.createCustomUI(), BorderLayout.CENTER); + protected JPanel createButtonPanel() { + JPanel panel = new JPanel(new GridLayout(1, 2)); - // Ok/Cancel buttons - JButton okButton = new JButton(resources.getString("okButton.text")); + JButton okButton = new JButton(resources.getString("Ok")); + okButton.setName("okButton"); okButton.addActionListener(this::okButtonActionPerformed); - okButton.requestFocus(); + panel.add(okButton); - JButton cancelButton = new JButton(resources.getString("cancelButton.text")); + + JButton cancelButton = new JButton(resources.getString("Cancel")); + cancelButton.setName("cancelButton"); cancelButton.addActionListener(this::cancelButtonActionPerformed); + panel.add(cancelButton); - // Layout buttons - JPanel buttonsPanel = new JPanel(new GridLayout(1, 2)); - buttonsPanel.add(okButton); - buttonsPanel.add(cancelButton); - JPanel bottom = new JPanel(new GridBagLayout()); - bottom.add(buttonsPanel); - this.getContentPane().add(bottom, BorderLayout.PAGE_END); + return panel; } private void setPreferences() { PreferencesNode preferences = MekHQ.getPreferences().forClass(getClass()); - preferences.manage(new JWindowPreference(this)); - this.setCustomPreferences(preferences); + setCustomPreferences(preferences); + } + + /** + * Adds custom preferences to this dialog. + * + * By default, this dialog will track preferences related to the size + * and position of the dialog. Other preferences should be added by overriding + * this method. + * @param preferences the preference node for this dialog + */ + protected void setCustomPreferences(final PreferencesNode preferences) { + } + //endregion Initialization - private void okButtonActionPerformed(ActionEvent evt) { - this.okAction(); - this.result = DialogResult.OK; - this.dispose(); + protected void okButtonActionPerformed(final ActionEvent evt) { + okAction(); + setResult(DialogResult.OK); + setVisible(false); } + /** + * Action performed when the ok button is clicked. + */ + protected abstract void okAction(); + /** * Notes: cancelling a dialog should always allow to close the dialog. */ - private void cancelButtonActionPerformed(ActionEvent evt) { + protected void cancelButtonActionPerformed(final ActionEvent evt) { try { - this.cancelAction(); + cancelAction(); } catch (Exception e) { MekHQ.getLogger().error(e); - } - finally { - this.result = DialogResult.CANCEL; - this.dispose(); + } finally { + setResult(DialogResult.CANCEL); + setVisible(false); } } /** - * Notes: closing the dialog should always allow to close the dialog. + * Action performed when the cancel button is clicked or + * when the dialog is closed by the X button. + */ + protected abstract void cancelAction(); + + //region WindowEvents + /** + * Notes: closing the dialog should always allow you to close the dialog. */ @Override - public void windowClosing(WindowEvent e) { + public void windowClosing(final WindowEvent e) { try { - this.cancelAction(); + cancelAction(); } catch (Exception ex) { MekHQ.getLogger().error(ex); - } - finally { - this.result = DialogResult.CANCEL; + } finally { + setResult(DialogResult.CANCEL); } } @Override - public void windowOpened(WindowEvent e) { + public void windowOpened(final WindowEvent e) { + } @Override - public void windowClosed(WindowEvent e) { + public void windowClosed(final WindowEvent e) { + } @Override - public void windowIconified(WindowEvent e){ + public void windowIconified(final WindowEvent e) { + } @Override - public void windowDeiconified(WindowEvent e){ + public void windowDeiconified(final WindowEvent e) { + } @Override - public void windowActivated(WindowEvent e) { + public void windowActivated(final WindowEvent e) { + } @Override - public void windowDeactivated(WindowEvent e) { + public void windowDeactivated(final WindowEvent e) { + } + //endregion WindowEvents } diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 89e215004d..0c8d401cd8 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -21,40 +21,33 @@ import megamek.common.util.EncodeControl; import mekhq.MekHQ; import mekhq.campaign.Campaign; -import mekhq.campaign.event.OrganizationChangedEvent; -import mekhq.gui.preferences.JWindowPreference; +import mekhq.gui.enums.CompanyGenerationPanelType; import mekhq.gui.view.CompanyGenerationOptionsPanel; -import mekhq.preferences.PreferencesNode; import javax.swing.*; import java.awt.*; import java.util.ResourceBundle; -public class CompanyGenerationDialog extends JDialog { +public class CompanyGenerationDialog extends BaseDialog { //region Variable Declarations - private JFrame frame; + private CompanyGenerationPanelType currentPanelType; private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations //region Constructors public CompanyGenerationDialog(final JFrame frame, final Campaign campaign) { - super(frame, "", ModalityType.APPLICATION_MODAL); - setTitle(resources.getString("CompanyGenerationDialog.title")); - setFrame(frame); - initialize(campaign); - managePreferences(); + super(frame, ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()), + "CompanyGenerationDialog.title", campaign); } //endregion Constructors //region Getters/Setters - public JFrame getFrame() { - return frame; + public CompanyGenerationPanelType getCurrentPanelType() { + return currentPanelType; } - public void setFrame(JFrame frame) { - this.frame = frame; + public void setCurrentPanelType(CompanyGenerationPanelType currentPanelType) { + this.currentPanelType = currentPanelType; } public CompanyGenerationOptionsPanel getCompanyGenerationOptionsPanel() { @@ -67,13 +60,24 @@ public void setCompanyGenerationOptionsPanel(final CompanyGenerationOptionsPanel //endregion Getters/Setters //region Initialization - private void initialize(final Campaign campaign) { - setLayout(new BorderLayout()); - add(new JScrollPane(initializeCompanyGenerationOptionsPanel(campaign)), BorderLayout.CENTER); - add(initializeButtons(), BorderLayout.PAGE_END); - - setMinimumSize(new Dimension(480, 240)); - setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + /** + * @param campaign the campaign with which to create the center pane + * @return + */ + @Override + protected Container createCenterPane(final Campaign campaign) { + switch (getCurrentPanelType()) { + case OPTIONS: + case PERSONNEL: + case UNITS: + case UNIT: + case SPARES: + case CONTRACTS: + case FINANCES: + case OVERVIEW: + default: + return new JScrollPane(initializeCompanyGenerationOptionsPanel(campaign)); + } } private JPanel initializeCompanyGenerationOptionsPanel(final Campaign campaign) { @@ -81,19 +85,43 @@ private JPanel initializeCompanyGenerationOptionsPanel(final Campaign campaign) return getCompanyGenerationOptionsPanel(); } - private JPanel initializeButtons() { - JButton btnCancel = new JButton(resources.getString("Cancel")); - btnCancel.addActionListener(evt -> setVisible(false)); + @Override + protected JPanel createButtonPanel() { + switch (getCurrentPanelType()) { + case OPTIONS: + case PERSONNEL: + case UNITS: + case UNIT: + case SPARES: + case CONTRACTS: + case FINANCES: + case OVERVIEW: + default: + return initializeCompanyGenerationOptionsButtonPanel(); + } + } + + private JPanel initializeCompanyGenerationOptionsButtonPanel() { + JPanel panel = new JPanel(new GridLayout(2, 3)); + + JButton cancelButton = new JButton(resources.getString("Cancel")); + cancelButton.setName("cancelButton"); + cancelButton.addActionListener(this::cancelButtonActionPerformed); + panel.add(cancelButton); JButton btnExport = new JButton(resources.getString("Export")); btnExport.addActionListener(evt -> getCompanyGenerationOptionsPanel().exportOptionsToXML()); - JButton btnGenerate = new JButton(resources.getString("Generate")); - //btnGenerate.addActionListener(evt -> getCompanyGenerationOptionsPanel().generate()); + JButton okButton = new JButton(resources.getString("Generate")); + okButton.setName("okButton"); + okButton.addActionListener(this::okButtonActionPerformed); + panel.add(okButton); JButton btnRestore = new JButton(resources.getString("RestoreDefaults")); + btnRestore.setName("btnRestore"); btnRestore.addActionListener(evt -> getCompanyGenerationOptionsPanel().setOptions( MekHQ.getMekHQOptions().getDefaultCompanyGenerationType())); + panel.add(btnRestore); JButton btnImport = new JButton(resources.getString("Import")); btnImport.addActionListener(evt -> getCompanyGenerationOptionsPanel().importOptionsFromXML()); @@ -107,45 +135,17 @@ private JPanel initializeButtons() { }); */ - // Layout the UI - JPanel panel = new JPanel(); - GroupLayout layout = new GroupLayout(panel); - panel.setLayout(layout); - - layout.setAutoCreateGaps(true); - layout.setAutoCreateContainerGaps(true); - - layout.setVerticalGroup( - layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(btnCancel) - .addComponent(btnExport) - .addComponent(btnGenerate, GroupLayout.Alignment.TRAILING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(btnRestore) - .addComponent(btnImport) - .addComponent(btnApply, GroupLayout.Alignment.TRAILING)) - ); - - layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.CENTER) - .addGroup(layout.createSequentialGroup() - .addComponent(btnCancel) - .addComponent(btnExport) - .addComponent(btnGenerate)) - .addGroup(layout.createSequentialGroup() - .addComponent(btnRestore) - .addComponent(btnImport) - .addComponent(btnApply)) - ); - return panel; } + //endregion Initialization - private void managePreferences() { - PreferencesNode preferences = MekHQ.getPreferences().forClass(getClass()); + @Override + protected void okAction() { + + } + + @Override + protected void cancelAction() { - preferences.manage(new JWindowPreference(this)); } - //endregion Initialization } diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index b894b34105..d6757d66ec 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -20,7 +20,10 @@ */ package mekhq.gui.dialog; +import megamek.common.annotations.Nullable; +import megamek.common.util.EncodeControl; import mekhq.MekHQ; +import mekhq.campaign.Campaign; import mekhq.campaign.event.MekHQOptionsChangedEvent; import mekhq.campaign.universe.enums.CompanyGenerationType; import mekhq.gui.enums.PersonnelFilterStyle; @@ -77,16 +80,12 @@ public class MekHqOptionsDialog extends BaseDialog { private JSpinner optionStartGameDelay; private JComboBox optionDefaultCompanyGenerationType; //endregion Miscellaneous - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog"); //endregion Variable Declarations //region Constructors public MekHqOptionsDialog(JFrame parent) { - super(parent); - - this.initialize(resources); - this.setInitialState(); + super(parent, ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog", new EncodeControl())); + setInitialState(); } //endregion Constructors @@ -94,9 +93,12 @@ public MekHqOptionsDialog(JFrame parent) { /** * This dialog uses the following Mnemonics: * C, D, M, M, S, U, W, Y + * + * @param campaign this value will always be null for this dialog, unless the constructor is + * changed first */ @Override - protected Container createCustomUI() { + protected Container createCenterPane(final @Nullable Campaign campaign) { JTabbedPane optionsTabbedPane = new JTabbedPane(); optionsTabbedPane.setName("optionsTabbedPane"); optionsTabbedPane.add(resources.getString("displayTab.title"), new JScrollPane(createDisplayTab())); @@ -447,6 +449,11 @@ protected void okAction() { MekHQ.triggerEvent(new MekHQOptionsChangedEvent()); } + @Override + protected void cancelAction() { + + } + private void setInitialState() { optionDisplayDateFormat.setText(MekHQ.getMekHQOptions().getDisplayDateFormat()); optionLongDisplayDateFormat.setText(MekHQ.getMekHQOptions().getLongDisplayDateFormat()); diff --git a/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java b/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java new file mode 100644 index 0000000000..315f3c5224 --- /dev/null +++ b/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.enums; + +public enum CompanyGenerationPanelType { + OPTIONS, + PERSONNEL, + UNITS, + UNIT, + SPARES, + CONTRACTS, + FINANCES, + OVERVIEW +} diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java index cbeae659f5..7a82b2a8f7 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -44,6 +44,7 @@ import java.util.Objects; import java.util.ResourceBundle; import java.util.stream.Collectors; +import java.util.stream.Stream; public class CompanyGenerationOptionsPanel extends JPanel { //region Variable Declarations @@ -143,7 +144,7 @@ public JFrame getFrame() { return frame; } - public void setFrame(JFrame frame) { + public void setFrame(final JFrame frame) { this.frame = frame; } @@ -151,7 +152,7 @@ public Campaign getCampaign() { return campaign; } - public void setCampaign(Campaign campaign) { + public void setCampaign(final Campaign campaign) { this.campaign = campaign; } @@ -164,7 +165,7 @@ public CompanyGenerationType getCompanyGenerationType() { return (CompanyGenerationType) Objects.requireNonNull(getComboCompanyGenerationType().getSelectedItem()); } - public void setComboCompanyGenerationType(JComboBox comboCompanyGenerationType) { + public void setComboCompanyGenerationType(final JComboBox comboCompanyGenerationType) { this.comboCompanyGenerationType = comboCompanyGenerationType; } @@ -176,7 +177,7 @@ public Faction getFaction() { return ((FactionChoice) Objects.requireNonNull(getComboFaction().getSelectedItem())).getFaction(); } - public void setComboFaction(JComboBox comboFaction) { + public void setComboFaction(final JComboBox comboFaction) { this.comboFaction = comboFaction; } @@ -184,7 +185,7 @@ public JCheckBox getChkStartingSystemFactionSpecific() { return chkStartingSystemFactionSpecific; } - public void setChkStartingSystemFactionSpecific(JCheckBox chkStartingSystemFactionSpecific) { + public void setChkStartingSystemFactionSpecific(final JCheckBox chkStartingSystemFactionSpecific) { this.chkStartingSystemFactionSpecific = chkStartingSystemFactionSpecific; } @@ -192,40 +193,59 @@ public JComboBox getComboStartingSystem() { return comboStartingSystem; } - public PlanetarySystem getStartingSystem() { - return (PlanetarySystem) Objects.requireNonNull(getComboStartingSystem().getSelectedItem()); + public @Nullable PlanetarySystem getStartingSystem() { + return (PlanetarySystem) getComboStartingSystem().getSelectedItem(); } - public void setComboStartingSystem(JComboBox comboStartingSystem) { + public void setComboStartingSystem(final JComboBox comboStartingSystem) { this.comboStartingSystem = comboStartingSystem; } - private void updateComboStartingSystem() { + private void restoreComboStartingSystem() { getComboStartingSystem().removeAllItems(); getComboStartingSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( getChkStartingSystemFactionSpecific().isSelected() ? getFaction() : null))); getComboStartingSystem().setSelectedIndex(0); - getComboStartingPlanet().setModel(new DefaultComboBoxModel<>( - getStartingSystem().getPlanets().toArray(new Planet[]{}))); + restoreComboStartingPlanet(); + } + + private void updateComboStartingSystem() { + if ((getStartingSystem() != null) + && !getStartingSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction())) { + restoreComboStartingSystem(); + } } public JComboBox getComboStartingPlanet() { return comboStartingPlanet; } - public Planet getStartingPlanet() { - return (Planet) Objects.requireNonNull(getComboStartingPlanet().getSelectedItem()); + public @Nullable Planet getStartingPlanet() { + return (Planet) getComboStartingPlanet().getSelectedItem(); } - public void setComboStartingPlanet(JComboBox comboStartingPlanet) { + public void setComboStartingPlanet(final JComboBox comboStartingPlanet) { this.comboStartingPlanet = comboStartingPlanet; } + private void restoreComboStartingPlanet() { + getComboStartingPlanet().setModel(new DefaultComboBoxModel<>( + getStartingSystem().getPlanets().toArray(new Planet[]{}))); + getComboStartingPlanet().setSelectedItem(getStartingSystem().getPrimaryPlanet()); + } + + private void updateComboStartingPlanet() { + if ((getStartingSystem() != null) && (getStartingPlanet() != null) + && !getStartingPlanet().getParentSystem().equals(getStartingSystem())) { + restoreComboStartingPlanet(); + } + } + public JCheckBox getChkGenerateMercenaryCompanyCommandLance() { return chkGenerateMercenaryCompanyCommandLance; } - public void setChkGenerateMercenaryCompanyCommandLance(JCheckBox chkGenerateMercenaryCompanyCommandLance) { + public void setChkGenerateMercenaryCompanyCommandLance(final JCheckBox chkGenerateMercenaryCompanyCommandLance) { this.chkGenerateMercenaryCompanyCommandLance = chkGenerateMercenaryCompanyCommandLance; } @@ -233,7 +253,7 @@ public JSpinner getSpnCompanyCount() { return spnCompanyCount; } - public void setSpnCompanyCount(JSpinner spnCompanyCount) { + public void setSpnCompanyCount(final JSpinner spnCompanyCount) { this.spnCompanyCount = spnCompanyCount; } @@ -241,7 +261,7 @@ public JSpinner getSpnIndividualLanceCount() { return spnIndividualLanceCount; } - public void setSpnIndividualLanceCount(JSpinner spnIndividualLanceCount) { + public void setSpnIndividualLanceCount(final JSpinner spnIndividualLanceCount) { this.spnIndividualLanceCount = spnIndividualLanceCount; } @@ -249,7 +269,7 @@ public JSpinner getSpnLancesPerCompany() { return spnLancesPerCompany; } - public void setSpnLancesPerCompany(JSpinner spnLancesPerCompany) { + public void setSpnLancesPerCompany(final JSpinner spnLancesPerCompany) { this.spnLancesPerCompany = spnLancesPerCompany; } @@ -257,7 +277,7 @@ public JSpinner getSpnLanceSize() { return spnLanceSize; } - public void setSpnLanceSize(JSpinner spnLanceSize) { + public void setSpnLanceSize(final JSpinner spnLanceSize) { this.spnLanceSize = spnLanceSize; } //endregion Base Information @@ -268,17 +288,18 @@ public JLabel getLblTotalSupportPersonnel() { } public void updateLblTotalSupportPersonnel() { - updateLblTotalSupportPersonnel(((getChkGenerateMercenaryCompanyCommandLance().isSelected() ? 1 : 0) + updateLblTotalSupportPersonnel( + ((getChkGenerateMercenaryCompanyCommandLance().isSelected() ? 1 : 0) + ((int) getSpnCompanyCount().getValue() * (int) getSpnLancesPerCompany().getValue()) + (int) getSpnIndividualLanceCount().getValue()) * (int) getSpnLanceSize().getValue()); } - public void updateLblTotalSupportPersonnel(int numSupportPersonnel) { + public void updateLblTotalSupportPersonnel(final int numSupportPersonnel) { getLblTotalSupportPersonnel().setText(String.format( resources.getString("lblTotalSupportPersonnel.text"), numSupportPersonnel)); } - public void setLblTotalSupportPersonnel(JLabel lblTotalSupportPersonnel) { + public void setLblTotalSupportPersonnel(final JLabel lblTotalSupportPersonnel) { this.lblTotalSupportPersonnel = lblTotalSupportPersonnel; } @@ -287,21 +308,18 @@ public RoleToSpinner[] getSpnSupportPersonnelNumbers() { } public Map getSupportPersonnelNumbers() { - Map supportPersonnelNumbers = new HashMap<>(); - for (RoleToSpinner rts : getSpnSupportPersonnelNumbers()) { - if (rts.getValue() > 0) { - supportPersonnelNumbers.put(rts.getRole(), rts.getValue()); - } - } + final Map supportPersonnelNumbers = new HashMap<>(); + Stream.of(getSpnSupportPersonnelNumbers()).filter(rts -> rts.getValue() > 0) + .forEach(rts -> supportPersonnelNumbers.put(rts.getRole(), rts.getValue())); return supportPersonnelNumbers; } - public void setSpnSupportPersonnelNumbers(RoleToSpinner... spnSupportPersonnelNumbers) { + public void setSpnSupportPersonnelNumbers(final RoleToSpinner... spnSupportPersonnelNumbers) { this.spnSupportPersonnelNumbers = spnSupportPersonnelNumbers; } - public void setSupportPersonnelNumbers(Map supportPersonnelNumbers) { - for (RoleToSpinner rts : getSpnSupportPersonnelNumbers()) { + public void setSupportPersonnelNumbers(final Map supportPersonnelNumbers) { + for (final RoleToSpinner rts : getSpnSupportPersonnelNumbers()) { rts.getSpinner().setValue(supportPersonnelNumbers.getOrDefault(rts.getRole(), 0)); } } @@ -310,7 +328,7 @@ public JCheckBox getChkPoolAssistants() { return chkPoolAssistants; } - public void setChkPoolAssistants(JCheckBox chkPoolAssistants) { + public void setChkPoolAssistants(final JCheckBox chkPoolAssistants) { this.chkPoolAssistants = chkPoolAssistants; } @@ -318,7 +336,7 @@ public JCheckBox getChkGenerateCaptains() { return chkGenerateCaptains; } - public void setChkGenerateCaptains(JCheckBox chkGenerateCaptains) { + public void setChkGenerateCaptains(final JCheckBox chkGenerateCaptains) { this.chkGenerateCaptains = chkGenerateCaptains; } @@ -326,7 +344,7 @@ public JCheckBox getChkAssignCompanyCommanderFlag() { return chkAssignCompanyCommanderFlag; } - public void setChkAssignCompanyCommanderFlag(JCheckBox chkAssignCompanyCommanderFlag) { + public void setChkAssignCompanyCommanderFlag(final JCheckBox chkAssignCompanyCommanderFlag) { this.chkAssignCompanyCommanderFlag = chkAssignCompanyCommanderFlag; } @@ -334,7 +352,7 @@ public JCheckBox getChkCompanyCommanderLanceOfficer() { return chkCompanyCommanderLanceOfficer; } - public void setChkCompanyCommanderLanceOfficer(JCheckBox chkCompanyCommanderLanceOfficer) { + public void setChkCompanyCommanderLanceOfficer(final JCheckBox chkCompanyCommanderLanceOfficer) { this.chkCompanyCommanderLanceOfficer = chkCompanyCommanderLanceOfficer; } @@ -342,7 +360,7 @@ public JCheckBox getChkApplyOfficerStatBonusToWorstSkill() { return chkApplyOfficerStatBonusToWorstSkill; } - public void setChkApplyOfficerStatBonusToWorstSkill(JCheckBox chkApplyOfficerStatBonusToWorstSkill) { + public void setChkApplyOfficerStatBonusToWorstSkill(final JCheckBox chkApplyOfficerStatBonusToWorstSkill) { this.chkApplyOfficerStatBonusToWorstSkill = chkApplyOfficerStatBonusToWorstSkill; } @@ -350,7 +368,7 @@ public JCheckBox getChkAssignBestOfficers() { return chkAssignBestOfficers; } - public void setChkAssignBestOfficers(JCheckBox chkAssignBestOfficers) { + public void setChkAssignBestOfficers(final JCheckBox chkAssignBestOfficers) { this.chkAssignBestOfficers = chkAssignBestOfficers; } @@ -358,7 +376,7 @@ public JCheckBox getChkAutomaticallyAssignRanks() { return chkAutomaticallyAssignRanks; } - public void setChkAutomaticallyAssignRanks(JCheckBox chkAutomaticallyAssignRanks) { + public void setChkAutomaticallyAssignRanks(final JCheckBox chkAutomaticallyAssignRanks) { this.chkAutomaticallyAssignRanks = chkAutomaticallyAssignRanks; } //endregion Personnel @@ -368,7 +386,7 @@ public JCheckBox getChkRandomizeOrigin() { return chkRandomizeOrigin; } - public void setChkRandomizeOrigin(JCheckBox chkRandomizeOrigin) { + public void setChkRandomizeOrigin(final JCheckBox chkRandomizeOrigin) { this.chkRandomizeOrigin = chkRandomizeOrigin; } @@ -376,7 +394,7 @@ public JCheckBox getChkCentralSystemFactionSpecific() { return chkCentralSystemFactionSpecific; } - public void setChkCentralSystemFactionSpecific(JCheckBox chkCentralSystemFactionSpecific) { + public void setChkCentralSystemFactionSpecific(final JCheckBox chkCentralSystemFactionSpecific) { this.chkCentralSystemFactionSpecific = chkCentralSystemFactionSpecific; } @@ -384,40 +402,59 @@ public JComboBox getComboCentralSystem() { return comboCentralSystem; } - public PlanetarySystem getCentralSystem() { - return (PlanetarySystem) Objects.requireNonNull(getComboCentralSystem().getSelectedItem()); + public @Nullable PlanetarySystem getCentralSystem() { + return (PlanetarySystem) getComboCentralSystem().getSelectedItem(); } - public void setComboCentralSystem(JComboBox comboCentralSystem) { + public void setComboCentralSystem(final JComboBox comboCentralSystem) { this.comboCentralSystem = comboCentralSystem; } - private void updateComboCentralSystem() { + private void restoreComboCentralSystem() { getComboCentralSystem().removeAllItems(); getComboCentralSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( getChkCentralSystemFactionSpecific().isSelected() ? getFaction() : null))); getComboCentralSystem().setSelectedIndex(0); - getComboCentralPlanet().setModel(new DefaultComboBoxModel<>( - getCentralSystem().getPlanets().toArray(new Planet[]{}))); + restoreComboCentralPlanet(); + } + + private void updateComboCentralSystem() { + if ((getCentralSystem() != null) + && !getCentralSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction())) { + restoreComboCentralSystem(); + } } public JComboBox getComboCentralPlanet() { return comboCentralPlanet; } - public Planet getCentralPlanet() { - return (Planet) Objects.requireNonNull(getComboCentralPlanet().getSelectedItem()); + public @Nullable Planet getCentralPlanet() { + return (Planet) getComboCentralPlanet().getSelectedItem(); } - public void setComboCentralPlanet(JComboBox comboCentralPlanet) { + public void setComboCentralPlanet(final JComboBox comboCentralPlanet) { this.comboCentralPlanet = comboCentralPlanet; } + private void restoreComboCentralPlanet() { + getComboCentralPlanet().setModel(new DefaultComboBoxModel<>( + getCentralSystem().getPlanets().toArray(new Planet[]{}))); + getComboCentralPlanet().setSelectedItem(getCentralSystem().getPrimaryPlanet()); + } + + private void updateComboCentralPlanet() { + if ((getCentralSystem() != null) && (getCentralPlanet() != null) + && !getCentralPlanet().getParentSystem().equals(getCentralSystem())) { + restoreComboCentralPlanet(); + } + } + public JSpinner getSpnOriginSearchRadius() { return spnOriginSearchRadius; } - public void setSpnOriginSearchRadius(JSpinner spnOriginSearchRadius) { + public void setSpnOriginSearchRadius(final JSpinner spnOriginSearchRadius) { this.spnOriginSearchRadius = spnOriginSearchRadius; } @@ -425,7 +462,7 @@ public JCheckBox getChkExtraRandomOrigin() { return chkExtraRandomOrigin; } - public void setChkExtraRandomOrigin(JCheckBox chkExtraRandomOrigin) { + public void setChkExtraRandomOrigin(final JCheckBox chkExtraRandomOrigin) { this.chkExtraRandomOrigin = chkExtraRandomOrigin; } @@ -433,7 +470,7 @@ public JSpinner getSpnOriginDistanceScale() { return spnOriginDistanceScale; } - public void setSpnOriginDistanceScale(JSpinner spnOriginDistanceScale) { + public void setSpnOriginDistanceScale(final JSpinner spnOriginDistanceScale) { this.spnOriginDistanceScale = spnOriginDistanceScale; } //endregion Personnel Randomization @@ -443,7 +480,7 @@ public JCheckBox getChkGenerateUnitsAsAttached() { return chkGenerateUnitsAsAttached; } - public void setChkGenerateUnitsAsAttached(JCheckBox chkGenerateUnitsAsAttached) { + public void setChkGenerateUnitsAsAttached(final JCheckBox chkGenerateUnitsAsAttached) { this.chkGenerateUnitsAsAttached = chkGenerateUnitsAsAttached; } @@ -451,7 +488,7 @@ public JCheckBox getChkAssignBestRollToUnitCommander() { return chkAssignBestRollToUnitCommander; } - public void setChkAssignBestRollToUnitCommander(JCheckBox chkAssignBestRollToUnitCommander) { + public void setChkAssignBestRollToUnitCommander(final JCheckBox chkAssignBestRollToUnitCommander) { this.chkAssignBestRollToUnitCommander = chkAssignBestRollToUnitCommander; } @@ -459,7 +496,7 @@ public JCheckBox getChkGroupByWeight() { return chkGroupByWeight; } - public void setChkGroupByWeight(JCheckBox chkGroupByWeight) { + public void setChkGroupByWeight(final JCheckBox chkGroupByWeight) { this.chkGroupByWeight = chkGroupByWeight; } @@ -467,7 +504,7 @@ public JCheckBox getChkKeepOfficerRollsSeparate() { return chkKeepOfficerRollsSeparate; } - public void setChkKeepOfficerRollsSeparate(JCheckBox chkKeepOfficerRollsSeparate) { + public void setChkKeepOfficerRollsSeparate(final JCheckBox chkKeepOfficerRollsSeparate) { this.chkKeepOfficerRollsSeparate = chkKeepOfficerRollsSeparate; } @@ -475,7 +512,7 @@ public JSpinner getSpnStarLeagueYear() { return spnStarLeagueYear; } - public void setSpnStarLeagueYear(JSpinner spnStarLeagueYear) { + public void setSpnStarLeagueYear(final JSpinner spnStarLeagueYear) { this.spnStarLeagueYear = spnStarLeagueYear; } @@ -483,7 +520,7 @@ public JCheckBox getChkAssignTechsToUnits() { return chkAssignTechsToUnits; } - public void setChkAssignTechsToUnits(JCheckBox chkAssignTechsToUnits) { + public void setChkAssignTechsToUnits(final JCheckBox chkAssignTechsToUnits) { this.chkAssignTechsToUnits = chkAssignTechsToUnits; } //endregion Units @@ -497,7 +534,7 @@ public ForceNamingType getForceNamingType() { return (ForceNamingType) Objects.requireNonNull(getComboForceNamingType().getSelectedItem()); } - public void setComboForceNamingType(JComboBox comboForceNamingType) { + public void setComboForceNamingType(final JComboBox comboForceNamingType) { this.comboForceNamingType = comboForceNamingType; } @@ -505,7 +542,7 @@ public JCheckBox getChkGenerateForceIcons() { return chkGenerateForceIcons; } - public void setChkGenerateForceIcons(JCheckBox chkGenerateForceIcons) { + public void setChkGenerateForceIcons(final JCheckBox chkGenerateForceIcons) { this.chkGenerateForceIcons = chkGenerateForceIcons; } //endregion Unit @@ -515,7 +552,7 @@ public JCheckBox getChkGenerateMothballedSpareUnits() { return chkGenerateMothballedSpareUnits; } - public void setChkGenerateMothballedSpareUnits(JCheckBox chkGenerateMothballedSpareUnits) { + public void setChkGenerateMothballedSpareUnits(final JCheckBox chkGenerateMothballedSpareUnits) { this.chkGenerateMothballedSpareUnits = chkGenerateMothballedSpareUnits; } @@ -523,7 +560,7 @@ public JSpinner getSpnSparesPercentOfActiveUnits() { return spnSparesPercentOfActiveUnits; } - public void setSpnSparesPercentOfActiveUnits(JSpinner spnSparesPercentOfActiveUnits) { + public void setSpnSparesPercentOfActiveUnits(final JSpinner spnSparesPercentOfActiveUnits) { this.spnSparesPercentOfActiveUnits = spnSparesPercentOfActiveUnits; } @@ -531,7 +568,7 @@ public JCheckBox getChkGenerateSpareParts() { return chkGenerateSpareParts; } - public void setChkGenerateSpareParts(JCheckBox chkGenerateSpareParts) { + public void setChkGenerateSpareParts(final JCheckBox chkGenerateSpareParts) { this.chkGenerateSpareParts = chkGenerateSpareParts; } @@ -539,7 +576,7 @@ public JSpinner getSpnStartingArmourWeight() { return spnStartingArmourWeight; } - public void setSpnStartingArmourWeight(JSpinner spnStartingArmourWeight) { + public void setSpnStartingArmourWeight(final JSpinner spnStartingArmourWeight) { this.spnStartingArmourWeight = spnStartingArmourWeight; } @@ -547,7 +584,7 @@ public JCheckBox getChkGenerateSpareAmmunition() { return chkGenerateSpareAmmunition; } - public void setChkGenerateSpareAmmunition(JCheckBox chkGenerateSpareAmmunition) { + public void setChkGenerateSpareAmmunition(final JCheckBox chkGenerateSpareAmmunition) { this.chkGenerateSpareAmmunition = chkGenerateSpareAmmunition; } @@ -555,7 +592,7 @@ public JSpinner getSpnNumberReloadsPerWeapon() { return spnNumberReloadsPerWeapon; } - public void setSpnNumberReloadsPerWeapon(JSpinner spnNumberReloadsPerWeapon) { + public void setSpnNumberReloadsPerWeapon(final JSpinner spnNumberReloadsPerWeapon) { this.spnNumberReloadsPerWeapon = spnNumberReloadsPerWeapon; } @@ -563,7 +600,7 @@ public JCheckBox getChkGenerateFractionalMachineGunAmmunition() { return chkGenerateFractionalMachineGunAmmunition; } - public void setChkGenerateFractionalMachineGunAmmunition(JCheckBox chkGenerateFractionalMachineGunAmmunition) { + public void setChkGenerateFractionalMachineGunAmmunition(final JCheckBox chkGenerateFractionalMachineGunAmmunition) { this.chkGenerateFractionalMachineGunAmmunition = chkGenerateFractionalMachineGunAmmunition; } //endregion Spares @@ -573,7 +610,7 @@ public JCheckBox getChkSelectStartingContract() { return chkSelectStartingContract; } - public void setChkSelectStartingContract(JCheckBox chkSelectStartingContract) { + public void setChkSelectStartingContract(final JCheckBox chkSelectStartingContract) { this.chkSelectStartingContract = chkSelectStartingContract; } @@ -581,7 +618,7 @@ public JCheckBox getChkStartCourseToContractPlanet() { return chkStartCourseToContractPlanet; } - public void setChkStartCourseToContractPlanet(JCheckBox chkStartCourseToContractPlanet) { + public void setChkStartCourseToContractPlanet(final JCheckBox chkStartCourseToContractPlanet) { this.chkStartCourseToContractPlanet = chkStartCourseToContractPlanet; } //endregion Contracts @@ -591,7 +628,7 @@ public JSpinner getSpnStartingCash() { return spnStartingCash; } - public void setSpnStartingCash(JSpinner spnStartingCash) { + public void setSpnStartingCash(final JSpinner spnStartingCash) { this.spnStartingCash = spnStartingCash; } @@ -599,7 +636,7 @@ public JCheckBox getChkRandomizeStartingCash() { return chkRandomizeStartingCash; } - public void setChkRandomizeStartingCash(JCheckBox chkRandomizeStartingCash) { + public void setChkRandomizeStartingCash(final JCheckBox chkRandomizeStartingCash) { this.chkRandomizeStartingCash = chkRandomizeStartingCash; } @@ -607,7 +644,7 @@ public JSpinner getSpnRandomStartingCashDiceCount() { return spnRandomStartingCashDiceCount; } - public void setSpnRandomStartingCashDiceCount(JSpinner spnRandomStartingCashDiceCount) { + public void setSpnRandomStartingCashDiceCount(final JSpinner spnRandomStartingCashDiceCount) { this.spnRandomStartingCashDiceCount = spnRandomStartingCashDiceCount; } @@ -615,7 +652,7 @@ public JSpinner getSpnMinimumStartingFloat() { return spnMinimumStartingFloat; } - public void setSpnMinimumStartingFloat(JSpinner spnMinimumStartingFloat) { + public void setSpnMinimumStartingFloat(final JSpinner spnMinimumStartingFloat) { this.spnMinimumStartingFloat = spnMinimumStartingFloat; } @@ -623,7 +660,7 @@ public JCheckBox getChkPayForSetup() { return chkPayForSetup; } - public void setChkPayForSetup(JCheckBox chkPayForSetup) { + public void setChkPayForSetup(final JCheckBox chkPayForSetup) { this.chkPayForSetup = chkPayForSetup; } @@ -631,7 +668,7 @@ public JCheckBox getChkStartingLoan() { return chkStartingLoan; } - public void setChkStartingLoan(JCheckBox chkStartingLoan) { + public void setChkStartingLoan(final JCheckBox chkStartingLoan) { this.chkStartingLoan = chkStartingLoan; } @@ -639,7 +676,7 @@ public JCheckBox getChkPayForPersonnel() { return chkPayForPersonnel; } - public void setChkPayForPersonnel(JCheckBox chkPayForPersonnel) { + public void setChkPayForPersonnel(final JCheckBox chkPayForPersonnel) { this.chkPayForPersonnel = chkPayForPersonnel; } @@ -647,7 +684,7 @@ public JCheckBox getChkPayForUnits() { return chkPayForUnits; } - public void setChkPayForUnits(JCheckBox chkPayForUnits) { + public void setChkPayForUnits(final JCheckBox chkPayForUnits) { this.chkPayForUnits = chkPayForUnits; } @@ -655,7 +692,7 @@ public JCheckBox getChkPayForParts() { return chkPayForParts; } - public void setChkPayForParts(JCheckBox chkPayForParts) { + public void setChkPayForParts(final JCheckBox chkPayForParts) { this.chkPayForParts = chkPayForParts; } @@ -663,7 +700,7 @@ public JCheckBox getChkPayForAmmunition() { return chkPayForAmmunition; } - public void setChkPayForAmmunition(JCheckBox chkPayForAmmunition) { + public void setChkPayForAmmunition(final JCheckBox chkPayForAmmunition) { this.chkPayForAmmunition = chkPayForAmmunition; } //endregion Finances @@ -673,7 +710,7 @@ public void setChkPayForAmmunition(JCheckBox chkPayForAmmunition) { private void initialize() { setName("companyGenerationOptionsPanel"); - GridBagConstraints gbc = new GridBagConstraints(); + final GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.NORTHWEST; @@ -714,12 +751,12 @@ private JPanel createBaseInformationPanel() { getComboCompanyGenerationType().setName("comboCompanyGenerationType"); getComboCompanyGenerationType().setRenderer(new DefaultListCellRenderer() { @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (isSelected && (index > -1)) { - list.setToolTipText((list.getSelectedValue() instanceof CompanyGenerationType) - ? ((CompanyGenerationType) list.getSelectedValue()).getToolTipText() : ""); + if (value instanceof CompanyGenerationType) { + list.setToolTipText(((CompanyGenerationType) value).getToolTipText()); } return this; } @@ -734,8 +771,9 @@ public Component getListCellRendererComponent(JList list, Object value, int i getComboFaction().setName("comboFaction"); setChkStartingSystemFactionSpecific(new JCheckBox(resources.getString("FactionSpecific"))); - getChkStartingSystemFactionSpecific().setToolTipText("chkStartingSystemFactionSpecific.toolTipText"); + getChkStartingSystemFactionSpecific().setToolTipText(resources.getString("chkStartingSystemFactionSpecific.toolTipText")); getChkStartingSystemFactionSpecific().setName("chkStartingSystemFactionSpecific"); + getChkStartingSystemFactionSpecific().addActionListener(evt -> updateComboStartingSystem()); JLabel lblStartingPlanet = new JLabel(resources.getString("lblStartingPlanet.text")); lblStartingPlanet.setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); @@ -744,10 +782,35 @@ public Component getListCellRendererComponent(JList list, Object value, int i setComboStartingSystem(new JComboBox<>()); getComboStartingSystem().setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); getComboStartingSystem().setName("comboStartingSystem"); + getComboStartingSystem().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof PlanetarySystem) { + setText(((PlanetarySystem) value).getName(getCampaign().getLocalDate())); + } + return this; + } + }); + getComboStartingSystem().addActionListener(evt -> updateComboStartingPlanet()); setComboStartingPlanet(new JComboBox<>()); getComboStartingPlanet().setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); getComboStartingPlanet().setName("comboStartingPlanet"); + getComboStartingPlanet().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof Planet) { + setText(((Planet) value).getName(getCampaign().getLocalDate())); + } + return this; + } + }); setChkGenerateMercenaryCompanyCommandLance(new JCheckBox(resources.getString("chkGenerateMercenaryCompanyCommandLance.text"))); getChkGenerateMercenaryCompanyCommandLance().setToolTipText(resources.getString("chkGenerateMercenaryCompanyCommandLance.toolTipText")); @@ -1045,6 +1108,7 @@ private JPanel createPersonnelRandomizationPanel() { setChkCentralSystemFactionSpecific(new JCheckBox(resources.getString("FactionSpecific"))); getChkCentralSystemFactionSpecific().setToolTipText(resources.getString("chkCentralSystemFactionSpecific.toolTipText")); getChkCentralSystemFactionSpecific().setName("chkCentralSystemFactionSpecific"); + getChkCentralSystemFactionSpecific().addActionListener(evt -> updateComboCentralSystem()); JLabel lblCentralPlanet = new JLabel(resources.getString("lblCentralPlanet.text")); lblCentralPlanet.setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); @@ -1053,10 +1117,35 @@ private JPanel createPersonnelRandomizationPanel() { setComboCentralSystem(new JComboBox<>()); getComboCentralSystem().setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); getComboCentralSystem().setName("comboCentralSystem"); + getComboCentralSystem().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof PlanetarySystem) { + setText(((PlanetarySystem) value).getName(getCampaign().getLocalDate())); + } + return this; + } + }); + getComboCentralSystem().addActionListener(evt -> updateComboCentralPlanet()); setComboCentralPlanet(new JComboBox<>()); getComboCentralPlanet().setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); getComboCentralPlanet().setName("comboCentralPlanet"); + getComboCentralPlanet().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof Planet) { + setText(((Planet) value).getName(getCampaign().getLocalDate())); + } + return this; + } + }); JLabel lblOriginSearchRadius = new JLabel(resources.getString("lblOriginSearchRadius.text")); lblOriginSearchRadius.setToolTipText(resources.getString("lblOriginSearchRadius.toolTipText")); @@ -1198,12 +1287,12 @@ private JPanel createUnitPanel() { getComboForceNamingType().setName("comboForceNamingType"); getComboForceNamingType().setRenderer(new DefaultListCellRenderer() { @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (isSelected && (index > -1)) { - list.setToolTipText((list.getSelectedValue() instanceof ForceNamingType) - ? ((ForceNamingType) list.getSelectedValue()).getToolTipText() : ""); + if (value instanceof ForceNamingType) { + list.setToolTipText(((ForceNamingType) value).getToolTipText()); } return this; } @@ -1479,7 +1568,7 @@ private List getFactionChoices() { return factionChoices; } - private PlanetarySystem[] getPlanetarySystems(@Nullable Faction faction) { + private PlanetarySystem[] getPlanetarySystems(final @Nullable Faction faction) { return getCampaign().getSystems().stream() .filter(p -> (faction == null) || p.getFactionSet(getCampaign().getLocalDate()).contains(faction)) .sorted(Comparator.comparing(p -> p.getName(getCampaign().getLocalDate()))) @@ -1509,10 +1598,8 @@ public void setOptions(final CompanyGenerationOptions options) { break; } } - if (getChkStartingSystemFactionSpecific().isSelected()) { - getChkStartingSystemFactionSpecific().setSelected(false); - updateComboStartingSystem(); - } + getChkStartingSystemFactionSpecific().setSelected(false); + restoreComboStartingSystem(); getComboStartingSystem().setSelectedItem(options.getStartingPlanet().getParentSystem()); getComboStartingPlanet().setSelectedItem(options.getStartingPlanet()); getChkGenerateMercenaryCompanyCommandLance().setSelected(options.isGenerateMercenaryCompanyCommandLance()); @@ -1534,10 +1621,8 @@ public void setOptions(final CompanyGenerationOptions options) { // Personnel Randomization getChkRandomizeOrigin().setSelected(options.isRandomizeOrigin()); - if (getChkCentralSystemFactionSpecific().isSelected()) { - getChkCentralSystemFactionSpecific().setSelected(false); - updateComboCentralSystem(); - } + getChkCentralSystemFactionSpecific().setSelected(false); + restoreComboCentralSystem(); getComboCentralSystem().setSelectedItem(options.getCentralPlanet().getParentSystem()); getComboCentralPlanet().setSelectedItem(options.getCentralPlanet()); getSpnOriginSearchRadius().setValue(options.getOriginSearchRadius()); @@ -1679,7 +1764,7 @@ private static class FactionChoice { //endregion Variable Declarations //region Constructors - public FactionChoice(Faction faction, int year) { + public FactionChoice(final Faction faction, final int year) { setFaction(faction); setYear(year); setDisplayName(); @@ -1691,7 +1776,7 @@ public Faction getFaction() { return faction; } - public void setFaction(Faction faction) { + public void setFaction(final Faction faction) { this.faction = faction; } @@ -1699,7 +1784,7 @@ public int getYear() { return year; } - public void setYear(int year) { + public void setYear(final int year) { this.year = year; } @@ -1733,7 +1818,7 @@ public int getRole() { return role; } - public void setRole(int role) { + public void setRole(final int role) { this.role = role; } @@ -1745,7 +1830,7 @@ public int getValue() { return (Integer) getSpinner().getValue(); } - public void setSpinner(JSpinner spinner) { + public void setSpinner(final JSpinner spinner) { this.spinner = spinner; } //endregion Getters/Setters From 3cf92f3d9ad4a73041d844bd6841a80b973be361 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 14 Feb 2021 08:50:58 -0700 Subject: [PATCH 008/115] Staging and working on the company generator --- .../resources/mekhq/resources/GUI.properties | 21 +- .../AbstractCompanyGenerator.java | 222 ++++++++-- .../AtBCompanyGenerator.java | 21 +- .../CompanyGenerationOptions.java | 76 +++- .../WindchildCompanyGenerator.java | 19 +- MekHQ/src/mekhq/gui/dialog/BaseDialog.java | 17 +- .../gui/dialog/CompanyGenerationDialog.java | 37 +- .../mekhq/gui/dialog/MekHqOptionsDialog.java | 1 + .../gui/enums/CompanyGenerationPanelType.java | 50 ++- .../view/CompanyGenerationOptionsPanel.java | 405 ++++++++++++++---- 10 files changed, 707 insertions(+), 162 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 55f507bfaa..86bd86ee3e 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -148,9 +148,12 @@ baseInformationPanel.title=Base Information lblCompanyGenerationType.text=Company Generation Type lblCompanyGenerationType.toolTipText=This is the type of company generator to use. These have hardcoded differences described in their tooltips. lblFaction.toolTipText=\u0020 +chkSpecifyStartingSystem.text=Specify Starting Planet +chkSpecifyStartingSystem.toolTipText=This option lets you specify the planet the mercenary company starts at. chkStartingSystemFactionSpecific.toolTipText=Filter the starting planet options so they are specific to the faction selected. lblStartingPlanet.text=Starting Planet lblStartingPlanet.toolTipText=This is the planet that the company starts at. This should normally be kept at the default value, but is customizable for RP reasons. +comboStartingSystem.toolTipText=This is the system to select the starting planet from. chkGenerateMercenaryCompanyCommandLance.text=Generate Company Command Lance chkGenerateMercenaryCompanyCommandLance.toolTipText=This generates a lance containing the company commander to lead the mercenary company. Otherwise, the company commander leads the first lance generate, either first company or the first independent lance. lblCompanyCount.text=Company Count @@ -185,9 +188,12 @@ chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks t personnelRandomizationPanel.title=Personnel Randomization chkRandomizeOrigin.text=Randomize Origin chkRandomizeOrigin.toolTipText=This randomizes the personnel origin. If disabled this will roll all 'Mechs on the faction's RAT. -lblCentralPlanet.text=Central Planet +chkRandomizeAroundCentralPlanet.text=Randomize Around Central Planet +chkRandomizeAroundCentralPlanet.toolTipText=This randomizes the personnel around a central planet, which allows one to have a company generated from within a specified region around that planet.
Terra is recommended for a wide variety around the Inner Sphere. chkCentralSystemFactionSpecific.toolTipText=Filter the central planet options so they are specific to the faction selected. +lblCentralPlanet.text=Central Planet lblCentralPlanet.toolTipText=This is the central planet around which personnel are randomized. +comboCentralSystem.toolTipText=This is the system from which to select the central planet around which personnel are randomized. lblOriginSearchRadius.text=Origin Search Radius lblOriginSearchRadius.toolTipText=This is the radius that is used to find factions and planets when randomizing a person's origin. chkExtraRandomOrigin.text=Extra Random Planetary Origin @@ -223,7 +229,7 @@ lblSparesPercentOfActiveUnits.toolTipText=This is the percentage of active units chkGenerateSpareParts.text=Generate Spare Parts chkGenerateSpareParts.toolTipText=This generates spare parts for the unit based on the parts used by the unit. lblStartingArmourWeight.text=Starting Armour Weight -lblStartingArmourWeight.toolTipText=This is the weight of starting standard armour to generate. +lblStartingArmourWeight.toolTipText=This is the weight of spare armour to generate at the start of the campaign. Each type of armour is generated based on the percentage weight it is of the total armour, rounded to the nearest ton.
The recommended value to use is 20 tons per lance. chkGenerateSpareAmmunition.text=Generate Spare Ammunition chkGenerateSpareAmmunition.toolTipText=This generates spare standard ammunition for any weapons in the force. lblNumberReloadsPerWeapon.text=Reloads per Weapon @@ -256,8 +262,19 @@ chkPayForUnits.text=Pay for Units chkPayForUnits.toolTipText=Pay for units, at either their full purchase cost or half of it if they are a person's attached unit chkPayForParts.text=Pay for Parts chkPayForParts.toolTipText=Pay for the spare parts generated, if any are generated. +chkPayForArmour.text=Pay for Armour +chkPayForArmour.toolTipText=Pay for the spare armour generated, if any is generated chkPayForAmmunition.text=Pay for Ammunition chkPayForAmmunition.toolTipText=Pay for the spare ammunition generated, if any is generated. +# Option Validation Warnings +CompanyGenerationOptionsPanel.InvalidOptions.title=Error: Invalid Option Selection +CompanyGenerationOptionsPanel.InvalidGenerationSize.text=You must select at least one company or independent lance to generate +CompanyGenerationOptionsPanel.InvalidStartingPlanet.text=You must select a valid starting planet. +CompanyGenerationOptionsPanel.InvalidCentralPlanet.text=You must select a valid central planet. +CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.title=Over Maximum Support Personnel +CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text=The specified number of support personnel to generate is over the recommended maximum number of support personnel. Select "Ok" to continue, or "Cancel" to make changes to these Company Generation Options. +CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.title=Under Half Maximum Support Personnel +CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.text=The specified number of support personnel to generate is under half the recommended maximum number of support personnel. Select "Ok" to continue, or "Cancel" to make changes to these Company Generation Options. ## CompanyGenerationPanel Class CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java index dd109d18fd..fb4c9f3a22 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java @@ -29,11 +29,13 @@ import mekhq.MekHQ; import mekhq.Utilities; import mekhq.campaign.Campaign; +import mekhq.campaign.CurrentLocation; import mekhq.campaign.finances.Money; import mekhq.campaign.finances.Transaction; import mekhq.campaign.force.Force; import mekhq.campaign.mission.Contract; import mekhq.campaign.parts.AmmoStorage; +import mekhq.campaign.parts.Armor; import mekhq.campaign.parts.Part; import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.Skill; @@ -45,6 +47,7 @@ import mekhq.campaign.universe.AbstractPlanetSelector; import mekhq.campaign.universe.DefaultFactionSelector; import mekhq.campaign.universe.DefaultPlanetSelector; +import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.RangedFactionSelector; import mekhq.campaign.universe.RangedPlanetSelector; import mekhq.campaign.universe.enums.Alphabet; @@ -56,6 +59,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.ResourceBundle; import java.util.UUID; import java.util.Vector; @@ -82,18 +86,14 @@ * Cleanup the dialog, have it disable and enable based on variable values * Implement: * assignBestRollToUnitCommander - * startingPlanet * centerPlanet * assignTechsToUnits - * generateMothballedSpareUnits - * sparesPercentOfActiveUnits * generateSpareParts // 1 for every 3 (round normally) parts in inventory? * startingArmourWeight * generateSpareAmmunition * numberReloadsPerWeapon * generateFractionalMachineGunAmmunition // 50 rounds per machine gun in force? * selectStartingContract - * startCourseToContractPlanet * * FIXME : * Backgrounds don't work @@ -164,6 +164,8 @@ private void createPersonnelGenerator(final Campaign campaign) { final AbstractFactionSelector factionSelector; final AbstractPlanetSelector planetSelector; + // TODO : central planet/system + if (getOptions().isRandomizeOrigin()) { factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); @@ -207,6 +209,18 @@ private int determineFirstNonOfficer() { } //endregion Determination Methods + //region Base Information + /** + * This sets the planet to the starting planet specified, if that option is enabled + * @param campaign the campaign to apply the location to + */ + private void moveToStartingPlanet(final Campaign campaign) { + if (getOptions().isSpecifyStartingPlanet()) { + campaign.setLocation(new CurrentLocation(getOptions().getStartingPlanet().getParentSystem(), 0)); + } + } + //endregion Base Information + //region Personnel //region Combat Personnel /** @@ -516,13 +530,13 @@ protected List createUnitGenerationParameters( * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables */ - protected abstract int determineBattleMechWeight(int roll); + protected abstract int determineBattleMechWeight(final int roll); /** * @param roll the modified roll to use * @return the generated IUnitRating magic int for Dragoon Quality */ - protected abstract int determineBattleMechQuality(int roll); + protected abstract int determineBattleMechQuality(final int roll); /** * @param campaign the campaign to generate for @@ -535,7 +549,7 @@ private List generateEntities(final Campaign campaign, final List combatPersonnel) { List entities = new ArrayList<>(); for (int i = 0; i < parameters.size(); i++) { - entities.add(generateEntity(campaign, parameters.get(i), combatPersonnel.get(i))); + entities.add(generateEntity(campaign, parameters.get(i), combatPersonnel.get(i).getOriginFaction())); } return entities; } @@ -544,18 +558,18 @@ private List generateEntities(final Campaign campaign, * This generates a single entity, thus allowing for individual rerolls * @param campaign the campaign to generate for * @param parameters the parameters to use in generation - * @param pilot the pilot to generate the Entity for + * @param faction the faction to generate the Entity from * @return the entity generated, or null otherwise */ public @Nullable Entity generateEntity(final Campaign campaign, - final RandomMechParameters parameters, - final Person pilot) { + final RandomMechParameters parameters, + final Faction faction) { // Ultra-Light means no mech generated if (parameters.getWeight() == EntityWeightClass.WEIGHT_ULTRA_LIGHT) { return null; } - final MechSummary mechSummary = generateMechSummary(campaign, parameters, pilot); + final MechSummary mechSummary = generateMechSummary(campaign, parameters, faction); try { return new MechFileParser(mechSummary.getSourceFile(), mechSummary.getEntryName()).getEntity(); @@ -569,12 +583,12 @@ private List generateEntities(final Campaign campaign, /** * @param campaign the campaign to generate for * @param parameters the parameters to use in generation - * @param person the person to generate the mech for + * @param faction the faction to generate the mech from * @return the MechSummary generated from the provided parameters */ protected abstract MechSummary generateMechSummary(final Campaign campaign, final RandomMechParameters parameters, - final Person person); + final Faction faction); /** * @param campaign the campaign to generate for @@ -600,9 +614,13 @@ protected MechSummary generateMechSummary(final Campaign campaign, * @param entities the list of generated entities, with null holding spaces without 'Mechs * @return the list of created units */ - private List createUnits(final Campaign campaign, final List combatPersonnel, + private List createUnits(final Campaign campaign, List combatPersonnel, final List entities) { - List units = new ArrayList<>(); + if (!getOptions().isKeepOfficerRollsSeparate()) { // Sorted into individual lances + combatPersonnel = sortPersonnelIntoLances(combatPersonnel); + } + + final List units = new ArrayList<>(); for (int i = 0; i < entities.size(); i++) { if (entities.get(i) != null) { final Unit unit = campaign.addNewUnit(entities.get(i), false, 0); @@ -732,7 +750,8 @@ private void generateUnit(final Campaign campaign, final List personnel) iconMap.get(LayeredForceIcon.TYPE.getLayerPath()).add("BattleMech.png"); // Background - if (!background.isBlank()) { + // TODO : Java 11 : isBlank + if (!background.trim().isEmpty()) { iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); } @@ -842,7 +861,8 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, iconMap.get(LayeredForceIcon.FORMATION.getLayerPath()).add(isLance ? "04 Lance.png" : "06 Company.png"); // Background - if (!background.isBlank()) { + // TODO : Java 11 : isBlank + if (!background.trim().isEmpty()) { iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); } @@ -855,7 +875,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, } /** - * This determines the weight class of a force (lance or company) based on the + * This determines the weight class of a force (lance or company) based on the units within * @param campaign the campaign to determine based on * @param force the force to determine the weight class for * @param isLance whether the force is a lance or a company @@ -889,11 +909,93 @@ private int determineLanceWeightClass(final Campaign campaign, final Force force //endregion Unit //region Spares + /** + * This generates any mothballed spare entities for the force + * @param campaign the campaign to generate for + * @param entities the generated combat entities + * @return the list of all generated entities to mothball as spares + */ + public List generateMothballedEntities(final Campaign campaign, final List entities) { + // Determine how many entities to generate + final int numberMothballedEntities; + if (getOptions().isGenerateMothballedSpareUnits() + && (getOptions().getSparesPercentOfActiveUnits() > 0)) { + // No free units for null rolls! + numberMothballedEntities = Math.toIntExact(Math.round( + entities.stream().filter(Objects::nonNull).count() + * (getOptions().getSparesPercentOfActiveUnits() / 100.0))); + } else { + numberMothballedEntities = 0; + } + + // Return if we aren't generating any mothballed entities + if (numberMothballedEntities <= 0) { + return new ArrayList<>(); + } + + // Create the return list + final List mothballedEntities = new ArrayList<>(); + + // Create the Faction Selector + final AbstractFactionSelector factionSelector; + if (getOptions().isRandomizeOrigin()) { + factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); + ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); + } else { + factionSelector = new DefaultFactionSelector(getOptions().getFaction()); + } + + // Create the Mothballed Entities + for (int i = 0; i < numberMothballedEntities; i++) { + final Faction faction = factionSelector.selectFaction(campaign); + if (faction == null) { + MekHQ.getLogger().error("Failed to generate a valid faction, and thus cannot generate a mothballed 'Mech"); + continue; + } + + // Create the parameters to generate the 'Mech from + final RandomMechParameters parameters = new RandomMechParameters( + determineBattleMechWeight(Utilities.dice(2, 6)), + determineBattleMechQuality(Utilities.dice(2, 6)) + ); + + // We want to ensure we get a 'Mech generated + while (parameters.getWeight() == EntityWeightClass.WEIGHT_ULTRA_LIGHT) { + parameters.setWeight(determineBattleMechWeight(Utilities.dice(2, 6))); + } + + // Generate the 'Mech, and add it to the mothballed entities list + mothballedEntities.add(generateEntity(campaign, parameters, faction)); + } + return mothballedEntities; + } + + /** + * @param campaign the campaign to add the units to + * @param mothballedEntities the list of generated spare 'Mech entities to add and mothball + * @return the list of created units + */ + private List createMothballedSpareUnits(final Campaign campaign, + final List mothballedEntities) { + List mothballedUnits = new ArrayList<>(); + for (final Entity mothballedEntity : mothballedEntities) { + final Unit unit = campaign.addNewUnit(mothballedEntity, false, 0); + unit.completeMothball(); + mothballedUnits.add(unit); + } + return mothballedUnits; + } + public List generateSpareParts() { // TODO : Implement me return new ArrayList<>(); } + public List generateArmour() { + // TODO : Implement me + return new ArrayList<>(); + } + public List generateAmmunition() { // TODO : Implement me return new ArrayList<>(); @@ -901,9 +1003,18 @@ public List generateAmmunition() { //endregion Spares //region Contract + /** + * This processes the selected contract + * @param campaign the campaign to apply changes to + * @param contract the selected contract, if any + */ private void processContract(final Campaign campaign, final @Nullable Contract contract) { + if (contract == null) { + return; + } + if (getOptions().isStartCourseToContractPlanet()) { - // TODO : implement me + campaign.getLocation().setJumpPath(contract.getJumpPath(campaign)); } } //endregion Contract @@ -911,8 +1022,10 @@ private void processContract(final Campaign campaign, final @Nullable Contract c //region Finances private void processFinances(final Campaign campaign, final List personnel, final List units, final List parts, - final List ammunition, + final List armour, final List ammunition, final @Nullable Contract contract) { + // TODO : Finish implementation + Money startingCash = getOptions().isRandomizeStartingCash() ? rollRandomStartingCash() : Money.of(getOptions().getStartingCash()); final Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); @@ -920,8 +1033,8 @@ private void processFinances(final Campaign campaign, final List personn final Money hiringCosts = calculateHiringCosts(personnel); final Money unitCosts = calculateUnitCosts(units); final Money partCosts = calculatePartCosts(parts); + final Money armourCosts = calculateArmourCosts(armour); final Money ammunitionCosts = calculateAmmunitionCosts(ammunition); - // TODO : Finish implementation } else { campaign.addReport(""); startingCash = startingCash.isGreaterOrEqualThan(minimumStartingFloat) ? startingCash @@ -996,6 +1109,22 @@ private Money calculatePartCosts(final List parts) { return partCosts; } + /** + * @param armours the list of different armours to get the cost for + * @return the cost of the armour, or zero if you aren't paying for armour + */ + private Money calculateArmourCosts(final List armours) { + if (!getOptions().isPayForArmour()) { + return Money.zero(); + } + + Money armourCosts = Money.zero(); + for (final Armor armour : armours) { + armourCosts = armourCosts.plus(armour.getStickerPrice()); + } + return armourCosts; + } + /** * @param ammunition the list of ammunition to get the cost for * @return the cost of the ammunition, or zero if you aren't paying for ammunition @@ -1014,6 +1143,7 @@ private Money calculateAmmunitionCosts(final List ammunition) { } //endregion Finances + //region Apply to Campaign /** * This method takes the campaign and applies all changes to it. No method not directly * called from here may alter the campaign. @@ -1022,17 +1152,45 @@ private Money calculateAmmunitionCosts(final List ammunition) { * @param combatPersonnel the list of generated combat personnel * @param supportPersonnel the list of generated support personnel * @param entities the list of generated entities, with null holding spaces without 'Mechs + * @param mothballedEntities the list of generated spare 'Mech entities to mothball * @param parts the list of generated parts + * @param armour the list of generated armour * @param ammunition the list of generated ammunition * @param contract the selected contract, or null if one has not been selected */ public void applyToCampaign(final Campaign campaign, final List combatPersonnel, final List supportPersonnel, final List entities, - final List parts, final List ammunition, + final List mothballedEntities, final List parts, + final List armour, final List ammunition, final @Nullable Contract contract) { + // Phase One: Personnel, Units, and Unit + final List personnel = new ArrayList<>(); + final List units = new ArrayList<>(); + applyPhaseOneToCampaign(campaign, combatPersonnel, supportPersonnel, personnel, entities, units); + + // Phase 2: Spares + final List mothballedUnits = createMothballedSpareUnits(campaign, mothballedEntities); + units.addAll(mothballedUnits); + + // Phase 3: Contract + moveToStartingPlanet(campaign); + processContract(campaign, contract); + + // Phase 4: Finances + processFinances(campaign, personnel, units, parts, armour, ammunition, contract); + + // Phase 5: Applying Spares + parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); + armour.forEach(a -> campaign.getWarehouse().addPart(a, true)); + ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); + } + + private void applyPhaseOneToCampaign(final Campaign campaign, final List combatPersonnel, + final List supportPersonnel, final List personnel, + final List entities, final List units) { // Process Personnel - List personnel = new ArrayList<>(supportPersonnel); personnel.addAll(combatPersonnel); + personnel.addAll(supportPersonnel); // If we aren't using the pool, generate all of the Astechs and Medics required generateAssistants(campaign, personnel); @@ -1048,27 +1206,19 @@ public void applyToCampaign(final Campaign campaign, final List combatPe } // Process Units - final List units = createUnits(campaign, combatPersonnel, entities); + units.addAll(createUnits(campaign, combatPersonnel, entities)); // Assign Techs to Units assignTechsToUnits(supportPersonnel, units); // Generate the Forces and Assign Units to them generateUnit(campaign, sortPersonnelIntoLances(combatPersonnel)); + } + //endregion Apply to Campaign - // Process Contract - processContract(campaign, contract); - - // Process Finances - processFinances(campaign, personnel, units, parts, ammunition, contract); - - // Process Parts - After finances because we want to merge parts together - parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); + //region Revert Application to Campaign - // Process Ammunition - After finances because we want to merge the ammunition together when - // possible - ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); - } + //endregion Revert Application to Campaign //region Local Classes /** diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java index 4437c82409..50a471c118 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java @@ -24,6 +24,7 @@ import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.ranks.Ranks; import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.enums.CompanyGenerationType; public class AtBCompanyGenerator extends AbstractCompanyGenerator { @@ -114,31 +115,29 @@ protected int determineBattleMechQuality(int roll) { /** * @param campaign the campaign to generate for * @param parameters the parameters to use in generation - * @param person the person to generate the mech for + * @param faction the faction to generate the mech from * @return the MechSummary generated from the provided parameters */ @Override protected MechSummary generateMechSummary(final Campaign campaign, final RandomMechParameters parameters, - final Person person) { - if (parameters.isStarLeague() && !person.getOriginFaction().isComStarOrWoB()) { - final String faction; - if (person.isClanner()) { + final Faction faction) { + if (parameters.isStarLeague() && !faction.isComStarOrWoB()) { + if (faction.isClan()) { // Clanners generate from Front Line tables instead of Star League - faction = person.getOriginFaction().getShortName(); parameters.setQuality(IUnitRating.DRAGOON_B); + return generateMechSummary(campaign, parameters, faction.getShortName(), campaign.getGameYear()); } else { // Roll on the Star League Royal table if you get a SL mech with A* Rating - faction = ((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"); + final String factionCode = ((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"); + return generateMechSummary(campaign, parameters, factionCode, getOptions().getStarLeagueYear()); } - return generateMechSummary(campaign, parameters, faction, getOptions().getStarLeagueYear()); } else { // Clanners Generate from 2nd Line Tables - if (person.isClanner()) { + if (faction.isClan()) { parameters.setQuality(IUnitRating.DRAGOON_C); } - return generateMechSummary(campaign, parameters, person.getOriginFaction().getShortName(), - campaign.getGameYear()); + return generateMechSummary(campaign, parameters, faction.getShortName(), campaign.getGameYear()); } } //endregion Units diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java index eac56f5d41..bac2d9020b 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java @@ -51,7 +51,8 @@ public class CompanyGenerationOptions implements Serializable { // Base Information private CompanyGenerationType type; - private Faction faction; + private Faction faction; // Not fully understood/Implemented + private boolean specifyStartingPlanet; private Planet startingPlanet; private boolean generateMercenaryCompanyCommandLance; private int companyCount; @@ -71,46 +72,48 @@ public class CompanyGenerationOptions implements Serializable { // Personnel Randomization private boolean randomizeOrigin; - private Planet centralPlanet; + private boolean randomizeAroundCentralPlanet; + private Planet centralPlanet; // Not Implemented private int originSearchRadius; private boolean extraRandomOrigin; private double originDistanceScale; // Units private boolean generateUnitsAsAttached; - private boolean assignBestRollToUnitCommander; - private boolean groupByWeight; + private boolean assignBestRollToUnitCommander; // Not Implemented + private boolean groupByWeight; // Buggy private boolean keepOfficerRollsSeparate; private int starLeagueYear; - private boolean assignTechsToUnits; + private boolean assignTechsToUnits; // Not Implemented // Unit private ForceNamingType forceNamingType; - private boolean generateForceIcons; + private boolean generateForceIcons; // Buggy // Spares private boolean generateMothballedSpareUnits; private int sparesPercentOfActiveUnits; - private boolean generateSpareParts; - private int startingArmourWeight; - private boolean generateSpareAmmunition; - private int numberReloadsPerWeapon; - private boolean generateFractionalMachineGunAmmunition; + private boolean generateSpareParts; // Not Implemented + private int startingArmourWeight; // Not Implemented + private boolean generateSpareAmmunition; // Not Implemented + private int numberReloadsPerWeapon; // Not Implemented + private boolean generateFractionalMachineGunAmmunition; // Not Implemented // Contracts - private boolean selectStartingContract; + private boolean selectStartingContract; // Not Implemented private boolean startCourseToContractPlanet; // Finances - private int startingCash; + private int startingCash; // Not Implemented private boolean randomizeStartingCash; private int randomStartingCashDiceCount; - private int minimumStartingFloat; - private boolean payForSetup; - private boolean startingLoan; + private int minimumStartingFloat; // Not Implemented + private boolean payForSetup; // Not Implemented + private boolean startingLoan; // Not Implemented private boolean payForPersonnel; private boolean payForUnits; private boolean payForParts; + private boolean payForArmour; private boolean payForAmmunition; //endregion Variable Declarations @@ -123,6 +126,7 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign // Base Information setType(type); setFaction(campaign.getFaction()); + setSpecifyStartingPlanet(true); setStartingPlanet(Systems.getInstance().getSystems().getOrDefault( getFaction().getStartingPlanet(campaign.getLocalDate()), campaign.getSystemByName("Terra")).getPrimaryPlanet()); @@ -159,6 +163,7 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign // Personnel Randomization setRandomizeOrigin(true); + setRandomizeAroundCentralPlanet(true); setCentralPlanet(campaign.getSystemByName("Terra").getPrimaryPlanet()); setOriginSearchRadius(1000); setExtraRandomOrigin(false); @@ -180,7 +185,7 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign setGenerateMothballedSpareUnits(false); setSparesPercentOfActiveUnits(10); setGenerateSpareParts(type.isWindchild()); - setStartingArmourWeight(25); + setStartingArmourWeight(60); setGenerateSpareAmmunition(type.isWindchild()); setNumberReloadsPerWeapon(4); setGenerateFractionalMachineGunAmmunition(true); @@ -199,6 +204,7 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign setPayForPersonnel(type.isWindchild()); setPayForUnits(type.isWindchild()); setPayForParts(type.isWindchild()); + setPayForArmour(type.isWindchild()); setPayForAmmunition(type.isWindchild()); } //endregion Constructors @@ -221,6 +227,14 @@ public void setFaction(final Faction faction) { this.faction = faction; } + public boolean isSpecifyStartingPlanet() { + return specifyStartingPlanet; + } + + public void setSpecifyStartingPlanet(final boolean specifyStartingPlanet) { + this.specifyStartingPlanet = specifyStartingPlanet; + } + public Planet getStartingPlanet() { return startingPlanet; } @@ -345,6 +359,14 @@ public void setRandomizeOrigin(final boolean randomizeOrigin) { this.randomizeOrigin = randomizeOrigin; } + public boolean isRandomizeAroundCentralPlanet() { + return randomizeAroundCentralPlanet; + } + + public void setRandomizeAroundCentralPlanet(final boolean randomizeAroundCentralPlanet) { + this.randomizeAroundCentralPlanet = randomizeAroundCentralPlanet; + } + public Planet getCentralPlanet() { return centralPlanet; } @@ -595,6 +617,14 @@ public void setPayForParts(final boolean payForParts) { this.payForParts = payForParts; } + public boolean isPayForArmour() { + return payForArmour; + } + + public void setPayForArmour(final boolean payForArmour) { + this.payForArmour = payForArmour; + } + public boolean isPayForAmmunition() { return payForAmmunition; } @@ -635,6 +665,7 @@ public void writeToXML(final PrintWriter pw, int indent) { // Base Information MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "type", getType().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "faction", getFaction().getShortName()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "specifyStartingPlanet", isSpecifyStartingPlanet()); MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "startingPlanet", "systemId", getStartingPlanet().getParentSystem().getId(), getStartingPlanet().getId()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMercenaryCompanyCommandLance", isGenerateMercenaryCompanyCommandLance()); @@ -662,6 +693,7 @@ public void writeToXML(final PrintWriter pw, int indent) { // Personnel Randomization MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeOrigin", isRandomizeOrigin()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeAroundCentralPlanet", isRandomizeAroundCentralPlanet()); MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "centralPlanet", "systemId", getCentralPlanet().getParentSystem().getId(), getCentralPlanet().getId()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originSearchRadius", getOriginSearchRadius()); @@ -703,6 +735,7 @@ public void writeToXML(final PrintWriter pw, int indent) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForPersonnel", isPayForPersonnel()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForUnits", isPayForUnits()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForParts", isPayForParts()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForArmour", isPayForArmour()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForAmmunition", isPayForAmmunition()); MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "companyGenerationOptions"); } @@ -747,6 +780,9 @@ public static CompanyGenerationOptions parseFromXML(final Node wn) { case "faction": options.setFaction(Factions.getInstance().getFaction(wn2.getTextContent().trim())); break; + case "specifyStartingPlanet": + options.setSpecifyStartingPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; case "startingPlanet": String startingPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); String startingPlanetPlanetId = wn2.getTextContent().trim(); @@ -818,6 +854,9 @@ public static CompanyGenerationOptions parseFromXML(final Node wn) { case "randomizeOrigin": options.setRandomizeOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); break; + case "randomizeAroundCentralPlanet": + options.setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; case "centralPlanet": String centralPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); String centralPlanetPlanetId = wn2.getTextContent().trim(); @@ -910,6 +949,9 @@ public static CompanyGenerationOptions parseFromXML(final Node wn) { case "payForParts": options.setPayForParts(Boolean.parseBoolean(wn2.getTextContent().trim())); break; + case "payForArmour": + options.setPayForArmour(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; case "payForAmmunition": options.setPayForAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); break; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java index e74fddd57e..df0112c3ee 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java @@ -24,6 +24,7 @@ import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.ranks.Ranks; import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.enums.CompanyGenerationType; public class WindchildCompanyGenerator extends AbstractCompanyGenerator { @@ -119,34 +120,32 @@ protected int determineBattleMechQuality(int roll) { * * @param campaign the campaign to generate for * @param parameters the parameters to use in generation - * @param person the person to generate the mech for + * @param faction the faction to generate the mech from * @return the MechSummary generated from the provided parameters */ @Override protected MechSummary generateMechSummary(final Campaign campaign, final RandomMechParameters parameters, - final Person person) { + final Faction faction) { if (parameters.isStarLeague()) { - final String faction; - if (person.isClanner()) { - faction = person.getOriginFaction().getShortName(); + if (faction.isClan()) { // Clanners generate using the Keshik Table if they roll A*, otherwise they roll on // the Front Line tables parameters.setQuality((parameters.getQuality() < IUnitRating.DRAGOON_ASTAR) ? IUnitRating.DRAGOON_B : parameters.getQuality()); + return generateMechSummary(campaign, parameters, faction.getShortName(), campaign.getGameYear()); } else { // Roll on the Star League Royal table if you get a SL mech with A* Rating - faction = ((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"); + final String factionCode = ((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"); + return generateMechSummary(campaign, parameters, factionCode, getOptions().getStarLeagueYear()); } - return generateMechSummary(campaign, parameters, faction, getOptions().getStarLeagueYear()); } else { // Clanners Generate from 2nd Line (or lesser) Tables (core AtB is just 2nd Line, // but this is more interesting) - if (person.isClanner() && (parameters.getQuality() > IUnitRating.DRAGOON_C)) { + if (faction.isClan() && (parameters.getQuality() > IUnitRating.DRAGOON_C)) { parameters.setQuality(IUnitRating.DRAGOON_C); } - return generateMechSummary(campaign, parameters, person.getOriginFaction().getShortName(), - campaign.getGameYear()); + return generateMechSummary(campaign, parameters, faction.getShortName(), campaign.getGameYear()); } } //endregion Units diff --git a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java index 26d725ef98..5e93c35938 100644 --- a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java @@ -57,22 +57,19 @@ public abstract class BaseDialog extends JDialog implements WindowListener { //region Constructors protected BaseDialog(final JFrame parent, final ResourceBundle resources) { - this(parent, false, resources, "dialog.text", null); + this(parent, false, resources, "dialog.text"); } - protected BaseDialog(final JFrame parent, final ResourceBundle resources, final String title, - final Campaign campaign) { - this(parent, false, resources, title, campaign); + protected BaseDialog(final JFrame parent, final ResourceBundle resources, final String title) { + this(parent, false, resources, title); } protected BaseDialog(final JFrame parent, final boolean modal, final ResourceBundle resources, - final String title, final @Nullable Campaign campaign) { + final String title) { super(parent, modal); setTitle(resources.getString(title)); - setFrame(frame); + setFrame(parent); setResources(resources); - - initialize(campaign); } //endregion Constructors @@ -99,6 +96,10 @@ private void setResources(final ResourceBundle resources) { //endregion Getters/Setters //region Initialization + protected void initialize() { + initialize(null); + } + /** * Initializes the dialog UI and preferences. Needs to be called by * child classes for initial setup. diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 0c8d401cd8..d1dd867bda 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -18,26 +18,39 @@ */ package mekhq.gui.dialog; +import megamek.common.Entity; import megamek.common.util.EncodeControl; import mekhq.MekHQ; import mekhq.campaign.Campaign; +import mekhq.campaign.mission.Contract; +import mekhq.campaign.parts.AmmoStorage; +import mekhq.campaign.parts.Armor; +import mekhq.campaign.parts.Part; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; +import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; import mekhq.gui.enums.CompanyGenerationPanelType; import mekhq.gui.view.CompanyGenerationOptionsPanel; import javax.swing.*; import java.awt.*; +import java.util.List; import java.util.ResourceBundle; public class CompanyGenerationDialog extends BaseDialog { //region Variable Declarations private CompanyGenerationPanelType currentPanelType; private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; + private Campaign campaign; // TODO : Temp value //endregion Variable Declarations //region Constructors public CompanyGenerationDialog(final JFrame frame, final Campaign campaign) { super(frame, ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()), - "CompanyGenerationDialog.title", campaign); + "CompanyGenerationDialog.title"); + setCurrentPanelType(CompanyGenerationPanelType.OPTIONS); + this.campaign = campaign; // TODO : Temp value + initialize(campaign); } //endregion Constructors @@ -62,12 +75,11 @@ public void setCompanyGenerationOptionsPanel(final CompanyGenerationOptionsPanel //region Initialization /** * @param campaign the campaign with which to create the center pane - * @return + * @return the center pane */ @Override protected Container createCenterPane(final Campaign campaign) { switch (getCurrentPanelType()) { - case OPTIONS: case PERSONNEL: case UNITS: case UNIT: @@ -75,6 +87,7 @@ protected Container createCenterPane(final Campaign campaign) { case CONTRACTS: case FINANCES: case OVERVIEW: + case OPTIONS: default: return new JScrollPane(initializeCompanyGenerationOptionsPanel(campaign)); } @@ -88,7 +101,6 @@ private JPanel initializeCompanyGenerationOptionsPanel(final Campaign campaign) @Override protected JPanel createButtonPanel() { switch (getCurrentPanelType()) { - case OPTIONS: case PERSONNEL: case UNITS: case UNIT: @@ -96,6 +108,7 @@ protected JPanel createButtonPanel() { case CONTRACTS: case FINANCES: case OVERVIEW: + case OPTIONS: default: return initializeCompanyGenerationOptionsButtonPanel(); } @@ -111,6 +124,7 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { JButton btnExport = new JButton(resources.getString("Export")); btnExport.addActionListener(evt -> getCompanyGenerationOptionsPanel().exportOptionsToXML()); + panel.add(btnExport); JButton okButton = new JButton(resources.getString("Generate")); okButton.setName("okButton"); @@ -125,6 +139,7 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { JButton btnImport = new JButton(resources.getString("Import")); btnImport.addActionListener(evt -> getCompanyGenerationOptionsPanel().importOptionsFromXML()); + panel.add(btnImport); JButton btnApply = new JButton(resources.getString("Apply")); /* @@ -134,6 +149,7 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { setVisible(false); }); */ + panel.add(btnApply); return panel; } @@ -141,7 +157,18 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { @Override protected void okAction() { - + final CompanyGenerationOptions options = getCompanyGenerationOptionsPanel().createOptionsFromPanel(); + final AbstractCompanyGenerator generator = options.getType().getGenerator(campaign, options); + final List combatPersonnel = generator.generateCombatPersonnel(campaign); + final List supportPersonnel = generator.generateSupportPersonnel(campaign); + final List entities = generator.generateUnits(campaign, combatPersonnel); + final List mothballedEntities = generator.generateMothballedEntities(campaign, entities); + final List parts = generator.generateSpareParts(); + final List armour = generator.generateArmour(); + final List ammunition = generator.generateAmmunition(); + final Contract contract = null; + generator.applyToCampaign(campaign, combatPersonnel, supportPersonnel, entities, mothballedEntities, + parts, armour, ammunition, contract); } @Override diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index d6757d66ec..9087282ff4 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -85,6 +85,7 @@ public class MekHqOptionsDialog extends BaseDialog { //region Constructors public MekHqOptionsDialog(JFrame parent) { super(parent, ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog", new EncodeControl())); + initialize(); setInitialState(); } //endregion Constructors diff --git a/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java b/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java index 315f3c5224..1b39b0d630 100644 --- a/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java +++ b/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java @@ -18,6 +18,8 @@ */ package mekhq.gui.enums; +import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; + public enum CompanyGenerationPanelType { OPTIONS, PERSONNEL, @@ -26,5 +28,51 @@ public enum CompanyGenerationPanelType { SPARES, CONTRACTS, FINANCES, - OVERVIEW + OVERVIEW; + + public CompanyGenerationPanelType getNextPanelType(final CompanyGenerationOptions options) { + switch (this) { + case OPTIONS: + return PERSONNEL; + case PERSONNEL: + return UNITS; + case UNITS: + return UNIT; + case UNIT: + return SPARES; + case SPARES: + return options.isSelectStartingContract() ? CONTRACTS + : (options.isRandomizeStartingCash() || options.isPayForSetup()) ? FINANCES + : OVERVIEW; + case CONTRACTS: + return (options.isRandomizeStartingCash() || options.isPayForSetup()) ? FINANCES + : OVERVIEW; + case FINANCES: + case OVERVIEW: + default: + return OVERVIEW; + } + } + + public CompanyGenerationPanelType getPreviousPanelType(final CompanyGenerationOptions options) { + switch (this) { + case OPTIONS: + case PERSONNEL: + return OPTIONS; + case UNITS: + return PERSONNEL; + case UNIT: + return UNITS; + case SPARES: + return UNIT; + case CONTRACTS: + return SPARES; + case FINANCES: + return options.isSelectStartingContract() ? CONTRACTS : SPARES; + case OVERVIEW: + default: + return (options.isRandomizeStartingCash() || options.isPayForSetup()) ? FINANCES + : options.isSelectStartingContract() ? CONTRACTS : SPARES; + } + } } diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java index 7a82b2a8f7..5ba18fefc5 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -35,7 +35,6 @@ import javax.swing.*; import java.awt.*; -import java.io.File; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; @@ -54,6 +53,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Base Information private JComboBox comboCompanyGenerationType; private JComboBox comboFaction; + private JCheckBox chkSpecifyStartingSystem; private JCheckBox chkStartingSystemFactionSpecific; private JComboBox comboStartingSystem; private JComboBox comboStartingPlanet; @@ -76,6 +76,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Personnel Randomization private JCheckBox chkRandomizeOrigin; + private JCheckBox chkRandomizeAroundCentralPlanet; private JCheckBox chkCentralSystemFactionSpecific; private JComboBox comboCentralSystem; private JComboBox comboCentralPlanet; @@ -118,6 +119,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkPayForPersonnel; private JCheckBox chkPayForUnits; private JCheckBox chkPayForParts; + private JCheckBox chkPayForArmour; private JCheckBox chkPayForAmmunition; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); @@ -181,6 +183,14 @@ public void setComboFaction(final JComboBox comboFaction) { this.comboFaction = comboFaction; } + public JCheckBox getChkSpecifyStartingSystem() { + return chkSpecifyStartingSystem; + } + + public void setChkSpecifyStartingSystem(final JCheckBox chkSpecifyStartingSystem) { + this.chkSpecifyStartingSystem = chkSpecifyStartingSystem; + } + public JCheckBox getChkStartingSystemFactionSpecific() { return chkStartingSystemFactionSpecific; } @@ -205,17 +215,9 @@ private void restoreComboStartingSystem() { getComboStartingSystem().removeAllItems(); getComboStartingSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( getChkStartingSystemFactionSpecific().isSelected() ? getFaction() : null))); - getComboStartingSystem().setSelectedIndex(0); restoreComboStartingPlanet(); } - private void updateComboStartingSystem() { - if ((getStartingSystem() != null) - && !getStartingSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction())) { - restoreComboStartingSystem(); - } - } - public JComboBox getComboStartingPlanet() { return comboStartingPlanet; } @@ -229,15 +231,12 @@ public void setComboStartingPlanet(final JComboBox comboStartingPlanet) } private void restoreComboStartingPlanet() { - getComboStartingPlanet().setModel(new DefaultComboBoxModel<>( - getStartingSystem().getPlanets().toArray(new Planet[]{}))); - getComboStartingPlanet().setSelectedItem(getStartingSystem().getPrimaryPlanet()); - } - - private void updateComboStartingPlanet() { - if ((getStartingSystem() != null) && (getStartingPlanet() != null) - && !getStartingPlanet().getParentSystem().equals(getStartingSystem())) { - restoreComboStartingPlanet(); + if (getStartingSystem() != null) { + getComboStartingPlanet().setModel(new DefaultComboBoxModel<>( + getStartingSystem().getPlanets().toArray(new Planet[]{}))); + getComboStartingPlanet().setSelectedItem(getStartingSystem().getPrimaryPlanet()); + } else { + getComboStartingPlanet().removeAllItems(); } } @@ -287,13 +286,6 @@ public JLabel getLblTotalSupportPersonnel() { return lblTotalSupportPersonnel; } - public void updateLblTotalSupportPersonnel() { - updateLblTotalSupportPersonnel( - ((getChkGenerateMercenaryCompanyCommandLance().isSelected() ? 1 : 0) - + ((int) getSpnCompanyCount().getValue() * (int) getSpnLancesPerCompany().getValue()) - + (int) getSpnIndividualLanceCount().getValue()) * (int) getSpnLanceSize().getValue()); - } - public void updateLblTotalSupportPersonnel(final int numSupportPersonnel) { getLblTotalSupportPersonnel().setText(String.format( resources.getString("lblTotalSupportPersonnel.text"), numSupportPersonnel)); @@ -390,6 +382,14 @@ public void setChkRandomizeOrigin(final JCheckBox chkRandomizeOrigin) { this.chkRandomizeOrigin = chkRandomizeOrigin; } + public JCheckBox getChkRandomizeAroundCentralPlanet() { + return chkRandomizeAroundCentralPlanet; + } + + public void setChkRandomizeAroundCentralPlanet(final JCheckBox chkRandomizeAroundCentralPlanet) { + this.chkRandomizeAroundCentralPlanet = chkRandomizeAroundCentralPlanet; + } + public JCheckBox getChkCentralSystemFactionSpecific() { return chkCentralSystemFactionSpecific; } @@ -414,17 +414,9 @@ private void restoreComboCentralSystem() { getComboCentralSystem().removeAllItems(); getComboCentralSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( getChkCentralSystemFactionSpecific().isSelected() ? getFaction() : null))); - getComboCentralSystem().setSelectedIndex(0); restoreComboCentralPlanet(); } - private void updateComboCentralSystem() { - if ((getCentralSystem() != null) - && !getCentralSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction())) { - restoreComboCentralSystem(); - } - } - public JComboBox getComboCentralPlanet() { return comboCentralPlanet; } @@ -438,15 +430,12 @@ public void setComboCentralPlanet(final JComboBox comboCentralPlanet) { } private void restoreComboCentralPlanet() { - getComboCentralPlanet().setModel(new DefaultComboBoxModel<>( - getCentralSystem().getPlanets().toArray(new Planet[]{}))); - getComboCentralPlanet().setSelectedItem(getCentralSystem().getPrimaryPlanet()); - } - - private void updateComboCentralPlanet() { - if ((getCentralSystem() != null) && (getCentralPlanet() != null) - && !getCentralPlanet().getParentSystem().equals(getCentralSystem())) { - restoreComboCentralPlanet(); + if (getCentralSystem() != null) { + getComboCentralPlanet().setModel(new DefaultComboBoxModel<>( + getCentralSystem().getPlanets().toArray(new Planet[]{}))); + getComboCentralPlanet().setSelectedItem(getCentralSystem().getPrimaryPlanet()); + } else { + getComboCentralPlanet().removeAllItems(); } } @@ -696,6 +685,14 @@ public void setChkPayForParts(final JCheckBox chkPayForParts) { this.chkPayForParts = chkPayForParts; } + public JCheckBox getChkPayForArmour() { + return chkPayForArmour; + } + + public void setChkPayForArmour(final JCheckBox chkPayForArmour) { + this.chkPayForArmour = chkPayForArmour; + } + public JCheckBox getChkPayForAmmunition() { return chkPayForAmmunition; } @@ -706,6 +703,14 @@ public void setChkPayForAmmunition(final JCheckBox chkPayForAmmunition) { //endregion Finances //endregion Getters/Setters + //region Determination Methods + public int determineMaximumSupportPersonnel() { + return ((getChkGenerateMercenaryCompanyCommandLance().isSelected() ? 1 : 0) + + ((int) getSpnCompanyCount().getValue() * (int) getSpnLancesPerCompany().getValue()) + + (int) getSpnIndividualLanceCount().getValue()) * (int) getSpnLanceSize().getValue(); + } + //endregion Determination Methods + //region Initialization private void initialize() { setName("companyGenerationOptionsPanel"); @@ -743,6 +748,10 @@ private void initialize() { } private JPanel createBaseInformationPanel() { + // Initialize Labels Used in ActionListeners + JLabel lblStartingPlanet = new JLabel(); + + // Create Panel Components JLabel lblCompanyGenerationType = new JLabel(resources.getString("lblCompanyGenerationType.text")); lblCompanyGenerationType.setToolTipText(resources.getString("lblCompanyGenerationType.toolTipText")); lblCompanyGenerationType.setName("lblCompanyGenerationType"); @@ -770,17 +779,33 @@ public Component getListCellRendererComponent(final JList list, final Object getComboFaction().setToolTipText(resources.getString("lblFaction.toolTipText")); getComboFaction().setName("comboFaction"); + setChkSpecifyStartingSystem(new JCheckBox(resources.getString("chkSpecifyStartingSystem.text"))); + getChkSpecifyStartingSystem().setToolTipText(resources.getString("chkSpecifyStartingSystem.toolTipText")); + getChkSpecifyStartingSystem().setName("chkSpecifyStartingSystem"); + getChkSpecifyStartingSystem().addActionListener(evt -> { + final boolean selected = getChkSpecifyStartingSystem().isSelected(); + getChkStartingSystemFactionSpecific().setEnabled(selected); + lblStartingPlanet.setEnabled(selected); + getComboStartingSystem().setEnabled(selected); + getComboStartingPlanet().setEnabled(selected); + }); + setChkStartingSystemFactionSpecific(new JCheckBox(resources.getString("FactionSpecific"))); getChkStartingSystemFactionSpecific().setToolTipText(resources.getString("chkStartingSystemFactionSpecific.toolTipText")); getChkStartingSystemFactionSpecific().setName("chkStartingSystemFactionSpecific"); - getChkStartingSystemFactionSpecific().addActionListener(evt -> updateComboStartingSystem()); + getChkStartingSystemFactionSpecific().addActionListener(evt -> { + if ((getStartingSystem() == null) || ((getStartingSystem() != null) + && !getStartingSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction()))) { + restoreComboStartingSystem(); + } + }); - JLabel lblStartingPlanet = new JLabel(resources.getString("lblStartingPlanet.text")); + lblStartingPlanet.setText(resources.getString("lblStartingPlanet.text")); lblStartingPlanet.setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); lblStartingPlanet.setName("lblStartingPlanet"); setComboStartingSystem(new JComboBox<>()); - getComboStartingSystem().setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); + getComboStartingSystem().setToolTipText(resources.getString("comboStartingSystem.toolTipText")); getComboStartingSystem().setName("comboStartingSystem"); getComboStartingSystem().setRenderer(new DefaultListCellRenderer() { @Override @@ -794,7 +819,12 @@ public Component getListCellRendererComponent(final JList list, final Object return this; } }); - getComboStartingSystem().addActionListener(evt -> updateComboStartingPlanet()); + getComboStartingSystem().addActionListener(evt -> { + if ((getStartingSystem() == null) || ((getStartingSystem() != null) && (getStartingPlanet() != null) + && !getStartingPlanet().getParentSystem().equals(getStartingSystem()))) { + restoreComboStartingPlanet(); + } + }); setComboStartingPlanet(new JComboBox<>()); getComboStartingPlanet().setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); @@ -848,6 +878,19 @@ public Component getListCellRendererComponent(final JList list, final Object getSpnLanceSize().setToolTipText(resources.getString("lblLanceSize.toolTipText")); getSpnLanceSize().setName("spnLanceSize"); + // Programmatically Assign Accessibility Labels + lblCompanyGenerationType.setLabelFor(getComboCompanyGenerationType()); + lblFaction.setLabelFor(getComboFaction()); + lblStartingPlanet.setLabelFor(getComboStartingPlanet()); + lblCompanyCount.setLabelFor(getSpnCompanyCount()); + lblIndividualLanceCount.setLabelFor(getSpnIndividualLanceCount()); + lblLancesPerCompany.setLabelFor(getSpnLancesPerCompany()); + lblLanceSize.setLabelFor(getSpnLanceSize()); + + // Disable Panel Portions by Default + getChkSpecifyStartingSystem().setSelected(true); + getChkSpecifyStartingSystem().doClick(); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("baseInformationPanel.title"))); @@ -865,7 +908,9 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getComboCompanyGenerationType(), GroupLayout.Alignment.LEADING)) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblFaction) - .addComponent(getComboFaction()) + .addComponent(getComboFaction(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getChkSpecifyStartingSystem()) .addComponent(getChkStartingSystemFactionSpecific(), GroupLayout.Alignment.LEADING)) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblStartingPlanet) @@ -891,7 +936,9 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getComboCompanyGenerationType())) .addGroup(layout.createSequentialGroup() .addComponent(lblFaction) - .addComponent(getComboFaction()) + .addComponent(getComboFaction())) + .addGroup(layout.createSequentialGroup() + .addComponent(getChkSpecifyStartingSystem()) .addComponent(getChkStartingSystemFactionSpecific())) .addGroup(layout.createSequentialGroup() .addComponent(lblStartingPlanet) @@ -913,6 +960,7 @@ public Component getListCellRendererComponent(final JList list, final Object } private JPanel createPersonnelPanel() { + // Create Panel Components setLblTotalSupportPersonnel(new JLabel()); updateLblTotalSupportPersonnel(0); getLblTotalSupportPersonnel().setToolTipText(resources.getString("lblTotalSupportPersonnel.toolTipText")); @@ -999,6 +1047,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[0] = new RoleToSpinner(Person.T_MECH_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[0].getSpinner().setToolTipText(toolTipText); rtsArray[0].getSpinner().setName("spn" + roleName); + rtsLabelArray[0].setLabelFor(rtsArray[0].getSpinner()); roleName = Person.getRoleDesc(Person.T_MECHANIC, false); toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); @@ -1008,6 +1057,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[1] = new RoleToSpinner(Person.T_MECHANIC, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[1].getSpinner().setToolTipText(toolTipText); rtsArray[1].getSpinner().setName("spn" + roleName); + rtsLabelArray[1].setLabelFor(rtsArray[1].getSpinner()); roleName = Person.getRoleDesc(Person.T_AERO_TECH, false); toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); @@ -1017,6 +1067,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[2] = new RoleToSpinner(Person.T_AERO_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[2].getSpinner().setToolTipText(toolTipText); rtsArray[2].getSpinner().setName("spn" + roleName); + rtsLabelArray[2].setLabelFor(rtsArray[2].getSpinner()); roleName = Person.getRoleDesc(Person.T_BA_TECH, false); toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); @@ -1026,6 +1077,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[3] = new RoleToSpinner(Person.T_BA_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[3].getSpinner().setToolTipText(toolTipText); rtsArray[3].getSpinner().setName("spn" + roleName); + rtsLabelArray[3].setLabelFor(rtsArray[3].getSpinner()); roleName = Person.getRoleDesc(Person.T_DOCTOR, false); toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); @@ -1035,6 +1087,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[4] = new RoleToSpinner(Person.T_DOCTOR, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[4].getSpinner().setToolTipText(toolTipText); rtsArray[4].getSpinner().setName("spn" + roleName); + rtsLabelArray[4].setLabelFor(rtsArray[4].getSpinner()); roleName = Person.getRoleDesc(Person.T_ADMIN_COM, false); toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); @@ -1044,6 +1097,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[5] = new RoleToSpinner(Person.T_ADMIN_COM, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[5].getSpinner().setToolTipText(toolTipText); rtsArray[5].getSpinner().setName("spn" + roleName); + rtsLabelArray[5].setLabelFor(rtsArray[5].getSpinner()); roleName = Person.getRoleDesc(Person.T_ADMIN_LOG, false); toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); @@ -1053,6 +1107,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[6] = new RoleToSpinner(Person.T_ADMIN_LOG, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[6].getSpinner().setToolTipText(toolTipText); rtsArray[6].getSpinner().setName("spn" + roleName); + rtsLabelArray[6].setLabelFor(rtsArray[6].getSpinner()); roleName = Person.getRoleDesc(Person.T_ADMIN_TRA, false); toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); @@ -1062,6 +1117,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[7] = new RoleToSpinner(Person.T_ADMIN_TRA, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[7].getSpinner().setToolTipText(toolTipText); rtsArray[7].getSpinner().setName("spn" + roleName); + rtsLabelArray[7].setLabelFor(rtsArray[7].getSpinner()); roleName = Person.getRoleDesc(Person.T_ADMIN_HR, false); toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); @@ -1071,6 +1127,7 @@ private JPanel createSupportPersonnelNumbersPanel() { rtsArray[8] = new RoleToSpinner(Person.T_ADMIN_HR, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); rtsArray[8].getSpinner().setToolTipText(toolTipText); rtsArray[8].getSpinner().setName("spn" + roleName); + rtsLabelArray[8].setLabelFor(rtsArray[8].getSpinner()); setSpnSupportPersonnelNumbers(rtsArray); @@ -1101,21 +1158,57 @@ private JPanel createSupportPersonnelNumbersPanel() { } private JPanel createPersonnelRandomizationPanel() { - setChkRandomizeOrigin(new JCheckBox("chkRandomizeOrigin.text")); + // Initialize Labels Used in ActionListeners + JLabel lblCentralPlanet = new JLabel(); + JLabel lblOriginSearchRadius = new JLabel(); + JLabel lblOriginDistanceScale = new JLabel(); + + // Create Panel Components + setChkRandomizeOrigin(new JCheckBox(resources.getString("chkRandomizeOrigin.text"))); getChkRandomizeOrigin().setToolTipText(resources.getString("chkRandomizeOrigin.toolTipText")); getChkRandomizeOrigin().setName("chkRandomizeOrigin"); + getChkRandomizeOrigin().addActionListener(evt -> { + final boolean selected = getChkRandomizeOrigin().isSelected(); + getChkRandomizeAroundCentralPlanet().setEnabled(selected); + getChkCentralSystemFactionSpecific().setEnabled(selected && getChkRandomizeAroundCentralPlanet().isSelected()); + lblCentralPlanet.setEnabled(selected && getChkRandomizeAroundCentralPlanet().isSelected()); + getComboCentralSystem().setEnabled(selected && getChkRandomizeAroundCentralPlanet().isSelected()); + getComboCentralPlanet().setEnabled(selected && getChkRandomizeAroundCentralPlanet().isSelected()); + lblOriginSearchRadius.setEnabled(selected); + getSpnOriginSearchRadius().setEnabled(selected); + getChkExtraRandomOrigin().setEnabled(selected); + lblOriginDistanceScale.setEnabled(selected); + getSpnOriginDistanceScale().setEnabled(selected); + }); + + setChkRandomizeAroundCentralPlanet(new JCheckBox(resources.getString("chkRandomizeAroundCentralPlanet.text"))); + getChkRandomizeAroundCentralPlanet().setToolTipText(resources.getString("chkRandomizeAroundCentralPlanet.toolTipText")); + getChkRandomizeAroundCentralPlanet().setName("chkRandomizeAroundCentralPlanet"); + getChkRandomizeAroundCentralPlanet().addActionListener(evt -> { + final boolean selected = getChkRandomizeAroundCentralPlanet().isSelected() + && getChkRandomizeAroundCentralPlanet().isEnabled(); + getChkCentralSystemFactionSpecific().setEnabled(selected); + lblCentralPlanet.setEnabled(selected); + getComboCentralSystem().setEnabled(selected); + getComboCentralPlanet().setEnabled(selected); + }); setChkCentralSystemFactionSpecific(new JCheckBox(resources.getString("FactionSpecific"))); getChkCentralSystemFactionSpecific().setToolTipText(resources.getString("chkCentralSystemFactionSpecific.toolTipText")); getChkCentralSystemFactionSpecific().setName("chkCentralSystemFactionSpecific"); - getChkCentralSystemFactionSpecific().addActionListener(evt -> updateComboCentralSystem()); + getChkCentralSystemFactionSpecific().addActionListener(evt -> { + if ((getCentralSystem() == null) || ((getCentralSystem() != null) + && !getCentralSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction()))) { + restoreComboCentralSystem(); + } + }); - JLabel lblCentralPlanet = new JLabel(resources.getString("lblCentralPlanet.text")); + lblCentralPlanet.setText(resources.getString("lblCentralPlanet.text")); lblCentralPlanet.setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); lblCentralPlanet.setName("lblCentralPlanet"); setComboCentralSystem(new JComboBox<>()); - getComboCentralSystem().setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); + getComboCentralSystem().setToolTipText(resources.getString("comboCentralSystem.toolTipText")); getComboCentralSystem().setName("comboCentralSystem"); getComboCentralSystem().setRenderer(new DefaultListCellRenderer() { @Override @@ -1129,7 +1222,12 @@ public Component getListCellRendererComponent(final JList list, final Object return this; } }); - getComboCentralSystem().addActionListener(evt -> updateComboCentralPlanet()); + getComboCentralSystem().addActionListener(evt -> { + if ((getCentralSystem() == null) || ((getCentralSystem() != null) && (getCentralPlanet() != null) + && !getCentralPlanet().getParentSystem().equals(getCentralSystem()))) { + restoreComboCentralPlanet(); + } + }); setComboCentralPlanet(new JComboBox<>()); getComboCentralPlanet().setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); @@ -1147,7 +1245,7 @@ public Component getListCellRendererComponent(final JList list, final Object } }); - JLabel lblOriginSearchRadius = new JLabel(resources.getString("lblOriginSearchRadius.text")); + lblOriginSearchRadius.setText(resources.getString("lblOriginSearchRadius.text")); lblOriginSearchRadius.setToolTipText(resources.getString("lblOriginSearchRadius.toolTipText")); lblOriginSearchRadius.setName("lblOriginSearchRadius"); @@ -1159,7 +1257,7 @@ public Component getListCellRendererComponent(final JList list, final Object getChkExtraRandomOrigin().setToolTipText(resources.getString("chkExtraRandomOrigin.toolTipText")); getChkExtraRandomOrigin().setName("chkExtraRandomOrigin"); - JLabel lblOriginDistanceScale = new JLabel(resources.getString("lblOriginDistanceScale.text")); + lblOriginDistanceScale.setText(resources.getString("lblOriginDistanceScale.text")); lblOriginDistanceScale.setToolTipText(resources.getString("lblOriginDistanceScale.toolTipText")); lblOriginDistanceScale.setName("lblOriginDistanceScale"); @@ -1167,6 +1265,13 @@ public Component getListCellRendererComponent(final JList list, final Object getSpnOriginDistanceScale().setToolTipText(resources.getString("lblOriginDistanceScale.toolTipText")); getSpnOriginDistanceScale().setName("spnOriginDistanceScale"); + // Programmatically Assign Accessibility Labels + lblCentralPlanet.setLabelFor(getComboCentralPlanet()); + + // Disable Panel by Default + getChkRandomizeOrigin().setSelected(true); + getChkRandomizeOrigin().doClick(); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("personnelRandomizationPanel.title"))); @@ -1180,7 +1285,9 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() .addComponent(getChkRandomizeOrigin()) - .addComponent(getChkCentralSystemFactionSpecific()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getChkRandomizeAroundCentralPlanet()) + .addComponent(getChkCentralSystemFactionSpecific(), GroupLayout.Alignment.LEADING)) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblCentralPlanet) .addComponent(getComboCentralSystem()) @@ -1197,7 +1304,9 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(getChkRandomizeOrigin()) - .addComponent(getChkCentralSystemFactionSpecific()) + .addGroup(layout.createSequentialGroup() + .addComponent(getChkRandomizeAroundCentralPlanet()) + .addComponent(getChkCentralSystemFactionSpecific())) .addGroup(layout.createSequentialGroup() .addComponent(lblCentralPlanet) .addComponent(getComboCentralSystem()) @@ -1214,6 +1323,7 @@ public Component getListCellRendererComponent(final JList list, final Object } private JPanel createUnitsPanel() { + // Create Panel Components setChkGenerateUnitsAsAttached(new JCheckBox(resources.getString("chkGenerateUnitsAsAttached.text"))); getChkGenerateUnitsAsAttached().setToolTipText(resources.getString("chkGenerateUnitsAsAttached.toolTipText")); getChkGenerateUnitsAsAttached().setName("chkGenerateUnitsAsAttached"); @@ -1237,11 +1347,15 @@ private JPanel createUnitsPanel() { setSpnStarLeagueYear(new JSpinner(new SpinnerNumberModel(2765, 2571, 2780, 1))); getSpnStarLeagueYear().setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); getSpnStarLeagueYear().setName("spnStarLeagueYear"); + getSpnStarLeagueYear().setEditor(new JSpinner.NumberEditor(getSpnStarLeagueYear(), "#")); setChkAssignTechsToUnits(new JCheckBox(resources.getString("chkAssignTechsToUnits.text"))); getChkAssignTechsToUnits().setToolTipText(resources.getString("chkAssignTechsToUnits.toolTipText")); getChkAssignTechsToUnits().setName("chkAssignTechsToUnits"); + // Programmatically Assign Accessibility Labels + lblStarLeagueYear.setLabelFor(getSpnStarLeagueYear()); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitsPanel.title"))); @@ -1279,6 +1393,7 @@ private JPanel createUnitsPanel() { } private JPanel createUnitPanel() { + // Create Panel Components JLabel lblForceNamingType = new JLabel(resources.getString("lblForceNamingType.text")); lblForceNamingType.setToolTipText(resources.getString("lblForceNamingType.toolTipText")); lblForceNamingType.setName("lblForceNamingType"); @@ -1302,6 +1417,9 @@ public Component getListCellRendererComponent(final JList list, final Object getChkGenerateForceIcons().setToolTipText(resources.getString("chkGenerateForceIcons.toolTipText")); getChkGenerateForceIcons().setName("chkGenerateForceIcons"); + // Programmatically Assign Accessibility Labels + lblForceNamingType.setLabelFor(getComboForceNamingType()); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitPanel.title"))); @@ -1331,17 +1449,27 @@ public Component getListCellRendererComponent(final JList list, final Object } private JPanel createSparesPanel() { + // Initialize Labels Used in ActionListeners + JLabel lblSparesPercentOfActiveUnits = new JLabel(); + JLabel lblNumberReloadsPerWeapon = new JLabel(); + + // Create Panel Components setChkGenerateMothballedSpareUnits(new JCheckBox(resources.getString("chkGenerateMothballedSpareUnits.text"))); getChkGenerateMothballedSpareUnits().setToolTipText(resources.getString("chkGenerateMothballedSpareUnits.toolTipText")); getChkGenerateMothballedSpareUnits().setName("chkGenerateMothballedSpareUnits"); + getChkGenerateMothballedSpareUnits().addActionListener(evt -> { + final boolean selected = getChkGenerateMothballedSpareUnits().isSelected(); + lblSparesPercentOfActiveUnits.setEnabled(selected); + getSpnSparesPercentOfActiveUnits().setEnabled(selected); + }); - JLabel lblSparesPercentOfActiveUnits = new JLabel(resources.getString("lblSparesPercentOfActiveUnits.text")); + lblSparesPercentOfActiveUnits.setText(resources.getString("lblSparesPercentOfActiveUnits.text")); lblSparesPercentOfActiveUnits.setToolTipText(resources.getString("lblSparesPercentOfActiveUnits.toolTipText")); lblSparesPercentOfActiveUnits.setName("lblSparesPercentOfActiveUnits"); setSpnSparesPercentOfActiveUnits(new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); getSpnSparesPercentOfActiveUnits().setToolTipText(resources.getString("chkGenerateMothballedSpareUnits.toolTipText")); - getSpnSparesPercentOfActiveUnits().setName("lblGenerateMothballedSpareUnits"); + getSpnSparesPercentOfActiveUnits().setName("spnGenerateMothballedSpareUnits"); setChkGenerateSpareParts(new JCheckBox(resources.getString("chkGenerateSpareParts.text"))); getChkGenerateSpareParts().setToolTipText(resources.getString("chkGenerateSpareParts.toolTipText")); @@ -1358,8 +1486,14 @@ private JPanel createSparesPanel() { setChkGenerateSpareAmmunition(new JCheckBox(resources.getString("chkGenerateSpareAmmunition.text"))); getChkGenerateSpareAmmunition().setToolTipText(resources.getString("chkGenerateSpareAmmunition.toolTipText")); getChkGenerateSpareAmmunition().setName("chkGenerateSpareAmmunition"); + getChkGenerateSpareAmmunition().addActionListener(evt -> { + final boolean selected = getChkGenerateSpareAmmunition().isSelected(); + lblNumberReloadsPerWeapon.setEnabled(selected); + getSpnNumberReloadsPerWeapon().setEnabled(selected); + getChkGenerateFractionalMachineGunAmmunition().setEnabled(selected); + }); - JLabel lblNumberReloadsPerWeapon = new JLabel(resources.getString("lblNumberReloadsPerWeapon.text")); + lblNumberReloadsPerWeapon.setText(resources.getString("lblNumberReloadsPerWeapon.text")); lblNumberReloadsPerWeapon.setToolTipText(resources.getString("lblNumberReloadsPerWeapon.toolTipText")); lblNumberReloadsPerWeapon.setName("lblNumberReloadsPerWeapon"); @@ -1371,6 +1505,17 @@ private JPanel createSparesPanel() { getChkGenerateFractionalMachineGunAmmunition().setToolTipText(resources.getString("chkGenerateFractionalMachineGunAmmunition.toolTipText")); getChkGenerateFractionalMachineGunAmmunition().setName("chkGenerateFractionalMachineGunAmmunition"); + // Programmatically Assign Accessibility Labels + lblSparesPercentOfActiveUnits.setLabelFor(getSpnSparesPercentOfActiveUnits()); + lblStartingArmourWeight.setLabelFor(getSpnStartingArmourWeight()); + lblNumberReloadsPerWeapon.setLabelFor(getSpnNumberReloadsPerWeapon()); + + // Disable Panel Portions by Default + getChkGenerateMothballedSpareUnits().setSelected(true); + getChkGenerateMothballedSpareUnits().doClick(); + getChkGenerateSpareAmmunition().setSelected(true); + getChkGenerateSpareAmmunition().doClick(); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("sparesPanel.title"))); @@ -1418,14 +1563,23 @@ private JPanel createSparesPanel() { } private JPanel createContractsPanel() { + // Create Panel Components setChkSelectStartingContract(new JCheckBox(resources.getString("chkSelectStartingContract.text"))); getChkSelectStartingContract().setToolTipText(resources.getString("chkSelectStartingContract.toolTipText")); getChkSelectStartingContract().setName("chkSelectStartingContract"); + getChkSelectStartingContract().addActionListener(evt -> { + final boolean selected = getChkSelectStartingContract().isSelected(); + getChkStartCourseToContractPlanet().setEnabled(selected); + }); setChkStartCourseToContractPlanet(new JCheckBox(resources.getString("chkStartCourseToContractPlanet.text"))); getChkStartCourseToContractPlanet().setToolTipText(resources.getString("chkStartCourseToContractPlanet.toolTipText")); getChkStartCourseToContractPlanet().setName("chkStartCourseToContractPlanet"); + // Disable Panel by Default + getChkSelectStartingContract().setSelected(true); + getChkSelectStartingContract().doClick(); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("contractsPanel.title"))); @@ -1451,6 +1605,10 @@ private JPanel createContractsPanel() { } private JPanel createFinancesPanel() { + // Initialize Labels Used in ActionListeners + JLabel lblRandomStartingCashDiceCount = new JLabel(); + + // Create Panel Components JLabel lblStartingCash = new JLabel(resources.getString("lblStartingCash.text")); lblStartingCash.setToolTipText(resources.getString("lblStartingCash.toolTipText")); lblStartingCash.setName("lblStartingCash"); @@ -1462,8 +1620,15 @@ private JPanel createFinancesPanel() { setChkRandomizeStartingCash(new JCheckBox(resources.getString("chkRandomizeStartingCash.text"))); getChkRandomizeStartingCash().setToolTipText(resources.getString("chkRandomizeStartingCash.toolTipText")); getChkRandomizeStartingCash().setName("chkRandomizeStartingCash"); + getChkRandomizeStartingCash().addActionListener(evt -> { + final boolean selected = getChkRandomizeStartingCash().isSelected(); + lblStartingCash.setEnabled(!selected); + getSpnStartingCash().setEnabled(!selected); + lblRandomStartingCashDiceCount.setEnabled(selected); + getSpnRandomStartingCashDiceCount().setEnabled(selected); + }); - JLabel lblRandomStartingCashDiceCount = new JLabel(resources.getString("lblRandomStartingCashDiceCount.text")); + lblRandomStartingCashDiceCount.setText(resources.getString("lblRandomStartingCashDiceCount.text")); lblRandomStartingCashDiceCount.setToolTipText(resources.getString("lblRandomStartingCashDiceCount.toolTipText")); lblRandomStartingCashDiceCount.setName("lblRandomStartingCashDiceCount"); @@ -1482,6 +1647,15 @@ private JPanel createFinancesPanel() { setChkPayForSetup(new JCheckBox(resources.getString("chkPayForSetup.text"))); getChkPayForSetup().setToolTipText(resources.getString("chkPayForSetup.toolTipText")); getChkPayForSetup().setName("chkPayForSetup"); + getChkPayForSetup().addActionListener(evt -> { + final boolean selected = getChkPayForSetup().isSelected(); + getChkStartingLoan().setEnabled(selected); + getChkPayForPersonnel().setEnabled(selected); + getChkPayForUnits().setEnabled(selected); + getChkPayForParts().setEnabled(selected); + getChkPayForArmour().setEnabled(selected); + getChkPayForAmmunition().setEnabled(selected); + }); setChkStartingLoan(new JCheckBox(resources.getString("chkStartingLoan.text"))); getChkStartingLoan().setToolTipText(resources.getString("chkStartingLoan.toolTipText")); @@ -1499,10 +1673,23 @@ private JPanel createFinancesPanel() { getChkPayForParts().setToolTipText(resources.getString("chkPayForParts.toolTipText")); getChkPayForParts().setName("chkPayForParts"); + setChkPayForArmour(new JCheckBox(resources.getString("chkPayForArmour.text"))); + getChkPayForArmour().setToolTipText(resources.getString("chkPayForArmour.toolTipText")); + getChkPayForArmour().setName("chkPayForArmour"); + setChkPayForAmmunition(new JCheckBox(resources.getString("chkPayForAmmunition.text"))); getChkPayForAmmunition().setToolTipText(resources.getString("chkPayForAmmunition.toolTipText")); getChkPayForAmmunition().setName("chkPayForAmmunition"); + // Programmatically Assign Accessibility Labels + lblStartingCash.setLabelFor(getSpnStartingCash()); + lblRandomStartingCashDiceCount.setLabelFor(getSpnRandomStartingCashDiceCount()); + lblMinimumStartingFloat.setLabelFor(getSpnMinimumStartingFloat()); + + // Disable Panel Portions by Default + getChkRandomizeStartingCash().setSelected(true); + getChkRandomizeStartingCash().doClick(); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financesPanel.title"))); @@ -1530,6 +1717,7 @@ private JPanel createFinancesPanel() { .addComponent(getChkPayForPersonnel()) .addComponent(getChkPayForUnits()) .addComponent(getChkPayForParts()) + .addComponent(getChkPayForArmour()) .addComponent(getChkPayForAmmunition()) ); @@ -1550,6 +1738,7 @@ private JPanel createFinancesPanel() { .addComponent(getChkPayForPersonnel()) .addComponent(getChkPayForUnits()) .addComponent(getChkPayForParts()) + .addComponent(getChkPayForArmour()) .addComponent(getChkPayForAmmunition()) ); return panel; @@ -1558,7 +1747,8 @@ private JPanel createFinancesPanel() { private List getFactionChoices() { final List factionChoices = new ArrayList<>(); - for (Faction faction : Factions.getInstance().getFactions()) { + // TODO : I shouldn't be all, just those valid during the game year + for (final Faction faction : Factions.getInstance().getFactions()) { factionChoices.add(new FactionChoice(faction, getCampaign().getGameYear())); } @@ -1598,6 +1788,9 @@ public void setOptions(final CompanyGenerationOptions options) { break; } } + if (getChkSpecifyStartingSystem().isSelected() != options.isSpecifyStartingPlanet()) { + getChkSpecifyStartingSystem().doClick(); + } getChkStartingSystemFactionSpecific().setSelected(false); restoreComboStartingSystem(); getComboStartingSystem().setSelectedItem(options.getStartingPlanet().getParentSystem()); @@ -1609,7 +1802,7 @@ public void setOptions(final CompanyGenerationOptions options) { getSpnLanceSize().setValue(options.getLanceSize()); // Personnel - updateLblTotalSupportPersonnel(); + updateLblTotalSupportPersonnel(determineMaximumSupportPersonnel()); setSupportPersonnelNumbers(options.getSupportPersonnel()); getChkPoolAssistants().setSelected(options.isPoolAssistants()); getChkGenerateCaptains().setSelected(options.isGenerateCaptains()); @@ -1620,7 +1813,12 @@ public void setOptions(final CompanyGenerationOptions options) { getChkAutomaticallyAssignRanks().setSelected(options.isAutomaticallyAssignRanks()); // Personnel Randomization - getChkRandomizeOrigin().setSelected(options.isRandomizeOrigin()); + if (getChkRandomizeOrigin().isSelected() != options.isRandomizeOrigin()) { + getChkRandomizeOrigin().doClick(); + } + if (getChkRandomizeAroundCentralPlanet().isSelected() != options.isRandomizeAroundCentralPlanet()) { + getChkRandomizeAroundCentralPlanet().doClick(); + } getChkCentralSystemFactionSpecific().setSelected(false); restoreComboCentralSystem(); getComboCentralSystem().setSelectedItem(options.getCentralPlanet().getParentSystem()); @@ -1642,15 +1840,21 @@ public void setOptions(final CompanyGenerationOptions options) { getChkGenerateForceIcons().setSelected(options.isGenerateForceIcons()); // Spares - getChkGenerateMothballedSpareUnits().setSelected(options.isGenerateMothballedSpareUnits()); + if (getChkGenerateMothballedSpareUnits().isSelected() != options.isGenerateMothballedSpareUnits()) { + getChkGenerateMothballedSpareUnits().doClick(); + } getSpnSparesPercentOfActiveUnits().setValue(options.getSparesPercentOfActiveUnits()); getChkGenerateSpareParts().setSelected(options.isGenerateSpareParts()); getSpnStartingArmourWeight().setValue(options.getStartingArmourWeight()); - getChkGenerateSpareAmmunition().setSelected(options.isGenerateSpareAmmunition()); + if (getChkGenerateSpareAmmunition().isSelected() != options.isGenerateSpareAmmunition()) { + getChkGenerateSpareAmmunition().doClick(); + } getChkGenerateFractionalMachineGunAmmunition().setSelected(options.isGenerateFractionalMachineGunAmmunition()); // Contracts - getChkSelectStartingContract().setSelected(options.isSelectStartingContract()); + if (getChkSelectStartingContract().isSelected() != options.isSelectStartingContract()) { + getChkSelectStartingContract().doClick(); + } getChkStartCourseToContractPlanet().setSelected(options.isStartCourseToContractPlanet()); // Finances @@ -1663,6 +1867,7 @@ public void setOptions(final CompanyGenerationOptions options) { getChkPayForPersonnel().setSelected(options.isPayForPersonnel()); getChkPayForUnits().setSelected(options.isPayForUnits()); getChkPayForParts().setSelected(options.isPayForParts()); + getChkPayForArmour().setSelected(options.isPayForArmour()); getChkPayForAmmunition().setSelected(options.isPayForAmmunition()); } @@ -1693,6 +1898,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Personnel Randomization options.setRandomizeOrigin(getChkRandomizeOrigin().isSelected()); + options.setRandomizeAroundCentralPlanet(getChkRandomizeAroundCentralPlanet().isSelected()); options.setCentralPlanet(getCentralPlanet()); options.setOriginSearchRadius((Integer) getSpnOriginSearchRadius().getValue()); options.setExtraRandomOrigin(getChkExtraRandomOrigin().isSelected()); @@ -1733,25 +1939,80 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setPayForPersonnel(getChkPayForPersonnel().isSelected()); options.setPayForUnits(getChkPayForUnits().isSelected()); options.setPayForParts(getChkPayForParts().isSelected()); + options.setPayForArmour(getChkPayForArmour().isSelected()); options.setPayForAmmunition(getChkPayForAmmunition().isSelected()); return options; } public boolean validateOptions() { - return ((int) getSpnCompanyCount().getValue() + (int) getSpnIndividualLanceCount().getValue()) > 0; + //region Errors + // Minimum Generation Size Validation + // Minimum Generation Parameter of 1 Company or Lance, the Company Command Lance Doesn't Count + if (((Integer) getSpnCompanyCount().getValue() <= 0) + && ((Integer) getSpnIndividualLanceCount().getValue() <= 0)) { + JOptionPane.showMessageDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.InvalidGenerationSize.text"), + resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), + JOptionPane.ERROR_MESSAGE); + return false; + } + + // Starting System/Planet Validation + if ((getStartingSystem() == null) || (getStartingPlanet() == null)) { + JOptionPane.showMessageDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.InvalidStartingPlanet.text"), + resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), + JOptionPane.ERROR_MESSAGE); + return false; + } + + // Central System/Planet Validation + if ((getCentralSystem() == null) || (getCentralPlanet() == null)) { + JOptionPane.showMessageDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.InvalidCentralPlanet.text"), + resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), + JOptionPane.ERROR_MESSAGE); + return false; + } + //endregion Errors + + //region Warnings + // Support Personnel Count: + // 1) Above Recommended Maximum Support Personnel Count + // 2) Below Half of Recommended Maximum Support Personnel Count + final int maximumSupportPersonnelCount = determineMaximumSupportPersonnel(); + final int currentSupportPersonnelCount = Stream.of(getSpnSupportPersonnelNumbers()) + .mapToInt(RoleToSpinner::getValue).sum(); + if ((maximumSupportPersonnelCount < currentSupportPersonnelCount) + && (JOptionPane.showConfirmDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text"), + resources.getString("CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.title"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { + return false; + } else if ((currentSupportPersonnelCount < (maximumSupportPersonnelCount / 2)) + && (JOptionPane.showConfirmDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.text"), + resources.getString("CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.title"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { + return false; + } + //endregion Warnings + + // The options specified are correct, and thus can be saved + return true; } //endregion Options //region File I/O public void importOptionsFromXML() { - File file = FileDialogs.openCompanyGenerationOptions(getFrame()).orElse(null); - setOptions(CompanyGenerationOptions.parseFromXML(file, getCampaign())); + FileDialogs.openCompanyGenerationOptions(getFrame()) + .ifPresent(file -> setOptions(CompanyGenerationOptions.parseFromXML(file, getCampaign()))); } public void exportOptionsToXML() { - File file = FileDialogs.saveCompanyGenerationOptions(getFrame()).orElse(null); - createOptionsFromPanel().writeToFile(file); + FileDialogs.saveCompanyGenerationOptions(getFrame()) + .ifPresent(file -> createOptionsFromPanel().writeToFile(file)); } //endregion File I/O From 1e365eac5f8548584fc6dca9c96b0dc78802516d Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 14 Feb 2021 08:59:07 -0700 Subject: [PATCH 009/115] Swapping call to Java 8 allowable --- MekHQ/src/mekhq/gui/CampaignGUI.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/gui/CampaignGUI.java b/MekHQ/src/mekhq/gui/CampaignGUI.java index df236725a4..ebe47ab8c1 100644 --- a/MekHQ/src/mekhq/gui/CampaignGUI.java +++ b/MekHQ/src/mekhq/gui/CampaignGUI.java @@ -2235,7 +2235,8 @@ protected void loadPartsFile() { protected void loadOptionsFile() { Optional maybeFile = FileDialogs.openCampaignOptions(frame); - if (maybeFile.isEmpty()) { + // TODO : Java 11: Swap to isEmpty + if (!maybeFile.isPresent()) { return; } From 636f7577a909f5157b11e285c5331cd380a7dde0 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 14 Feb 2021 09:01:55 -0700 Subject: [PATCH 010/115] Fixing missing number of reloads per weapon value initialization --- .../companyGeneration/CompanyGenerationOptions.java | 4 ++-- MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java index bac2d9020b..587f1a98e9 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java @@ -81,14 +81,14 @@ public class CompanyGenerationOptions implements Serializable { // Units private boolean generateUnitsAsAttached; private boolean assignBestRollToUnitCommander; // Not Implemented - private boolean groupByWeight; // Buggy + private boolean groupByWeight; // Buggy - Annoyingly Implemented, might need to work on how I've done this one before I open private boolean keepOfficerRollsSeparate; private int starLeagueYear; private boolean assignTechsToUnits; // Not Implemented // Unit private ForceNamingType forceNamingType; - private boolean generateForceIcons; // Buggy + private boolean generateForceIcons; // Very Buggy // Spares private boolean generateMothballedSpareUnits; diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java index 5ba18fefc5..a94457d351 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -1849,6 +1849,7 @@ public void setOptions(final CompanyGenerationOptions options) { if (getChkGenerateSpareAmmunition().isSelected() != options.isGenerateSpareAmmunition()) { getChkGenerateSpareAmmunition().doClick(); } + getSpnNumberReloadsPerWeapon().setValue(options.getNumberReloadsPerWeapon()); getChkGenerateFractionalMachineGunAmmunition().setSelected(options.isGenerateFractionalMachineGunAmmunition()); // Contracts From 8a9a5f085b11059fb99fe551c7c97b90f09c46b6 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 15 Feb 2021 08:59:15 -0700 Subject: [PATCH 011/115] Implementing Armour, Ammunition, Techs Assigned to Units, and bugfixing --- .../resources/mekhq/resources/GUI.properties | 2 +- MekHQ/src/mekhq/campaign/parts/Armor.java | 4 + .../src/mekhq/campaign/universe/Faction.java | 18 +- .../AbstractCompanyGenerator.java | 165 +++++++++++++++--- .../gui/dialog/CompanyGenerationDialog.java | 6 +- .../view/CompanyGenerationOptionsPanel.java | 27 ++- 6 files changed, 175 insertions(+), 47 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 86bd86ee3e..5bdc0c4905 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -229,7 +229,7 @@ lblSparesPercentOfActiveUnits.toolTipText=This is the percentage of active units chkGenerateSpareParts.text=Generate Spare Parts chkGenerateSpareParts.toolTipText=This generates spare parts for the unit based on the parts used by the unit. lblStartingArmourWeight.text=Starting Armour Weight -lblStartingArmourWeight.toolTipText=This is the weight of spare armour to generate at the start of the campaign. Each type of armour is generated based on the percentage weight it is of the total armour, rounded to the nearest ton.
The recommended value to use is 20 tons per lance. +lblStartingArmourWeight.toolTipText=This is the weight of spare armour to generate at the start of the campaign. Each type of armour is generated based on the percentage weight it is of the total armour, rounded to the nearest point.
The recommended value to use is 20 tons per lance. chkGenerateSpareAmmunition.text=Generate Spare Ammunition chkGenerateSpareAmmunition.toolTipText=This generates spare standard ammunition for any weapons in the force. lblNumberReloadsPerWeapon.text=Reloads per Weapon diff --git a/MekHQ/src/mekhq/campaign/parts/Armor.java b/MekHQ/src/mekhq/campaign/parts/Armor.java index 1c09ce77d5..f64c226b2c 100644 --- a/MekHQ/src/mekhq/campaign/parts/Armor.java +++ b/MekHQ/src/mekhq/campaign/parts/Armor.java @@ -186,6 +186,10 @@ public int getAmount() { return amount; } + public void addAmount(int amount) { + this.amount += amount; + } + public int getAmountNeeded() { return amountNeeded; } diff --git a/MekHQ/src/mekhq/campaign/universe/Faction.java b/MekHQ/src/mekhq/campaign/universe/Faction.java index 609bc51e05..76afc07ff1 100644 --- a/MekHQ/src/mekhq/campaign/universe/Faction.java +++ b/MekHQ/src/mekhq/campaign/universe/Faction.java @@ -1,7 +1,7 @@ /* * Faction.java * - * Copyright (C) 2009-2016 - The MegaMek Team. All Rights Reserved. + * Copyright (C) 2009-2021 - The MegaMek Team. All Rights Reserved. * Copyright (c) 2009 Jay Lawson . All rights reserved. * * This file is part of MekHQ. @@ -35,6 +35,7 @@ import java.util.Set; import java.util.TreeMap; +import megamek.common.annotations.Nullable; import org.w3c.dom.DOMException; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -47,7 +48,6 @@ import mekhq.campaign.parts.Part; /** - * * @author Jay Lawson */ public class Faction { @@ -120,13 +120,13 @@ public String getNameGenerator() { return nameGenerator; } - public String getStartingPlanet(LocalDate year) { - Map.Entry change = planetChanges.floorEntry(year); - if (null == change) { - return startingPlanet; - } else { - return change.getValue(); - } + public @Nullable PlanetarySystem getStartingPlanet(final Campaign campaign, final LocalDate date) { + return campaign.getSystemById(getStartingPlanet(date)); + } + + public String getStartingPlanet(final LocalDate date) { + Map.Entry change = planetChanges.floorEntry(date); + return (change == null) ? startingPlanet : change.getValue(); } public int getEraMod(int year) { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java index fb4c9f3a22..23865767ab 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java @@ -18,6 +18,7 @@ */ package mekhq.campaign.universe.generators.companyGeneration; +import megamek.common.AmmoType; import megamek.common.Entity; import megamek.common.EntityWeightClass; import megamek.common.MechFileParser; @@ -37,6 +38,7 @@ import mekhq.campaign.parts.AmmoStorage; import mekhq.campaign.parts.Armor; import mekhq.campaign.parts.Part; +import mekhq.campaign.parts.equipment.AmmoBin; import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.Skill; import mekhq.campaign.personnel.SkillType; @@ -52,6 +54,7 @@ import mekhq.campaign.universe.RangedPlanetSelector; import mekhq.campaign.universe.enums.Alphabet; import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.campaign.work.WorkTime; import mekhq.gui.enums.LayeredForceIcon; import java.util.ArrayList; @@ -87,12 +90,7 @@ * Implement: * assignBestRollToUnitCommander * centerPlanet - * assignTechsToUnits * generateSpareParts // 1 for every 3 (round normally) parts in inventory? - * startingArmourWeight - * generateSpareAmmunition - * numberReloadsPerWeapon - * generateFractionalMachineGunAmmunition // 50 rounds per machine gun in force? * selectStartingContract * * FIXME : @@ -102,6 +100,7 @@ * Dialog Buttons look odd and need fixing * Dialog Modify the buttons, and have them appear or disappear based on the current panel * Panel has odd whitespace usage + * System, Planet text search * * Class Notes: * {{@link AbstractCompanyGenerator#applyToCampaign}} takes the campaign and applies all changes to @@ -601,9 +600,7 @@ protected MechSummary generateMechSummary(final Campaign campaign, final RandomMechParameters parameters, final String faction, int year) { Predicate filter = ms -> - (!campaign.getCampaignOptions().limitByYear() || (year > ms.getYear())) - && (!ms.isClan() || campaign.getCampaignOptions().allowClanPurchases()) - && (ms.isClan() || campaign.getCampaignOptions().allowISPurchases()); + (!campaign.getCampaignOptions().limitByYear() || (year > ms.getYear())); return campaign.getUnitGenerator().generate(faction, UnitType.MEK, parameters.getWeight(), year, parameters.getQuality(), filter); } @@ -638,11 +635,28 @@ private List createUnits(final Campaign campaign, List combatPerso /** * @param supportPersonnel the list of support personnel including the techs to assign to units - * @param units the list of units to have techs assigned to + * @param units the list of units to have techs assigned to (order does not matter) */ private void assignTechsToUnits(final List supportPersonnel, final List units) { - if (getOptions().isAssignTechsToUnits()) { - // TODO : Implement me + if (!getOptions().isAssignTechsToUnits()) { + return; + } + + final List mechTechs = supportPersonnel.parallelStream() + .filter(p -> p.getPrimaryRole() == Person.T_MECH_TECH).collect(Collectors.toList()); + if (mechTechs.size() == 0) { + return; + } + + units.sort(Comparator.comparingDouble(Unit::getMaintenanceTime)); + int numberMechTechs = mechTechs.size(); + for (int i = 0; (i < units.size()) && !mechTechs.isEmpty(); i++) { + Person mechTech = mechTechs.get(i % numberMechTechs); + if (mechTech.getMaintenanceTimeUsing() + units.get(i).getMaintenanceTime() <= Person.PRIMARY_ROLE_SUPPORT_TIME) { + units.get(i).setTech(mechTech); + } else { + mechTechs.remove(i % numberMechTechs--); + } } } //endregion Units @@ -965,7 +979,10 @@ public List generateMothballedEntities(final Campaign campaign, final Li } // Generate the 'Mech, and add it to the mothballed entities list - mothballedEntities.add(generateEntity(campaign, parameters, faction)); + final Entity entity = generateEntity(campaign, parameters, faction); + if (entity != null) { + mothballedEntities.add(entity); + } } return mothballedEntities; } @@ -986,19 +1003,101 @@ private List createMothballedSpareUnits(final Campaign campaign, return mothballedUnits; } - public List generateSpareParts() { + public List generateSpareParts(final List units) { + if (!getOptions().isGenerateSpareParts()) { + return new ArrayList<>(); + } // TODO : Implement me return new ArrayList<>(); } - public List generateArmour() { - // TODO : Implement me - return new ArrayList<>(); + public List generateArmour(final List units) { + if (getOptions().getStartingArmourWeight() <= 0) { + return new ArrayList<>(); + } + + final List unitAssignedArmour = units.stream() + .flatMap(u -> u.getParts().stream()) + .filter(p -> p instanceof Armor) + .map(p -> (Armor) p) + .collect(Collectors.toList()); + final List armour = mergeIdenticalArmour(unitAssignedArmour); + final double armourTonnageMultiplier = getOptions().getStartingArmourWeight() + / armour.stream().mapToDouble(Armor::getTonnage).sum(); + armour.forEach(a -> a.setAmount(Math.toIntExact(Math.round(a.getAmount() * armourTonnageMultiplier)))); + return armour; } - public List generateAmmunition() { - // TODO : Implement me - return new ArrayList<>(); + private List mergeIdenticalArmour(final List unmergedArmour) { + final List mergedArmour = new ArrayList<>(); + unmergedArmour.forEach(a -> { + boolean unmerged = true; + for (final Armor armour : mergedArmour) { + if (areSameArmour(armour, a)) { + armour.addAmount(a.getAmount()); + unmerged = false; + break; + } + } + if (unmerged) { + final Armor armour = a.clone(); + armour.setMode(WorkTime.NORMAL); + armour.setOmniPodded(false); + mergedArmour.add(armour); + } + }); + return mergedArmour; + } + + private boolean areSameArmour(final Armor a1, final Armor a2) { + return (a1.getClass() == a2.getClass()) + && a1.isSameType(a2) + && (a1.isClan() == a2.isClan()) + && (a1.getQuality() == a2.getQuality()) + && (a1.getHits() == a2.getHits()) + && (a1.getSkillMin() == a2.getSkillMin()); + } + + public List generateAmmunition(final Campaign campaign, final List units) { + if (!getOptions().isGenerateSpareAmmunition() || ((getOptions().getNumberReloadsPerWeapon() <= 0) + && !getOptions().isGenerateFractionalMachineGunAmmunition())) { + return new ArrayList<>(); + } + + final List ammoBins = units.stream() + .flatMap(u -> u.getParts().stream()) + .filter(p -> p instanceof AmmoBin) + .map(p -> (AmmoBin) p) + .collect(Collectors.toList()); + + final List ammunition = new ArrayList<>(); + final boolean generateReloads = getOptions().getNumberReloadsPerWeapon() > 0; + ammoBins.forEach(ammoBin -> { + if (getOptions().isGenerateFractionalMachineGunAmmunition() + && ammoBinIsMachineGun(ammoBin)) { + ammunition.add(new AmmoStorage(0, ammoBin.getType(), 50, campaign)); + } else if (generateReloads) { + ammunition.add(new AmmoStorage(0, ammoBin.getType(), + ammoBin.getFullShots() * getOptions().getNumberReloadsPerWeapon(), campaign)); + } + }); + + return ammunition; + } + + /** + * @param ammoBin the ammo bin to check + * @return whether the ammo bin's ammo type is a machine gun type + */ + private boolean ammoBinIsMachineGun(final AmmoBin ammoBin) { + switch (ammoBin.getType().getAmmoType()) { + case AmmoType.T_MG: + case AmmoType.T_MG_HEAVY: + case AmmoType.T_MG_LIGHT: + return true; + default: + return false; + } } //endregion Spares @@ -1026,8 +1125,7 @@ private void processFinances(final Campaign campaign, final List personn final @Nullable Contract contract) { // TODO : Finish implementation - Money startingCash = getOptions().isRandomizeStartingCash() ? rollRandomStartingCash() - : Money.of(getOptions().getStartingCash()); + Money startingCash = generateStartingCash(); final Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); if (getOptions().isPayForSetup()) { final Money hiringCosts = calculateHiringCosts(personnel); @@ -1046,6 +1144,14 @@ private void processFinances(final Campaign campaign, final List personn } } + /** + * @return the amount of starting cash generated for the Mercenary Company + */ + public Money generateStartingCash() { + return getOptions().isRandomizeStartingCash() ? rollRandomStartingCash() + : Money.of(getOptions().getStartingCash()); + } + /** * @return the option dice count d6 million c-bills, or zero if randomize starting cash is disabled */ @@ -1145,6 +1251,7 @@ private Money calculateAmmunitionCosts(final List ammunition) { //region Apply to Campaign /** + * TODO : UNFINISHED * This method takes the campaign and applies all changes to it. No method not directly * called from here may alter the campaign. * @@ -1153,16 +1260,13 @@ private Money calculateAmmunitionCosts(final List ammunition) { * @param supportPersonnel the list of generated support personnel * @param entities the list of generated entities, with null holding spaces without 'Mechs * @param mothballedEntities the list of generated spare 'Mech entities to mothball - * @param parts the list of generated parts - * @param armour the list of generated armour - * @param ammunition the list of generated ammunition * @param contract the selected contract, or null if one has not been selected */ public void applyToCampaign(final Campaign campaign, final List combatPersonnel, final List supportPersonnel, final List entities, - final List mothballedEntities, final List parts, - final List armour, final List ammunition, - final @Nullable Contract contract) { + final List mothballedEntities, final @Nullable Contract contract) { + moveToStartingPlanet(campaign); + // Phase One: Personnel, Units, and Unit final List personnel = new ArrayList<>(); final List units = new ArrayList<>(); @@ -1172,8 +1276,11 @@ public void applyToCampaign(final Campaign campaign, final List combatPe final List mothballedUnits = createMothballedSpareUnits(campaign, mothballedEntities); units.addAll(mothballedUnits); + final List parts = generateSpareParts(units); + final List armour = generateArmour(units); + final List ammunition = generateAmmunition(campaign, units); + // Phase 3: Contract - moveToStartingPlanet(campaign); processContract(campaign, contract); // Phase 4: Finances @@ -1217,7 +1324,7 @@ private void applyPhaseOneToCampaign(final Campaign campaign, final List //endregion Apply to Campaign //region Revert Application to Campaign - + // TODO : ADD ME //endregion Revert Application to Campaign //region Local Classes diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index d1dd867bda..ec1699d2f2 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -163,12 +163,8 @@ protected void okAction() { final List supportPersonnel = generator.generateSupportPersonnel(campaign); final List entities = generator.generateUnits(campaign, combatPersonnel); final List mothballedEntities = generator.generateMothballedEntities(campaign, entities); - final List parts = generator.generateSpareParts(); - final List armour = generator.generateArmour(); - final List ammunition = generator.generateAmmunition(); final Contract contract = null; - generator.applyToCampaign(campaign, combatPersonnel, supportPersonnel, entities, mothballedEntities, - parts, armour, ammunition, contract); + generator.applyToCampaign(campaign, combatPersonnel, supportPersonnel, entities, mothballedEntities, contract); } @Override diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java index a94457d351..2fcfeb9c55 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -775,9 +775,29 @@ public Component getListCellRendererComponent(final JList list, final Object lblFaction.setToolTipText(resources.getString("lblFaction.toolTipText")); lblFaction.setName("lblFaction"); - setComboFaction(new JComboBox<>(getFactionChoices().toArray(new FactionChoice[]{}))); + setComboFaction(new JComboBox<>(new DefaultComboBoxModel<>(getFactionChoices().toArray(new FactionChoice[]{})))); getComboFaction().setToolTipText(resources.getString("lblFaction.toolTipText")); getComboFaction().setName("comboFaction"); + getComboFaction().addActionListener(evt -> { + if (getChkStartingSystemFactionSpecific().isSelected()) { + if ((getStartingPlanet() != null) + && getStartingSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction())) { + final PlanetarySystem startingSystem = getFaction().getStartingPlanet(getCampaign(), getCampaign().getLocalDate()); + if (startingSystem != null) { + getComboStartingSystem().setSelectedItem(startingSystem); + getComboStartingPlanet().setSelectedItem(startingSystem.getPrimaryPlanet()); + } else { + restoreComboStartingSystem(); + } + } else { + restoreComboStartingSystem(); + } + } + + if (getChkCentralSystemFactionSpecific().isSelected()) { + restoreComboStartingSystem(); + } + }); setChkSpecifyStartingSystem(new JCheckBox(resources.getString("chkSpecifyStartingSystem.text"))); getChkSpecifyStartingSystem().setToolTipText(resources.getString("chkSpecifyStartingSystem.toolTipText")); @@ -1747,9 +1767,10 @@ private JPanel createFinancesPanel() { private List getFactionChoices() { final List factionChoices = new ArrayList<>(); - // TODO : I shouldn't be all, just those valid during the game year for (final Faction faction : Factions.getInstance().getFactions()) { - factionChoices.add(new FactionChoice(faction, getCampaign().getGameYear())); + if (faction.validIn(getCampaign().getLocalDate())) { + factionChoices.add(new FactionChoice(faction, getCampaign().getGameYear())); + } } final NaturalOrderComparator noc = new NaturalOrderComparator(); From df74b88228129d3d8643841cb65a5a8a3f6a19f2 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 15 Feb 2021 16:11:20 -0700 Subject: [PATCH 012/115] New Campaign Preset Selection Dialog and Panel using JList --- .../ChooseGamePresetDialog.properties | 3 - .../resources/mekhq/resources/GUI.properties | 56 +++--- MekHQ/src/mekhq/gui/dialog/BaseDialog.java | 41 ++-- .../gui/dialog/CampaignOptionsDialog.java | 29 ++- .../dialog/CampaignPresetSelectionDialog.java | 80 ++++++++ .../gui/dialog/ChooseGamePresetDialog.java | 184 ------------------ .../gui/dialog/CompanyGenerationDialog.java | 41 ++-- .../mekhq/gui/dialog/DataLoadingDialog.java | 15 +- .../mekhq/gui/dialog/MekHqOptionsDialog.java | 12 +- .../gui/{dialog => enums}/DialogResult.java | 25 ++- .../gui/view/CampaignPresetRenderer.java | 109 +++++++++++ .../view/CampaignPresetSelectionPanel.java | 73 +++++++ 12 files changed, 369 insertions(+), 299 deletions(-) delete mode 100644 MekHQ/resources/mekhq/resources/ChooseGamePresetDialog.properties create mode 100644 MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java delete mode 100644 MekHQ/src/mekhq/gui/dialog/ChooseGamePresetDialog.java rename MekHQ/src/mekhq/gui/{dialog => enums}/DialogResult.java (52%) create mode 100644 MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java create mode 100644 MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java diff --git a/MekHQ/resources/mekhq/resources/ChooseGamePresetDialog.properties b/MekHQ/resources/mekhq/resources/ChooseGamePresetDialog.properties deleted file mode 100644 index c44c3af2d5..0000000000 --- a/MekHQ/resources/mekhq/resources/ChooseGamePresetDialog.properties +++ /dev/null @@ -1,3 +0,0 @@ -btnCancel.text=Cancel -btnOk.text=Ok -title=Choose Game Preset diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 5bdc0c4905..9504aefab9 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -1,6 +1,6 @@ # This is used to store any mekhq/gui Resources -### General GUI Resources - These are used multiple times across the GUI to mean the same thing +#### General GUI Resources - These are used multiple times across the GUI to mean the same thing Apply=Apply Cancel=Cancel Export=Export @@ -11,12 +11,15 @@ Import=Import Ok=Ok RestoreDefaults=Restore Defaults -### Dialog -## CompanyGenerationDialog Class +#### Dialog +### CampaignPresetSelectionDialog Class +CampaignPresetSelectionDialog.title=Select Campaign Preset + +### CompanyGenerationDialog Class CompanyGenerationDialog.title=Company Generator -## GMToolsDialog -# Dice Panel +### GMToolsDialog +## Dice Panel dicePanel.text=Dice Roller rolls.text=rolls of\u0020 sides.text=d @@ -24,7 +27,7 @@ totalDiceResultsLabel.text=Result: totalDiceResult.text=%5d diceRoll.text=Roll individualDiceResultsLabel.text=Individual Results: -# RAT Panel +## RAT Panel ratPanel.text=RAT Roller yearLabel.text=Year qualityLabel.text=Quality @@ -35,7 +38,7 @@ addRandomUnit.text=Add Random Unit invalidYear.error=Please enter a valid year noValidUnit.error=No unit matching criteria and purchase restrictions. entityLoadFailure.error=Failed to load entity -# Name Panel +## Name Panel namePanel.text=Name Generator genderLabel.text=Gender originFactionLabel.text=Origin Faction @@ -46,13 +49,13 @@ currentNameLabel.text=Current Name: nameGeneratedLabel.text=Generated Name: generateNameButton.text=Generate Name assignNameButton.text=Assign Name -# Callsign Panel +## Callsign Panel callsignPanel.text=Callsign Generator currentCallsignLabel.text=Current Callsign: callsignGeneratedLabel.text=Generated Callsign: generateCallsignButton.text=Generate Callsign assignCallsignButton.text=Assign Callsign -# Bloodname Panel +## Bloodname Panel bloodnamePanel.text=Bloodname Generator originClanLabel.text=Clan bloodnameEraLabel.text=Year @@ -64,8 +67,8 @@ phenotypeGeneratedLabel.text=Generated Phenotype generateBloodnameButton.text=Generate Bloodname assignBloodnameButton.text=Assign Bloodname -### Enums -## LayeredForceIcon Enum +#### Enums +### LayeredForceIcon Enum LayeredForceIcon.types.text=Types LayeredForceIcon.formations.text=Formations LayeredForceIcon.adjustments.text=Adjustments @@ -75,7 +78,7 @@ LayeredForceIcon.backgrounds.text=Backgrounds LayeredForceIcon.frame.text=Frames LayeredForceIcon.logos.text=Logos -## PersonnelFilter Enum +### PersonnelFilter Enum PersonnelFilter.ALL.text=All Personnel PersonnelFilter.ACTIVE.text=Active Personnel PersonnelFilter.COMBAT.text=Combat Personnel @@ -122,7 +125,7 @@ PersonnelFilter.MIA.text=Missing in Action Personnel PersonnelFilter.KIA.text=Rolls of Honor PersonnelFilter.DEAD.text=Cemetery -## PersonnelFilterStyle Enum +### PersonnelFilterStyle Enum PersonnelFilterStyle.STANDARD.text=Standard PersonnelFilterStyle.STANDARD.toolTipText=This is the standard filter style for MekHQ, which groups less commonly used but related personnel roles into a single filter (e.g. Doctors and Medics are grouped as Medical Staff) PersonnelFilterStyle.INDIVIDUAL_ROLE.text=Individual Role @@ -130,7 +133,7 @@ PersonnelFilterStyle.INDIVIDUAL_ROLE.toolTipText=This filter style provides filt PersonnelFilterStyle.ALL.text=All PersonnelFilterStyle.ALL.toolTipText=This filter style provides all of the standard AND individual role filters. -## PersonnelTabView Enum +### PersonnelTabView Enum PersonnelTabView.GRAPHIC.text=Graphic PersonnelTabView.GENERAL.text=General PersonnelTabView.PILOT_GUNNERY_SKILLS.text=Piloting/Gunnery Skills @@ -141,9 +144,9 @@ PersonnelTabView.ADMINISTRATIVE_SKILLS.text=Admin Skills PersonnelTabView.BIOGRAPHICAL.text=Biographical Information PersonnelTabView.FLUFF.text=Fluff Information -### View -## CompanyGenerationOptionsPanel Class -# Base Information Panel +#### View +### CompanyGenerationOptionsPanel Class +## Base Information Panel baseInformationPanel.title=Base Information lblCompanyGenerationType.text=Company Generation Type lblCompanyGenerationType.toolTipText=This is the type of company generator to use. These have hardcoded differences described in their tooltips. @@ -164,7 +167,7 @@ lblLancesPerCompany.text=Lances per Company lblLancesPerCompany.toolTipText=The number of lances generated per company, from 2 to 6. lblLanceSize.text=BattleMechs per Lance lblLanceSize.toolTipText=The number of BattleMechs to generate per lance, from 3 to 6. -# Personnel Panel +## Personnel Panel personnelPanel.title=Personnel lblTotalSupportPersonnel.text=Number of Support Personnel: %d lblTotalSupportPersonnel.toolTipText=This is the maximum number of starting support personnel for the force. This does not include assistants. @@ -184,7 +187,7 @@ chkAssignBestOfficers.text=Assign Best Officers chkAssignBestOfficers.toolTipText= chkAutomaticallyAssignRanks.text=Automatically Assign Ranks chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command while . -# Personnel Randomization Panel +## Personnel Randomization Panel personnelRandomizationPanel.title=Personnel Randomization chkRandomizeOrigin.text=Randomize Origin chkRandomizeOrigin.toolTipText=This randomizes the personnel origin. If disabled this will roll all 'Mechs on the faction's RAT. @@ -200,7 +203,7 @@ chkExtraRandomOrigin.text=Extra Random Planetary Origin chkExtraRandomOrigin.toolTipText=When selected random origin is randomized to the planetary level, rather than just randomizing to the system level (with the planet being the primary planet). lblOriginDistanceScale.text=Origin Distance Scaling Factor lblOriginDistanceScale.toolTipText=A scaling factor to apply to planetary distances during weighting when randomizing the faction and planetary origins. Values above 1.0 prefer the current location, while values closer to 0.1 spread out the faction selection. -# Units Panel +## Units Panel unitsPanel.title=Units chkGenerateUnitsAsAttached.text=Generate Units as Attached chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules. These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MW when they retire (provided the campaign options are enabled). @@ -214,13 +217,13 @@ lblStarLeagueYear.text=Star League Year lblStarLeagueYear.toolTipText=This is the year to use when rolling for Star League 'Mechs. Valid years are 2571 to 2780, with 2765 being the default. chkAssignTechsToUnits.text=Assign Techs to Units chkAssignTechsToUnits.toolTipText=This automatically assigns techs to units during company generation. -# Unit Panel +## Unit Panel unitPanel.title=Unit lblForceNamingType.text=Force Naming Type lblForceNamingType.toolTipText=This is the naming type used for lance and company names, producing names like "Baker Company", "Bravo Company", and "Beta Company". chkGenerateForceIcons.text=Generate Force Icons chkGenerateForceIcons.toolTipText=This will automatically create force icons for generated lances and companies, displaying the weight class, type, formation, and using the selected faction for background if possible. -# Spares Panel +## Spares Panel sparesPanel.title=Spares chkGenerateMothballedSpareUnits.text=Generate Mothballed Spare Units chkGenerateMothballedSpareUnits.toolTipText=This generates the specified percentage of active units as mothballed spares kept by the company to replace destroyed 'Mechs. @@ -236,13 +239,13 @@ lblNumberReloadsPerWeapon.text=Reloads per Weapon lblNumberReloadsPerWeapon.toolTipText=This is the number of reloads to generate per weapon requiring the specified ammunition type. chkGenerateFractionalMachineGunAmmunition.text=Generate Fractional Machine Gun Ammunition chkGenerateFractionalMachineGunAmmunition.toolTipText=Generate 50 rounds of machine gun ammunition per machine gun instead of the full ammunition bin of 200. -# Contracts Panel +## Contracts Panel contractsPanel.title=Contracts chkSelectStartingContract.text=Select Starting Contract chkSelectStartingContract.toolTipText=This enables a panel where the company's starting contract can be selected. (This panel will only show when there is not an active contract and the AtB contract market is enabled). chkStartCourseToContractPlanet.text=Start Course to Contract Planet chkStartCourseToContractPlanet.toolTipText=This automatically charts and starts the company's travel towards the planet of the selected contract. -# Finances Panel +## Finances Panel financesPanel.title=Finances lblStartingCash.text=Starting C-Bills lblStartingCash.toolTipText=The number of C-Bills to start with, minus expenses, if not randomizing the starting cash. @@ -266,7 +269,7 @@ chkPayForArmour.text=Pay for Armour chkPayForArmour.toolTipText=Pay for the spare armour generated, if any is generated chkPayForAmmunition.text=Pay for Ammunition chkPayForAmmunition.toolTipText=Pay for the spare ammunition generated, if any is generated. -# Option Validation Warnings +## Option Validation Warnings CompanyGenerationOptionsPanel.InvalidOptions.title=Error: Invalid Option Selection CompanyGenerationOptionsPanel.InvalidGenerationSize.text=You must select at least one company or independent lance to generate CompanyGenerationOptionsPanel.InvalidStartingPlanet.text=You must select a valid starting planet. @@ -276,7 +279,6 @@ CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text=The specified num CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.title=Under Half Maximum Support Personnel CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.text=The specified number of support personnel to generate is under half the recommended maximum number of support personnel. Select "Ok" to continue, or "Cancel" to make changes to these Company Generation Options. -## CompanyGenerationPanel Class +### CompanyGenerationPanel Class CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? CompanyGenerationPanel.ImmediateApplicationWarning.text=Confirm immediate generation and application to campaign? -CompanyGenerationPanel.OverwriteGenerationWarning.text=The new generation will overwrite the current generation. The previous data is not recoverable. Confirm generation? diff --git a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java index 5e93c35938..1a10d6066b 100644 --- a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java @@ -20,9 +20,9 @@ */ package mekhq.gui.dialog; -import megamek.common.annotations.Nullable; +import megamek.common.util.EncodeControl; import mekhq.MekHQ; -import mekhq.campaign.Campaign; +import mekhq.gui.enums.DialogResult; import mekhq.gui.preferences.JWindowPreference; import mekhq.preferences.PreferencesNode; @@ -32,6 +32,7 @@ import java.util.ResourceBundle; /* + * TODO : Windchild : Rewrite all comments * Base class for dialogs in MekHQ. This class handles setting the UI, * managing the Ok/Cancel buttons, managing the X button, and saving the dialog preferences. * @@ -56,20 +57,25 @@ public abstract class BaseDialog extends JDialog implements WindowListener { //endregion Variable Declarations //region Constructors - protected BaseDialog(final JFrame parent, final ResourceBundle resources) { - this(parent, false, resources, "dialog.text"); + protected BaseDialog(final JFrame frame, final String title) { + this(frame, ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()), title); } - protected BaseDialog(final JFrame parent, final ResourceBundle resources, final String title) { - this(parent, false, resources, title); + protected BaseDialog(final JFrame frame, final boolean modal, final String title) { + this(frame, modal, ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()), title); } - protected BaseDialog(final JFrame parent, final boolean modal, final ResourceBundle resources, + protected BaseDialog(final JFrame frame, final ResourceBundle resources, final String title) { + this(frame, false, resources, title); + } + + protected BaseDialog(final JFrame frame, final boolean modal, final ResourceBundle resources, final String title) { - super(parent, modal); + super(frame, modal); setTitle(resources.getString(title)); - setFrame(parent); + setFrame(frame); setResources(resources); + setResult(DialogResult.CANCELLED); // Default result is cancelled } //endregion Constructors @@ -96,17 +102,15 @@ private void setResources(final ResourceBundle resources) { //endregion Getters/Setters //region Initialization - protected void initialize() { - initialize(null); - } - /** * Initializes the dialog UI and preferences. Needs to be called by * child classes for initial setup. */ - protected void initialize(final @Nullable Campaign campaign) { + protected void initialize(final String name) { + setName(name); setLayout(new BorderLayout()); - add(createCenterPane(campaign), BorderLayout.CENTER); + + add(createCenterPane(), BorderLayout.CENTER); add(createButtonPanel(), BorderLayout.PAGE_END); pack(); @@ -115,7 +119,7 @@ protected void initialize(final @Nullable Campaign campaign) { setPreferences(); } - protected abstract Container createCenterPane(final @Nullable Campaign campaign); + protected abstract Container createCenterPane(); protected JPanel createButtonPanel() { JPanel panel = new JPanel(new GridLayout(1, 2)); @@ -155,7 +159,7 @@ protected void setCustomPreferences(final PreferencesNode preferences) { protected void okButtonActionPerformed(final ActionEvent evt) { okAction(); - setResult(DialogResult.OK); + setResult(DialogResult.CONFIRMED); setVisible(false); } @@ -173,7 +177,6 @@ protected void cancelButtonActionPerformed(final ActionEvent evt) { } catch (Exception e) { MekHQ.getLogger().error(e); } finally { - setResult(DialogResult.CANCEL); setVisible(false); } } @@ -194,8 +197,6 @@ public void windowClosing(final WindowEvent e) { cancelAction(); } catch (Exception ex) { MekHQ.getLogger().error(ex); - } finally { - setResult(DialogResult.CANCEL); } } diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index 0348b5080d..dadac798ee 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -62,6 +62,7 @@ import megamek.client.ui.swing.util.PlayerColour; import megamek.common.EquipmentType; import megamek.common.ITechnology; +import megamek.common.annotations.Nullable; import megamek.common.icons.AbstractIcon; import megamek.common.icons.Camouflage; import megamek.common.options.GameOptions; @@ -4252,11 +4253,15 @@ public void actionPerformed(ActionEvent e) { btnLoad.setText(resourceMap.getString("btnLoad.text")); btnLoad.setName("btnLoad"); - btnLoad.addActionListener(evt -> btnLoadActionPerformed()); - gridBagConstraints = new java.awt.GridBagConstraints(); + btnLoad.addActionListener(evt -> { + final CampaignPresetSelectionDialog presetSelectionDialog = new CampaignPresetSelectionDialog(frame); + presetSelectionDialog.setVisible(true); + applyPreset(presetSelectionDialog.getSelectedPreset()); + }); + gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; - gridBagConstraints.anchor = java.awt.GridBagConstraints.CENTER; + gridBagConstraints.anchor = GridBagConstraints.CENTER; gridBagConstraints.weightx = 0.25; getContentPane().add(btnLoad, gridBagConstraints); @@ -4296,7 +4301,11 @@ private void fillRankInfo() { } } - public void applyPreset(GamePreset gamePreset) { + public void applyPreset(final @Nullable GamePreset gamePreset) { + if (gamePreset == null) { + return; + } + // Handle CampaignOptions and RandomSkillPreferences setOptions(gamePreset.getOptions(), gamePreset.getRandomSkillPreferences()); @@ -4766,18 +4775,6 @@ private void removeRank() { } } - private void btnLoadActionPerformed() { - List presets = GamePreset.getGamePresetsIn(); - - if (!presets.isEmpty()) { - ChooseGamePresetDialog cgpd = new ChooseGamePresetDialog(null, true, presets); - cgpd.setVisible(true); - if (!cgpd.wasCancelled() && (cgpd.getSelectedPreset() != null)) { - applyPreset(cgpd.getSelectedPreset()); - } - } - } - private void btnSaveActionPerformed() { if (txtName.getText().length() == 0) { return; diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java new file mode 100644 index 0000000000..680e5b4518 --- /dev/null +++ b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.dialog; + +import megamek.common.annotations.Nullable; +import mekhq.campaign.GamePreset; +import mekhq.gui.view.CampaignPresetSelectionPanel; + +import javax.swing.*; +import java.awt.*; + +public class CampaignPresetSelectionDialog extends BaseDialog { + //region Variable Declarations + private CampaignPresetSelectionPanel presetSelectionPanel; + //endregion Variable Declarations + + //region Constructors + protected CampaignPresetSelectionDialog(final JFrame parent) { + super(parent, true, "CampaignPresetSelectionDialog.title"); + initialize("CampaignPresetSelectionDialog"); + } + //endregion Constructors + + //region Getters/Setters + public CampaignPresetSelectionPanel getPresetSelectionPanel() { + return presetSelectionPanel; + } + + public void setPresetSelectionPanel(final CampaignPresetSelectionPanel presetSelectionPanel) { + this.presetSelectionPanel = presetSelectionPanel; + } + + /** + * @return the selected preset, or null if the dialog was cancelled or no preset was selected + */ + public @Nullable GamePreset getSelectedPreset() { + return getResult().isConfirmed() ? getPresetSelectionPanel().getSelectedPreset() : null; + } + //endregion Getters/Setters + + //region Initialization + @Override + protected Container createCenterPane() { + setPresetSelectionPanel(new CampaignPresetSelectionPanel(GamePreset.getGamePresetsIn())); + return getPresetSelectionPanel(); + } + //endregion Initialization + + @Override + protected void okAction() { + + } + + @Override + protected void cancelAction() { + + } + + @Override + public void setVisible(final boolean visible) { + // Only show if there are presets to select from + super.setVisible(visible && (getPresetSelectionPanel().getPresets().getModel().getSize() > 0)); + } +} diff --git a/MekHQ/src/mekhq/gui/dialog/ChooseGamePresetDialog.java b/MekHQ/src/mekhq/gui/dialog/ChooseGamePresetDialog.java deleted file mode 100644 index ac03d7a724..0000000000 --- a/MekHQ/src/mekhq/gui/dialog/ChooseGamePresetDialog.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * ChooseGamePresetDialog.java - * - * Copyright (c) 2009 - Jay Lawson . All rights reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.dialog; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridBagLayout; -import java.util.ArrayList; -import java.util.List; -import java.util.ResourceBundle; - -import javax.swing.BorderFactory; -import javax.swing.ButtonGroup; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; - -import megamek.common.util.EncodeControl; -import mekhq.MekHQ; -import mekhq.campaign.GamePreset; -import mekhq.gui.preferences.JWindowPreference; -import mekhq.preferences.PreferencesNode; - -/** - * This dialog will allow the users to choose from a set of possible game presets - * @author Taharqa - */ -public class ChooseGamePresetDialog extends javax.swing.JDialog { - private static final long serialVersionUID = -8038099101234445018L; - - - private javax.swing.JPanel panButtons; - private javax.swing.JButton btnCancel; - private javax.swing.JButton btnOk; - - private List presets; - private List presetButtons; - private GamePreset selectedPreset; - private boolean cancelled; - - /** Creates new form NewTeamDialog */ - public ChooseGamePresetDialog(java.awt.Frame parent, boolean modal, List p) { - super(parent, modal); - presets = p; - cancelled = false; - selectedPreset = null; - initComponents(); - setLocationRelativeTo(parent); - setUserPreferences(); - } - - private void initComponents() { - java.awt.GridBagConstraints gridBagConstraints; - - panButtons = new javax.swing.JPanel(); - btnOk = new javax.swing.JButton(); - btnCancel = new javax.swing.JButton(); - presetButtons = new ArrayList<>(); - - JPanel mainPanel = new JPanel(new GridBagLayout()); - JScrollPane scrPane = new JScrollPane(mainPanel); - - ButtonGroup group = new ButtonGroup(); - - ResourceBundle resourceMap = ResourceBundle.getBundle("mekhq.resources.ChooseGamePresetDialog", new EncodeControl()); //$NON-NLS-1$ - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setName("Form"); // NOI18N - - getContentPane().setLayout(new BorderLayout()); - setTitle(resourceMap.getString("title")); - - int i = 0; - for (GamePreset preset : presets) { - JRadioButton presetButton = new JRadioButton(""); - presetButtons.add(presetButton); - presetButton.setSelected(i == 0); - group.add(presetButton); - JLabel label = new JLabel("" + preset.getTitle() + "
" + preset.getDescription() + ""); - - JPanel presetPanel = new JPanel(new BorderLayout()); - presetPanel.add(presetButton, BorderLayout.WEST); - presetPanel.add(label, BorderLayout.CENTER); - presetPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); - presetPanel.setPreferredSize(new Dimension(450, 100)); - - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 0; - gridBagConstraints.gridy = i; - gridBagConstraints.weightx = 1.0; - gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; - gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; - gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); - mainPanel.add(presetPanel, gridBagConstraints); - i++; - } - - panButtons.setName("panButtons"); - panButtons.setLayout(new GridBagLayout()); - - btnOk.setText(resourceMap.getString("btnOk.text")); // NOI18N - btnOk.setName("btnOk"); // NOI18N - btnOk.addActionListener(this::btnOkActionPerformed); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 0; - gridBagConstraints.gridy = 0; - gridBagConstraints.gridwidth = 1; - gridBagConstraints.weightx = 1.0; - gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; - gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0); - panButtons.add(btnOk, gridBagConstraints); - - btnCancel.setText(resourceMap.getString("btnCancel.text")); // NOI18N - btnCancel.setName("btnClose"); // NOI18N - btnCancel.addActionListener(this::btnCancelActionPerformed); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 1; - gridBagConstraints.gridy = 0; - gridBagConstraints.gridwidth = 1; - gridBagConstraints.weightx = 0.0; - gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; - gridBagConstraints.insets = new java.awt.Insets(5, 5, 0, 0); - panButtons.add(btnCancel, gridBagConstraints); - - scrPane.setPreferredSize(new Dimension(500, 430)); - - getContentPane().add(scrPane, BorderLayout.CENTER); - getContentPane().add(panButtons, BorderLayout.SOUTH); - - pack(); - } - - private void setUserPreferences() { - PreferencesNode preferences = MekHQ.getPreferences().forClass(ChooseGamePresetDialog.class); - - this.setName("dialog"); - preferences.manage(new JWindowPreference(this)); - } - - private void btnOkActionPerformed(java.awt.event.ActionEvent evt) { - int sel = 0; - for (JRadioButton button : presetButtons) { - if (button.isSelected()) { - selectedPreset = presets.get(sel); - break; - } - sel++; - } - - this.setVisible(false); - } - - private void btnCancelActionPerformed(java.awt.event.ActionEvent evt) { - cancelled = true; - this.setVisible(false); - } - - public boolean wasCancelled() { - return cancelled; - } - - public GamePreset getSelectedPreset() { - return selectedPreset; - } -} diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index ec1699d2f2..db27ff8cec 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -19,13 +19,9 @@ package mekhq.gui.dialog; import megamek.common.Entity; -import megamek.common.util.EncodeControl; import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.mission.Contract; -import mekhq.campaign.parts.AmmoStorage; -import mekhq.campaign.parts.Armor; -import mekhq.campaign.parts.Part; import mekhq.campaign.personnel.Person; import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; @@ -35,31 +31,37 @@ import javax.swing.*; import java.awt.*; import java.util.List; -import java.util.ResourceBundle; public class CompanyGenerationDialog extends BaseDialog { //region Variable Declarations + private Campaign campaign; private CompanyGenerationPanelType currentPanelType; private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; - private Campaign campaign; // TODO : Temp value //endregion Variable Declarations //region Constructors public CompanyGenerationDialog(final JFrame frame, final Campaign campaign) { - super(frame, ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()), - "CompanyGenerationDialog.title"); + super(frame, "CompanyGenerationDialog.title"); + setCampaign(campaign); setCurrentPanelType(CompanyGenerationPanelType.OPTIONS); - this.campaign = campaign; // TODO : Temp value - initialize(campaign); + initialize("CompanyGenerationDialog"); } //endregion Constructors //region Getters/Setters + public Campaign getCampaign() { + return campaign; + } + + public void setCampaign(final Campaign campaign) { + this.campaign = campaign; + } + public CompanyGenerationPanelType getCurrentPanelType() { return currentPanelType; } - public void setCurrentPanelType(CompanyGenerationPanelType currentPanelType) { + public void setCurrentPanelType(final CompanyGenerationPanelType currentPanelType) { this.currentPanelType = currentPanelType; } @@ -74,11 +76,10 @@ public void setCompanyGenerationOptionsPanel(final CompanyGenerationOptionsPanel //region Initialization /** - * @param campaign the campaign with which to create the center pane * @return the center pane */ @Override - protected Container createCenterPane(final Campaign campaign) { + protected Container createCenterPane() { switch (getCurrentPanelType()) { case PERSONNEL: case UNITS: @@ -89,7 +90,7 @@ protected Container createCenterPane(final Campaign campaign) { case OVERVIEW: case OPTIONS: default: - return new JScrollPane(initializeCompanyGenerationOptionsPanel(campaign)); + return new JScrollPane(initializeCompanyGenerationOptionsPanel(getCampaign())); } } @@ -158,13 +159,13 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { @Override protected void okAction() { final CompanyGenerationOptions options = getCompanyGenerationOptionsPanel().createOptionsFromPanel(); - final AbstractCompanyGenerator generator = options.getType().getGenerator(campaign, options); - final List combatPersonnel = generator.generateCombatPersonnel(campaign); - final List supportPersonnel = generator.generateSupportPersonnel(campaign); - final List entities = generator.generateUnits(campaign, combatPersonnel); - final List mothballedEntities = generator.generateMothballedEntities(campaign, entities); + final AbstractCompanyGenerator generator = options.getType().getGenerator(getCampaign(), options); + final List combatPersonnel = generator.generateCombatPersonnel(getCampaign()); + final List supportPersonnel = generator.generateSupportPersonnel(getCampaign()); + final List entities = generator.generateUnits(getCampaign(), combatPersonnel); + final List mothballedEntities = generator.generateMothballedEntities(getCampaign(), entities); final Contract contract = null; - generator.applyToCampaign(campaign, combatPersonnel, supportPersonnel, entities, mothballedEntities, contract); + generator.applyToCampaign(getCampaign(), combatPersonnel, supportPersonnel, entities, mothballedEntities, contract); } @Override diff --git a/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java b/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java index 94a6c56fdf..98848a24a4 100644 --- a/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java @@ -28,7 +28,6 @@ import java.io.FileInputStream; import java.io.IOException; import java.text.ParseException; -import java.util.List; import java.util.ResourceBundle; import java.util.concurrent.ExecutionException; @@ -215,17 +214,11 @@ public Campaign doInBackground() throws IOException, CampaignXmlParseException, setVisible(false); // Game Presets - GamePreset gamePreset = null; - List presets = GamePreset.getGamePresetsIn(); - if (!presets.isEmpty()) { - ChooseGamePresetDialog cgpd = new ChooseGamePresetDialog(frame, true, presets); - cgpd.setVisible(true); - gamePreset = cgpd.getSelectedPreset(); - } + final CampaignPresetSelectionDialog presetSelectionDialog = new CampaignPresetSelectionDialog(frame); + presetSelectionDialog.setVisible(true); + GamePreset gamePreset = presetSelectionDialog.getSelectedPreset(); CampaignOptionsDialog optionsDialog = new CampaignOptionsDialog(frame, true, campaign); - if (gamePreset != null) { - optionsDialog.applyPreset(gamePreset); - } + optionsDialog.applyPreset(gamePreset); optionsDialog.setVisible(true); if (optionsDialog.wasCancelled()) { cancelled = true; diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index 9087282ff4..3908cf5c34 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -20,10 +20,8 @@ */ package mekhq.gui.dialog; -import megamek.common.annotations.Nullable; import megamek.common.util.EncodeControl; import mekhq.MekHQ; -import mekhq.campaign.Campaign; import mekhq.campaign.event.MekHQOptionsChangedEvent; import mekhq.campaign.universe.enums.CompanyGenerationType; import mekhq.gui.enums.PersonnelFilterStyle; @@ -84,8 +82,9 @@ public class MekHqOptionsDialog extends BaseDialog { //region Constructors public MekHqOptionsDialog(JFrame parent) { - super(parent, ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog", new EncodeControl())); - initialize(); + super(parent, ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog", + new EncodeControl()), "dialog.text"); + initialize("MekHQOptionsDialog"); setInitialState(); } //endregion Constructors @@ -94,12 +93,9 @@ public MekHqOptionsDialog(JFrame parent) { /** * This dialog uses the following Mnemonics: * C, D, M, M, S, U, W, Y - * - * @param campaign this value will always be null for this dialog, unless the constructor is - * changed first */ @Override - protected Container createCenterPane(final @Nullable Campaign campaign) { + protected Container createCenterPane() { JTabbedPane optionsTabbedPane = new JTabbedPane(); optionsTabbedPane.setName("optionsTabbedPane"); optionsTabbedPane.add(resources.getString("displayTab.title"), new JScrollPane(createDisplayTab())); diff --git a/MekHQ/src/mekhq/gui/dialog/DialogResult.java b/MekHQ/src/mekhq/gui/enums/DialogResult.java similarity index 52% rename from MekHQ/src/mekhq/gui/dialog/DialogResult.java rename to MekHQ/src/mekhq/gui/enums/DialogResult.java index 01eaaba339..a9358cc4ad 100644 --- a/MekHQ/src/mekhq/gui/dialog/DialogResult.java +++ b/MekHQ/src/mekhq/gui/enums/DialogResult.java @@ -1,7 +1,7 @@ /* * DialogResult.java * - * Copyright (c) 2019 MekHQ Team. All rights reserved. + * Copyright (c) 2019-2021 The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -12,22 +12,27 @@ * * MekHQ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . + * along with MekHQ. If not, see . */ - -package mekhq.gui.dialog; +package mekhq.gui.enums; public enum DialogResult { - OK(1), - CANCEL(-1); + //region Enum Declarations + CONFIRMED, + CANCELLED; + //endregion Enum Declarations - private final int value; + //region Boolean Comparison Methods + public boolean isConfirmed() { + return this == CONFIRMED; + } - DialogResult(int value) { - this.value = value; + public boolean isCancelled() { + return this == CANCELLED; } + //endregion Boolean Comparison Methods } diff --git a/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java b/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java new file mode 100644 index 0000000000..39ae07e4f2 --- /dev/null +++ b/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.view; + +import mekhq.campaign.GamePreset; + +import javax.swing.*; +import java.awt.*; + +public class CampaignPresetRenderer extends JPanel implements ListCellRenderer { + //region Variable Declarations + private JLabel lblTitle; + private JTextArea description; + //endregion Variable Declarations + + //region Constructors + public CampaignPresetRenderer() { + initialize(); + } + //endregion Constructors + + //region Getters/Setters + public JLabel getLblTitle() { + return lblTitle; + } + + public void setLblTitle(JLabel lblTitle) { + this.lblTitle = lblTitle; + } + + public JTextArea getDescription() { + return description; + } + + public void setDescription(JTextArea description) { + this.description = description; + } + //endregion Getters/Setters + + //region Initialization + private void initialize() { + setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder(5, 5, 5, 5), + BorderFactory.createLineBorder(Color.BLACK, 2))); + setName("CampaignPreset"); + setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); + + setLblTitle(new JLabel()); + getLblTitle().setName("lblTitle"); + getLblTitle().setAlignmentX(Component.CENTER_ALIGNMENT); + add(getLblTitle()); + + setDescription(new JTextArea()); + getDescription().setName("description"); + getDescription().setEditable(false); + getDescription().setLineWrap(true); + getDescription().setWrapStyleWord(true); + add(getDescription()); + } + + @Override + public Component getListCellRendererComponent(final JList list, + final GamePreset value, final int index, + final boolean isSelected, + final boolean cellHasFocus) { + // JTextArea::setForeground and JTextArea::setBackground don't work properly with the default + // return, but by recreating the colour it works properly + final Color foreground = new Color(UIManager.getColor(isSelected + ? "Table.selectionForeground" : "Table.foreground").getRGB()); + final Color background = new Color(UIManager.getColor(isSelected + ? "Table.selectionBackground" : "Table.background").getRGB()); + setForeground(foreground); + setBackground(background); + getDescription().setForeground(foreground); + getDescription().setBackground(background); + + getLblTitle().setText(value.getTitle()); + getDescription().setText(value.getDescription()); + + return this; + } + //endregion Initialization + + @Override + public Dimension getMinimumSize() { + return new Dimension(300, 100); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(400, 120); + } +} diff --git a/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java b/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java new file mode 100644 index 0000000000..d8db79a27d --- /dev/null +++ b/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.view; + +import megamek.common.annotations.Nullable; +import mekhq.campaign.GamePreset; + +import javax.swing.*; +import java.awt.*; +import java.util.List; + +public class CampaignPresetSelectionPanel extends JPanel { + //region Variable Declarations + private JList presets; + //endregion Variable Declarations + + //region Constructors + public CampaignPresetSelectionPanel(final List presets) { + initialize(presets); + } + //endregion Constructors + + //region Getters/Setters + public JList getPresets() { + return presets; + } + + public void setPresets(final JList presets) { + this.presets = presets; + } + + public @Nullable GamePreset getSelectedPreset() { + return getPresets().getSelectedValue(); + } + //endregion Getters/Setters + + //region Initialization + private void initialize(final List presets) { + setName("campaignPresetSelectionPanel"); + setLayout(new GridLayout(1, 1)); + setMinimumSize(new Dimension(335, 130)); + setPreferredSize(new Dimension(500, 400)); + + DefaultListModel listModel = new DefaultListModel<>(); + listModel.addAll(presets); + + setPresets(new JList<>(listModel)); + getPresets().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + getPresets().setSelectedIndex(0); + getPresets().setLayoutOrientation(JList.VERTICAL); + getPresets().setCellRenderer(new CampaignPresetRenderer()); + + add(new JScrollPane(getPresets(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)); + } + //endregion Initialization +} From ad818d9e8a39e2a4d4fe6acdf39fd08e329971dc Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Tue, 16 Feb 2021 09:39:52 -0700 Subject: [PATCH 013/115] Starting to create a new Date Selector --- .../resources/mekhq/resources/GUI.properties | 3 + .../gui/dialog/AddOrEditKillEntryDialog.java | 6 +- .../dialog/AddOrEditMissionEntryDialog.java | 6 +- .../dialog/AddOrEditPersonnelEntryDialog.java | 6 +- MekHQ/src/mekhq/gui/dialog/BaseDialog.java | 29 ++++--- .../gui/dialog/CampaignOptionsDialog.java | 10 +-- .../dialog/CampaignPresetSelectionDialog.java | 2 +- .../gui/dialog/CustomizePersonDialog.java | 36 ++++---- .../gui/dialog/CustomizeScenarioDialog.java | 16 ++-- .../mekhq/gui/dialog/DataLoadingDialog.java | 7 +- MekHQ/src/mekhq/gui/dialog/DateChooser.java | 48 ++--------- .../mekhq/gui/dialog/DateSelectionDialog.java | 84 +++++++++++++++++++ .../gui/dialog/EditTransactionDialog.java | 6 +- .../mekhq/gui/dialog/NewCampaignDialog.java | 4 + .../mekhq/gui/dialog/NewContractDialog.java | 11 ++- .../gui/dialog/NewPlanetaryEventDialog.java | 9 +- .../gui/view/CampaignPresetRenderer.java | 4 +- .../view/CampaignPresetSelectionPanel.java | 9 +- .../mekhq/gui/view/DateSelectionPanel.java | 45 ++++++++++ 19 files changed, 218 insertions(+), 123 deletions(-) create mode 100644 MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java create mode 100644 MekHQ/src/mekhq/gui/dialog/NewCampaignDialog.java create mode 100644 MekHQ/src/mekhq/gui/view/DateSelectionPanel.java diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 9504aefab9..e4c168f0db 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -18,6 +18,9 @@ CampaignPresetSelectionDialog.title=Select Campaign Preset ### CompanyGenerationDialog Class CompanyGenerationDialog.title=Company Generator +### DateSelectionDialog Class +DateSelectionDialog.title=Select Date + ### GMToolsDialog ## Dice Panel dicePanel.text=Dice Roller diff --git a/MekHQ/src/mekhq/gui/dialog/AddOrEditKillEntryDialog.java b/MekHQ/src/mekhq/gui/dialog/AddOrEditKillEntryDialog.java index b512abca43..906052c8a1 100644 --- a/MekHQ/src/mekhq/gui/dialog/AddOrEditKillEntryDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/AddOrEditKillEntryDialog.java @@ -202,9 +202,9 @@ private void btnCloseActionPerformed(ActionEvent evt) { } private void changeDate() { - DateChooser dc = new DateChooser(frame, date); - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - date = dc.getDate(); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, date); + if (dateSelectionDialog.showDialog().isConfirmed()) { + date = dateSelectionDialog.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/AddOrEditMissionEntryDialog.java b/MekHQ/src/mekhq/gui/dialog/AddOrEditMissionEntryDialog.java index 4a3d370a8f..2197cc4d28 100644 --- a/MekHQ/src/mekhq/gui/dialog/AddOrEditMissionEntryDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/AddOrEditMissionEntryDialog.java @@ -158,9 +158,9 @@ private void setUserPreferences() { } private void changeDate() { - DateChooser dc = new DateChooser(frame, newDate); - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - newDate = dc.getDate(); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, newDate); + if (dateSelectionDialog.showDialog().isConfirmed()) { + newDate = dateSelectionDialog.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(newDate)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/AddOrEditPersonnelEntryDialog.java b/MekHQ/src/mekhq/gui/dialog/AddOrEditPersonnelEntryDialog.java index 3c8f637db5..a052d98216 100644 --- a/MekHQ/src/mekhq/gui/dialog/AddOrEditPersonnelEntryDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/AddOrEditPersonnelEntryDialog.java @@ -180,9 +180,9 @@ private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) { } private void changeDate() { - DateChooser dc = new DateChooser(frame, date); - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - date = dc.getDate(); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, date); + if (dateSelectionDialog.showDialog().isConfirmed()) { + date = dateSelectionDialog.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java index 1a10d6066b..4149e124ea 100644 --- a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java @@ -32,7 +32,7 @@ import java.util.ResourceBundle; /* - * TODO : Windchild : Rewrite all comments + * TODO : Windchild : Rewrite this comment * Base class for dialogs in MekHQ. This class handles setting the UI, * managing the Ok/Cancel buttons, managing the X button, and saving the dialog preferences. * @@ -103,8 +103,8 @@ private void setResources(final ResourceBundle resources) { //region Initialization /** - * Initializes the dialog UI and preferences. Needs to be called by - * child classes for initial setup. + * Initializes the dialog's UI and preferences. Needs to be called by child classes for initial + * setup. */ protected void initialize(final String name) { setName(name); @@ -145,10 +145,10 @@ private void setPreferences() { } /** - * Adds custom preferences to this dialog. + * Adds custom preferences to the child dialog. * * By default, this dialog will track preferences related to the size - * and position of the dialog. Other preferences should be added by overriding + * and position of the dialog. Other preferences can be added by overriding * this method. * @param preferences the preference node for this dialog */ @@ -164,12 +164,12 @@ protected void okButtonActionPerformed(final ActionEvent evt) { } /** - * Action performed when the ok button is clicked. + * Action performed when the Ok button is clicked. */ protected abstract void okAction(); /** - * Notes: cancelling a dialog should always allow to close the dialog. + * Note: Cancelling a dialog should always allow one to close the dialog. */ protected void cancelButtonActionPerformed(final ActionEvent evt) { try { @@ -182,14 +182,23 @@ protected void cancelButtonActionPerformed(final ActionEvent evt) { } /** - * Action performed when the cancel button is clicked or - * when the dialog is closed by the X button. + * Action performed when the Cancel button is clicked, the dialog is closed by the X button, or + * the escape key is pressed */ protected abstract void cancelAction(); + /** + * Sets the dialog to be visible, before returning the result + * @return the result of showing the dialog + */ + public DialogResult showDialog() { + setVisible(true); + return getResult(); + } + //region WindowEvents /** - * Notes: closing the dialog should always allow you to close the dialog. + * Note: Closing the dialog should always allow one to close the dialog. */ @Override public void windowClosing(final WindowEvent e) { diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index dadac798ee..cc3255e685 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -5232,11 +5232,11 @@ public boolean wasCancelled() { } private void btnDateActionPerformed(ActionEvent evt) { - // show the date chooser - DateChooser dc = new DateChooser(frame, date); - // user can either choose a date or cancel by closing - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - date = dc.getDate(); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, date); + // Only overwrite here when it is confirmed with a different date + if (dateSelectionDialog.showDialog().isConfirmed() + && !date.equals(dateSelectionDialog.getDate())) { + date = dateSelectionDialog.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); factionModel = new SortedComboBoxModel<>(); for (String sname : Factions.getInstance().getChoosableFactionCodes()) { diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java index 680e5b4518..cf1c625e46 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java @@ -57,7 +57,7 @@ public void setPresetSelectionPanel(final CampaignPresetSelectionPanel presetSel //region Initialization @Override protected Container createCenterPane() { - setPresetSelectionPanel(new CampaignPresetSelectionPanel(GamePreset.getGamePresetsIn())); + setPresetSelectionPanel(new CampaignPresetSelectionPanel()); return getPresetSelectionPanel(); } //endregion Initialization diff --git a/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java b/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java index 018c254218..9e36a7e750 100644 --- a/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java @@ -1247,43 +1247,35 @@ private void changeValueEnabled(String type) { skillBonus.get(type).setEnabled(skillChks.get(type).isSelected()); } - private void btnDateActionPerformed(ActionEvent evt) { - // show the date chooser - DateChooser dc = new DateChooser(frame, birthdate); - // user can either choose a date or cancel by closing - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - birthdate = dc.getDate(); + private void btnDateActionPerformed(final ActionEvent evt) { + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, birthdate); + if (dateSelectionDialog.showDialog().isConfirmed()) { + birthdate = dateSelectionDialog.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(birthdate)); lblAge.setText(getAge() + " " + resourceMap.getString("age")); } } - private void btnServiceDateActionPerformed(ActionEvent evt) { - // show the date chooser - DateChooser dc = new DateChooser(frame, recruitment); - // user can either choose a date or cancel by closing - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - recruitment = dc.getDate(); + private void btnServiceDateActionPerformed(final ActionEvent evt) { + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, recruitment); + if (dateSelectionDialog.showDialog().isConfirmed()) { + recruitment = dateSelectionDialog.getDate(); btnServiceDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(recruitment)); } } private void btnRankDateActionPerformed() { - // show the date chooser - DateChooser dc = new DateChooser(frame, lastRankChangeDate); - // user can either choose a date or cancel by closing - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - lastRankChangeDate = dc.getDate(); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, lastRankChangeDate); + if (dateSelectionDialog.showDialog().isConfirmed()) { + lastRankChangeDate = dateSelectionDialog.getDate(); btnRankDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(lastRankChangeDate)); } } private void btnRetirementDateActionPerformed() { - // show the date chooser - DateChooser dc = new DateChooser(frame, retirement); - // user can either choose a date or cancel by closing - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - retirement = dc.getDate(); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, retirement); + if (dateSelectionDialog.showDialog().isConfirmed()) { + retirement = dateSelectionDialog.getDate(); btnRetirementDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(retirement)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/CustomizeScenarioDialog.java b/MekHQ/src/mekhq/gui/dialog/CustomizeScenarioDialog.java index 99ebda0ecc..ee73d64ca8 100644 --- a/MekHQ/src/mekhq/gui/dialog/CustomizeScenarioDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CustomizeScenarioDialog.java @@ -373,21 +373,19 @@ private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) { } private void changeDate() { - // show the date chooser - DateChooser dc = new DateChooser(frame, date); - // user can either choose a date or cancel by closing - if (dc.showDateChooser() == DateChooser.OK_OPTION) { + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, date); + if (dateSelectionDialog.showDialog().isConfirmed()) { if (scenario.isCurrent()) { - if (dc.getDate().isBefore(campaign.getLocalDate())) { + if (dateSelectionDialog.getDate().isBefore(campaign.getLocalDate())) { JOptionPane.showMessageDialog(frame, "You cannot choose a date before the current date for a pending battle.", "Invalid date", JOptionPane.ERROR_MESSAGE); return; } else { - LocalDate nextMonday = campaign.getLocalDate().with(TemporalAdjusters.next(DayOfWeek.MONDAY)); + final LocalDate nextMonday = campaign.getLocalDate().with(TemporalAdjusters.next(DayOfWeek.MONDAY)); - if (!dc.getDate().isBefore(nextMonday)) { + if (!dateSelectionDialog.getDate().isBefore(nextMonday)) { JOptionPane.showMessageDialog(frame, "You cannot choose a date beyond the current week.", "Invalid date", @@ -395,14 +393,14 @@ private void changeDate() { return; } } - } else if (dc.getDate().isAfter(campaign.getLocalDate())) { + } else if (dateSelectionDialog.getDate().isAfter(campaign.getLocalDate())) { JOptionPane.showMessageDialog(frame, "You cannot choose a date after the current date.", "Invalid date", JOptionPane.ERROR_MESSAGE); return; } - date = dc.getDate(); + date = dateSelectionDialog.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java b/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java index 98848a24a4..e41c3340fd 100644 --- a/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java @@ -203,10 +203,9 @@ public Campaign doInBackground() throws IOException, CampaignXmlParseException, setProgress(4); if (newCampaign) { // show the date chooser - DateChooser dc = new DateChooser(frame, campaign.getLocalDate()); - // user can either choose a date or cancel by closing - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - campaign.setLocalDate(dc.getDate()); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, campaign.getLocalDate()); + if (dateSelectionDialog.showDialog().isConfirmed()) { + campaign.setLocalDate(dateSelectionDialog.getDate()); campaign.getGameOptions().getOption("year").setValue(campaign.getGameYear()); } diff --git a/MekHQ/src/mekhq/gui/dialog/DateChooser.java b/MekHQ/src/mekhq/gui/dialog/DateChooser.java index e5e1babbcb..263edcfb04 100644 --- a/MekHQ/src/mekhq/gui/dialog/DateChooser.java +++ b/MekHQ/src/mekhq/gui/dialog/DateChooser.java @@ -20,8 +20,6 @@ import javax.swing.text.DefaultFormatterFactory; import mekhq.MekHQ; -import mekhq.gui.preferences.JWindowPreference; -import mekhq.preferences.PreferencesNode; /** * Hovanes Gambaryan Henry Demirchian CSUN, CS 585 Professor Mike Barnes @@ -50,10 +48,6 @@ * == DateChooser.OK_OPTION) { date = dc.getDate(); } */ public class DateChooser extends JDialog implements ActionListener, FocusListener, KeyListener { - private static final long serialVersionUID = 4353945278962427075L; - public static final int OK_OPTION = 1; - public static final int CANCEL_OPTION = 2; - private static final List monthNames; static { monthNames = new ArrayList<>(12); @@ -66,7 +60,7 @@ public class DateChooser extends JDialog implements ActionListener, FocusListene monthNames.add("July"); monthNames.add("August"); monthNames.add("September"); - monthNames.add("October "); + monthNames.add("October"); monthNames.add("November"); monthNames.add("December"); } @@ -76,7 +70,6 @@ public class DateChooser extends JDialog implements ActionListener, FocusListene private JLabel monthLabel; private JLabel yearLabel; private JPanel dayGrid; - private boolean ready; // Stores the user-input date. private JFormattedTextField dateField; @@ -119,6 +112,7 @@ public DateChooser(JFrame owner, LocalDate d) { // build the panel with year and navigation buttons yearPane.add(navButton[2] = new JButton("<<")); + // Month::getDisplayName yearPane.add( yearLabel = new JLabel(String.valueOf(date.getYear()), JLabel.CENTER), BorderLayout.CENTER); @@ -176,41 +170,10 @@ public String valueToString(Object value) { dateField.setColumns(10); setResizable(false); - ready = false; pack(); // center this dialog over the owner setLocationRelativeTo(owner); - setUserPreferences(); - } - - private void setUserPreferences() { - PreferencesNode preferences = MekHQ.getPreferences().forClass(DateChooser.class); - - this.setName("dialog"); - preferences.manage(new JWindowPreference(this)); - } - - /** - * Return the last selected date for this instance of DateChooser - */ - public LocalDate getDate() { - return date; - } - - /** - * Displays a DateChooser dialog on the screen. If a new date is selected - * returnsor OK_OPTION. If the action is canceled returns CANCEL_OPTION. - * Both of the returned values are defined as static constants. - */ - public int showDateChooser() { - ready = false; - setVisible(true); - if (ready) { - return OK_OPTION; - } else { - return CANCEL_OPTION; - } } /** @@ -267,10 +230,8 @@ public void actionPerformed(ActionEvent evt) { y = Integer.parseInt(yearLabel.getText()); d = Integer.parseInt(label); } catch (NumberFormatException e) { - MekHQ.getLogger().error(getClass(), "actionPerformed", e); } date = LocalDate.of(y, m, d); - ready = true; //Set the date field to the new date. dateField.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); @@ -287,7 +248,6 @@ public void actionPerformed(ActionEvent evt) { */ private void setDate(LocalDate date) { this.date = date; - ready = true; monthLabel.setText(monthNames.get(date.getMonth().ordinal())); yearLabel.setText(String.valueOf(date.getYear())); dateField.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); @@ -492,7 +452,9 @@ public void keyReleased(KeyEvent e) { private void updateDateFromDateField() { LocalDate newDate = parseDate(dateField.getText()); if (newDate == null) { - JOptionPane.showMessageDialog(this, "Invalid Date Format\nTry: yyyy-MM-dd", "Date Format", JOptionPane.WARNING_MESSAGE); + JOptionPane.showMessageDialog(this, + "Invalid Date Format\nTry: yyyy-MM-dd", "Date Format", + JOptionPane.WARNING_MESSAGE); return; } setDate(newDate); diff --git a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java new file mode 100644 index 0000000000..31365552ba --- /dev/null +++ b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.dialog; + +import mekhq.gui.view.DateSelectionPanel; + +import javax.swing.*; +import java.awt.*; +import java.time.LocalDate; + +public class DateSelectionDialog extends BaseDialog { + //region Variable Declarations + private LocalDate initialDate; + + private DateSelectionPanel dateSelectionPanel; + //endregion Variable Declarations + + //region Constructors + public DateSelectionDialog(final JFrame frame, final LocalDate initialDate) { + super(frame, "DateSelectionDialog.title"); + setInitialDate(initialDate); + initialize("DateSelectionDialog"); + } + //endregion Constructors + + //region Getters/Setters + public LocalDate getInitialDate() { + return initialDate; + } + + public void setInitialDate(LocalDate initialDate) { + this.initialDate = initialDate; + } + + public DateSelectionPanel getDateSelectionPanel() { + return dateSelectionPanel; + } + + public void setDateSelectionPanel(final DateSelectionPanel dateSelectionPanel) { + this.dateSelectionPanel = dateSelectionPanel; + } + + /** + * @return the specified date + */ + public LocalDate getDate() { + return getResult().isConfirmed() ? getDateSelectionPanel().getDate() : getInitialDate(); + } + //endregion Getters/Setters + + //region Initialization + @Override + protected Container createCenterPane() { + setDateSelectionPanel(new DateSelectionPanel(getInitialDate())); + return getDateSelectionPanel(); + } + //endregion Initialization + + @Override + protected void okAction() { + + } + + @Override + protected void cancelAction() { + + } +} diff --git a/MekHQ/src/mekhq/gui/dialog/EditTransactionDialog.java b/MekHQ/src/mekhq/gui/dialog/EditTransactionDialog.java index 2327956ca7..07149e65d3 100644 --- a/MekHQ/src/mekhq/gui/dialog/EditTransactionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/EditTransactionDialog.java @@ -199,9 +199,9 @@ public void actionPerformed(ActionEvent e) { } else if (cancelButton.equals(e.getSource())) { setVisible(false); } else if (dateButton.equals(e.getSource())) { - DateChooser chooser = new DateChooser(parent, newTransaction.getDate()); - if (chooser.showDateChooser() == DateChooser.OK_OPTION) { - dateButton.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(chooser.getDate())); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(parent, getNewTransaction().getDate()); + if (dateSelectionDialog.showDialog().isConfirmed()) { + dateButton.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(dateSelectionDialog.getDate())); } } } diff --git a/MekHQ/src/mekhq/gui/dialog/NewCampaignDialog.java b/MekHQ/src/mekhq/gui/dialog/NewCampaignDialog.java new file mode 100644 index 0000000000..667369b577 --- /dev/null +++ b/MekHQ/src/mekhq/gui/dialog/NewCampaignDialog.java @@ -0,0 +1,4 @@ +package mekhq.gui.dialog; + +public class NewCampaignDialog { +} diff --git a/MekHQ/src/mekhq/gui/dialog/NewContractDialog.java b/MekHQ/src/mekhq/gui/dialog/NewContractDialog.java index 460d8b909c..13eb10c0cc 100644 --- a/MekHQ/src/mekhq/gui/dialog/NewContractDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/NewContractDialog.java @@ -662,18 +662,17 @@ protected void btnOKActionPerformed(ActionEvent evt) { } private void changeStartDate() { - // show the date chooser - DateChooser dc = new DateChooser(frame, contract.getStartDate()); - // user can either choose a date or cancel by closing - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - if (campaign.getLocalDate().isAfter(dc.getDate())) { + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, contract.getStartDate()); + if (dateSelectionDialog.showDialog().isConfirmed() + && !contract.getStartDate().equals(dateSelectionDialog.getDate())) { + if (campaign.getLocalDate().isAfter(dateSelectionDialog.getDate())) { JOptionPane.showMessageDialog(frame, "You cannot choose a start date before the current date.", "Invalid date", JOptionPane.ERROR_MESSAGE); return; } - contract.setStartDate(dc.getDate()); + contract.setStartDate(dateSelectionDialog.getDate()); contract.calculateContract(campaign); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(contract.getStartDate())); } diff --git a/MekHQ/src/mekhq/gui/dialog/NewPlanetaryEventDialog.java b/MekHQ/src/mekhq/gui/dialog/NewPlanetaryEventDialog.java index ea90bb47db..340066259d 100644 --- a/MekHQ/src/mekhq/gui/dialog/NewPlanetaryEventDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/NewPlanetaryEventDialog.java @@ -164,14 +164,15 @@ public void actionPerformed(ActionEvent e) { dateButton = new JButton(new AbstractAction() { private static final long serialVersionUID = 5708871251030417524L; { - putValue(SHORT_DESCRIPTION, resourceMap.getString("setDay.tooltip")); //$NON-NLS-1$ + putValue(SHORT_DESCRIPTION, resourceMap.getString("setDay.tooltip")); } @Override public void actionPerformed(ActionEvent e) { - DateChooser dc = new DateChooser((content instanceof JFrame) ? (JFrame) content : null, date); - if (dc.showDateChooser() == DateChooser.OK_OPTION) { - date = dc.getDate(); + final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog( + ((content instanceof JFrame) ? (JFrame) content : null), date); + if (dateSelectionDialog.showDialog().isConfirmed() && !date.equals(dateSelectionDialog.getDate())) { + date = dateSelectionDialog.getDate(); updateDate(); } } diff --git a/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java b/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java index 39ae07e4f2..14788129f4 100644 --- a/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java +++ b/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java @@ -40,7 +40,7 @@ public JLabel getLblTitle() { return lblTitle; } - public void setLblTitle(JLabel lblTitle) { + public void setLblTitle(final JLabel lblTitle) { this.lblTitle = lblTitle; } @@ -48,7 +48,7 @@ public JTextArea getDescription() { return description; } - public void setDescription(JTextArea description) { + public void setDescription(final JTextArea description) { this.description = description; } //endregion Getters/Setters diff --git a/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java b/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java index d8db79a27d..3bcf6b0a71 100644 --- a/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java +++ b/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java @@ -23,7 +23,6 @@ import javax.swing.*; import java.awt.*; -import java.util.List; public class CampaignPresetSelectionPanel extends JPanel { //region Variable Declarations @@ -31,8 +30,8 @@ public class CampaignPresetSelectionPanel extends JPanel { //endregion Variable Declarations //region Constructors - public CampaignPresetSelectionPanel(final List presets) { - initialize(presets); + public CampaignPresetSelectionPanel() { + initialize(); } //endregion Constructors @@ -51,14 +50,14 @@ public void setPresets(final JList presets) { //endregion Getters/Setters //region Initialization - private void initialize(final List presets) { + private void initialize() { setName("campaignPresetSelectionPanel"); setLayout(new GridLayout(1, 1)); setMinimumSize(new Dimension(335, 130)); setPreferredSize(new Dimension(500, 400)); DefaultListModel listModel = new DefaultListModel<>(); - listModel.addAll(presets); + listModel.addAll(GamePreset.getGamePresetsIn()); setPresets(new JList<>(listModel)); getPresets().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); diff --git a/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java b/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java new file mode 100644 index 0000000000..3128f1e702 --- /dev/null +++ b/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.view; + +import javax.swing.*; +import java.time.LocalDate; + +public class DateSelectionPanel extends JPanel { + //region Variable Declarations + //endregion Variable Declarations + + //region Constructors + public DateSelectionPanel(final LocalDate date) { + initialize(date); + } + //endregion Constructors + + //region Getters/Setters + public LocalDate getDate() { + return date; + } + //endregion Getters/Setters + + //region Initialization + private void initialize(final LocalDate date) { + + } + //endregion Initialization +} From a3d467692d6d73dbac4257782b40baf6261acdda Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 19 Feb 2021 13:25:01 -0700 Subject: [PATCH 014/115] Splitting BaseDialog into BaseDialog and BaseButtonDialog --- MekHQ/src/mekhq/gui/CampaignGUI.java | 11 +- .../mekhq/gui/dialog/BaseButtonDialog.java | 132 ++++++++++++++++++ MekHQ/src/mekhq/gui/dialog/BaseDialog.java | 93 ++++-------- .../dialog/CampaignPresetSelectionDialog.java | 14 +- .../gui/dialog/CompanyGenerationDialog.java | 9 +- .../mekhq/gui/dialog/DateSelectionDialog.java | 12 +- .../mekhq/gui/dialog/MekHqOptionsDialog.java | 11 +- .../mekhq/gui/view/DateSelectionPanel.java | 2 + 8 files changed, 173 insertions(+), 111 deletions(-) create mode 100644 MekHQ/src/mekhq/gui/dialog/BaseButtonDialog.java diff --git a/MekHQ/src/mekhq/gui/CampaignGUI.java b/MekHQ/src/mekhq/gui/CampaignGUI.java index ebe47ab8c1..471f71c43b 100644 --- a/MekHQ/src/mekhq/gui/CampaignGUI.java +++ b/MekHQ/src/mekhq/gui/CampaignGUI.java @@ -671,19 +671,19 @@ private void initMenu() { miMercRoster.addActionListener(evt -> showMercRosterDialog()); menuFile.add(miMercRoster); - JMenuItem menuOptions = new JMenuItem(resourceMap.getString("menuOptions.text")); // NOI18N + JMenuItem menuOptions = new JMenuItem(resourceMap.getString("menuOptions.text")); menuOptions.setMnemonic(KeyEvent.VK_C); menuOptions.addActionListener(this::menuOptionsActionPerformed); menuFile.add(menuOptions); - JMenuItem menuOptionsMM = new JMenuItem(resourceMap.getString("menuOptionsMM.text")); // NOI18N + JMenuItem menuOptionsMM = new JMenuItem(resourceMap.getString("menuOptionsMM.text")); menuOptionsMM.setMnemonic(KeyEvent.VK_M); menuOptionsMM.addActionListener(this::menuOptionsMMActionPerformed); menuFile.add(menuOptionsMM); JMenuItem menuMekHqOptions = new JMenuItem(resourceMap.getString("menuMekHqOptions.text")); menuMekHqOptions.setMnemonic(KeyEvent.VK_H); - menuMekHqOptions.addActionListener(this::menuMekHqOptionsActionPerformed); + menuMekHqOptions.addActionListener(evt -> new MekHqOptionsDialog(getFrame()).setVisible(true)); menuFile.add(menuMekHqOptions); menuThemes = new JMenu(resourceMap.getString("menuThemes.text")); @@ -1475,11 +1475,6 @@ private void menuOptionsMMActionPerformed(java.awt.event.ActionEvent evt) { } } - private void menuMekHqOptionsActionPerformed(ActionEvent evt) { - MekHqOptionsDialog dialog = new MekHqOptionsDialog(getFrame()); - dialog.setVisible(true); - } - private void miLoadForcesActionPerformed(java.awt.event.ActionEvent evt) { loadListFile(true); } diff --git a/MekHQ/src/mekhq/gui/dialog/BaseButtonDialog.java b/MekHQ/src/mekhq/gui/dialog/BaseButtonDialog.java new file mode 100644 index 0000000000..34d763f9c9 --- /dev/null +++ b/MekHQ/src/mekhq/gui/dialog/BaseButtonDialog.java @@ -0,0 +1,132 @@ +/* + * BaseButtonDialog.java + * + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.dialog; + +import megamek.common.util.EncodeControl; +import mekhq.gui.enums.DialogResult; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.ResourceBundle; + +/** + * This is the Base Dialog for a dialog with buttons in MekHQ. It extends Base Dialog, and adds a + * button panel with base Ok and Cancel buttons. It also includes an enum tracker for the result of + * the dialog. + * + * The resources associated with this dialog need to contain at least the following keys: + * - "Ok" -> text for the ok button + * - "Cancel" -> text for the cancel button + */ +public abstract class BaseButtonDialog extends BaseDialog { + //region Variable Declarations + private DialogResult result; + //endregion Variable Declarations + + //region Constructors + protected BaseButtonDialog(final JFrame frame, final String title) { + this(frame, true, title); + } + + protected BaseButtonDialog(final JFrame frame, final boolean modal, final String title) { + this(frame, modal, ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()), title); + } + + protected BaseButtonDialog(final JFrame frame, final ResourceBundle resources, final String title) { + this(frame, true, resources, title); + } + + protected BaseButtonDialog(final JFrame frame, final boolean modal, final ResourceBundle resources, + final String title) { + super(frame, modal, resources, title); + setResult(DialogResult.CANCELLED); // Default result is cancelled + } + //endregion Constructors + + //region Getters/Setters + public DialogResult getResult() { + return result; + } + + public void setResult(final DialogResult result) { + this.result = result; + } + //endregion Getters/Setters + + //region Initialization + /** + * Initializes the dialog's UI and preferences. Needs to be called by child classes for initial + * setup. + */ + @Override + protected void initialize(final String name) { + setName(name); + setLayout(new BorderLayout()); + + add(createCenterPane(), BorderLayout.CENTER); + add(createButtonPanel(), BorderLayout.PAGE_END); + + finalizeInitialization(); + } + + protected JPanel createButtonPanel() { + JPanel panel = new JPanel(new GridLayout(1, 2)); + + JButton okButton = new JButton(resources.getString("Ok")); + okButton.setName("okButton"); + okButton.addActionListener(this::okButtonActionPerformed); + panel.add(okButton); + + + JButton cancelButton = new JButton(resources.getString("Cancel")); + cancelButton.setName("cancelButton"); + cancelButton.addActionListener(this::cancelActionPerformed); + panel.add(cancelButton); + + return panel; + } + //endregion Initialization + + //region Button Actions + protected void okButtonActionPerformed(final ActionEvent evt) { + okAction(); + setResult(DialogResult.CONFIRMED); + setVisible(false); + } + + /** + * Action performed when the Ok button is clicked. + */ + protected void okAction() { + + } + //endregion Button Actions + + /** + * Sets the dialog to be visible, before returning the result + * @return the result of showing the dialog + */ + public DialogResult showDialog() { + setVisible(true); + return getResult(); + } +} diff --git a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java index 4149e124ea..adc6d0c1c4 100644 --- a/MekHQ/src/mekhq/gui/dialog/BaseDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/BaseDialog.java @@ -22,7 +22,6 @@ import megamek.common.util.EncodeControl; import mekhq.MekHQ; -import mekhq.gui.enums.DialogResult; import mekhq.gui.preferences.JWindowPreference; import mekhq.preferences.PreferencesNode; @@ -31,51 +30,41 @@ import java.awt.event.*; import java.util.ResourceBundle; -/* - * TODO : Windchild : Rewrite this comment - * Base class for dialogs in MekHQ. This class handles setting the UI, - * managing the Ok/Cancel buttons, managing the X button, and saving the dialog preferences. +/** + * This is the base class for dialogs in MekHQ. This class handles setting the UI, managing the X + * button, managing the escape key, and saving the dialog preferences. * * A class that inherits from this class needs to at least implement the method - * setCustomUI which will create the custom UI dialog. - * The methods setCustomPreferences, okAction, and cancelAction allow to customize + * createCenterPane to create the dialog's custom center pane. + * The methods setCustomPreferences and cancelAction allow one to customize * further the behavior of the dialog by child classes. * * The dialog will be constructed by the child class calling the initialize method. - * - * The resources associated with this dialog need to contain at least the following keys: - * - dialog.text -> title of the dialog - * - okButton.text -> text for the ok button - * - cancelButton.text -> text for the cancel button */ public abstract class BaseDialog extends JDialog implements WindowListener { //region Variable Declarations private JFrame frame; - private DialogResult result; + + protected static final String CLOSE_ACTION = "closeAction"; protected ResourceBundle resources; //endregion Variable Declarations //region Constructors protected BaseDialog(final JFrame frame, final String title) { - this(frame, ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()), title); + this(frame, false, title); } protected BaseDialog(final JFrame frame, final boolean modal, final String title) { this(frame, modal, ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()), title); } - protected BaseDialog(final JFrame frame, final ResourceBundle resources, final String title) { - this(frame, false, resources, title); - } - protected BaseDialog(final JFrame frame, final boolean modal, final ResourceBundle resources, final String title) { super(frame, modal); setTitle(resources.getString(title)); setFrame(frame); setResources(resources); - setResult(DialogResult.CANCELLED); // Default result is cancelled } //endregion Constructors @@ -88,14 +77,6 @@ public void setFrame(final JFrame frame) { this.frame = frame; } - public DialogResult getResult() { - return result; - } - - public void setResult(final DialogResult result) { - this.result = result; - } - private void setResources(final ResourceBundle resources) { this.resources = resources; } @@ -111,31 +92,31 @@ protected void initialize(final String name) { setLayout(new BorderLayout()); add(createCenterPane(), BorderLayout.CENTER); - add(createButtonPanel(), BorderLayout.PAGE_END); - - pack(); - addWindowListener(this); - setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - setPreferences(); + finalizeInitialization(); } protected abstract Container createCenterPane(); - protected JPanel createButtonPanel() { - JPanel panel = new JPanel(new GridLayout(1, 2)); - - JButton okButton = new JButton(resources.getString("Ok")); - okButton.setName("okButton"); - okButton.addActionListener(this::okButtonActionPerformed); - panel.add(okButton); + protected void finalizeInitialization() { + pack(); + // Escape keypress + final KeyStroke escape = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); + //getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(escape, CLOSE_ACTION); + getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape, CLOSE_ACTION); + getRootPane().getInputMap(JComponent.WHEN_FOCUSED).put(escape, CLOSE_ACTION); + getRootPane().getActionMap().put(CLOSE_ACTION, new AbstractAction() { + private static final long serialVersionUID = 95171770700983453L; - JButton cancelButton = new JButton(resources.getString("Cancel")); - cancelButton.setName("cancelButton"); - cancelButton.addActionListener(this::cancelButtonActionPerformed); - panel.add(cancelButton); + @Override + public void actionPerformed(ActionEvent evt) { + cancelActionPerformed(evt); + } + }); - return panel; + addWindowListener(this); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setPreferences(); } private void setPreferences() { @@ -157,21 +138,10 @@ protected void setCustomPreferences(final PreferencesNode preferences) { } //endregion Initialization - protected void okButtonActionPerformed(final ActionEvent evt) { - okAction(); - setResult(DialogResult.CONFIRMED); - setVisible(false); - } - - /** - * Action performed when the Ok button is clicked. - */ - protected abstract void okAction(); - /** * Note: Cancelling a dialog should always allow one to close the dialog. */ - protected void cancelButtonActionPerformed(final ActionEvent evt) { + protected void cancelActionPerformed(final ActionEvent evt) { try { cancelAction(); } catch (Exception e) { @@ -185,15 +155,8 @@ protected void cancelButtonActionPerformed(final ActionEvent evt) { * Action performed when the Cancel button is clicked, the dialog is closed by the X button, or * the escape key is pressed */ - protected abstract void cancelAction(); + protected void cancelAction() { - /** - * Sets the dialog to be visible, before returning the result - * @return the result of showing the dialog - */ - public DialogResult showDialog() { - setVisible(true); - return getResult(); } //region WindowEvents diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java index cf1c625e46..70f346af24 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java @@ -25,14 +25,14 @@ import javax.swing.*; import java.awt.*; -public class CampaignPresetSelectionDialog extends BaseDialog { +public class CampaignPresetSelectionDialog extends BaseButtonDialog { //region Variable Declarations private CampaignPresetSelectionPanel presetSelectionPanel; //endregion Variable Declarations //region Constructors protected CampaignPresetSelectionDialog(final JFrame parent) { - super(parent, true, "CampaignPresetSelectionDialog.title"); + super(parent, "CampaignPresetSelectionDialog.title"); initialize("CampaignPresetSelectionDialog"); } //endregion Constructors @@ -62,16 +62,6 @@ protected Container createCenterPane() { } //endregion Initialization - @Override - protected void okAction() { - - } - - @Override - protected void cancelAction() { - - } - @Override public void setVisible(final boolean visible) { // Only show if there are presets to select from diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index db27ff8cec..b002d1ba53 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -32,7 +32,7 @@ import java.awt.*; import java.util.List; -public class CompanyGenerationDialog extends BaseDialog { +public class CompanyGenerationDialog extends BaseButtonDialog { //region Variable Declarations private Campaign campaign; private CompanyGenerationPanelType currentPanelType; @@ -120,7 +120,7 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { JButton cancelButton = new JButton(resources.getString("Cancel")); cancelButton.setName("cancelButton"); - cancelButton.addActionListener(this::cancelButtonActionPerformed); + cancelButton.addActionListener(this::cancelActionPerformed); panel.add(cancelButton); JButton btnExport = new JButton(resources.getString("Export")); @@ -167,9 +167,4 @@ protected void okAction() { final Contract contract = null; generator.applyToCampaign(getCampaign(), combatPersonnel, supportPersonnel, entities, mothballedEntities, contract); } - - @Override - protected void cancelAction() { - - } } diff --git a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java index 31365552ba..7512f1938f 100644 --- a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java @@ -24,7 +24,7 @@ import java.awt.*; import java.time.LocalDate; -public class DateSelectionDialog extends BaseDialog { +public class DateSelectionDialog extends BaseButtonDialog { //region Variable Declarations private LocalDate initialDate; @@ -71,14 +71,4 @@ protected Container createCenterPane() { return getDateSelectionPanel(); } //endregion Initialization - - @Override - protected void okAction() { - - } - - @Override - protected void cancelAction() { - - } } diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index 3908cf5c34..c25d8960cd 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -34,7 +34,7 @@ import java.util.Objects; import java.util.ResourceBundle; -public class MekHqOptionsDialog extends BaseDialog { +public class MekHqOptionsDialog extends BaseButtonDialog { //region Variable Declarations //region Display private JTextField optionDisplayDateFormat; @@ -81,8 +81,8 @@ public class MekHqOptionsDialog extends BaseDialog { //endregion Variable Declarations //region Constructors - public MekHqOptionsDialog(JFrame parent) { - super(parent, ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog", + public MekHqOptionsDialog(final JFrame frame) { + super(frame, ResourceBundle.getBundle("mekhq.resources.MekHqOptionsDialog", new EncodeControl()), "dialog.text"); initialize("MekHQOptionsDialog"); setInitialState(); @@ -446,11 +446,6 @@ protected void okAction() { MekHQ.triggerEvent(new MekHQOptionsChangedEvent()); } - @Override - protected void cancelAction() { - - } - private void setInitialState() { optionDisplayDateFormat.setText(MekHQ.getMekHQOptions().getDisplayDateFormat()); optionLongDisplayDateFormat.setText(MekHQ.getMekHQOptions().getLongDisplayDateFormat()); diff --git a/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java b/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java index 3128f1e702..9fea8dd19f 100644 --- a/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java +++ b/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java @@ -23,11 +23,13 @@ public class DateSelectionPanel extends JPanel { //region Variable Declarations + private LocalDate date; //endregion Variable Declarations //region Constructors public DateSelectionPanel(final LocalDate date) { initialize(date); + this.date = date; // remove } //endregion Constructors From 1a9d000431b1f187634f7e6ef15161dd07678998 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 5 Mar 2021 12:19:51 -0700 Subject: [PATCH 015/115] Continuing to work on the company generator --- .../resources/mekhq/resources/GUI.properties | 71 ++- .../resources/MekHqOptionsDialog.properties | 4 +- .../mekhq/resources/Universe.properties | 58 +- MekHQ/src/mekhq/MekHQOptions.java | 12 +- MekHQ/src/mekhq/MekHqConstants.java | 2 +- MekHQ/src/mekhq/campaign/Campaign.java | 8 +- MekHQ/src/mekhq/campaign/CampaignOptions.java | 4 +- .../campaign/ResolveScenarioTracker.java | 4 +- .../mekhq/campaign/mod/am/InjuryTypes.java | 20 +- .../src/mekhq/campaign/personnel/Person.java | 116 ++-- .../campaign/personnel/enums/Marriage.java | 13 +- .../campaign/universe/enums/Alphabet.java | 2 +- ...Type.java => CompanyGenerationMethod.java} | 16 +- ...NamingType.java => ForceNamingMethod.java} | 10 +- .../universe/enums/MysteryBoxType.java | 95 ++++ .../universe/enums/PartGenerationMethod.java | 90 +++ .../AbstractCompanyGenerator.java | 284 +++++++--- .../AtBCompanyGenerator.java | 6 +- .../CompanyGenerationOptions.java | 438 ++++++++++----- .../WindchildCompanyGenerator.java | 6 +- .../partGenerators/AbstractPartGenerator.java | 83 +++ .../partGenerators/DoublePartGenerator.java | 44 ++ .../partGenerators/MishraPartGenerator.java | 48 ++ .../partGenerators/SinglePartGenerator.java | 40 ++ .../partGenerators/TriplePartGenerator.java | 48 ++ .../WindchildPartGenerator.java | 47 ++ .../mysteryBoxes/AbstractClanMysteryBox.java | 22 + .../AbstractInnerSphereMysteryBox.java | 22 + .../mysteryBoxes/AbstractMysteryBox.java | 30 + .../ClanExperimentalMysteryBox.java | 22 + .../mysteryBoxes/ClanFrontlineMysteryBox.java | 22 + .../mysteryBoxes/ClanKeshikMysteryBox.java | 22 + .../ClanSecondLineMysteryBox.java | 22 + .../InnerSphereExperimentalMysteryBox.java | 22 + .../StarLeagueRegularMysteryBox.java | 22 + .../StarLeagueRoyalMysteryBox.java | 22 + .../ThirdSuccessionWarMysteryBox.java | 22 + .../adapter/PersonnelTableMouseAdapter.java | 14 +- .../gui/dialog/CompanyGenerationDialog.java | 8 +- .../mekhq/gui/dialog/MekHqOptionsDialog.java | 29 +- .../gui/enums/CompanyGenerationPanelType.java | 2 +- .../view/CompanyGenerationOptionsPanel.java | 530 ++++++++++++++---- .../gui/view/CompanyGenerationPanel.java | 5 +- 43 files changed, 1931 insertions(+), 476 deletions(-) rename MekHQ/src/mekhq/campaign/universe/enums/{CompanyGenerationType.java => CompanyGenerationMethod.java} (77%) rename MekHQ/src/mekhq/campaign/universe/enums/{ForceNamingType.java => ForceNamingMethod.java} (80%) create mode 100644 MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java create mode 100644 MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java rename MekHQ/src/mekhq/campaign/universe/generators/{companyGeneration => companyGenerators}/AbstractCompanyGenerator.java (84%) rename MekHQ/src/mekhq/campaign/universe/generators/{companyGeneration => companyGenerators}/AtBCompanyGenerator.java (93%) rename MekHQ/src/mekhq/campaign/universe/generators/{companyGeneration => companyGenerators}/CompanyGenerationOptions.java (66%) rename MekHQ/src/mekhq/campaign/universe/generators/{companyGeneration => companyGenerators}/WindchildCompanyGenerator.java (94%) create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/partGenerators/DoublePartGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/partGenerators/SinglePartGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/partGenerators/TriplePartGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractClanMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractInnerSphereMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanExperimentalMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanFrontlineMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanKeshikMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanSecondLineMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/InnerSphereExperimentalMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRegularMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRoyalMysteryBox.java create mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ThirdSuccessionWarMysteryBox.java diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index e4c168f0db..9ba9667235 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -130,7 +130,7 @@ PersonnelFilter.DEAD.text=Cemetery ### PersonnelFilterStyle Enum PersonnelFilterStyle.STANDARD.text=Standard -PersonnelFilterStyle.STANDARD.toolTipText=This is the standard filter style for MekHQ, which groups less commonly used but related personnel roles into a single filter (e.g. Doctors and Medics are grouped as Medical Staff) +PersonnelFilterStyle.STANDARD.toolTipText=This is the standard filter style for MekHQ, which groups less commonly used but related personnel roles into a single filter (e.g. Doctors and Medics are grouped as Medical Staff). PersonnelFilterStyle.INDIVIDUAL_ROLE.text=Individual Role PersonnelFilterStyle.INDIVIDUAL_ROLE.toolTipText=This filter style provides filters that allow one to filter personnel by each individual role, without the filter groupings as seen previously. PersonnelFilterStyle.ALL.text=All @@ -151,8 +151,8 @@ PersonnelTabView.FLUFF.text=Fluff Information ### CompanyGenerationOptionsPanel Class ## Base Information Panel baseInformationPanel.title=Base Information -lblCompanyGenerationType.text=Company Generation Type -lblCompanyGenerationType.toolTipText=This is the type of company generator to use. These have hardcoded differences described in their tooltips. +lblCompanyGenerationMethod.text=Company Generation Method +lblCompanyGenerationMethod.toolTipText=This is the method of company generator to use. These have hardcoded differences described in their tooltips. lblFaction.toolTipText=\u0020 chkSpecifyStartingSystem.text=Specify Starting Planet chkSpecifyStartingSystem.toolTipText=This option lets you specify the planet the mercenary company starts at. @@ -161,7 +161,7 @@ lblStartingPlanet.text=Starting Planet lblStartingPlanet.toolTipText=This is the planet that the company starts at. This should normally be kept at the default value, but is customizable for RP reasons. comboStartingSystem.toolTipText=This is the system to select the starting planet from. chkGenerateMercenaryCompanyCommandLance.text=Generate Company Command Lance -chkGenerateMercenaryCompanyCommandLance.toolTipText=This generates a lance containing the company commander to lead the mercenary company. Otherwise, the company commander leads the first lance generate, either first company or the first independent lance. +chkGenerateMercenaryCompanyCommandLance.toolTipText=This generates a lance containing the company commander to lead the mercenary company.
Otherwise, the company commander leads the first lance generate, either first company or the first independent lance. lblCompanyCount.text=Company Count lblCompanyCount.toolTipText=The number of companies to generate, from 0 to 5. lblIndividualLanceCount.text=Individual Lance Count @@ -179,17 +179,27 @@ supportPersonnelNumber.toolTipText=The number of %s(s) to hire. chkPoolAssistants.text=Pool Assistants chkPoolAssistants.toolTipText=Automatically fills the unit's astech and medic pools, otherwise they are hired as permanent members of the unit. chkGenerateCaptains.text=Generate Captains -chkGenerateCaptains.toolTipText=This creates Captains for every company after the first, or for every company when using a mercenary company command lance. They have two officer skill increases, and are assigned the rank of Captain. +chkGenerateCaptains.toolTipText=This creates Captains for every company after the first, or for every company when using a mercenary company command lance.
They have two officer skill increases, and are assigned the rank of Captain. chkAssignCompanyCommanderFlag.text=Assign Commander Flag chkAssignCompanyCommanderFlag.toolTipText=This assigns the Commander flag to the generated Company Commander, designating them as the overall commander for the mercenary company. chkCompanyCommanderLanceOfficer.text=Generate Company Commander as Lance Officer -chkCompanyCommanderLanceOfficer.toolTipText=When enabled the company commander has their own lance without any other officers. Otherwise, the lance containing the company commander will also contain a Lieutenant. +chkCompanyCommanderLanceOfficer.toolTipText=When enabled the company commander has their own lance without any other officers.
Otherwise, the lance containing the company commander will also contain a Lieutenant. chkApplyOfficerStatBonusToWorstSkill.text=Apply Officer Stat Bonus to Weaker Skill -chkApplyOfficerStatBonusToWorstSkill.toolTipText=This applies the worst +chkApplyOfficerStatBonusToWorstSkill.toolTipText=This applies the single officer stat bonus to the weaker of their primary skills, normally piloting. chkAssignBestOfficers.text=Assign Best Officers -chkAssignBestOfficers.toolTipText= +chkAssignBestOfficers.toolTipText=Tactical Genius is always sorted first, but this continues the sort so that it is then sorted by experience level and finally by their total officer skill level. chkAutomaticallyAssignRanks.text=Automatically Assign Ranks -chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command while . +chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command
while MechWarriors are assigned Sergeant ranks and support personnel are assigned Corporal ranks. +chkAssignFounderFlag.text=Assign Founder Flag +chkAssignFounderFlag.toolTipText=This automatically applies the founder flag to all generated personnel. +chkRunStartingSimulation.text=Run Starting Simulation +chkRunStartingSimulation.toolTipText=This will simulate any enabled simulations for duration years, starting that length before the current day. +lblSimulationDuration.text=Starting Simulation Duration +lblSimulationDuration.toolTipText=This is the duration, in years, of the starting simulation +chkSimulateRandomMarriages.text=Simulate Random Marriages +chkSimulateRandomMarriages.toolTipText=This runs random marriages for the duration of the simulation. +chkSimulateRandomProcreation.text=Simulate Random Procreation +chkSimulateRandomProcreation.toolTipText=This runs random procreation for the duration of the simulation. ## Personnel Randomization Panel personnelRandomizationPanel.title=Personnel Randomization chkRandomizeOrigin.text=Randomize Origin @@ -203,37 +213,41 @@ comboCentralSystem.toolTipText=This is the system from which to select the centr lblOriginSearchRadius.text=Origin Search Radius lblOriginSearchRadius.toolTipText=This is the radius that is used to find factions and planets when randomizing a person's origin. chkExtraRandomOrigin.text=Extra Random Planetary Origin -chkExtraRandomOrigin.toolTipText=When selected random origin is randomized to the planetary level, rather than just randomizing to the system level (with the planet being the primary planet). +chkExtraRandomOrigin.toolTipText=When selected random origin is randomized to the planetary level, rather than just randomizing to the system level
(with the planet being the primary planet). lblOriginDistanceScale.text=Origin Distance Scaling Factor -lblOriginDistanceScale.toolTipText=A scaling factor to apply to planetary distances during weighting when randomizing the faction and planetary origins. Values above 1.0 prefer the current location, while values closer to 0.1 spread out the faction selection. +lblOriginDistanceScale.toolTipText=A scaling factor to apply to planetary distances during weighting when randomizing the faction and planetary origins.
Values above 1.0 prefer the current location, while values closer to 0.1 spread out the faction selection. ## Units Panel unitsPanel.title=Units chkGenerateUnitsAsAttached.text=Generate Units as Attached -chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules. These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MW when they retire (provided the campaign options are enabled). +chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MW when they retire
(provided the campaign options are enabled). chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander -chkAssignBestRollToUnitCommander.toolTipText=This assigns the best rolled unit to the unit commander. The heaviest Star League weight class will be assigned to them if a Star League 'Mech is rolled, or otherwise they will be assigned the heaviest 'Mech. +chkAssignBestRollToUnitCommander.toolTipText=This assigns the best rolled unit to the unit commander.
The heaviest Star League weight class will be assigned to them if a Star League 'Mech is rolled, or otherwise they will be assigned the heaviest 'Mech. +chkSortStarLeagueUnitsFirst.text=Sort Star League Units First +chkSortStarLeagueUnitsFirst.toolTipText=This sorts any Star League rolls so they will be assigned to either the highest rank officers (with Keep Officer Rolls Separate) or to lances in order of the roll. chkGroupByWeight.text=Group Units by Weight -chkGroupByWeight.toolTipText=This groups the rolls so that the 'Mechs are sorted into lances (largely) by weight class. Otherwise, you can expect lances to have highly varied weight classes +chkGroupByWeight.toolTipText=This groups the rolls so that the 'Mechs are sorted into lances (largely) by weight class.
Otherwise, you can expect lances to have highly varied weight classes between the 'Mechs. +chkGroupByQuality.text=Group Units by Quality +chkGroupByQuality.toolTipText=This groups the rolls so that the highest quality will go to lances higher in the order of assignment. chkKeepOfficerRollsSeparate.text=Keep Officer Rolls Separate -chkKeepOfficerRollsSeparate.toolTipText=When grouping the rolls by weight, this separates out the officer rolls. This follows the spirit of the AtB rules, but means that officers will in general have heavier 'Mechs. +chkKeepOfficerRollsSeparate.toolTipText=This separates out the officer rolls from combat personnel rolls when using any of the above sorts.
This follows the spirit of the AtB rules, but means that officers will in general have heavier 'Mechs than their lance. lblStarLeagueYear.text=Star League Year lblStarLeagueYear.toolTipText=This is the year to use when rolling for Star League 'Mechs. Valid years are 2571 to 2780, with 2765 being the default. chkAssignTechsToUnits.text=Assign Techs to Units chkAssignTechsToUnits.toolTipText=This automatically assigns techs to units during company generation. ## Unit Panel unitPanel.title=Unit -lblForceNamingType.text=Force Naming Type -lblForceNamingType.toolTipText=This is the naming type used for lance and company names, producing names like "Baker Company", "Bravo Company", and "Beta Company". +lblForceNamingMethod.text=Force Naming Method +lblForceNamingMethod.toolTipText=This is the method used for generating lance and company names, producing names like "Baker Company", "Bravo Company", and "Beta Company". chkGenerateForceIcons.text=Generate Force Icons -chkGenerateForceIcons.toolTipText=This will automatically create force icons for generated lances and companies, displaying the weight class, type, formation, and using the selected faction for background if possible. +chkGenerateForceIcons.toolTipText=This will automatically create force icons for generated lances and companies, displaying the weight class, type, formation, and
using the selected faction for background if possible. ## Spares Panel sparesPanel.title=Spares chkGenerateMothballedSpareUnits.text=Generate Mothballed Spare Units chkGenerateMothballedSpareUnits.toolTipText=This generates the specified percentage of active units as mothballed spares kept by the company to replace destroyed 'Mechs. lblSparesPercentOfActiveUnits.text=Generated Percentage of Active Units lblSparesPercentOfActiveUnits.toolTipText=This is the percentage of active units for which a mothballed unit will be generated. -chkGenerateSpareParts.text=Generate Spare Parts -chkGenerateSpareParts.toolTipText=This generates spare parts for the unit based on the parts used by the unit. +lblPartGenerationMethod.text=Generate Spare Parts +lblPartGenerationMethod.toolTipText=This generates spare parts for the unit based on the specified generation method, normally using the units generated include any generated as mothballed spares. lblStartingArmourWeight.text=Starting Armour Weight lblStartingArmourWeight.toolTipText=This is the weight of spare armour to generate at the start of the campaign. Each type of armour is generated based on the percentage weight it is of the total armour, rounded to the nearest point.
The recommended value to use is 20 tons per lance. chkGenerateSpareAmmunition.text=Generate Spare Ammunition @@ -245,7 +259,7 @@ chkGenerateFractionalMachineGunAmmunition.toolTipText=Generate 50 rounds of mach ## Contracts Panel contractsPanel.title=Contracts chkSelectStartingContract.text=Select Starting Contract -chkSelectStartingContract.toolTipText=This enables a panel where the company's starting contract can be selected. (This panel will only show when there is not an active contract and the AtB contract market is enabled). +chkSelectStartingContract.toolTipText=This enables a panel where the company's starting contract can be selected.
(This panel will only show when there is not an active contract and a contract market is enabled) chkStartCourseToContractPlanet.text=Start Course to Contract Planet chkStartCourseToContractPlanet.toolTipText=This automatically charts and starts the company's travel towards the planet of the selected contract. ## Finances Panel @@ -255,23 +269,28 @@ lblStartingCash.toolTipText=The number of C-Bills to start with, minus expenses, chkRandomizeStartingCash.text=Randomize Starting C-Bills chkRandomizeStartingCash.toolTipText=This overrides the starting C-Bills with a random roll of nd6 million C-Bills, with the n specified below. lblRandomStartingCashDiceCount.text=Random Starting C-Bills d6 Count -lblRandomStartingCashDiceCount.toolTipText=This is the number of d6s rolled to generate the random starting C-Bills when randomizing starting funds. The base value of 8 will generate approximately 28m C-Bills, which is enough for a company in 3025 with a small float. For later eras 10 to 12 per company is recommended. +lblRandomStartingCashDiceCount.toolTipText=This is the number of d6s rolled to generate the random starting C-Bills when randomizing starting funds.
The base value of 8 will generate approximately 28m C-Bills, which is enough for a company in 3025 with a small float.
For later eras 10 to 12 per company is recommended. lblMinimumStartingFloat.text=Minimum Starting Float lblMinimumStartingFloat.toolTipText=This is the minimum number of available C-Bills the company will start with following generation. chkPayForSetup.text=Pay for Setup chkPayForSetup.toolTipText=Pay for the generated unit from the starting cash, to a minimum of the starting float. chkStartingLoan.text=Starting Loan -chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended, leaving the starting float as available C-Bills. +chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended,
leaving the starting float as available C-Bills. chkPayForPersonnel.text=Pay for Personnel chkPayForPersonnel.toolTipText=Pay to hire personnel, at the standard hiring rate of two months salary. chkPayForUnits.text=Pay for Units -chkPayForUnits.toolTipText=Pay for units, at either their full purchase cost or half of it if they are a person's attached unit +chkPayForUnits.toolTipText=Pay for units, at either their full purchase cost or half of it if they are a person's attached unit. chkPayForParts.text=Pay for Parts chkPayForParts.toolTipText=Pay for the spare parts generated, if any are generated. chkPayForArmour.text=Pay for Armour -chkPayForArmour.toolTipText=Pay for the spare armour generated, if any is generated +chkPayForArmour.toolTipText=Pay for the spare armour generated, if any is generated. chkPayForAmmunition.text=Pay for Ammunition chkPayForAmmunition.toolTipText=Pay for the spare ammunition generated, if any is generated. +## Surprises Panel +surprisesPanel.title=Surprises +surprisesPanel.toolTipText=Mystery Boxes each contain a 'Mech and between two and four parts.\u0020 +chkGenerateSurprises.text=Generate Surprises +chkGenerateSurprises.toolTipText=\u0020 ## Option Validation Warnings CompanyGenerationOptionsPanel.InvalidOptions.title=Error: Invalid Option Selection CompanyGenerationOptionsPanel.InvalidGenerationSize.text=You must select at least one company or independent lance to generate @@ -285,3 +304,5 @@ CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.text=The specifie ### CompanyGenerationPanel Class CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? CompanyGenerationPanel.ImmediateApplicationWarning.text=Confirm immediate generation and application to campaign? +CompanyGenerationPanel.StartupNag.title=Company Generator Information +CompanyGenerationPanel.StartupNag.text=The Company Generator is an automated and expanded version of AtB company generation rules, expanded to handle a complete MekHQ setup.
All options override any specified in Campaign Options. This means that otherwise illegal decisions may be made based on the options selected in this generator.
The default settings are recommended for initial use, while options are provided to customize the generated company. diff --git a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties index 471d795eb5..b63b00dadb 100644 --- a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties @@ -51,5 +51,5 @@ optionSaveCompanyGenerationOptions.toolTipText=This option allows you to save yo miscellaneousTab.title=Miscellaneous Options labelStartGameDelay.text=Delay Timer optionStartGameDelay.toolTipText=Number of milliseconds to wait before sending another unit. If the application tends to hang when starting a game in MegaMek or does not transfer all units or settings, try increasing this value. -labelDefaultCompanyGenerationType.text=Default Company Generation Type -labelDefaultCompanyGenerationType.toolTipText=This is the default company generation type to be used on load. +labelDefaultCompanyGenerationMethod.text=Default Company Generation Method +labelDefaultCompanyGenerationMethod.toolTipText=This is the default company generation method to be used on load. diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 13f735d635..ef5950c733 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -83,23 +83,55 @@ Alphabets.X.greek.text=Omega Alphabets.Y.greek.text=Ena Alphabets.Z.greek.text=Dio -# CompanyGenerationType Enum -CompanyGenerationType.AGAINST_THE_BOT.text=AtB -CompanyGenerationType.AGAINST_THE_BOT.toolTipText=This follows the AtB rules to generate a mercenary company. -CompanyGenerationType.WINDCHILD.text=Windchild -CompanyGenerationType.WINDCHILD.toolTipText=This is a variant that ensures all personnel have units and creates a heavier force. +# CompanyGenerationMethod Enum +CompanyGenerationMethod.AGAINST_THE_BOT.text=AtB +CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the AtB rules to generate a mercenary company. +CompanyGenerationMethod.WINDCHILD.text=Windchild +CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that ensures all personnel have units and creates a heavier force. -# ForceNamingType Enum -ForceNamingType.CCB_1943.text=CCB (1943) -ForceNamingType.CCB_1943.toolTipText=This generates names using the Combined Communications Board's WW2 calling alphabet as settled upon in 1943. Produces names like "Able Lance", "Charlie Company", and "Easy Company". -ForceNamingType.ICAO_1956.text=ICAO (1956) -ForceNamingType.ICAO_1956.toolTipText=This generates names using the International Radiotelephony Spelling Alphabet, also known as the NATO phonetic alphabet. Produces names like "Bravo Lance", "Charlie Company", and "Hotel Lance" -ForceNamingType.GREEK_ALPHABET.text=Greek Alphabet -ForceNamingType.GREEK_ALPHABET.toolTipText=This generates names using the Greek Alphabet, with one and two taking the place of the final two characters as Greek only has 24 characters. Produces names like "Alpha Lance", "Beta Company", and "Omega Lance". +# ForceNamingMethod Enum +ForceNamingMethod.CCB_1943.text=CCB (1943) +ForceNamingMethod.CCB_1943.toolTipText=This generates names using the Combined Communications Board's WW2 calling alphabet as settled upon in 1943. Produces names like "Able Lance", "Charlie Company", and "Easy Company". +ForceNamingMethod.ICAO_1956.text=ICAO (1956) +ForceNamingMethod.ICAO_1956.toolTipText=This generates names using the International Radiotelephony Spelling Alphabet, also known as the NATO phonetic alphabet. Produces names like "Bravo Lance", "Charlie Company", and "Hotel Lance" +ForceNamingMethod.GREEK_ALPHABET.text=Greek Alphabet +ForceNamingMethod.GREEK_ALPHABET.toolTipText=This generates names using the Greek Alphabet, with one and two taking the place of the final two characters as Greek only has 24 characters. Produces names like "Alpha Lance", "Beta Company", and "Omega Lance". + +# MysteryBoxType Enum +MysteryBoxType.THIRD_SUCCESSION_WAR.text=Third Succession War Mystery Box +MysteryBoxType.THIRD_SUCCESSION_WAR.toolTipText=\u0020 +MysteryBoxType.STAR_LEAGUE_ROYAL.text=Star League Royal Mystery Box +MysteryBoxType.STAR_LEAGUE_ROYAL.toolTipText=\u0020 +MysteryBoxType.STAR_LEAGUE_REGULAR.text=Star League Defence Force Mystery Box +MysteryBoxType.STAR_LEAGUE_REGULAR.toolTipText=\u0020 +MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.text=Inner Sphere Experimental Tech Mystery Box +MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.toolTipText=\u0020 +MysteryBoxType.CLAN_KESHIK.text=Clan Keshik Mystery Box +MysteryBoxType.CLAN_KESHIK.toolTipText=\u0020 +MysteryBoxType.CLAN_FRONTLINE.text=Clan Frontline Mystery Box +MysteryBoxType.CLAN_FRONTLINE.toolTipText=\u0020 +MysteryBoxType.CLAN_SECOND_LINE.text=Clan Second Line Mystery Box +MysteryBoxType.CLAN_SECOND_LINE.toolTipText=\u0020 +MysteryBoxType.CLAN_EXPERIMENTAL.text=Clan Experimental Tech Mystery Box +MysteryBoxType.CLAN_EXPERIMENTAL.toolTipText=\u0020 + +# PartGenerationMethod Enum +PartGenerationMethod.DISABLED.text=Disabled +PartGenerationMethod.DISABLED.toolTipText=Part Generation is disabled. +PartGenerationMethod.WINDCHILD.text=Windchild +PartGenerationMethod.WINDCHILD.toolTipText=Windchild's method generates one part for every three in the input, rounded normally.
This means you get a single part if you have two to four parts, and another part for each interval above that. +PartGenerationMethod.MISHRA.text=Mishra +PartGenerationMethod.MISHRA.toolTipText=Mishra's method generates (Unimplemented)\u0020 +PartGenerationMethod.SINGLE.text=Single Copy +PartGenerationMethod.SINGLE.toolTipText=This returns a part for every part in the input, which may be a list of parts or the parts from the provided units. +PartGenerationMethod.DOUBLE.text=Double Copy +PartGenerationMethod.DOUBLE.toolTipText=This returns two parts for every one in the input, which may be a list of parts or the parts from the provided units. +PartGenerationMethod.TRIPLE.text=Triple Copy +PartGenerationMethod.TRIPLE.toolTipText=This returns three parts for every one in the input, which may be a list of parts or the parts from the provided units. ## Generators # AbstractCompanyGenerator AbstractCompanyGenerator.commandLance.text=\u0020Command Lance AbstractCompanyGenerator.company.text=\u0020Company AbstractCompanyGenerator.lance.text=\u0020Lance -AbstractCompanyGenerator.StartingFunds.report= +AbstractCompanyGenerator.StartingFunds.report=\u0020 diff --git a/MekHQ/src/mekhq/MekHQOptions.java b/MekHQ/src/mekhq/MekHQOptions.java index 377a4aad0e..ff138b0bf2 100644 --- a/MekHQ/src/mekhq/MekHQOptions.java +++ b/MekHQ/src/mekhq/MekHQOptions.java @@ -18,7 +18,7 @@ */ package mekhq; -import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; import mekhq.gui.enums.PersonnelFilterStyle; import java.time.LocalDate; @@ -251,13 +251,13 @@ public void setStartGameDelay(final int startGameDelay) { userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE).putInt(MekHqConstants.START_GAME_DELAY, startGameDelay); } - public CompanyGenerationType getDefaultCompanyGenerationType() { - return CompanyGenerationType.valueOf(userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE) - .get(MekHqConstants.DEFAULT_COMPANY_GENERATION_TYPE, CompanyGenerationType.AGAINST_THE_BOT.name())); + public CompanyGenerationMethod getDefaultCompanyGenerationMethod() { + return CompanyGenerationMethod.valueOf(userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE) + .get(MekHqConstants.DEFAULT_COMPANY_GENERATION_METHOD, CompanyGenerationMethod.AGAINST_THE_BOT.name())); } - public void setDefaultCompanyGenerationType(final CompanyGenerationType value) { - userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE).put(MekHqConstants.DEFAULT_COMPANY_GENERATION_TYPE, value.name()); + public void setDefaultCompanyGenerationMethod(final CompanyGenerationMethod value) { + userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE).put(MekHqConstants.DEFAULT_COMPANY_GENERATION_METHOD, value.name()); } //endregion Miscellaneous Options } diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index 0b08c8ffbf..4848a64501 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -75,7 +75,7 @@ public final class MekHqConstants { //region Miscellaneous Options public static final String MISCELLANEOUS_NODE = "mekhq/prefs/miscellaneous"; public static final String START_GAME_DELAY = "startGameDelay"; - public static final String DEFAULT_COMPANY_GENERATION_TYPE = "defaultCompanyGenerationType"; + public static final String DEFAULT_COMPANY_GENERATION_METHOD = "defaultCompanyGenerationMethod"; //endregion Miscellaneous Options //endregion MekHQ Options diff --git a/MekHQ/src/mekhq/campaign/Campaign.java b/MekHQ/src/mekhq/campaign/Campaign.java index 59a7e9a994..521b777109 100644 --- a/MekHQ/src/mekhq/campaign/Campaign.java +++ b/MekHQ/src/mekhq/campaign/Campaign.java @@ -683,7 +683,7 @@ public boolean applyRetirement(Money totalPayout, HashMap unitAssign if (getFinances().debit(totalPayout, Transaction.C_SALARY, "Final Payout", getLocalDate())) { for (UUID pid : getRetirementDefectionTracker().getRetirees()) { if (getPerson(pid).getStatus().isActive()) { - getPerson(pid).changeStatus(this, PersonnelStatus.RETIRED); + getPerson(pid).changeStatus(this, PersonnelStatus.RETIRED, getLocalDate()); addReport(getPerson(pid).getFullName() + " has retired."); } if (Person.T_NONE != getRetirementDefectionTracker().getPayout(pid).getRecruitType()) { @@ -3206,7 +3206,7 @@ public void processNewDayPersonnel() { // Random Marriages if (getCampaignOptions().useRandomMarriages()) { - p.randomMarriage(this); + p.randomMarriage(this, getLocalDate()); } p.resetMinutesLeft(); @@ -3263,13 +3263,13 @@ public void processNewDayPersonnel() { if (p.isPregnant()) { if (getCampaignOptions().useUnofficialProcreation()) { if (getLocalDate().compareTo((p.getDueDate())) == 0) { - p.birth(this); + p.birth(this, getLocalDate()); } } else { p.removePregnancy(); } } else if (getCampaignOptions().useUnofficialProcreation()) { - p.procreate(this); + p.procreate(this, getLocalDate()); } } } diff --git a/MekHQ/src/mekhq/campaign/CampaignOptions.java b/MekHQ/src/mekhq/campaign/CampaignOptions.java index 2651f3b0a5..13b83e83e8 100644 --- a/MekHQ/src/mekhq/campaign/CampaignOptions.java +++ b/MekHQ/src/mekhq/campaign/CampaignOptions.java @@ -31,7 +31,7 @@ import mekhq.campaign.personnel.enums.FamilialRelationshipDisplayLevel; import mekhq.campaign.personnel.enums.Phenotype; import mekhq.campaign.personnel.enums.PrisonerCaptureStyle; -import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.service.MassRepairOption; import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Node; @@ -3956,7 +3956,7 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve } else if (wn2.getNodeName().equalsIgnoreCase("massRepairOptions")) { retVal.setMassRepairOptions(MassRepairOption.parseListFromXML(wn2, version)); } else if (wn2.getNodeName().equals("companyGenerationOptions")) { - retVal.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn2)); + retVal.setCompanyGenerationOptions(new CompanyGenerationOptions(wn2)); } } diff --git a/MekHQ/src/mekhq/campaign/ResolveScenarioTracker.java b/MekHQ/src/mekhq/campaign/ResolveScenarioTracker.java index 17f2454bf6..2910f321f0 100644 --- a/MekHQ/src/mekhq/campaign/ResolveScenarioTracker.java +++ b/MekHQ/src/mekhq/campaign/ResolveScenarioTracker.java @@ -1398,9 +1398,9 @@ public void resolveScenario(int resolution, String report) { campaign.addKill(k); } if (status.isMissing()) { - person.changeStatus(getCampaign(), PersonnelStatus.MIA); + person.changeStatus(getCampaign(), PersonnelStatus.MIA, getCampaign().getLocalDate()); } else if (status.isDead()) { - person.changeStatus(getCampaign(), PersonnelStatus.KIA); + person.changeStatus(getCampaign(), PersonnelStatus.KIA, getCampaign().getLocalDate()); if (campaign.getCampaignOptions().getUseAtB() && isAtBContract) { campaign.getRetirementDefectionTracker().removeFromCampaign(person, true, campaign.getCampaignOptions().getUseShareSystem() diff --git a/MekHQ/src/mekhq/campaign/mod/am/InjuryTypes.java b/MekHQ/src/mekhq/campaign/mod/am/InjuryTypes.java index 03ecd6bb29..fb726382ff 100644 --- a/MekHQ/src/mekhq/campaign/mod/am/InjuryTypes.java +++ b/MekHQ/src/mekhq/campaign/mod/am/InjuryTypes.java @@ -172,7 +172,7 @@ public List genStressEffect(Campaign c, Person p, Injury i, int hits new GameEffect( "certain death", rnd -> { - p.changeStatus(c, PersonnelStatus.WOUNDS); + p.changeStatus(c, PersonnelStatus.WOUNDS, c.getLocalDate()); MedicalLogEntry entry = MedicalLogger.diedDueToBrainTrauma(p, c.getLocalDate()); MekHQ.getLogger().info(this, entry.toString()); })); @@ -183,7 +183,7 @@ public List genStressEffect(Campaign c, Person p, Injury i, int hits new GameEffect(deathChance + "% chance of death", rnd -> { if (rnd.applyAsInt(6) + hits >= 5) { - p.changeStatus(c, PersonnelStatus.WOUNDS); + p.changeStatus(c, PersonnelStatus.WOUNDS, c.getLocalDate()); MedicalLogEntry entry = MedicalLogger.diedDueToBrainTrauma(p, c.getLocalDate()); MekHQ.getLogger().info(this, entry.toString()); } @@ -353,9 +353,9 @@ public List genStressEffect(Campaign c, Person p, Injury i, int hits new GameEffect( "certain death", rnd -> { - p.changeStatus(c, PersonnelStatus.WOUNDS); + p.changeStatus(c, PersonnelStatus.WOUNDS, c.getLocalDate()); MedicalLogEntry entry = MedicalLogger.diedOfInternalBleeding(p, c.getLocalDate()); - MekHQ.getLogger().info(this, entry.toString()); + MekHQ.getLogger().info(entry.toString()); }) ); } else { @@ -369,11 +369,11 @@ public List genStressEffect(Campaign c, Person p, Injury i, int hits if (i.getHits() < 3) { i.setHits(i.getHits() + 1); MedicalLogEntry entry = MedicalLogger.internalBleedingWorsened(p, c.getLocalDate()); - MekHQ.getLogger().info(this, entry.toString()); + MekHQ.getLogger().info(entry.toString()); } else { - p.changeStatus(c, PersonnelStatus.WOUNDS); + p.changeStatus(c, PersonnelStatus.WOUNDS, c.getLocalDate()); MedicalLogEntry entry = MedicalLogger.diedOfInternalBleeding(p, c.getLocalDate()); - MekHQ.getLogger().info(this, entry.toString()); + MekHQ.getLogger().info(entry.toString()); } } }) @@ -480,14 +480,14 @@ public List genStressEffect(Campaign c, Person p, Injury i, int hits rnd -> { int rib = rnd.applyAsInt(100); if (rib < 1) { - p.changeStatus(c, PersonnelStatus.WOUNDS); + p.changeStatus(c, PersonnelStatus.WOUNDS, c.getLocalDate()); MedicalLogEntry entry = MedicalLogger.brokenRibPunctureDead(p, c.getLocalDate()); - MekHQ.getLogger().info(this, entry.toString()); + MekHQ.getLogger().info(entry.toString()); } else if (rib < 10) { Injury puncturedLung = PUNCTURED_LUNG.newInjury(c, p, BodyLocation.CHEST, 1); p.addInjury(puncturedLung); MedicalLogEntry entry = MedicalLogger.brokenRibPuncture(p, c.getLocalDate()); - MekHQ.getLogger().info(this, entry.toString()); + MekHQ.getLogger().info(entry.toString()); } })); } diff --git a/MekHQ/src/mekhq/campaign/personnel/Person.java b/MekHQ/src/mekhq/campaign/personnel/Person.java index cd2925a4a6..6a5e89f21a 100644 --- a/MekHQ/src/mekhq/campaign/personnel/Person.java +++ b/MekHQ/src/mekhq/campaign/personnel/Person.java @@ -861,8 +861,9 @@ public PersonnelStatus getStatus() { * This is used to change the person's PersonnelStatus * @param campaign the campaign the person is part of * @param status the person's new PersonnelStatus + * @param today the current date */ - public void changeStatus(Campaign campaign, PersonnelStatus status) { + public void changeStatus(final Campaign campaign, final PersonnelStatus status, final LocalDate today) { if (status == getStatus()) { // no change means we don't need to process anything return; } else if (getStatus().isKIA()) { @@ -873,41 +874,41 @@ public void changeStatus(Campaign campaign, PersonnelStatus status) { switch (status) { case ACTIVE: if (getStatus().isMIA()) { - ServiceLogger.recoveredMia(this, campaign.getLocalDate()); + ServiceLogger.recoveredMia(this, today); } else if (getStatus().isDead()) { - ServiceLogger.resurrected(this, campaign.getLocalDate()); + ServiceLogger.resurrected(this, today); } else { - ServiceLogger.rehired(this, campaign.getLocalDate()); + ServiceLogger.rehired(this, today); } setRetirement(null); break; case RETIRED: - ServiceLogger.retired(this, campaign.getLocalDate()); + ServiceLogger.retired(this, today); if (campaign.getCampaignOptions().useRetirementDateTracking()) { - setRetirement(campaign.getLocalDate()); + setRetirement(today); } break; case MIA: - ServiceLogger.mia(this, campaign.getLocalDate()); + ServiceLogger.mia(this, today); break; case KIA: - ServiceLogger.kia(this, campaign.getLocalDate()); + ServiceLogger.kia(this, today); break; case NATURAL_CAUSES: - MedicalLogger.diedOfNaturalCauses(this, campaign.getLocalDate()); - ServiceLogger.passedAway(this, campaign.getLocalDate(), status.toString()); + MedicalLogger.diedOfNaturalCauses(this, today); + ServiceLogger.passedAway(this, today, status.toString()); break; case WOUNDS: - MedicalLogger.diedFromWounds(this, campaign.getLocalDate()); - ServiceLogger.passedAway(this, campaign.getLocalDate(), status.toString()); + MedicalLogger.diedFromWounds(this, today); + ServiceLogger.passedAway(this, today, status.toString()); break; case DISEASE: - MedicalLogger.diedFromDisease(this, campaign.getLocalDate()); - ServiceLogger.passedAway(this, campaign.getLocalDate(), status.toString()); + MedicalLogger.diedFromDisease(this, today); + ServiceLogger.passedAway(this, today, status.toString()); break; case OLD_AGE: - MedicalLogger.diedOfOldAge(this, campaign.getLocalDate()); - ServiceLogger.passedAway(this, campaign.getLocalDate(), status.toString()); + MedicalLogger.diedOfOldAge(this, today); + ServiceLogger.passedAway(this, today, status.toString()); break; case PREGNANCY_COMPLICATIONS: // The child might be able to be born, albeit into a world without their mother. @@ -915,7 +916,7 @@ public void changeStatus(Campaign campaign, PersonnelStatus status) { // purposeful, to allow for player customization, and thus we first check if someone // is pregnant before having the birth if (isPregnant()) { - int pregnancyWeek = getPregnancyWeek(campaign.getLocalDate()); + int pregnancyWeek = getPregnancyWeek(today); double babyBornChance; if (pregnancyWeek > 35) { babyBornChance = 0.99; @@ -934,18 +935,18 @@ public void changeStatus(Campaign campaign, PersonnelStatus status) { } if (Compute.randomFloat() < babyBornChance) { - birth(campaign); + birth(campaign, today); } } - MedicalLogger.diedFromPregnancyComplications(this, campaign.getLocalDate()); - ServiceLogger.passedAway(this, campaign.getLocalDate(), status.toString()); + MedicalLogger.diedFromPregnancyComplications(this, today); + ServiceLogger.passedAway(this, today, status.toString()); break; } setStatus(status); if (status.isDead()) { - setDateOfDeath(campaign.getLocalDate()); + setDateOfDeath(today); // Don't forget to tell the spouse if (getGenealogy().hasSpouse() && !getGenealogy().getSpouse(campaign).getStatus().isDeadOrMIA()) { Divorce divorceType = campaign.getCampaignOptions().getKeepMarriedNameUponSpouseDeath() @@ -1381,16 +1382,16 @@ public boolean isPregnant() { /** * This is used to determine if a person can procreate - * @param campaign the campaign the person was in + * @param today the current date * @return true if they can, otherwise false */ - public boolean canProcreate(Campaign campaign) { + public boolean canProcreate(final LocalDate today) { return getGender().isFemale() && isTryingToConceive() && !isPregnant() && !isDeployed() - && !isChild() && (getAge(campaign.getLocalDate()) < 51); + && !isChild() && (getAge(today) < 51); } - public void procreate(Campaign campaign) { - if (canProcreate(campaign)) { + public void procreate(final Campaign campaign, final LocalDate today) { + if (canProcreate(today)) { boolean conceived = false; if (getGenealogy().hasSpouse()) { Person spouse = getGenealogy().getSpouse(campaign); @@ -1405,14 +1406,13 @@ public void procreate(Campaign campaign) { } if (conceived) { - addPregnancy(campaign); + addPregnancy(campaign, today); } } } - public void addPregnancy(Campaign campaign) { - LocalDate dueDate = campaign.getLocalDate(); - dueDate = dueDate.plus(PREGNANCY_STANDARD_DURATION, ChronoUnit.DAYS); + public void addPregnancy(final Campaign campaign, final LocalDate today) { + LocalDate dueDate = today.plus(PREGNANCY_STANDARD_DURATION, ChronoUnit.DAYS); setExpectedDueDate(dueDate); dueDate = dueDate.plus(PREGNANCY_MODIFY_DURATION.getAsInt(), ChronoUnit.DAYS); setDueDate(dueDate); @@ -1426,10 +1426,10 @@ public void addPregnancy(Campaign campaign) { campaign.addReport(getHyperlinkedName() + " has conceived" + (sizeString == null ? "" : (" " + sizeString))); if (campaign.getCampaignOptions().logConception()) { - MedicalLogger.hasConceived(this, campaign.getLocalDate(), sizeString); + MedicalLogger.hasConceived(this, today, sizeString); if (getGenealogy().hasSpouse()) { - PersonalLogger.spouseConceived(getGenealogy().getSpouse(campaign), - getFullName(), getCampaign().getLocalDate(), sizeString); + PersonalLogger.spouseConceived(getGenealogy().getSpouse(campaign), getFullName(), + today, sizeString); } } } @@ -1447,8 +1447,9 @@ public void removePregnancy() { /** * This method is how a person gives birth to a number of babies and have them added to the campaign * @param campaign the campaign to add the baby in question to + * @param today the current date */ - public void birth(Campaign campaign) { + public void birth(final Campaign campaign, final LocalDate today) { // Determine the number of children int size = extraData.get(PREGNANCY_CHILDREN_DATA, 1); @@ -1475,7 +1476,7 @@ public void birth(Campaign campaign) { String surname = campaign.getCampaignOptions().getBabySurnameStyle() .generateBabySurname(this, campaign.getPerson(fatherId), baby.getGender()); baby.setSurname(surname); - baby.setBirthday(campaign.getLocalDate()); + baby.setBirthday(today); // Recruit the baby campaign.recruitPerson(baby, prisonerStatus, baby.isDependent(), true, true); @@ -1493,10 +1494,9 @@ public void birth(Campaign campaign) { campaign.addReport(String.format("%s has given birth to %s, a baby %s!", getHyperlinkedName(), baby.getHyperlinkedName(), GenderDescriptors.BOY_GIRL.getDescriptor(baby.getGender()))); if (campaign.getCampaignOptions().logConception()) { - MedicalLogger.deliveredBaby(this, baby, campaign.getLocalDate()); + MedicalLogger.deliveredBaby(this, baby, today); if (fatherId != null) { - PersonalLogger.ourChildBorn(campaign.getPerson(fatherId), baby, getFullName(), - campaign.getLocalDate()); + PersonalLogger.ourChildBorn(campaign.getPerson(fatherId), baby, getFullName(), today); } } } @@ -1517,10 +1517,11 @@ public void setTryingToMarry(boolean tryingToMarry) { /** * Determines if another person is a safe spouse for the current person + * @param campaign the campaign to use to determine if the person is a safe spouse * @param person the person to determine if they are a safe spouse - * @param campaign the campaign to use to determine if they are a safe spouse + * @param today the current date */ - public boolean safeSpouse(Person person, Campaign campaign) { + public boolean safeSpouse(final Campaign campaign, final Person person, final LocalDate today) { // Huge convoluted return statement, with the following restrictions // can't marry yourself // can't marry someone who is already married @@ -1534,7 +1535,7 @@ public boolean safeSpouse(Person person, Campaign campaign) { !this.equals(person) && !person.getGenealogy().hasSpouse() && person.isTryingToMarry() - && person.oldEnoughToMarry(campaign) + && person.oldEnoughToMarry(campaign, today) && (!person.getPrisonerStatus().isPrisoner() || getPrisonerStatus().isPrisoner()) && !person.getStatus().isDeadOrMIA() && person.getStatus().isActive() @@ -1542,52 +1543,51 @@ public boolean safeSpouse(Person person, Campaign campaign) { ); } - public boolean oldEnoughToMarry(Campaign campaign) { - return (getAge(campaign.getLocalDate()) >= campaign.getCampaignOptions().getMinimumMarriageAge()); + public boolean oldEnoughToMarry(final Campaign campaign, final LocalDate today) { + return getAge(today) >= campaign.getCampaignOptions().getMinimumMarriageAge(); } - public void randomMarriage(Campaign campaign) { + public void randomMarriage(final Campaign campaign, final LocalDate today) { // Don't attempt to generate is someone isn't trying to marry, has a spouse, // isn't old enough to marry, or is actively deployed - if (!isTryingToMarry() || getGenealogy().hasSpouse() || !oldEnoughToMarry(campaign) || isDeployed()) { + if (!isTryingToMarry() || getGenealogy().hasSpouse() || !oldEnoughToMarry(campaign, today) || isDeployed()) { return; } // setting is the fractional chance that this attempt at finding a marriage will result in one if (Compute.randomFloat() < (campaign.getCampaignOptions().getChanceRandomMarriages())) { - addRandomSpouse(false, campaign); + addRandomSpouse(campaign, false, today); } else if (campaign.getCampaignOptions().useRandomSameSexMarriages()) { if (Compute.randomFloat() < (campaign.getCampaignOptions().getChanceRandomSameSexMarriages())) { - addRandomSpouse(true, campaign); + addRandomSpouse(campaign, true, today); } } } - public void addRandomSpouse(boolean sameSex, Campaign campaign) { + public void addRandomSpouse(final Campaign campaign, final boolean sameSex, final LocalDate today) { List potentials = new ArrayList<>(); Gender gender = sameSex ? getGender() : (getGender().isMale() ? Gender.FEMALE : Gender.MALE); - for (Person p : campaign.getActivePersonnel()) { - if (isPotentialRandomSpouse(p, gender, campaign)) { - potentials.add(p); + for (final Person person : campaign.getActivePersonnel()) { + if (isPotentialRandomSpouse(campaign, person, gender, today)) { + potentials.add(person); } } int n = potentials.size(); if (n > 0) { - Marriage.WEIGHTED.marry(this, potentials.get(Compute.randomInt(n)), campaign); + Marriage.WEIGHTED.marry(campaign, this, potentials.get(Compute.randomInt(n)), today); } } - public boolean isPotentialRandomSpouse(Person p, Gender gender, Campaign campaign) { - if ((p.getGender() != gender) || !safeSpouse(p, campaign) + public boolean isPotentialRandomSpouse(final Campaign campaign, final Person person, + final Gender gender, final LocalDate today) { + if ((person.getGender() != gender) || !safeSpouse(campaign, person, today) || !(getPrisonerStatus().isFree() - || (getPrisonerStatus().isPrisoner() && p.getPrisonerStatus().isPrisoner()))) { + || (getPrisonerStatus().isPrisoner() && person.getPrisonerStatus().isPrisoner()))) { return false; } - int ageDifference = Math.abs(p.getAge(campaign.getLocalDate()) - getAge(campaign.getLocalDate())); - - return (ageDifference <= campaign.getCampaignOptions().getMarriageAgeRange()); + return Math.abs(person.getAge(today) - getAge(today)) <= campaign.getCampaignOptions().getMarriageAgeRange(); } //endregion Marriage diff --git a/MekHQ/src/mekhq/campaign/personnel/enums/Marriage.java b/MekHQ/src/mekhq/campaign/personnel/enums/Marriage.java index 9c0fac6a4c..e8dbac73e6 100644 --- a/MekHQ/src/mekhq/campaign/personnel/enums/Marriage.java +++ b/MekHQ/src/mekhq/campaign/personnel/enums/Marriage.java @@ -27,6 +27,7 @@ import mekhq.campaign.log.PersonalLogger; import mekhq.campaign.personnel.Person; +import java.time.LocalDate; import java.util.ResourceBundle; public enum Marriage { @@ -87,7 +88,7 @@ public String getDropDownText() { } //endregion Getters - public void marry(Person origin, Person spouse, Campaign campaign) { + public void marry(final Campaign campaign, final Person origin, final Person spouse, final LocalDate today) { String surname = origin.getSurname(); String spouseSurname = spouse.getSurname(); Marriage surnameStyle = this; @@ -190,7 +191,7 @@ public void marry(Person origin, Person spouse, Campaign campaign) { break; case WEIGHTED: default: - MekHQ.getLogger().error(this, String.format("Marriage Surname Style is not defined, and cannot be used \"%s\" and \"%s\"", + MekHQ.getLogger().error(String.format("Marriage Surname Style is not defined, and cannot be used \"%s\" and \"%s\"", origin.getFullName(), spouse.getFullName())); break; } @@ -203,15 +204,15 @@ public void marry(Person origin, Person spouse, Campaign campaign) { spouse.getGenealogy().setSpouse(origin.getId()); // Then we do the logging - PersonalLogger.marriage(origin, spouse, campaign.getLocalDate()); - PersonalLogger.marriage(spouse, origin, campaign.getLocalDate()); + PersonalLogger.marriage(origin, spouse, today); + PersonalLogger.marriage(spouse, origin, today); if (campaign.getCampaignOptions().logMarriageNameChange()) { if (!spouse.getSurname().equals(spouseSurname)) { - PersonalLogger.marriageNameChange(spouse, origin, campaign.getLocalDate()); + PersonalLogger.marriageNameChange(spouse, origin, today); } if (!origin.getSurname().equals(surname)) { - PersonalLogger.marriageNameChange(origin, spouse, campaign.getLocalDate()); + PersonalLogger.marriageNameChange(origin, spouse, today); } } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java b/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java index ed73c21563..b94455536d 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java @@ -61,7 +61,7 @@ public enum Alphabet { //endregion Variable Declarations //region Constructors - Alphabet(String ccb1943, String icao1956, String greek) { + Alphabet(final String ccb1943, final String icao1956, final String greek) { this.ccb1943 = resources.getString(ccb1943); this.icao1956 = resources.getString(icao1956); this.greek = resources.getString(greek); diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java similarity index 77% rename from MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java rename to MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java index afd218f26a..f00eaf1fd5 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java @@ -20,17 +20,17 @@ import megamek.common.util.EncodeControl; import mekhq.campaign.Campaign; -import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; -import mekhq.campaign.universe.generators.companyGeneration.AtBCompanyGenerator; -import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; -import mekhq.campaign.universe.generators.companyGeneration.WindchildCompanyGenerator; +import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; +import mekhq.campaign.universe.generators.companyGenerators.AtBCompanyGenerator; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.campaign.universe.generators.companyGenerators.WindchildCompanyGenerator; import java.util.ResourceBundle; -public enum CompanyGenerationType { +public enum CompanyGenerationMethod { //region Enum Declarations - AGAINST_THE_BOT("CompanyGenerationType.AGAINST_THE_BOT.text", "CompanyGenerationType.AGAINST_THE_BOT.toolTipText"), - WINDCHILD("CompanyGenerationType.WINDCHILD.text", "CompanyGenerationType.WINDCHILD.toolTipText"); + AGAINST_THE_BOT("CompanyGenerationMethod.AGAINST_THE_BOT.text", "CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText"), + WINDCHILD("CompanyGenerationMethod.WINDCHILD.text", "CompanyGenerationMethod.WINDCHILD.toolTipText"); //endregion Enum Declarations //region Variable Declarations @@ -41,7 +41,7 @@ public enum CompanyGenerationType { //endregion Variable Declarations //region Constructors - CompanyGenerationType(String name, String toolTipText) { + CompanyGenerationMethod(final String name, final String toolTipText) { this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java similarity index 80% rename from MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java rename to MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java index 186ee9347c..3bca46ec52 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java @@ -22,11 +22,11 @@ import java.util.ResourceBundle; -public enum ForceNamingType { +public enum ForceNamingMethod { //region Enum Declarations - CCB_1943("ForceNamingType.CCB_1943.text", "ForceNamingType.CCB_1943.toolTipText"), - ICAO_1956("ForceNamingType.ICAO_1956.text", "ForceNamingType.ICAO_1956.toolTipText"), - GREEK_ALPHABET("ForceNamingType.GREEK_ALPHABET.text", "ForceNamingType.GREEK_ALPHABET.toolTipText"); + CCB_1943("ForceNamingMethod.CCB_1943.text", "ForceNamingMethod.CCB_1943.toolTipText"), + ICAO_1956("ForceNamingMethod.ICAO_1956.text", "ForceNamingMethod.ICAO_1956.toolTipText"), + GREEK_ALPHABET("ForceNamingMethod.GREEK_ALPHABET.text", "ForceNamingMethod.GREEK_ALPHABET.toolTipText"); //endregion Enum Declarations //region Variable Declarations @@ -37,7 +37,7 @@ public enum ForceNamingType { //endregion Variable Declarations //region Constructors - ForceNamingType(final String name, final String toolTipText) { + ForceNamingMethod(final String name, final String toolTipText) { this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java new file mode 100644 index 0000000000..1b733696b3 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.enums; + +import megamek.common.util.EncodeControl; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.AbstractMysteryBox; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.ClanExperimentalMysteryBox; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.ClanFrontlineMysteryBox; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.ClanKeshikMysteryBox; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.ClanSecondLineMysteryBox; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.InnerSphereExperimentalMysteryBox; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.StarLeagueRegularMysteryBox; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.StarLeagueRoyalMysteryBox; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.ThirdSuccessionWarMysteryBox; + +import java.util.ResourceBundle; + +public enum MysteryBoxType { + //region Enum Declarations + THIRD_SUCCESSION_WAR("MysteryBoxType.THIRD_SUCCESSION_WAR.text", "MysteryBoxType.THIRD_SUCCESSION_WAR.toolTipText"), + STAR_LEAGUE_ROYAL("MysteryBoxType.STAR_LEAGUE_ROYAL.text", "MysteryBoxType.STAR_LEAGUE_ROYAL.toolTipText"), + STAR_LEAGUE_REGULAR("MysteryBoxType.STAR_LEAGUE_REGULAR.text", "MysteryBoxType.STAR_LEAGUE_REGULAR.toolTipText"), + INNER_SPHERE_EXPERIMENTAL("MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.text", "MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.toolTipText"), + CLAN_KESHIK("MysteryBoxType.CLAN_KESHIK.text", "MysteryBoxType.CLAN_KESHIK.toolTipText"), + CLAN_FRONTLINE("MysteryBoxType.CLAN_FRONTLINE.text", "MysteryBoxType.CLAN_FRONTLINE.toolTipText"), + CLAN_SECOND_LINE("MysteryBoxType.CLAN_SECOND_LINE.text", "MysteryBoxType.CLAN_SECOND_LINE.toolTipText"), + CLAN_EXPERIMENTAL("MysteryBoxType.CLAN_EXPERIMENTAL.text", "MysteryBoxType.CLAN_EXPERIMENTAL.toolTipText"); + //endregion Enum Declarations + + //region Variable Declarations + private final String name; + private final String toolTipText; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + //endregion Variable Declarations + + //region Constructors + MysteryBoxType(final String name, final String toolTipText) { + this.name = resources.getString(name); + this.toolTipText = resources.getString(toolTipText); + } + //endregion Constructors + + //region Getters + public String getToolTipText() { + return toolTipText; + } + //endregion Getters + + //region Boolean Comparisons + //endregion Boolean Comparisons + + public AbstractMysteryBox getMysteryBox() { + switch (this) { + case STAR_LEAGUE_ROYAL: + return new StarLeagueRoyalMysteryBox(); + case STAR_LEAGUE_REGULAR: + return new StarLeagueRegularMysteryBox(); + case INNER_SPHERE_EXPERIMENTAL: + return new InnerSphereExperimentalMysteryBox(); + case CLAN_KESHIK: + return new ClanKeshikMysteryBox(); + case CLAN_FRONTLINE: + return new ClanFrontlineMysteryBox(); + case CLAN_SECOND_LINE: + return new ClanSecondLineMysteryBox(); + case CLAN_EXPERIMENTAL: + return new ClanExperimentalMysteryBox(); + case THIRD_SUCCESSION_WAR: + default: + return new ThirdSuccessionWarMysteryBox(); + } + } + + @Override + public String toString() { + return name; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java new file mode 100644 index 0000000000..0d732c411d --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.enums; + +import megamek.common.util.EncodeControl; +import mekhq.MekHQ; +import mekhq.campaign.universe.generators.partGenerators.AbstractPartGenerator; +import mekhq.campaign.universe.generators.partGenerators.DoublePartGenerator; +import mekhq.campaign.universe.generators.partGenerators.MishraPartGenerator; +import mekhq.campaign.universe.generators.partGenerators.SinglePartGenerator; +import mekhq.campaign.universe.generators.partGenerators.TriplePartGenerator; +import mekhq.campaign.universe.generators.partGenerators.WindchildPartGenerator; + +import java.util.ResourceBundle; + +public enum PartGenerationMethod { + //region Enum Declarations + DISABLED("PartGenerationMethod.DISABLED.text", "PartGenerationMethod.DISABLED.toolTipText"), + WINDCHILD("PartGenerationMethod.WINDCHILD.text", "PartGenerationMethod.WINDCHILD.toolTipText"), + MISHRA("PartGenerationMethod.MISHRA.text", "PartGenerationMethod.MISHRA.toolTipText"), + SINGLE("PartGenerationMethod.SINGLE.text", "PartGenerationMethod.SINGLE.toolTipText"), + DOUBLE("PartGenerationMethod.DOUBLE.text", "PartGenerationMethod.DOUBLE.toolTipText"), + TRIPLE("PartGenerationMethod.TRIPLE.text", "PartGenerationMethod.TRIPLE.toolTipText"); + //endregion Enum Declarations + + //region Variable Declarations + private final String name; + private final String toolTipText; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + //endregion Variable Declarations + + //region Constructors + PartGenerationMethod(final String name, final String toolTipText) { + this.name = resources.getString(name); + this.toolTipText = resources.getString(toolTipText); + } + //endregion Constructors + + //region Getters + public String getToolTipText() { + return toolTipText; + } + //endregion Getters + + //region Boolean Comparisons + public boolean isDisabled() { + return this == DISABLED; + } + //endregion Boolean Comparisons + + public AbstractPartGenerator getGenerator() { + switch (this) { + case MISHRA: + return new MishraPartGenerator(); + case SINGLE: + return new SinglePartGenerator(); + case DOUBLE: + return new DoublePartGenerator(); + case TRIPLE: + return new TriplePartGenerator(); + case DISABLED: + MekHQ.getLogger().error("Attempted to get generator for a disabled part generator. Returning Windchild"); + case WINDCHILD: + default: + return new WindchildPartGenerator(); + } + } + + @Override + public String toString() { + return name; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java similarity index 84% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java rename to MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 23865767ab..77292f9aea 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.campaign.universe.generators.companyGeneration; +package mekhq.campaign.universe.generators.companyGenerators; import megamek.common.AmmoType; import megamek.common.Entity; @@ -25,6 +25,7 @@ import megamek.common.MechSummary; import megamek.common.UnitType; import megamek.common.annotations.Nullable; +import megamek.common.options.OptionsConstants; import megamek.common.util.EncodeControl; import mekhq.MHQStaticDirectoryManager; import mekhq.MekHQ; @@ -53,11 +54,15 @@ import mekhq.campaign.universe.RangedFactionSelector; import mekhq.campaign.universe.RangedPlanetSelector; import mekhq.campaign.universe.enums.Alphabet; -import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; +import mekhq.campaign.universe.enums.MysteryBoxType; +import mekhq.campaign.universe.randomEvent.mysteryBoxes.AbstractMysteryBox; import mekhq.campaign.work.WorkTime; import mekhq.gui.enums.LayeredForceIcon; +import java.time.LocalDate; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; @@ -70,6 +75,13 @@ import java.util.stream.Collectors; /** + * Startup: + * First Panel (initial startup only): Client Options + * Second Panel: Presets, Date, Starting Faction, Starting Planet, AtB + * Third Panel: Campaign Options + * Fourth Panel: MegaMek Options + * Fifth Panel: Start of the Company Generator + * * Ideas: * First panel is the options panel * Second panel is the generated personnel panel, where you can customize and reroll personnel @@ -88,9 +100,7 @@ * Finish the personnel randomization overrides * Cleanup the dialog, have it disable and enable based on variable values * Implement: - * assignBestRollToUnitCommander * centerPlanet - * generateSpareParts // 1 for every 3 (round normally) parts in inventory? * selectStartingContract * * FIXME : @@ -108,45 +118,31 @@ */ public abstract class AbstractCompanyGenerator { //region Variable Declarations - private CompanyGenerationType type; - private CompanyGenerationOptions options; + private final CompanyGenerationMethod method; + private final CompanyGenerationOptions options; private AbstractPersonnelGenerator personnelGenerator; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors - protected AbstractCompanyGenerator(final Campaign campaign, final CompanyGenerationType type, + protected AbstractCompanyGenerator(final Campaign campaign, final CompanyGenerationMethod method, final CompanyGenerationOptions options) { - setType(type); - setOptions(options); + this.method = method; + this.options = options; createPersonnelGenerator(campaign); } //endregion Constructors //region Getters/Setters - public CompanyGenerationType getType() { - return type; - } - - /** - * This is ONLY to be called by constructors - */ - protected void setType(final CompanyGenerationType type) { - this.type = type; + public CompanyGenerationMethod getMethod() { + return method; } public CompanyGenerationOptions getOptions() { return options; } - /** - * This is ONLY to be called by constructors - */ - protected void setOptions(final CompanyGenerationOptions options) { - this.options = options; - } - public AbstractPersonnelGenerator getPersonnelGenerator() { return personnelGenerator; } @@ -160,23 +156,40 @@ public void setPersonnelGenerator(final AbstractPersonnelGenerator personnelGene * @param campaign the Campaign to generate using */ private void createPersonnelGenerator(final Campaign campaign) { - final AbstractFactionSelector factionSelector; - final AbstractPlanetSelector planetSelector; + setPersonnelGenerator(campaign.getPersonnelGenerator(createFactionSelector(), createPlanetSelector())); + } + /** + * @return a newly created Faction Selector based on the provided options + */ + private AbstractFactionSelector createFactionSelector() { // TODO : central planet/system + final AbstractFactionSelector factionSelector; if (getOptions().isRandomizeOrigin()) { factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); + } else { + factionSelector = new DefaultFactionSelector(getOptions().getFaction()); + } + return factionSelector; + } + /** + * @return a newly created Planet Selector based on the provided options + */ + private AbstractPlanetSelector createPlanetSelector() { + // TODO : central planet/system + + final AbstractPlanetSelector planetSelector; + if (getOptions().isRandomizeOrigin()) { planetSelector = new RangedPlanetSelector(getOptions().getOriginSearchRadius(), getOptions().isExtraRandomOrigin()); ((RangedPlanetSelector) planetSelector).setDistanceScale(getOptions().getOriginDistanceScale()); } else { - factionSelector = new DefaultFactionSelector(getOptions().getFaction()); planetSelector = new DefaultPlanetSelector(); } - setPersonnelGenerator(campaign.getPersonnelGenerator(factionSelector, planetSelector)); + return planetSelector; } //endregion Getters/Setters @@ -234,14 +247,17 @@ public List generateCombatPersonnel(final Campaign campaign) { combatPersonnel.add(campaign.newPerson(Person.T_MECHWARRIOR, getPersonnelGenerator())); } + // Default Sort is Tactical Genius First + Comparator personnelSorter = Comparator.comparing( + (Person p) -> p.getOptions().booleanOption(OptionsConstants.MISC_TACTICAL_GENIUS)); if (getOptions().isAssignBestOfficers()) { - combatPersonnel = combatPersonnel.stream() - .sorted(Comparator.comparingInt((Person p) -> p.getExperienceLevel(false)) - .reversed() - .thenComparingInt(p -> p.getSkillLevel(SkillType.S_LEADER) - + p.getSkillLevel(SkillType.S_STRATEGY) + p.getSkillLevel(SkillType.S_TACTICS))) - .collect(Collectors.toList()); + personnelSorter = personnelSorter.thenComparingInt((Person p) -> p.getExperienceLevel(false)) + .reversed() + .thenComparingInt(p -> p.getSkillLevel(SkillType.S_LEADER) + + p.getSkillLevel(SkillType.S_STRATEGY) + p.getSkillLevel(SkillType.S_TACTICS)) + .reversed(); } + combatPersonnel.sort(personnelSorter); generateCommandingOfficer(combatPersonnel.get(0), numMechWarriors); @@ -464,6 +480,45 @@ private void generateAssistants(final Campaign campaign, final List pers } } //endregion Support Personnel + + /** + * This does the final personnel processing + * @param campaign the campaign to use in processing and to add the personnel to + * @param personnel the list of ALL personnel in the campaign + */ + private void finalizePersonnel(final Campaign campaign, final List personnel) { + // Assign the founder flag if we need to + if (getOptions().isAssignFounderFlag()) { + personnel.forEach(p -> p.setFounder(true)); + } + + // Recruit all of the personnel, GM-style so that the initial hiring cost is calculated as + // part of the financial model + personnel.forEach(p -> campaign.recruitPerson(p, true)); + + // Now that they are recruited, we can simulate backwards a few years and generate marriages + // and children + if (getOptions().isRunStartingSimulation()) { + LocalDate date = campaign.getLocalDate().minusYears(getOptions().getSimulationDuration()).minusDays(1); + while (date.isBefore(campaign.getLocalDate())) { + date = date.plusDays(1); + + for (final Person person : personnel) { + if (getOptions().isSimulateRandomMarriages()) { + person.randomMarriage(campaign, date); + } + + if (getOptions().isSimulateRandomProcreation() && person.getGender().isFemale()) { + if (person.isPregnant() && (date.compareTo(person.getDueDate()) == 0)) { + person.birth(campaign, date); + } else { + person.procreate(campaign, date); + } + } + } + } + } + } //endregion Personnel //region Units @@ -480,26 +535,63 @@ public List generateUnits(final Campaign campaign, List combatPe // If it is, reroll the weight with a max value of 12 for (int i = 0; i < combatPersonnel.size(); i++) { if (parameters.get(i).isStarLeague()) { - parameters.get(i).setWeight(determineBattleMechWeight(Math.max(Utilities.dice(2, 6) + parameters.get(i).setWeight(determineBattleMechWeight(Math.min(Utilities.dice(2, 6) + ((i == 0) ? 2 : ((i < firstNonOfficer) ? 1 : 0)), 12))); } } - // TODO : Add a sort SL units first option - if (getOptions().isGroupByWeight()) { - if (getOptions().isKeepOfficerRollsSeparate()) { - parameters.subList(0, firstNonOfficer) - .sort(Comparator.comparingInt(RandomMechParameters::getWeight).reversed()); - parameters.subList(firstNonOfficer, parameters.size()) - .sort(Comparator.comparingInt(RandomMechParameters::getWeight).reversed()); - } else { - parameters.sort(Comparator.comparingInt(RandomMechParameters::getWeight).reversed()); - combatPersonnel = sortPersonnelIntoLances(combatPersonnel); + if (getOptions().isAssignBestRollToUnitCommander()) { + int bestIndex = 0; + RandomMechParameters bestParameters = parameters.get(bestIndex); + for (int i = 1; i < parameters.size(); i++) { + final RandomMechParameters checkParameters = parameters.get(i); + if (bestParameters.isStarLeague() == checkParameters.isStarLeague()) { + if (bestParameters.getWeight() == checkParameters.getWeight()) { + if (bestParameters.getQuality() < checkParameters.getQuality()) { + bestParameters = checkParameters; + bestIndex = i; + } + } else if (bestParameters.getWeight() < checkParameters.getWeight()) { + bestParameters = checkParameters; + bestIndex = i; + } + } else if (!bestParameters.isStarLeague() && checkParameters.isStarLeague()) { + bestParameters = checkParameters; + bestIndex = i; + } + } + + if (bestIndex != 0) { + Collections.swap(parameters, 0, bestIndex); } } - if (getOptions().isAssignBestRollToUnitCommander()) { - // TODO : Implement + Comparator parametersComparator = (o1, o2) -> 0; + + if (getOptions().isSortStarLeagueUnitsFirst()) { + parametersComparator = parametersComparator.thenComparing(RandomMechParameters::isStarLeague).reversed(); + } + + if (getOptions().isGroupByWeight()) { + parametersComparator = parametersComparator.thenComparingInt(RandomMechParameters::getWeight).reversed(); + } + + if (getOptions().isGroupByQuality()) { + parametersComparator = parametersComparator.thenComparingInt(RandomMechParameters::getQuality).reversed(); + } + + if (getOptions().isKeepOfficerRollsSeparate()) { + parameters.subList(getOptions().isAssignBestRollToUnitCommander() ? 1 : 0, firstNonOfficer).sort(parametersComparator); + parameters.subList(firstNonOfficer, parameters.size()).sort(parametersComparator); + } else { + // Officer Rolls are not separated. However, if the unit commander is assigned the best + // roll we don't sort the unit commander, just the rest of the rolls + if (getOptions().isAssignBestRollToUnitCommander()) { + parameters.subList(1, parameters.size()).sort(parametersComparator); + } else { + parameters.sort(parametersComparator); + } + combatPersonnel = sortPersonnelIntoLances(combatPersonnel); } return generateEntities(campaign, parameters, combatPersonnel); @@ -787,7 +879,7 @@ private void generateUnit(final Campaign campaign, final List personnel) // Create Companies for (int i = 0; i < getOptions().getCompanyCount(); i++) { - final Force company = new Force(getOptions().getForceNamingType().getValue(alphabet[i]) + final Force company = new Force(getOptions().getForceNamingMethod().getValue(alphabet[i]) + resources.getString("AbstractCompanyGenerator.company.text")); campaign.addForce(company, originForce); for (int y = 0; y < getOptions().getLancesPerCompany(); y++) { @@ -816,7 +908,7 @@ private void generateUnit(final Campaign campaign, final List personnel) private void createLance(final Campaign campaign, final Force head, final List personnel, final Alphabet alphabet, final String background) { createLance(campaign, head, personnel, - getOptions().getForceNamingType().getValue(alphabet) + getOptions().getForceNamingMethod().getValue(alphabet) + resources.getString("AbstractCompanyGenerator.lance.text"), background); } @@ -951,13 +1043,7 @@ public List generateMothballedEntities(final Campaign campaign, final Li final List mothballedEntities = new ArrayList<>(); // Create the Faction Selector - final AbstractFactionSelector factionSelector; - if (getOptions().isRandomizeOrigin()) { - factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); - ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); - } else { - factionSelector = new DefaultFactionSelector(getOptions().getFaction()); - } + final AbstractFactionSelector factionSelector = createFactionSelector(); // Create the Mothballed Entities for (int i = 0; i < numberMothballedEntities; i++) { @@ -1003,14 +1089,19 @@ private List createMothballedSpareUnits(final Campaign campaign, return mothballedUnits; } + /** + * @param units the list of units to generate spare parts based on + * @return the list of randomly generated parts + */ public List generateSpareParts(final List units) { - if (!getOptions().isGenerateSpareParts()) { - return new ArrayList<>(); - } - // TODO : Implement me - return new ArrayList<>(); + return getOptions().getPartGenerationMethod().isDisabled() ? new ArrayList<>() + : getOptions().getPartGenerationMethod().getGenerator().generate(units, false, false); } + /** + * @param units the list of units to generate spare armour based on + * @return the generated armour + */ public List generateArmour(final List units) { if (getOptions().getStartingArmourWeight() <= 0) { return new ArrayList<>(); @@ -1028,6 +1119,11 @@ public List generateArmour(final List units) { return armour; } + /** + * This clones and merges armour determined by the custom check below together + * @param unmergedArmour the unmerged list of armour, which may be assigned to a unit + * @return the merged list of armour + */ private List mergeIdenticalArmour(final List unmergedArmour) { final List mergedArmour = new ArrayList<>(); unmergedArmour.forEach(a -> { @@ -1049,6 +1145,14 @@ private List mergeIdenticalArmour(final List unmergedArmour) { return mergedArmour; } + /** + * This is a custom equals comparison utilized by this class to determine if two Armour Parts + * are the same + * @param a1 the first Armour part + * @param a2 the second Armour part + * @return whether this class considers both types of Armour to be the same. This DIFFERS + * from Armor::equals + */ private boolean areSameArmour(final Armor a1, final Armor a2) { return (a1.getClass() == a2.getClass()) && a1.isSameType(a2) @@ -1058,6 +1162,11 @@ private boolean areSameArmour(final Armor a1, final Armor a2) { && (a1.getSkillMin() == a2.getSkillMin()); } + /** + * @param campaign the campaign to generate ammunition for + * @param units the list of units to generate ammunition for + * @return the generated ammunition + */ public List generateAmmunition(final Campaign campaign, final List units) { if (!getOptions().isGenerateSpareAmmunition() || ((getOptions().getNumberReloadsPerWeapon() <= 0) && !getOptions().isGenerateFractionalMachineGunAmmunition())) { @@ -1249,6 +1358,42 @@ private Money calculateAmmunitionCosts(final List ammunition) { } //endregion Finances + //region Surprises + private void generateSurprises(final Campaign campaign) { + if (!getOptions().isGenerateSurprises()) { + return; + } + + final MysteryBoxType[] mysteryBoxTypes = MysteryBoxType.values(); + final List mysteryBoxes = new ArrayList<>(); + for (int i = 0; i < ) + + if (getOptions().isGenerateStarLeagueRoyalBox()) { + + } + + if (getOptions().isGenerateStarLeagueRegularBox()) { + + } + + if (getOptions().isGenerateClanKeshikBox()) { + + } + + if (getOptions().isGenerateClanFrontlineBox()) { + + } + + if (getOptions().isGenerateClanSecondLineBox()) { + + } + + if (getOptions().isGenerateExperimentalTechBox()) { + + } + } + //endregion Surprises + //region Apply to Campaign /** * TODO : UNFINISHED @@ -1273,8 +1418,7 @@ public void applyToCampaign(final Campaign campaign, final List combatPe applyPhaseOneToCampaign(campaign, combatPersonnel, supportPersonnel, personnel, entities, units); // Phase 2: Spares - final List mothballedUnits = createMothballedSpareUnits(campaign, mothballedEntities); - units.addAll(mothballedUnits); + units.addAll(createMothballedSpareUnits(campaign, mothballedEntities)); final List parts = generateSpareParts(units); final List armour = generateArmour(units); @@ -1302,9 +1446,9 @@ private void applyPhaseOneToCampaign(final Campaign campaign, final List // If we aren't using the pool, generate all of the Astechs and Medics required generateAssistants(campaign, personnel); - // Recruit all of the personnel, GM-style so that the initial hiring cost is calculated as - // part of the financial model - personnel.forEach(p -> campaign.recruitPerson(p, true)); + // This does all of the final personnel processing, including recruitment and running random + // marriages + finalizePersonnel(campaign, personnel); // We can only fill the pool after recruiting our support personnel if (getOptions().isPoolAssistants()) { @@ -1352,7 +1496,7 @@ public int getWeight() { return weight; } - public void setWeight(int weight) { + public void setWeight(final int weight) { this.weight = weight; } @@ -1360,7 +1504,7 @@ public int getQuality() { return quality; } - public void setQuality(int quality) { + public void setQuality(final int quality) { this.quality = quality; } @@ -1368,7 +1512,7 @@ public boolean isStarLeague() { return starLeague; } - public void setStarLeague(boolean starLeague) { + public void setStarLeague(final boolean starLeague) { this.starLeague = starLeague; } //endregion Getters/Setters diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java similarity index 93% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java rename to MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index 50a471c118..adfdddecbc 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.campaign.universe.generators.companyGeneration; +package mekhq.campaign.universe.generators.companyGenerators; import megamek.common.EntityWeightClass; import megamek.common.MechSummary; @@ -25,12 +25,12 @@ import mekhq.campaign.personnel.ranks.Ranks; import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.Faction; -import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; public class AtBCompanyGenerator extends AbstractCompanyGenerator { //region Constructors public AtBCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { - super(campaign, CompanyGenerationType.AGAINST_THE_BOT, options); + super(campaign, CompanyGenerationMethod.AGAINST_THE_BOT, options); } //endregion Constructors diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java similarity index 66% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java rename to MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index 587f1a98e9..80b31a1411 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.campaign.universe.generators.companyGeneration; +package mekhq.campaign.universe.generators.companyGenerators; import mekhq.MekHQ; import mekhq.MekHqXmlUtil; @@ -26,8 +26,10 @@ import mekhq.campaign.universe.Factions; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.Systems; -import mekhq.campaign.universe.enums.CompanyGenerationType; -import mekhq.campaign.universe.enums.ForceNamingType; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; +import mekhq.campaign.universe.enums.MysteryBoxType; +import mekhq.campaign.universe.enums.PartGenerationMethod; +import mekhq.campaign.universe.enums.ForceNamingMethod; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -50,8 +52,8 @@ public class CompanyGenerationOptions implements Serializable { private static final long serialVersionUID = 3034123423672457769L; // Base Information - private CompanyGenerationType type; - private Faction faction; // Not fully understood/Implemented + private CompanyGenerationMethod method; + private Faction faction; // Not fully understood/Implemented private boolean specifyStartingPlanet; private Planet startingPlanet; private boolean generateMercenaryCompanyCommandLance; @@ -59,6 +61,7 @@ public class CompanyGenerationOptions implements Serializable { private int individualLanceCount; private int lancesPerCompany; private int lanceSize; + private int starLeagueYear; // Personnel private Map supportPersonnel; @@ -69,6 +72,11 @@ public class CompanyGenerationOptions implements Serializable { private boolean applyOfficerStatBonusToWorstSkill; private boolean assignBestOfficers; private boolean automaticallyAssignRanks; + private boolean assignFounderFlag; + private boolean runStartingSimulation; + private int simulationDuration; + private boolean simulateRandomMarriages; + private boolean simulateRandomProcreation; // Personnel Randomization private boolean randomizeOrigin; @@ -80,27 +88,28 @@ public class CompanyGenerationOptions implements Serializable { // Units private boolean generateUnitsAsAttached; - private boolean assignBestRollToUnitCommander; // Not Implemented - private boolean groupByWeight; // Buggy - Annoyingly Implemented, might need to work on how I've done this one before I open + private boolean assignBestRollToUnitCommander; + private boolean sortStarLeagueUnitsFirst; + private boolean groupByWeight; + private boolean groupByQuality; private boolean keepOfficerRollsSeparate; - private int starLeagueYear; - private boolean assignTechsToUnits; // Not Implemented + private boolean assignTechsToUnits; // Unit - private ForceNamingType forceNamingType; + private ForceNamingMethod forceNamingMethod; private boolean generateForceIcons; // Very Buggy // Spares private boolean generateMothballedSpareUnits; private int sparesPercentOfActiveUnits; - private boolean generateSpareParts; // Not Implemented - private int startingArmourWeight; // Not Implemented - private boolean generateSpareAmmunition; // Not Implemented - private int numberReloadsPerWeapon; // Not Implemented - private boolean generateFractionalMachineGunAmmunition; // Not Implemented + private PartGenerationMethod partGenerationMethod; + private int startingArmourWeight; + private boolean generateSpareAmmunition; + private int numberReloadsPerWeapon; + private boolean generateFractionalMachineGunAmmunition; // Contracts - private boolean selectStartingContract; // Not Implemented + private boolean selectStartingContract; // Not Implemented private boolean startCourseToContractPlanet; // Finances @@ -115,6 +124,10 @@ public class CompanyGenerationOptions implements Serializable { private boolean payForParts; private boolean payForArmour; private boolean payForAmmunition; + + // Surprises + private boolean generateSurprises; + private boolean[] generateMysteryBoxTypes; //endregion Variable Declarations //region Constructors @@ -122,23 +135,24 @@ public CompanyGenerationOptions() { } - public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign campaign) { + public CompanyGenerationOptions(final CompanyGenerationMethod method, final Campaign campaign) { // Base Information - setType(type); + setMethod(method); setFaction(campaign.getFaction()); setSpecifyStartingPlanet(true); setStartingPlanet(Systems.getInstance().getSystems().getOrDefault( getFaction().getStartingPlanet(campaign.getLocalDate()), campaign.getSystemByName("Terra")).getPrimaryPlanet()); + setGenerateMercenaryCompanyCommandLance(false); setCompanyCount(1); setIndividualLanceCount(0); - setGenerateMercenaryCompanyCommandLance(false); setLancesPerCompany(3); setLanceSize(4); + setStarLeagueYear(2765); // Personnel Map supportPersonnel = new HashMap<>(); - if (getType().isWindchild()) { + if (getMethod().isWindchild()) { supportPersonnel.put(Person.T_MECH_TECH, 5); supportPersonnel.put(Person.T_MECHANIC, 1); supportPersonnel.put(Person.T_AERO_TECH, 1); @@ -154,12 +168,17 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign } setSupportPersonnel(supportPersonnel); setPoolAssistants(true); - setGenerateCaptains(type.isWindchild()); + setGenerateCaptains(method.isWindchild()); setAssignCompanyCommanderFlag(true); - setCompanyCommanderLanceOfficer(type.isWindchild()); - setApplyOfficerStatBonusToWorstSkill(type.isWindchild()); - setAssignBestOfficers(type.isWindchild()); + setCompanyCommanderLanceOfficer(method.isWindchild()); + setApplyOfficerStatBonusToWorstSkill(method.isWindchild()); + setAssignBestOfficers(method.isWindchild()); setAutomaticallyAssignRanks(true); + setAssignFounderFlag(true); + setRunStartingSimulation(method.isWindchild()); + setSimulationDuration(5); + setSimulateRandomMarriages(method.isWindchild()); + setSimulateRandomProcreation(method.isWindchild()); // Personnel Randomization setRandomizeOrigin(true); @@ -170,23 +189,24 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign setOriginDistanceScale(0.2); // Units - setGenerateUnitsAsAttached(type.isAtB()); - setAssignBestRollToUnitCommander(type.isWindchild()); + setGenerateUnitsAsAttached(method.isAtB()); + setAssignBestRollToUnitCommander(method.isWindchild()); + setSortStarLeagueUnitsFirst(true); setGroupByWeight(true); - setKeepOfficerRollsSeparate(type.isAtB()); - setStarLeagueYear(2765); + setGroupByQuality(method.isWindchild()); + setKeepOfficerRollsSeparate(method.isAtB()); setAssignTechsToUnits(true); // Unit - setForceNamingType(ForceNamingType.CCB_1943); + setForceNamingMethod(ForceNamingMethod.CCB_1943); setGenerateForceIcons(true); // Spares setGenerateMothballedSpareUnits(false); setSparesPercentOfActiveUnits(10); - setGenerateSpareParts(type.isWindchild()); + setPartGenerationMethod(PartGenerationMethod.WINDCHILD); setStartingArmourWeight(60); - setGenerateSpareAmmunition(type.isWindchild()); + setGenerateSpareAmmunition(method.isWindchild()); setNumberReloadsPerWeapon(4); setGenerateFractionalMachineGunAmmunition(true); @@ -196,27 +216,35 @@ public CompanyGenerationOptions(final CompanyGenerationType type, final Campaign // Finances setStartingCash(0); - setRandomizeStartingCash(type.isWindchild()); + setRandomizeStartingCash(method.isWindchild()); setRandomStartingCashDiceCount(8); - setMinimumStartingFloat(type.isWindchild() ? 3500000 : 0); - setPayForSetup(type.isWindchild()); - setStartingLoan(type.isWindchild()); - setPayForPersonnel(type.isWindchild()); - setPayForUnits(type.isWindchild()); - setPayForParts(type.isWindchild()); - setPayForArmour(type.isWindchild()); - setPayForAmmunition(type.isWindchild()); + setMinimumStartingFloat(method.isWindchild() ? 3500000 : 0); + setPayForSetup(method.isWindchild()); + setStartingLoan(method.isWindchild()); + setPayForPersonnel(method.isWindchild()); + setPayForUnits(method.isWindchild()); + setPayForParts(method.isWindchild()); + setPayForArmour(method.isWindchild()); + setPayForAmmunition(method.isWindchild()); + + // Surprises + setGenerateSurprises(true); + setGenerateMysteryBoxTypes(new boolean[MysteryBoxType.values().length]); + } + + public CompanyGenerationOptions(final Node wn) { + fillFromXML(wn); } //endregion Constructors //region Getters/Setters //region Base Information - public CompanyGenerationType getType() { - return type; + public CompanyGenerationMethod getMethod() { + return method; } - public void setType(final CompanyGenerationType type) { - this.type = type; + public void setMethod(final CompanyGenerationMethod method) { + this.method = method; } public Faction getFaction() { @@ -267,6 +295,14 @@ public void setIndividualLanceCount(final int individualLanceCount) { this.individualLanceCount = individualLanceCount; } + public int getLancesPerCompany() { + return lancesPerCompany; + } + + public void setLancesPerCompany(final int lancesPerCompany) { + this.lancesPerCompany = lancesPerCompany; + } + public int getLanceSize() { return lanceSize; } @@ -275,12 +311,12 @@ public void setLanceSize(final int lanceSize) { this.lanceSize = lanceSize; } - public int getLancesPerCompany() { - return lancesPerCompany; + public int getStarLeagueYear() { + return starLeagueYear; } - public void setLancesPerCompany(final int lancesPerCompany) { - this.lancesPerCompany = lancesPerCompany; + public void setStarLeagueYear(final int starLeagueYear) { + this.starLeagueYear = starLeagueYear; } //endregion Base Information @@ -348,6 +384,46 @@ public boolean isAutomaticallyAssignRanks() { public void setAutomaticallyAssignRanks(final boolean automaticallyAssignRanks) { this.automaticallyAssignRanks = automaticallyAssignRanks; } + + public boolean isAssignFounderFlag() { + return assignFounderFlag; + } + + public void setAssignFounderFlag(final boolean assignFounderFlag) { + this.assignFounderFlag = assignFounderFlag; + } + + public boolean isRunStartingSimulation() { + return runStartingSimulation; + } + + public void setRunStartingSimulation(final boolean runStartingSimulation) { + this.runStartingSimulation = runStartingSimulation; + } + + public int getSimulationDuration() { + return simulationDuration; + } + + public void setSimulationDuration(final int simulationDuration) { + this.simulationDuration = simulationDuration; + } + + public boolean isSimulateRandomMarriages() { + return simulateRandomMarriages; + } + + public void setSimulateRandomMarriages(final boolean simulateRandomMarriages) { + this.simulateRandomMarriages = simulateRandomMarriages; + } + + public boolean isSimulateRandomProcreation() { + return simulateRandomProcreation; + } + + public void setSimulateRandomProcreation(final boolean simulateRandomProcreation) { + this.simulateRandomProcreation = simulateRandomProcreation; + } //endregion Personnel //region Personnel Randomization @@ -417,6 +493,14 @@ public void setAssignBestRollToUnitCommander(final boolean assignBestRollToUnitC this.assignBestRollToUnitCommander = assignBestRollToUnitCommander; } + public boolean isSortStarLeagueUnitsFirst() { + return sortStarLeagueUnitsFirst; + } + + public void setSortStarLeagueUnitsFirst(final boolean sortStarLeagueUnitsFirst) { + this.sortStarLeagueUnitsFirst = sortStarLeagueUnitsFirst; + } + public boolean isGroupByWeight() { return groupByWeight; } @@ -425,20 +509,20 @@ public void setGroupByWeight(final boolean groupByWeight) { this.groupByWeight = groupByWeight; } - public boolean isKeepOfficerRollsSeparate() { - return keepOfficerRollsSeparate; + public boolean isGroupByQuality() { + return groupByQuality; } - public void setKeepOfficerRollsSeparate(final boolean keepOfficerRollsSeparate) { - this.keepOfficerRollsSeparate = keepOfficerRollsSeparate; + public void setGroupByQuality(final boolean groupByQuality) { + this.groupByQuality = groupByQuality; } - public int getStarLeagueYear() { - return starLeagueYear; + public boolean isKeepOfficerRollsSeparate() { + return keepOfficerRollsSeparate; } - public void setStarLeagueYear(final int starLeagueYear) { - this.starLeagueYear = starLeagueYear; + public void setKeepOfficerRollsSeparate(final boolean keepOfficerRollsSeparate) { + this.keepOfficerRollsSeparate = keepOfficerRollsSeparate; } public boolean isAssignTechsToUnits() { @@ -451,12 +535,12 @@ public void setAssignTechsToUnits(final boolean assignTechsToUnits) { //endregion Units //region Unit - public ForceNamingType getForceNamingType() { - return forceNamingType; + public ForceNamingMethod getForceNamingMethod() { + return forceNamingMethod; } - public void setForceNamingType(final ForceNamingType forceNamingType) { - this.forceNamingType = forceNamingType; + public void setForceNamingMethod(final ForceNamingMethod forceNamingMethod) { + this.forceNamingMethod = forceNamingMethod; } public boolean isGenerateForceIcons() { @@ -485,12 +569,12 @@ public void setSparesPercentOfActiveUnits(final int sparesPercentOfActiveUnits) this.sparesPercentOfActiveUnits = sparesPercentOfActiveUnits; } - public boolean isGenerateSpareParts() { - return generateSpareParts; + public PartGenerationMethod getPartGenerationMethod() { + return partGenerationMethod; } - public void setGenerateSpareParts(final boolean generateSpareParts) { - this.generateSpareParts = generateSpareParts; + public void setPartGenerationMethod(final PartGenerationMethod partGenerationMethod) { + this.partGenerationMethod = partGenerationMethod; } public int getStartingArmourWeight() { @@ -633,6 +717,24 @@ public void setPayForAmmunition(final boolean payForAmmunition) { this.payForAmmunition = payForAmmunition; } //endregion Finances + + //region Surprises + public boolean isGenerateSurprises() { + return generateSurprises; + } + + public void setGenerateSurprises(final boolean generateSurprises) { + this.generateSurprises = generateSurprises; + } + + public boolean[] getGenerateMysteryBoxTypes() { + return generateMysteryBoxTypes; + } + + public void setGenerateMysteryBoxTypes(final boolean... generateMysteryBoxTypes) { + this.generateMysteryBoxTypes = generateMysteryBoxTypes; + } + //endregion Surprises //endregion Getters/Setters //region File IO @@ -662,8 +764,9 @@ public void writeToXML(final PrintWriter pw) { public void writeToXML(final PrintWriter pw, int indent) { MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "companyGenerationOptions"); + // Base Information - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "type", getType().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "method", getMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "faction", getFaction().getShortName()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "specifyStartingPlanet", isSpecifyStartingPlanet()); MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "startingPlanet", "systemId", @@ -673,6 +776,7 @@ public void writeToXML(final PrintWriter pw, int indent) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "individualLanceCount", getIndividualLanceCount()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lancesPerCompany", getLancesPerCompany()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lanceSize", getLanceSize()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "starLeagueYear", getStarLeagueYear()); // Personnel MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "supportPersonnel"); @@ -690,6 +794,11 @@ public void writeToXML(final PrintWriter pw, int indent) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "applyOfficerStatBonusToWorstSkill", isApplyOfficerStatBonusToWorstSkill()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestOfficers", isAssignBestOfficers()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "automaticallyAssignRanks", isAutomaticallyAssignRanks()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignFounderFlag", isAssignFounderFlag()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "runStartingSimulation", isRunStartingSimulation()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulationDuration", getSimulationDuration()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomMarriages", isSimulateRandomMarriages()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomProcreation", isSimulateRandomProcreation()); // Personnel Randomization MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeOrigin", isRandomizeOrigin()); @@ -703,19 +812,20 @@ public void writeToXML(final PrintWriter pw, int indent) { // Units MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToUnitCommander", isAssignBestRollToUnitCommander()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sortStarLeagueUnitsFirst", isSortStarLeagueUnitsFirst()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByWeight", isGroupByWeight()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByQuality", isGroupByQuality()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "keepOfficerRollsSeparate", isKeepOfficerRollsSeparate()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "starLeagueYear", getStarLeagueYear()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignTechsToUnits", isAssignTechsToUnits()); // Unit - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "forceNamingType", getForceNamingType().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "ForceNamingMethod", getForceNamingMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateForceIcons", isGenerateForceIcons()); // Spares MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMothballedSpareUnits", isGenerateMothballedSpareUnits()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sparesPercentOfActiveUnits", getSparesPercentOfActiveUnits()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSpareParts", isGenerateSpareParts()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "partGenerationMethod", getPartGenerationMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingArmourWeight", getStartingArmourWeight()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSpareAmmunition", isGenerateSpareAmmunition()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "numberReloadsPerWeapon", getNumberReloadsPerWeapon()); @@ -737,13 +847,18 @@ public void writeToXML(final PrintWriter pw, int indent) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForParts", isPayForParts()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForArmour", isPayForArmour()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForAmmunition", isPayForAmmunition()); + + // Surprises + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSurprises", isGenerateSurprises()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxTypes", getGenerateMysteryBoxTypes()); + MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "companyGenerationOptions"); } - public static CompanyGenerationOptions parseFromXML(final File file, final Campaign campaign) { + public static CompanyGenerationOptions parseFromXML(final Campaign campaign, final File file) { if (file == null) { MekHQ.getLogger().error("Received a null file, returning the default AtB options"); - return new CompanyGenerationOptions(CompanyGenerationType.AGAINST_THE_BOT, campaign); + return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); } final Element element; @@ -752,59 +867,64 @@ public static CompanyGenerationOptions parseFromXML(final File file, final Campa element = MekHqXmlUtil.newSafeDocumentBuilder().parse(is).getDocumentElement(); } catch (Exception e) { MekHQ.getLogger().error("Failed to open file, returning the default AtB options", e); - return new CompanyGenerationOptions(CompanyGenerationType.AGAINST_THE_BOT, campaign); + return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); } element.normalize(); final NodeList nl = element.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { final Node wn = nl.item(i); if ("companyGenerationOptions".equals(wn.getNodeName())) { - return parseFromXML(wn); + return new CompanyGenerationOptions(wn); } } MekHQ.getLogger().error("Failed to parse file, returning the default AtB options"); - return new CompanyGenerationOptions(CompanyGenerationType.AGAINST_THE_BOT, campaign); + return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); } - public static CompanyGenerationOptions parseFromXML(final Node wn) { + public void fillFromXML(final Node wn) { final NodeList nl = wn.getChildNodes(); - final CompanyGenerationOptions options = new CompanyGenerationOptions(); - try { for (int x = 0; x < nl.getLength(); x++) { final Node wn2 = nl.item(x); switch (wn2.getNodeName()) { - case "type": - options.setType(CompanyGenerationType.valueOf(wn2.getTextContent().trim())); + //region Base Information + case "method": + setMethod(CompanyGenerationMethod.valueOf(wn2.getTextContent().trim())); break; case "faction": - options.setFaction(Factions.getInstance().getFaction(wn2.getTextContent().trim())); + setFaction(Factions.getInstance().getFaction(wn2.getTextContent().trim())); break; case "specifyStartingPlanet": - options.setSpecifyStartingPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + setSpecifyStartingPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "startingPlanet": String startingPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); String startingPlanetPlanetId = wn2.getTextContent().trim(); - options.setStartingPlanet(Systems.getInstance().getSystemById(startingPlanetSystemId).getPlanetById(startingPlanetPlanetId)); + setStartingPlanet(Systems.getInstance().getSystemById(startingPlanetSystemId).getPlanetById(startingPlanetPlanetId)); break; case "generateMercenaryCompanyCommandLance": - options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn2.getTextContent().trim())); + setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "companyCount": - options.setCompanyCount(Integer.parseInt(wn2.getTextContent().trim())); + setCompanyCount(Integer.parseInt(wn2.getTextContent().trim())); break; case "individualLanceCount": - options.setIndividualLanceCount(Integer.parseInt(wn2.getTextContent().trim())); + setIndividualLanceCount(Integer.parseInt(wn2.getTextContent().trim())); break; case "lancesPerCompany": - options.setLancesPerCompany(Integer.parseInt(wn2.getTextContent().trim())); + setLancesPerCompany(Integer.parseInt(wn2.getTextContent().trim())); break; case "lanceSize": - options.setLanceSize(Integer.parseInt(wn2.getTextContent().trim())); + setLanceSize(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "starLeagueYear": + setStarLeagueYear(Integer.parseInt(wn2.getTextContent().trim())); break; + //endregion Base Information + + //region Personnel case "supportPersonnel": { - options.setSupportPersonnel(new HashMap<>()); + setSupportPersonnel(new HashMap<>()); final NodeList nl2 = wn.getChildNodes(); for (int y = 0; y < nl2.getLength(); y++) { final Node wn3 = nl2.item(y); @@ -824,143 +944,193 @@ public static CompanyGenerationOptions parseFromXML(final Node wn) { } } if ((role != -1) && (number != -1)) { - options.getSupportPersonnel().put(role, number); + getSupportPersonnel().put(role, number); } } } break; } case "poolAssistants": - options.setPoolAssistants(Boolean.parseBoolean(wn2.getTextContent().trim())); + setPoolAssistants(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "generateCaptains": - options.setGenerateCaptains(Boolean.parseBoolean(wn2.getTextContent().trim())); + setGenerateCaptains(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignCompanyCommanderFlag": - options.setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); + setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "companyCommanderLanceOfficer": - options.setCompanyCommanderLanceOfficer(Boolean.parseBoolean(wn2.getTextContent().trim())); + setCompanyCommanderLanceOfficer(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "applyOfficerStatBonusToWorstSkill": - options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn2.getTextContent().trim())); + setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignBestOfficers": - options.setAssignBestOfficers(Boolean.parseBoolean(wn2.getTextContent().trim())); + setAssignBestOfficers(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "automaticallyAssignRanks": - options.setAutomaticallyAssignRanks(Boolean.parseBoolean(wn2.getTextContent().trim())); + setAutomaticallyAssignRanks(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "assignFounderFlag": + setAssignFounderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); break; + case "runStartingSimulation": + setRunStartingSimulation(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "simulationDuration": + setSimulationDuration(Integer.parseInt(wn2.getTextContent().trim())); + break; + case "simulateRandomMarriages": + setSimulateRandomMarriages(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "simulateRandomProcreation": + setSimulateRandomProcreation(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + //endregion Personnel + + //region Personnel Randomization case "randomizeOrigin": - options.setRandomizeOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); + setRandomizeOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "randomizeAroundCentralPlanet": - options.setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "centralPlanet": String centralPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); String centralPlanetPlanetId = wn2.getTextContent().trim(); - options.setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); + setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); break; case "originSearchRadius": - options.setOriginSearchRadius(Integer.parseInt(wn2.getTextContent().trim())); + setOriginSearchRadius(Integer.parseInt(wn2.getTextContent().trim())); break; case "extraRandomOrigin": - options.setExtraRandomOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); + setExtraRandomOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "originDistanceScale": - options.setOriginDistanceScale(Double.parseDouble(wn2.getTextContent().trim())); + setOriginDistanceScale(Double.parseDouble(wn2.getTextContent().trim())); break; + //endregion Personnel Randomization + + //region Units case "generateUnitsAsAttached": - options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn2.getTextContent().trim())); + setGenerateUnitsAsAttached(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignBestRollToUnitCommander": - options.setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn2.getTextContent().trim())); + setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "sortStarLeagueUnitsFirst": + setSortStarLeagueUnitsFirst(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "groupByWeight": - options.setGroupByWeight(Boolean.parseBoolean(wn2.getTextContent().trim())); + setGroupByWeight(Boolean.parseBoolean(wn2.getTextContent().trim())); break; - case "keepOfficerRollsSeparate": - options.setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn2.getTextContent().trim())); + case "groupByQuality": + setGroupByQuality(Boolean.parseBoolean(wn2.getTextContent().trim())); break; - case "starLeagueYear": - options.setStarLeagueYear(Integer.parseInt(wn2.getTextContent().trim())); + case "keepOfficerRollsSeparate": + setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignTechsToUnits": - options.setAssignTechsToUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + setAssignTechsToUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); break; - case "forceNamingType": - options.setForceNamingType(ForceNamingType.valueOf(wn2.getTextContent().trim())); + //endregion Units + + //region Unit + case "ForceNamingMethod": + setForceNamingMethod(ForceNamingMethod.valueOf(wn2.getTextContent().trim())); break; case "generateForceIcons": - options.setGenerateForceIcons(Boolean.parseBoolean(wn2.getTextContent().trim())); + setGenerateForceIcons(Boolean.parseBoolean(wn2.getTextContent().trim())); break; + //endregion Units + + //region Spares case "generateMothballedSpareUnits": - options.setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "sparesPercentOfActiveUnits": - options.setSparesPercentOfActiveUnits(Integer.parseInt(wn2.getTextContent().trim())); + setSparesPercentOfActiveUnits(Integer.parseInt(wn2.getTextContent().trim())); break; - case "generateSpareParts": - options.setGenerateSpareParts(Boolean.parseBoolean(wn2.getTextContent().trim())); + case "partGenerationMethod": + setPartGenerationMethod(PartGenerationMethod.valueOf(wn2.getTextContent().trim())); break; case "startingArmourWeight": - options.setStartingArmourWeight(Integer.parseInt(wn2.getTextContent().trim())); + setStartingArmourWeight(Integer.parseInt(wn2.getTextContent().trim())); break; case "generateSpareAmmunition": - options.setGenerateSpareAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + setGenerateSpareAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "numberReloadsPerWeapon": - options.setNumberReloadsPerWeapon(Integer.parseInt(wn2.getTextContent().trim())); + setNumberReloadsPerWeapon(Integer.parseInt(wn2.getTextContent().trim())); break; case "generateFractionalMachineGunAmmunition": - options.setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); break; + //endregion Spares + + //region Contracts case "selectStartingContract": - options.setSelectStartingContract(Boolean.parseBoolean(wn2.getTextContent().trim())); + setSelectStartingContract(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "startCourseToContractPlanet": - options.setStartCourseToContractPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + setStartCourseToContractPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); break; + //endregion Contracts + + //region Finances case "startingCash": - options.setStartingCash(Integer.parseInt(wn2.getTextContent().trim())); + setStartingCash(Integer.parseInt(wn2.getTextContent().trim())); break; case "randomizeStartingCash": - options.setRandomizeStartingCash(Boolean.parseBoolean(wn2.getTextContent().trim())); + setRandomizeStartingCash(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "randomStartingCashDiceCount": - options.setRandomStartingCashDiceCount(Integer.parseInt(wn2.getTextContent().trim())); + setRandomStartingCashDiceCount(Integer.parseInt(wn2.getTextContent().trim())); break; case "minimumStartingFloat": - options.setMinimumStartingFloat(Integer.parseInt(wn2.getTextContent().trim())); + setMinimumStartingFloat(Integer.parseInt(wn2.getTextContent().trim())); break; case "payForSetup": - options.setPayForSetup(Boolean.parseBoolean(wn2.getTextContent().trim())); + setPayForSetup(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "startingLoan": - options.setStartingLoan(Boolean.parseBoolean(wn2.getTextContent().trim())); + setStartingLoan(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForPersonnel": - options.setPayForPersonnel(Boolean.parseBoolean(wn2.getTextContent().trim())); + setPayForPersonnel(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForUnits": - options.setPayForUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + setPayForUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForParts": - options.setPayForParts(Boolean.parseBoolean(wn2.getTextContent().trim())); + setPayForParts(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForArmour": - options.setPayForArmour(Boolean.parseBoolean(wn2.getTextContent().trim())); + setPayForArmour(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForAmmunition": - options.setPayForAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + setPayForAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + //endregion Finances + + //region Surprises + case "generateSurprises": + setGenerateSurprises(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; + case "generateMysteryBoxTypes": + final String[] values = wn2.getTextContent().trim().split(","); + final boolean[] booleans = new boolean[values.length]; + for (int i = 0; i < values.length; i++) { + booleans[i] = Boolean.parseBoolean(values[i]); + } + setGenerateMysteryBoxTypes(booleans); break; + //endregion Surprises } } } catch (Exception e) { MekHQ.getLogger().error(e); } - return options; } //endregion File IO } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java similarity index 94% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java rename to MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index df0112c3ee..64673d8283 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGeneration/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.campaign.universe.generators.companyGeneration; +package mekhq.campaign.universe.generators.companyGenerators; import megamek.common.EntityWeightClass; import megamek.common.MechSummary; @@ -25,12 +25,12 @@ import mekhq.campaign.personnel.ranks.Ranks; import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.Faction; -import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; public class WindchildCompanyGenerator extends AbstractCompanyGenerator { //region Constructors public WindchildCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { - super(campaign, CompanyGenerationType.WINDCHILD, options); + super(campaign, CompanyGenerationMethod.WINDCHILD, options); } //endregion Constructors diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java new file mode 100644 index 0000000000..77cc58b4de --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.partGenerators; + +import mekhq.campaign.parts.Armor; +import mekhq.campaign.parts.Part; +import mekhq.campaign.parts.equipment.AmmoBin; +import mekhq.campaign.unit.Unit; +import mekhq.campaign.universe.enums.PartGenerationMethod; +import mekhq.campaign.work.WorkTime; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractPartGenerator { + //region Variable Declarations + private final PartGenerationMethod method; + //endregion Variable Declarations + + //region Constructors + protected AbstractPartGenerator(final PartGenerationMethod method) { + this.method = method; + } + //endregion Constructors + + //region Getters/Setters + public PartGenerationMethod getMethod() { + return method; + } + //endregion Getters/Setters + + /** + * This generates based on the parts from a list of units, optionally excluding armour and ammunition + * @param units the list of units to generate parts based off of + * @param includeArmour whether to include armour in the parts generated + * @param includeAmmunition whether to include ammunition in the parts generated + * @return the generated list of parts + */ + public List generate(final List units, final boolean includeArmour, + final boolean includeAmmunition) { + final List parts = new ArrayList<>(); + units.forEach(unit -> unit.getParts().stream() + .filter(part -> (includeArmour || !(part instanceof Armor)) + && (includeAmmunition || !(part instanceof AmmoBin))) + .forEach(parts::add)); + return generate(parts); + } + + /** + * @param inputParts a list of parts, which are not guaranteed to be unique, sorted, nor unassigned. + * Implementors are required to clone the parts as required. + * @return the list of generated parts + */ + public abstract List generate(final List inputParts); + + /** + * This creates a clone of the input part, with it not being omni-podded if it was originally + * @param inputPart the input part to clone + * @return the cloned part + */ + protected Part clonePart(final Part inputPart) { + final Part part = inputPart.clone(); + part.setMode(WorkTime.NORMAL); + part.setOmniPodded(false); + return part; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/DoublePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/DoublePartGenerator.java new file mode 100644 index 0000000000..d82507daaa --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/DoublePartGenerator.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.partGenerators; + +import mekhq.campaign.parts.Part; +import mekhq.campaign.universe.enums.PartGenerationMethod; + +import java.util.ArrayList; +import java.util.List; + +public class DoublePartGenerator extends AbstractPartGenerator { + //region Constructors + public DoublePartGenerator() { + super(PartGenerationMethod.DOUBLE); + } + //endregion Constructors + + @Override + public List generate(final List inputParts) { + final List parts = new ArrayList<>(); + inputParts.forEach(inputPart -> { + final Part part = clonePart(inputPart); + part.setQuantity(part.getQuantity() * 2); + parts.add(part); + }); + return parts; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java new file mode 100644 index 0000000000..5abc2c63ba --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.partGenerators; + +import mekhq.campaign.parts.Part; +import mekhq.campaign.universe.enums.PartGenerationMethod; + +import java.util.ArrayList; +import java.util.List; + +/** + * The Rules for this Generator: + * 1) Start with Triple, then cut it down. + * Remove all Engines. + * All Heat Sinks are capped at 30 per type. + * All Mech Heads [Sensors, Life Support] are capped at 2 per weight/type. + * All Gyros are capped at 1 per weight/type. + * MASC is capped at 1 per type + * Any other parts are capped at 6. + */ +public class MishraPartGenerator extends TriplePartGenerator { + //region Constructors + public MishraPartGenerator() { + super(PartGenerationMethod.MISHRA); + } + //endregion Constructors + + @Override + public List generate(final List inputParts) { + return new ArrayList<>(); + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/SinglePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/SinglePartGenerator.java new file mode 100644 index 0000000000..c7e35122e8 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/SinglePartGenerator.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.partGenerators; + +import mekhq.campaign.parts.Part; +import mekhq.campaign.universe.enums.PartGenerationMethod; + +import java.util.ArrayList; +import java.util.List; + +public class SinglePartGenerator extends AbstractPartGenerator { + //region Constructors + public SinglePartGenerator() { + super(PartGenerationMethod.SINGLE); + } + //endregion Constructors + + @Override + public List generate(final List inputParts) { + final List parts = new ArrayList<>(); + inputParts.forEach(part -> parts.add(clonePart(part))); + return parts; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/TriplePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/TriplePartGenerator.java new file mode 100644 index 0000000000..9624e93b86 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/TriplePartGenerator.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.partGenerators; + +import mekhq.campaign.parts.Part; +import mekhq.campaign.universe.enums.PartGenerationMethod; + +import java.util.ArrayList; +import java.util.List; + +public class TriplePartGenerator extends AbstractPartGenerator { + //region Constructors + public TriplePartGenerator() { + this(PartGenerationMethod.TRIPLE); + } + + protected TriplePartGenerator(final PartGenerationMethod method) { + super(method); + } + //endregion Constructors + + @Override + public List generate(final List inputParts) { + final List parts = new ArrayList<>(); + inputParts.forEach(inputPart -> { + final Part part = clonePart(inputPart); + part.setQuantity(part.getQuantity() * 3); + parts.add(part); + }); + return parts; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java new file mode 100644 index 0000000000..1b2e879593 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.partGenerators; + +import mekhq.campaign.Warehouse; +import mekhq.campaign.parts.Part; +import mekhq.campaign.universe.enums.PartGenerationMethod; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 1 Part for every 3, rounded normally. + * This means you get 1 part for 2-4 in the input array, plus another for every interval above that + */ +public class WindchildPartGenerator extends AbstractPartGenerator { + //region Constructors + public WindchildPartGenerator() { + super(PartGenerationMethod.WINDCHILD); + } + //endregion Constructors + + @Override + public List generate(final List inputParts) { + final Warehouse warehouse = new Warehouse(); + inputParts.forEach(part -> warehouse.addPart(clonePart(part), true)); + warehouse.forEachPart(part -> part.setQuantity((int) Math.round(part.getQuantity() / 3d))); + return warehouse.getParts().stream().filter(part -> part.getQuantity() > 0).collect(Collectors.toList()); + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractClanMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractClanMysteryBox.java new file mode 100644 index 0000000000..0e7051158f --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractClanMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public abstract class AbstractClanMysteryBox extends AbstractMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractInnerSphereMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractInnerSphereMysteryBox.java new file mode 100644 index 0000000000..7d3e858e52 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractInnerSphereMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class AbstractInnerSphereMysteryBox extends AbstractMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractMysteryBox.java new file mode 100644 index 0000000000..a2ab8e7e4c --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractMysteryBox.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public abstract class AbstractMysteryBox { + //region Variable Declarations + //endregion Variable Declarations + + //region Constructors + //endregion Constructors + + //region Getters/Setters + //endregion Getters/Setters +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanExperimentalMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanExperimentalMysteryBox.java new file mode 100644 index 0000000000..2a4c4c118d --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanExperimentalMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class ClanExperimentalMysteryBox extends AbstractClanMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanFrontlineMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanFrontlineMysteryBox.java new file mode 100644 index 0000000000..14764820ed --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanFrontlineMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class ClanFrontlineMysteryBox extends AbstractClanMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanKeshikMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanKeshikMysteryBox.java new file mode 100644 index 0000000000..b0a8b82591 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanKeshikMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class ClanKeshikMysteryBox extends AbstractClanMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanSecondLineMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanSecondLineMysteryBox.java new file mode 100644 index 0000000000..1e23a362b0 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanSecondLineMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class ClanSecondLineMysteryBox extends AbstractClanMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/InnerSphereExperimentalMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/InnerSphereExperimentalMysteryBox.java new file mode 100644 index 0000000000..95851c2b7a --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/InnerSphereExperimentalMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class InnerSphereExperimentalMysteryBox extends AbstractInnerSphereMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRegularMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRegularMysteryBox.java new file mode 100644 index 0000000000..06f04491a1 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRegularMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class StarLeagueRegularMysteryBox extends AbstractMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRoyalMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRoyalMysteryBox.java new file mode 100644 index 0000000000..aaf8fa071e --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRoyalMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class StarLeagueRoyalMysteryBox extends StarLeagueRegularMysteryBox { +} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ThirdSuccessionWarMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ThirdSuccessionWarMysteryBox.java new file mode 100644 index 0000000000..ca4483c90a --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ThirdSuccessionWarMysteryBox.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.randomEvent.mysteryBoxes; + +public class ThirdSuccessionWarMysteryBox extends AbstractInnerSphereMysteryBox { +} diff --git a/MekHQ/src/mekhq/gui/adapter/PersonnelTableMouseAdapter.java b/MekHQ/src/mekhq/gui/adapter/PersonnelTableMouseAdapter.java index 00fad23951..e9b13e9265 100644 --- a/MekHQ/src/mekhq/gui/adapter/PersonnelTableMouseAdapter.java +++ b/MekHQ/src/mekhq/gui/adapter/PersonnelTableMouseAdapter.java @@ -477,7 +477,7 @@ public void actionPerformed(ActionEvent action) { } case CMD_ADD_PREGNANCY: { if (selectedPerson.getGender().isFemale()) { - selectedPerson.addPregnancy(gui.getCampaign()); + selectedPerson.addPregnancy(gui.getCampaign(), gui.getCampaign().getLocalDate()); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); } break; @@ -499,7 +499,8 @@ public void actionPerformed(ActionEvent action) { } case CMD_ADD_SPOUSE: { Person spouse = gui.getCampaign().getPerson(UUID.fromString(data[1])); - Marriage.valueOf(data[2]).marry(selectedPerson, spouse, gui.getCampaign()); + Marriage.valueOf(data[2]).marry(gui.getCampaign(), selectedPerson, spouse, + gui.getCampaign().getLocalDate()); break; } case CMD_ADD_AWARD: { @@ -623,7 +624,7 @@ public void actionPerformed(ActionEvent action) { if (status.isActive() || (JOptionPane.showConfirmDialog(null, String.format(resourceMap.getString("confirmRetireQ.format"), person.getFullTitle()), status.toString(), JOptionPane.YES_NO_OPTION) == 0)) { - person.changeStatus(gui.getCampaign(), status); + person.changeStatus(gui.getCampaign(), status, gui.getCampaign().getLocalDate()); } } break; @@ -1743,7 +1744,8 @@ private void maybeShowPopup(MouseEvent e) { if (oneSelected && person.getStatus().isActive()) { if (gui.getCampaign().getCampaignOptions().useManualMarriages() - && person.oldEnoughToMarry(gui.getCampaign()) && !person.getGenealogy().hasSpouse()) { + && person.oldEnoughToMarry(gui.getCampaign(), gui.getCampaign().getLocalDate()) + && !person.getGenealogy().hasSpouse()) { menu = new JMenu(resourceMap.getString("chooseSpouse.text")); JMenu maleMenu = new JMenu(resourceMap.getString("spouseMenuMale.text")); JMenu femaleMenu = new JMenu(resourceMap.getString("spouseMenuFemale.text")); @@ -1755,7 +1757,7 @@ private void maybeShowPopup(MouseEvent e) { personnel.sort(Comparator.comparing((Person p) -> p.getAge(today)).thenComparing(Person::getSurname)); for (Person ps : personnel) { - if (person.safeSpouse(ps, gui.getCampaign())) { + if (person.safeSpouse(gui.getCampaign(), ps, gui.getCampaign().getLocalDate())) { String pStatus; if (ps.getPrisonerStatus().isBondsman()) { @@ -2673,7 +2675,7 @@ private void maybeShowPopup(MouseEvent e) { } if (oneSelected) { - if (person.canProcreate(gui.getCampaign())) { + if (person.canProcreate(gui.getCampaign().getLocalDate())) { menuItem = new JMenuItem(resourceMap.getString("addPregnancy.text")); menuItem.setActionCommand(CMD_ADD_PREGNANCY); menuItem.addActionListener(this); diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index b002d1ba53..bbd51ae91c 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -23,8 +23,8 @@ import mekhq.campaign.Campaign; import mekhq.campaign.mission.Contract; import mekhq.campaign.personnel.Person; -import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; -import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.gui.enums.CompanyGenerationPanelType; import mekhq.gui.view.CompanyGenerationOptionsPanel; @@ -135,7 +135,7 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { JButton btnRestore = new JButton(resources.getString("RestoreDefaults")); btnRestore.setName("btnRestore"); btnRestore.addActionListener(evt -> getCompanyGenerationOptionsPanel().setOptions( - MekHQ.getMekHQOptions().getDefaultCompanyGenerationType())); + MekHQ.getMekHQOptions().getDefaultCompanyGenerationMethod())); panel.add(btnRestore); JButton btnImport = new JButton(resources.getString("Import")); @@ -159,7 +159,7 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { @Override protected void okAction() { final CompanyGenerationOptions options = getCompanyGenerationOptionsPanel().createOptionsFromPanel(); - final AbstractCompanyGenerator generator = options.getType().getGenerator(getCampaign(), options); + final AbstractCompanyGenerator generator = options.getMethod().getGenerator(getCampaign(), options); final List combatPersonnel = generator.generateCombatPersonnel(getCampaign()); final List supportPersonnel = generator.generateSupportPersonnel(getCampaign()); final List entities = generator.generateUnits(getCampaign(), combatPersonnel); diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index c25d8960cd..46a2acada5 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -23,7 +23,7 @@ import megamek.common.util.EncodeControl; import mekhq.MekHQ; import mekhq.campaign.event.MekHQOptionsChangedEvent; -import mekhq.campaign.universe.enums.CompanyGenerationType; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; import mekhq.gui.enums.PersonnelFilterStyle; import javax.swing.*; @@ -76,7 +76,7 @@ public class MekHqOptionsDialog extends BaseButtonDialog { //region Miscellaneous private JSpinner optionStartGameDelay; - private JComboBox optionDefaultCompanyGenerationType; + private JComboBox optionDefaultCompanyGenerationMethod; //endregion Miscellaneous //endregion Variable Declarations @@ -361,17 +361,18 @@ private JPanel createMiscellaneousTab() { optionStartGameDelay = new JSpinner(new SpinnerNumberModel(0, 0, 2500, 25)); optionStartGameDelay.setToolTipText(resources.getString("optionStartGameDelay.toolTipText")); - JLabel labelDefaultCompanyGenerationType = new JLabel(resources.getString("labelDefaultCompanyGenerationType.text")); - labelDefaultCompanyGenerationType.setToolTipText(resources.getString("labelDefaultCompanyGenerationType.toolTipText")); - optionDefaultCompanyGenerationType = new JComboBox<>(CompanyGenerationType.values()); - optionDefaultCompanyGenerationType.setRenderer(new DefaultListCellRenderer() { + JLabel labelDefaultCompanyGenerationMethod = new JLabel(resources.getString("labelDefaultCompanyGenerationMethod.text")); + labelDefaultCompanyGenerationMethod.setToolTipText(resources.getString("labelDefaultCompanyGenerationMethod.toolTipText")); + + optionDefaultCompanyGenerationMethod = new JComboBox<>(CompanyGenerationMethod.values()); + optionDefaultCompanyGenerationMethod.setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (isSelected && (index > -1)) { - list.setToolTipText((list.getSelectedValue() instanceof CompanyGenerationType) - ? ((CompanyGenerationType) list.getSelectedValue()).getToolTipText() : ""); + list.setToolTipText((list.getSelectedValue() instanceof CompanyGenerationMethod) + ? ((CompanyGenerationMethod) list.getSelectedValue()).getToolTipText() : ""); } return this; } @@ -392,8 +393,8 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(optionStartGameDelay, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, 40)) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(labelDefaultCompanyGenerationType) - .addComponent(optionDefaultCompanyGenerationType)) + .addComponent(labelDefaultCompanyGenerationMethod) + .addComponent(optionDefaultCompanyGenerationMethod)) ); layout.setHorizontalGroup( @@ -402,8 +403,8 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(labelStartGameDelay) .addComponent(optionStartGameDelay)) .addGroup(layout.createSequentialGroup() - .addComponent(labelDefaultCompanyGenerationType) - .addComponent(optionDefaultCompanyGenerationType)) + .addComponent(labelDefaultCompanyGenerationMethod) + .addComponent(optionDefaultCompanyGenerationMethod)) ); return body; @@ -441,7 +442,7 @@ protected void okAction() { MekHQ.getMekHQOptions().setSaveCompanyGenerationOptions(optionSaveCompanyGenerationOptions.isSelected()); MekHQ.getMekHQOptions().setStartGameDelay((Integer) optionStartGameDelay.getValue()); - MekHQ.getMekHQOptions().setDefaultCompanyGenerationType((CompanyGenerationType) Objects.requireNonNull(optionDefaultCompanyGenerationType.getSelectedItem())); + MekHQ.getMekHQOptions().setDefaultCompanyGenerationMethod((CompanyGenerationMethod) Objects.requireNonNull(optionDefaultCompanyGenerationMethod.getSelectedItem())); MekHQ.triggerEvent(new MekHQOptionsChangedEvent()); } @@ -472,7 +473,7 @@ private void setInitialState() { optionSaveCompanyGenerationOptions.setSelected(MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()); optionStartGameDelay.setValue(MekHQ.getMekHQOptions().getStartGameDelay()); - optionDefaultCompanyGenerationType.setSelectedItem(MekHQ.getMekHQOptions().getDefaultCompanyGenerationType()); + optionDefaultCompanyGenerationMethod.setSelectedItem(MekHQ.getMekHQOptions().getDefaultCompanyGenerationMethod()); } //region Data Validation diff --git a/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java b/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java index 1b39b0d630..8d640aae25 100644 --- a/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java +++ b/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java @@ -18,7 +18,7 @@ */ package mekhq.gui.enums; -import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; public enum CompanyGenerationPanelType { OPTIONS, diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java index 2fcfeb9c55..dc62ee202d 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -28,9 +28,10 @@ import mekhq.campaign.universe.Factions; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.PlanetarySystem; -import mekhq.campaign.universe.enums.CompanyGenerationType; -import mekhq.campaign.universe.enums.ForceNamingType; -import mekhq.campaign.universe.generators.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; +import mekhq.campaign.universe.enums.ForceNamingMethod; +import mekhq.campaign.universe.enums.PartGenerationMethod; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.gui.FileDialogs; import javax.swing.*; @@ -51,7 +52,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { private Campaign campaign; // Base Information - private JComboBox comboCompanyGenerationType; + private JComboBox comboCompanyGenerationMethod; private JComboBox comboFaction; private JCheckBox chkSpecifyStartingSystem; private JCheckBox chkStartingSystemFactionSpecific; @@ -62,6 +63,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JSpinner spnIndividualLanceCount; private JSpinner spnLancesPerCompany; private JSpinner spnLanceSize; + private JSpinner spnStarLeagueYear; // Personnel private JLabel lblTotalSupportPersonnel; @@ -73,6 +75,11 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkApplyOfficerStatBonusToWorstSkill; private JCheckBox chkAssignBestOfficers; private JCheckBox chkAutomaticallyAssignRanks; + private JCheckBox chkAssignFounderFlag; + private JCheckBox chkRunStartingSimulation; + private JSpinner spnSimulationDuration; + private JCheckBox chkSimulateRandomMarriages; + private JCheckBox chkSimulateRandomProcreation; // Personnel Randomization private JCheckBox chkRandomizeOrigin; @@ -87,19 +94,20 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Units private JCheckBox chkGenerateUnitsAsAttached; private JCheckBox chkAssignBestRollToUnitCommander; + private JCheckBox chkSortStarLeagueUnitsFirst; private JCheckBox chkGroupByWeight; + private JCheckBox chkGroupByQuality; private JCheckBox chkKeepOfficerRollsSeparate; - private JSpinner spnStarLeagueYear; private JCheckBox chkAssignTechsToUnits; // Unit - private JComboBox comboForceNamingType; + private JComboBox comboForceNamingMethod; private JCheckBox chkGenerateForceIcons; // Spares private JCheckBox chkGenerateMothballedSpareUnits; private JSpinner spnSparesPercentOfActiveUnits; - private JCheckBox chkGenerateSpareParts; + private JComboBox comboPartGenerationMethod; private JSpinner spnStartingArmourWeight; private JCheckBox chkGenerateSpareAmmunition; private JSpinner spnNumberReloadsPerWeapon; @@ -122,6 +130,15 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkPayForArmour; private JCheckBox chkPayForAmmunition; + // Surprises + private JCheckBox chkGenerateSurprises; + private JCheckBox chkGenerateStarLeagueRoyalBox; + private JCheckBox chkGenerateStarLeagueRegularBox; + private JCheckBox chkGenerateClanKeshikBox; + private JCheckBox chkGenerateClanFrontlineBox; + private JCheckBox chkGenerateClanSecondLineBox; + private JCheckBox chkGenerateExperimentalTechBox; + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations @@ -134,7 +151,7 @@ public CompanyGenerationOptionsPanel(final JFrame frame, final Campaign campaign initialize(); if (campaign.getCampaignOptions().getCompanyGenerationOptions() == null) { - setOptions(MekHQ.getMekHQOptions().getDefaultCompanyGenerationType()); + setOptions(MekHQ.getMekHQOptions().getDefaultCompanyGenerationMethod()); } else { setOptions(campaign.getCampaignOptions().getCompanyGenerationOptions()); } @@ -159,16 +176,16 @@ public void setCampaign(final Campaign campaign) { } //region Base Information - public JComboBox getComboCompanyGenerationType() { - return comboCompanyGenerationType; + public JComboBox getComboCompanyGenerationMethod() { + return comboCompanyGenerationMethod; } - public CompanyGenerationType getCompanyGenerationType() { - return (CompanyGenerationType) Objects.requireNonNull(getComboCompanyGenerationType().getSelectedItem()); + public CompanyGenerationMethod getCompanyGenerationMethod() { + return (CompanyGenerationMethod) Objects.requireNonNull(getComboCompanyGenerationMethod().getSelectedItem()); } - public void setComboCompanyGenerationType(final JComboBox comboCompanyGenerationType) { - this.comboCompanyGenerationType = comboCompanyGenerationType; + public void setComboCompanyGenerationMethod(final JComboBox comboCompanyGenerationMethod) { + this.comboCompanyGenerationMethod = comboCompanyGenerationMethod; } public JComboBox getComboFaction() { @@ -279,6 +296,14 @@ public JSpinner getSpnLanceSize() { public void setSpnLanceSize(final JSpinner spnLanceSize) { this.spnLanceSize = spnLanceSize; } + + public JSpinner getSpnStarLeagueYear() { + return spnStarLeagueYear; + } + + public void setSpnStarLeagueYear(final JSpinner spnStarLeagueYear) { + this.spnStarLeagueYear = spnStarLeagueYear; + } //endregion Base Information //region Personnel @@ -371,6 +396,46 @@ public JCheckBox getChkAutomaticallyAssignRanks() { public void setChkAutomaticallyAssignRanks(final JCheckBox chkAutomaticallyAssignRanks) { this.chkAutomaticallyAssignRanks = chkAutomaticallyAssignRanks; } + + public JCheckBox getChkAssignFounderFlag() { + return chkAssignFounderFlag; + } + + public void setChkAssignFounderFlag(final JCheckBox chkAssignFounderFlag) { + this.chkAssignFounderFlag = chkAssignFounderFlag; + } + + public JCheckBox getChkRunStartingSimulation() { + return chkRunStartingSimulation; + } + + public void setChkRunStartingSimulation(final JCheckBox chkRunStartingSimulation) { + this.chkRunStartingSimulation = chkRunStartingSimulation; + } + + public JSpinner getSpnSimulationDuration() { + return spnSimulationDuration; + } + + public void setSpnSimulationDuration(final JSpinner spnSimulationDuration) { + this.spnSimulationDuration = spnSimulationDuration; + } + + public JCheckBox getChkSimulateRandomMarriages() { + return chkSimulateRandomMarriages; + } + + public void setChkSimulateRandomMarriages(final JCheckBox chkSimulateRandomMarriages) { + this.chkSimulateRandomMarriages = chkSimulateRandomMarriages; + } + + public JCheckBox getChkSimulateRandomProcreation() { + return chkSimulateRandomProcreation; + } + + public void setChkSimulateRandomProcreation(final JCheckBox chkSimulateRandomProcreation) { + this.chkSimulateRandomProcreation = chkSimulateRandomProcreation; + } //endregion Personnel //region Personnel Randomization @@ -481,6 +546,14 @@ public void setChkAssignBestRollToUnitCommander(final JCheckBox chkAssignBestRol this.chkAssignBestRollToUnitCommander = chkAssignBestRollToUnitCommander; } + public JCheckBox getChkSortStarLeagueUnitsFirst() { + return chkSortStarLeagueUnitsFirst; + } + + public void setChkSortStarLeagueUnitsFirst(final JCheckBox chkSortStarLeagueUnitsFirst) { + this.chkSortStarLeagueUnitsFirst = chkSortStarLeagueUnitsFirst; + } + public JCheckBox getChkGroupByWeight() { return chkGroupByWeight; } @@ -489,20 +562,20 @@ public void setChkGroupByWeight(final JCheckBox chkGroupByWeight) { this.chkGroupByWeight = chkGroupByWeight; } - public JCheckBox getChkKeepOfficerRollsSeparate() { - return chkKeepOfficerRollsSeparate; + public JCheckBox getChkGroupByQuality() { + return chkGroupByQuality; } - public void setChkKeepOfficerRollsSeparate(final JCheckBox chkKeepOfficerRollsSeparate) { - this.chkKeepOfficerRollsSeparate = chkKeepOfficerRollsSeparate; + public void setChkGroupByQuality(final JCheckBox chkGroupByQuality) { + this.chkGroupByQuality = chkGroupByQuality; } - public JSpinner getSpnStarLeagueYear() { - return spnStarLeagueYear; + public JCheckBox getChkKeepOfficerRollsSeparate() { + return chkKeepOfficerRollsSeparate; } - public void setSpnStarLeagueYear(final JSpinner spnStarLeagueYear) { - this.spnStarLeagueYear = spnStarLeagueYear; + public void setChkKeepOfficerRollsSeparate(final JCheckBox chkKeepOfficerRollsSeparate) { + this.chkKeepOfficerRollsSeparate = chkKeepOfficerRollsSeparate; } public JCheckBox getChkAssignTechsToUnits() { @@ -515,16 +588,16 @@ public void setChkAssignTechsToUnits(final JCheckBox chkAssignTechsToUnits) { //endregion Units //region Unit - public JComboBox getComboForceNamingType() { - return comboForceNamingType; + public JComboBox getComboForceNamingMethod() { + return comboForceNamingMethod; } - public ForceNamingType getForceNamingType() { - return (ForceNamingType) Objects.requireNonNull(getComboForceNamingType().getSelectedItem()); + public ForceNamingMethod getForceNamingMethod() { + return (ForceNamingMethod) Objects.requireNonNull(getComboForceNamingMethod().getSelectedItem()); } - public void setComboForceNamingType(final JComboBox comboForceNamingType) { - this.comboForceNamingType = comboForceNamingType; + public void setComboForceNamingMethod(final JComboBox comboForceNamingMethod) { + this.comboForceNamingMethod = comboForceNamingMethod; } public JCheckBox getChkGenerateForceIcons() { @@ -553,12 +626,16 @@ public void setSpnSparesPercentOfActiveUnits(final JSpinner spnSparesPercentOfAc this.spnSparesPercentOfActiveUnits = spnSparesPercentOfActiveUnits; } - public JCheckBox getChkGenerateSpareParts() { - return chkGenerateSpareParts; + public JComboBox getComboPartGenerationMethod() { + return comboPartGenerationMethod; + } + + public PartGenerationMethod getPartGenerationMethod() { + return (PartGenerationMethod) Objects.requireNonNull(getComboPartGenerationMethod().getSelectedItem()); } - public void setChkGenerateSpareParts(final JCheckBox chkGenerateSpareParts) { - this.chkGenerateSpareParts = chkGenerateSpareParts; + public void setComboPartGenerationMethod(final JComboBox comboPartGenerationMethod) { + this.comboPartGenerationMethod = comboPartGenerationMethod; } public JSpinner getSpnStartingArmourWeight() { @@ -701,6 +778,64 @@ public void setChkPayForAmmunition(final JCheckBox chkPayForAmmunition) { this.chkPayForAmmunition = chkPayForAmmunition; } //endregion Finances + + //region Surprises + public JCheckBox getChkGenerateSurprises() { + return chkGenerateSurprises; + } + + public void setChkGenerateSurprises(final JCheckBox chkGenerateSurprises) { + this.chkGenerateSurprises = chkGenerateSurprises; + } + + public JCheckBox getChkGenerateStarLeagueRoyalBox() { + return chkGenerateStarLeagueRoyalBox; + } + + public void setChkGenerateStarLeagueRoyalBox(final JCheckBox chkGenerateStarLeagueRoyalBox) { + this.chkGenerateStarLeagueRoyalBox = chkGenerateStarLeagueRoyalBox; + } + + public JCheckBox getChkGenerateStarLeagueRegularBox() { + return chkGenerateStarLeagueRegularBox; + } + + public void setChkGenerateStarLeagueRegularBox(final JCheckBox chkGenerateStarLeagueRegularBox) { + this.chkGenerateStarLeagueRegularBox = chkGenerateStarLeagueRegularBox; + } + + public JCheckBox getChkGenerateClanKeshikBox() { + return chkGenerateClanKeshikBox; + } + + public void setChkGenerateClanKeshikBox(final JCheckBox chkGenerateClanKeshikBox) { + this.chkGenerateClanKeshikBox = chkGenerateClanKeshikBox; + } + + public JCheckBox getChkGenerateClanFrontlineBox() { + return chkGenerateClanFrontlineBox; + } + + public void setChkGenerateClanFrontlineBox(final JCheckBox chkGenerateClanFrontlineBox) { + this.chkGenerateClanFrontlineBox = chkGenerateClanFrontlineBox; + } + + public JCheckBox getChkGenerateClanSecondLineBox() { + return chkGenerateClanSecondLineBox; + } + + public void setChkGenerateClanSecondLineBox(final JCheckBox chkGenerateClanSecondLineBox) { + this.chkGenerateClanSecondLineBox = chkGenerateClanSecondLineBox; + } + + public JCheckBox getChkGenerateExperimentalTechBox() { + return chkGenerateExperimentalTechBox; + } + + public void setChkGenerateExperimentalTechBox(final JCheckBox chkGenerateExperimentalTechBox) { + this.chkGenerateExperimentalTechBox = chkGenerateExperimentalTechBox; + } + //endregion Surprises //endregion Getters/Setters //region Determination Methods @@ -745,6 +880,10 @@ private void initialize() { gbc.gridx++; add(createFinancesPanel(), gbc); + + gbc.gridx = 0; + gbc.gridy++; + add(createSurprisesPanel(), gbc); } private JPanel createBaseInformationPanel() { @@ -752,20 +891,20 @@ private JPanel createBaseInformationPanel() { JLabel lblStartingPlanet = new JLabel(); // Create Panel Components - JLabel lblCompanyGenerationType = new JLabel(resources.getString("lblCompanyGenerationType.text")); - lblCompanyGenerationType.setToolTipText(resources.getString("lblCompanyGenerationType.toolTipText")); - lblCompanyGenerationType.setName("lblCompanyGenerationType"); + JLabel lblCompanyGenerationMethod = new JLabel(resources.getString("lblCompanyGenerationMethod.text")); + lblCompanyGenerationMethod.setToolTipText(resources.getString("lblCompanyGenerationMethod.toolTipText")); + lblCompanyGenerationMethod.setName("lblCompanyGenerationMethod"); - setComboCompanyGenerationType(new JComboBox<>(CompanyGenerationType.values())); - getComboCompanyGenerationType().setName("comboCompanyGenerationType"); - getComboCompanyGenerationType().setRenderer(new DefaultListCellRenderer() { + setComboCompanyGenerationMethod(new JComboBox<>(CompanyGenerationMethod.values())); + getComboCompanyGenerationMethod().setName("comboCompanyGenerationMethod"); + getComboCompanyGenerationMethod().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof CompanyGenerationType) { - list.setToolTipText(((CompanyGenerationType) value).getToolTipText()); + if (value instanceof CompanyGenerationMethod) { + list.setToolTipText(((CompanyGenerationMethod) value).getToolTipText()); } return this; } @@ -898,14 +1037,24 @@ public Component getListCellRendererComponent(final JList list, final Object getSpnLanceSize().setToolTipText(resources.getString("lblLanceSize.toolTipText")); getSpnLanceSize().setName("spnLanceSize"); + JLabel lblStarLeagueYear = new JLabel(resources.getString("lblStarLeagueYear.text")); + lblStarLeagueYear.setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); + lblStarLeagueYear.setName("lblStarLeagueYear"); + + setSpnStarLeagueYear(new JSpinner(new SpinnerNumberModel(2765, 2571, 2780, 1))); + getSpnStarLeagueYear().setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); + getSpnStarLeagueYear().setName("spnStarLeagueYear"); + getSpnStarLeagueYear().setEditor(new JSpinner.NumberEditor(getSpnStarLeagueYear(), "#")); + // Programmatically Assign Accessibility Labels - lblCompanyGenerationType.setLabelFor(getComboCompanyGenerationType()); + lblCompanyGenerationMethod.setLabelFor(getComboCompanyGenerationMethod()); lblFaction.setLabelFor(getComboFaction()); lblStartingPlanet.setLabelFor(getComboStartingPlanet()); lblCompanyCount.setLabelFor(getSpnCompanyCount()); lblIndividualLanceCount.setLabelFor(getSpnIndividualLanceCount()); lblLancesPerCompany.setLabelFor(getSpnLancesPerCompany()); lblLanceSize.setLabelFor(getSpnLanceSize()); + lblStarLeagueYear.setLabelFor(getSpnStarLeagueYear()); // Disable Panel Portions by Default getChkSpecifyStartingSystem().setSelected(true); @@ -924,8 +1073,8 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(lblCompanyGenerationType) - .addComponent(getComboCompanyGenerationType(), GroupLayout.Alignment.LEADING)) + .addComponent(lblCompanyGenerationMethod) + .addComponent(getComboCompanyGenerationMethod(), GroupLayout.Alignment.LEADING)) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblFaction) .addComponent(getComboFaction(), GroupLayout.Alignment.LEADING)) @@ -947,13 +1096,16 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getSpnLancesPerCompany()) .addComponent(lblLanceSize) .addComponent(getSpnLanceSize(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblStarLeagueYear) + .addComponent(getSpnStarLeagueYear(), GroupLayout.Alignment.LEADING)) ); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(lblCompanyGenerationType) - .addComponent(getComboCompanyGenerationType())) + .addComponent(lblCompanyGenerationMethod) + .addComponent(getComboCompanyGenerationMethod())) .addGroup(layout.createSequentialGroup() .addComponent(lblFaction) .addComponent(getComboFaction())) @@ -975,11 +1127,17 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getSpnLancesPerCompany()) .addComponent(lblLanceSize) .addComponent(getSpnLanceSize())) + .addGroup(layout.createSequentialGroup() + .addComponent(lblStarLeagueYear) + .addComponent(getSpnStarLeagueYear())) ); return panel; } private JPanel createPersonnelPanel() { + // Initialize Labels Used in ActionListeners + JLabel lblSimulationDuration = new JLabel(); + // Create Panel Components setLblTotalSupportPersonnel(new JLabel()); updateLblTotalSupportPersonnel(0); @@ -1016,6 +1174,44 @@ private JPanel createPersonnelPanel() { getChkAutomaticallyAssignRanks().setToolTipText(resources.getString("chkAutomaticallyAssignRanks.toolTipText")); getChkAutomaticallyAssignRanks().setName("chkAutomaticallyAssignRanks"); + setChkAssignFounderFlag(new JCheckBox(resources.getString("chkAssignFounderFlag.text"))); + getChkAssignFounderFlag().setToolTipText(resources.getString("chkAssignFounderFlag.toolTipText")); + getChkAssignFounderFlag().setName("chkAssignFounderFlag"); + + setChkRunStartingSimulation(new JCheckBox(resources.getString("chkRunStartingSimulation.text"))); + getChkRunStartingSimulation().setToolTipText(resources.getString("chkRunStartingSimulation.toolTipText")); + getChkRunStartingSimulation().setName("chkRunStartingSimulation"); + getChkRunStartingSimulation().addActionListener(evt -> { + final boolean selected = getChkRunStartingSimulation().isSelected(); + lblSimulationDuration.setEnabled(selected); + getSpnSimulationDuration().setEnabled(selected); + getChkSimulateRandomMarriages().setEnabled(selected); + getChkSimulateRandomProcreation().setEnabled(selected); + }); + + lblSimulationDuration.setText(resources.getString("lblSimulationDuration.text")); + lblSimulationDuration.setToolTipText(resources.getString("lblSimulationDuration.toolTipText")); + lblSimulationDuration.setName("lblSimulationDuration"); + + setSpnSimulationDuration(new JSpinner(new SpinnerNumberModel(0, 0, 25, 1))); + getSpnSimulationDuration().setToolTipText(resources.getString("lblSimulationDuration.toolTipText")); + getSpnSimulationDuration().setName("spnSimulationDuration"); + + setChkSimulateRandomMarriages(new JCheckBox(resources.getString("chkSimulateRandomMarriages.text"))); + getChkSimulateRandomMarriages().setToolTipText(resources.getString("chkSimulateRandomMarriages.toolTipText")); + getChkSimulateRandomMarriages().setName("chkSimulateRandomMarriages"); + + setChkSimulateRandomProcreation(new JCheckBox(resources.getString("chkSimulateRandomProcreation.text"))); + getChkSimulateRandomProcreation().setToolTipText(resources.getString("chkSimulateRandomProcreation.toolTipText")); + getChkSimulateRandomProcreation().setName("chkSimulateRandomProcreation"); + + // Programmatically Assign Accessibility Labels + lblSimulationDuration.setLabelFor(getSpnSimulationDuration()); + + // Disable Panel Portions by Default + getChkRunStartingSimulation().setSelected(true); + getChkRunStartingSimulation().doClick(); + // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("personnelPanel.title"))); @@ -1037,6 +1233,13 @@ private JPanel createPersonnelPanel() { .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) .addComponent(getChkAssignBestOfficers()) .addComponent(getChkAutomaticallyAssignRanks()) + .addComponent(getChkAssignFounderFlag()) + .addComponent(getChkRunStartingSimulation()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblSimulationDuration) + .addComponent(getSpnSimulationDuration(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkSimulateRandomMarriages()) + .addComponent(getChkSimulateRandomProcreation()) ); layout.setHorizontalGroup( @@ -1050,7 +1253,16 @@ private JPanel createPersonnelPanel() { .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) .addComponent(getChkAssignBestOfficers()) .addComponent(getChkAutomaticallyAssignRanks()) + .addComponent(getChkAssignFounderFlag()) + .addComponent(getChkRunStartingSimulation()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblSimulationDuration) + .addComponent(getSpnSimulationDuration())) + .addComponent(getChkSimulateRandomMarriages()) + .addComponent(getChkSimulateRandomProcreation()) ); + + return panel; } @@ -1287,6 +1499,8 @@ public Component getListCellRendererComponent(final JList list, final Object // Programmatically Assign Accessibility Labels lblCentralPlanet.setLabelFor(getComboCentralPlanet()); + lblOriginSearchRadius.setLabelFor(getSpnOriginSearchRadius()); + lblOriginDistanceScale.setLabelFor(getSpnOriginDistanceScale()); // Disable Panel by Default getChkRandomizeOrigin().setSelected(true); @@ -1352,30 +1566,26 @@ private JPanel createUnitsPanel() { getChkAssignBestRollToUnitCommander().setToolTipText(resources.getString("chkAssignBestRollToUnitCommander.toolTipText")); getChkAssignBestRollToUnitCommander().setName("chkAssignBestRollToUnitCommander"); + setChkSortStarLeagueUnitsFirst(new JCheckBox(resources.getString("chkSortStarLeagueUnitsFirst.text"))); + getChkSortStarLeagueUnitsFirst().setToolTipText(resources.getString("chkSortStarLeagueUnitsFirst.toolTipText")); + getChkSortStarLeagueUnitsFirst().setName("chkSortStarLeagueUnitsFirst"); + setChkGroupByWeight(new JCheckBox(resources.getString("chkGroupByWeight.text"))); getChkGroupByWeight().setToolTipText(resources.getString("chkGroupByWeight.toolTipText")); getChkGroupByWeight().setName("chkGroupByWeight"); + setChkGroupByQuality(new JCheckBox(resources.getString("chkGroupByQuality.text"))); + getChkGroupByQuality().setToolTipText(resources.getString("chkGroupByQuality.toolTipText")); + getChkGroupByQuality().setName("chkGroupByQuality"); + setChkKeepOfficerRollsSeparate(new JCheckBox(resources.getString("chkKeepOfficerRollsSeparate.text"))); getChkKeepOfficerRollsSeparate().setToolTipText(resources.getString("chkKeepOfficerRollsSeparate.toolTipText")); getChkKeepOfficerRollsSeparate().setName("chkKeepOfficerRollsSeparate"); - JLabel lblStarLeagueYear = new JLabel(resources.getString("lblStarLeagueYear.text")); - lblStarLeagueYear.setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); - lblStarLeagueYear.setName("lblStarLeagueYear"); - - setSpnStarLeagueYear(new JSpinner(new SpinnerNumberModel(2765, 2571, 2780, 1))); - getSpnStarLeagueYear().setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); - getSpnStarLeagueYear().setName("spnStarLeagueYear"); - getSpnStarLeagueYear().setEditor(new JSpinner.NumberEditor(getSpnStarLeagueYear(), "#")); - setChkAssignTechsToUnits(new JCheckBox(resources.getString("chkAssignTechsToUnits.text"))); getChkAssignTechsToUnits().setToolTipText(resources.getString("chkAssignTechsToUnits.toolTipText")); getChkAssignTechsToUnits().setName("chkAssignTechsToUnits"); - // Programmatically Assign Accessibility Labels - lblStarLeagueYear.setLabelFor(getSpnStarLeagueYear()); - // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitsPanel.title"))); @@ -1390,11 +1600,10 @@ private JPanel createUnitsPanel() { layout.createSequentialGroup() .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) + .addComponent(getChkSortStarLeagueUnitsFirst()) .addComponent(getChkGroupByWeight()) + .addComponent(getChkGroupByQuality()) .addComponent(getChkKeepOfficerRollsSeparate()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(lblStarLeagueYear) - .addComponent(getSpnStarLeagueYear(), GroupLayout.Alignment.LEADING)) .addComponent(getChkAssignTechsToUnits()) ); @@ -1402,11 +1611,10 @@ private JPanel createUnitsPanel() { layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) + .addComponent(getChkSortStarLeagueUnitsFirst()) .addComponent(getChkGroupByWeight()) + .addComponent(getChkGroupByQuality()) .addComponent(getChkKeepOfficerRollsSeparate()) - .addGroup(layout.createSequentialGroup() - .addComponent(lblStarLeagueYear) - .addComponent(getSpnStarLeagueYear())) .addComponent(getChkAssignTechsToUnits()) ); return panel; @@ -1414,20 +1622,20 @@ private JPanel createUnitsPanel() { private JPanel createUnitPanel() { // Create Panel Components - JLabel lblForceNamingType = new JLabel(resources.getString("lblForceNamingType.text")); - lblForceNamingType.setToolTipText(resources.getString("lblForceNamingType.toolTipText")); - lblForceNamingType.setName("lblForceNamingType"); + JLabel lblForceNamingMethod = new JLabel(resources.getString("lblForceNamingMethod.text")); + lblForceNamingMethod.setToolTipText(resources.getString("lblForceNamingMethod.toolTipText")); + lblForceNamingMethod.setName("lblForceNamingMethod"); - setComboForceNamingType(new JComboBox<>(ForceNamingType.values())); - getComboForceNamingType().setName("comboForceNamingType"); - getComboForceNamingType().setRenderer(new DefaultListCellRenderer() { + setComboForceNamingMethod(new JComboBox<>(ForceNamingMethod.values())); + getComboForceNamingMethod().setName("comboForceNamingMethod"); + getComboForceNamingMethod().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof ForceNamingType) { - list.setToolTipText(((ForceNamingType) value).getToolTipText()); + if (value instanceof ForceNamingMethod) { + list.setToolTipText(((ForceNamingMethod) value).getToolTipText()); } return this; } @@ -1438,7 +1646,7 @@ public Component getListCellRendererComponent(final JList list, final Object getChkGenerateForceIcons().setName("chkGenerateForceIcons"); // Programmatically Assign Accessibility Labels - lblForceNamingType.setLabelFor(getComboForceNamingType()); + lblForceNamingMethod.setLabelFor(getComboForceNamingMethod()); // Layout the UI JPanel panel = new JPanel(); @@ -1453,16 +1661,16 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(lblForceNamingType) - .addComponent(getComboForceNamingType(), GroupLayout.Alignment.LEADING)) + .addComponent(lblForceNamingMethod) + .addComponent(getComboForceNamingMethod(), GroupLayout.Alignment.LEADING)) .addComponent(getChkGenerateForceIcons()) ); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(lblForceNamingType) - .addComponent(getComboForceNamingType())) + .addComponent(lblForceNamingMethod) + .addComponent(getComboForceNamingMethod())) .addComponent(getChkGenerateForceIcons()) ); return panel; @@ -1491,9 +1699,25 @@ private JPanel createSparesPanel() { getSpnSparesPercentOfActiveUnits().setToolTipText(resources.getString("chkGenerateMothballedSpareUnits.toolTipText")); getSpnSparesPercentOfActiveUnits().setName("spnGenerateMothballedSpareUnits"); - setChkGenerateSpareParts(new JCheckBox(resources.getString("chkGenerateSpareParts.text"))); - getChkGenerateSpareParts().setToolTipText(resources.getString("chkGenerateSpareParts.toolTipText")); - getChkGenerateSpareParts().setName("chkGenerateSpareParts"); + JLabel lblPartGenerationMethod = new JLabel(resources.getString("lblPartGenerationMethod.text")); + lblPartGenerationMethod.setToolTipText(resources.getString("lblPartGenerationMethod.toolTipText")); + lblPartGenerationMethod.setName("lblPartGenerationMethod"); + + setComboPartGenerationMethod(new JComboBox<>(PartGenerationMethod.values())); + getComboPartGenerationMethod().setToolTipText(resources.getString("lblPartGenerationMethod.toolTipText")); + getComboPartGenerationMethod().setName("comboPartGenerationMethod"); + getComboPartGenerationMethod().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof PartGenerationMethod) { + list.setToolTipText(((PartGenerationMethod) value).getToolTipText()); + } + return this; + } + }); JLabel lblStartingArmourWeight = new JLabel(resources.getString("lblStartingArmourWeight.text")); lblStartingArmourWeight.setToolTipText(resources.getString("lblStartingArmourWeight.toolTipText")); @@ -1527,6 +1751,7 @@ private JPanel createSparesPanel() { // Programmatically Assign Accessibility Labels lblSparesPercentOfActiveUnits.setLabelFor(getSpnSparesPercentOfActiveUnits()); + lblPartGenerationMethod.setLabelFor(getComboPartGenerationMethod()); lblStartingArmourWeight.setLabelFor(getSpnStartingArmourWeight()); lblNumberReloadsPerWeapon.setLabelFor(getSpnNumberReloadsPerWeapon()); @@ -1552,7 +1777,9 @@ private JPanel createSparesPanel() { .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblSparesPercentOfActiveUnits) .addComponent(getSpnSparesPercentOfActiveUnits(), GroupLayout.Alignment.LEADING)) - .addComponent(getChkGenerateSpareParts()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblPartGenerationMethod) + .addComponent(getComboPartGenerationMethod(), GroupLayout.Alignment.LEADING)) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblStartingArmourWeight) .addComponent(getSpnStartingArmourWeight(), GroupLayout.Alignment.LEADING)) @@ -1569,7 +1796,9 @@ private JPanel createSparesPanel() { .addGroup(layout.createSequentialGroup() .addComponent(lblSparesPercentOfActiveUnits) .addComponent(getSpnSparesPercentOfActiveUnits())) - .addComponent(getChkGenerateSpareParts()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblPartGenerationMethod) + .addComponent(getComboPartGenerationMethod())) .addGroup(layout.createSequentialGroup() .addComponent(lblStartingArmourWeight) .addComponent(getSpnStartingArmourWeight())) @@ -1764,6 +1993,84 @@ private JPanel createFinancesPanel() { return panel; } + private JPanel createSurprisesPanel() { + // Create Panel Components + setChkGenerateSurprises(new JCheckBox(resources.getString("chkGenerateSurprises.text"))); + getChkGenerateSurprises().setToolTipText(resources.getString("chkGenerateSurprises.toolTipText")); + getChkGenerateSurprises().setName("chkGenerateSurprises"); + getChkGenerateSurprises().addActionListener(evt -> { + final boolean selected = getChkGenerateSurprises().isSelected(); + getChkGenerateStarLeagueRoyalBox().setEnabled(selected); + getChkGenerateStarLeagueRegularBox().setEnabled(selected); + getChkGenerateClanKeshikBox().setEnabled(selected); + getChkGenerateClanFrontlineBox().setEnabled(selected); + getChkGenerateClanSecondLineBox().setEnabled(selected); + getChkGenerateExperimentalTechBox().setEnabled(selected); + }); + + setChkGenerateStarLeagueRoyalBox(new JCheckBox(resources.getString("chkGenerateStarLeagueRoyalBox.text"))); + getChkGenerateStarLeagueRoyalBox().setToolTipText(resources.getString("chkGenerateStarLeagueRoyalBox.toolTipText")); + getChkGenerateStarLeagueRoyalBox().setName("chkGenerateStarLeagueRoyalBox"); + + setChkGenerateStarLeagueRegularBox(new JCheckBox(resources.getString("chkGenerateStarLeagueRegularBox.text"))); + getChkGenerateStarLeagueRegularBox().setToolTipText(resources.getString("chkGenerateStarLeagueRegularBox.toolTipText")); + getChkGenerateStarLeagueRegularBox().setName("chkGenerateStarLeagueRegularBox"); + + setChkGenerateClanKeshikBox(new JCheckBox(resources.getString("chkGenerateClanKeshikBox.text"))); + getChkGenerateClanKeshikBox().setToolTipText(resources.getString("chkGenerateClanKeshikBox.toolTipText")); + getChkGenerateClanKeshikBox().setName("chkGenerateClanKeshikBox"); + + setChkGenerateClanFrontlineBox(new JCheckBox(resources.getString("chkGenerateClanFrontlineBox.text"))); + getChkGenerateClanFrontlineBox().setToolTipText(resources.getString("chkGenerateClanFrontlineBox.toolTipText")); + getChkGenerateClanFrontlineBox().setName("chkGenerateClanFrontlineBox"); + + setChkGenerateClanSecondLineBox(new JCheckBox(resources.getString("chkGenerateClanSecondLineBox.text"))); + getChkGenerateClanSecondLineBox().setToolTipText(resources.getString("chkGenerateClanSecondLineBox.toolTipText")); + getChkGenerateClanSecondLineBox().setName("chkGenerateClanSecondLineBox"); + + setChkGenerateExperimentalTechBox(new JCheckBox(resources.getString("chkGenerateExperimentalTechBox.text"))); + getChkGenerateExperimentalTechBox().setToolTipText(resources.getString("chkGenerateExperimentalTechBox.toolTipText")); + getChkGenerateExperimentalTechBox().setName("chkGenerateExperimentalTechBox"); + + // Disable Panel by Default + getChkGenerateSurprises().setSelected(true); + getChkGenerateSurprises().doClick(); + + // Layout the UI + JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("surprisesPanel.title"))); + panel.setToolTipText(resources.getString("surprisesPanel.toolTipText")); + panel.setName("surprisesPanel"); + GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getChkGenerateSurprises()) + .addComponent(getChkGenerateStarLeagueRoyalBox()) + .addComponent(getChkGenerateStarLeagueRegularBox()) + .addComponent(getChkGenerateClanKeshikBox()) + .addComponent(getChkGenerateClanFrontlineBox()) + .addComponent(getChkGenerateClanSecondLineBox()) + .addComponent(getChkGenerateExperimentalTechBox()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(getChkGenerateSurprises()) + .addComponent(getChkGenerateStarLeagueRoyalBox()) + .addComponent(getChkGenerateStarLeagueRegularBox()) + .addComponent(getChkGenerateClanKeshikBox()) + .addComponent(getChkGenerateClanFrontlineBox()) + .addComponent(getChkGenerateClanSecondLineBox()) + .addComponent(getChkGenerateExperimentalTechBox()) + ); + return panel; + } + private List getFactionChoices() { final List factionChoices = new ArrayList<>(); @@ -1789,18 +2096,17 @@ private PlanetarySystem[] getPlanetarySystems(final @Nullable Faction faction) { //region Options public void setOptions() { - setOptions(getCompanyGenerationType()); + setOptions(getCompanyGenerationMethod()); } - public void setOptions(final CompanyGenerationType type) { - getComboCompanyGenerationType().setSelectedItem(type); - setOptions(new CompanyGenerationOptions(type, getCampaign())); + public void setOptions(final CompanyGenerationMethod method) { + getComboCompanyGenerationMethod().setSelectedItem(method); + setOptions(new CompanyGenerationOptions(method, getCampaign())); } public void setOptions(final CompanyGenerationOptions options) { // Base Information - getComboCompanyGenerationType().setSelectedItem(options.getType()); - + getComboCompanyGenerationMethod().setSelectedItem(options.getMethod()); getComboFaction().setSelectedIndex(0); // default to 0 final List factionChoices = getFactionChoices(); for (int i = 0; i < factionChoices.size(); i++) { @@ -1821,6 +2127,7 @@ public void setOptions(final CompanyGenerationOptions options) { getSpnIndividualLanceCount().setValue(options.getIndividualLanceCount()); getSpnLancesPerCompany().setValue(options.getLancesPerCompany()); getSpnLanceSize().setValue(options.getLanceSize()); + getSpnStarLeagueYear().setValue(options.getStarLeagueYear()); // Personnel updateLblTotalSupportPersonnel(determineMaximumSupportPersonnel()); @@ -1832,6 +2139,13 @@ public void setOptions(final CompanyGenerationOptions options) { getChkApplyOfficerStatBonusToWorstSkill().setSelected(options.isApplyOfficerStatBonusToWorstSkill()); getChkAssignBestOfficers().setSelected(options.isAssignBestOfficers()); getChkAutomaticallyAssignRanks().setSelected(options.isAutomaticallyAssignRanks()); + getChkAssignFounderFlag().setSelected(options.isAssignFounderFlag()); + if (getChkRunStartingSimulation().isSelected() != options.isRunStartingSimulation()) { + getChkRunStartingSimulation().doClick(); + } + getSpnSimulationDuration().setValue(options.getSimulationDuration()); + getChkSimulateRandomMarriages().setSelected(options.isSimulateRandomMarriages()); + getChkSimulateRandomProcreation().setSelected(options.isSimulateRandomProcreation()); // Personnel Randomization if (getChkRandomizeOrigin().isSelected() != options.isRandomizeOrigin()) { @@ -1851,13 +2165,14 @@ public void setOptions(final CompanyGenerationOptions options) { // Units getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); getChkAssignBestRollToUnitCommander().setSelected(options.isAssignBestRollToUnitCommander()); + getChkSortStarLeagueUnitsFirst().setSelected(options.isSortStarLeagueUnitsFirst()); getChkGroupByWeight().setSelected(options.isGroupByWeight()); + getChkGroupByQuality().setSelected(options.isGroupByQuality()); getChkKeepOfficerRollsSeparate().setSelected(options.isKeepOfficerRollsSeparate()); - getSpnStarLeagueYear().setValue(options.getStarLeagueYear()); getChkAssignTechsToUnits().setSelected(options.isAssignTechsToUnits()); // Unit - getComboForceNamingType().setSelectedItem(options.getForceNamingType()); + getComboForceNamingMethod().setSelectedItem(options.getForceNamingMethod()); getChkGenerateForceIcons().setSelected(options.isGenerateForceIcons()); // Spares @@ -1865,7 +2180,7 @@ public void setOptions(final CompanyGenerationOptions options) { getChkGenerateMothballedSpareUnits().doClick(); } getSpnSparesPercentOfActiveUnits().setValue(options.getSparesPercentOfActiveUnits()); - getChkGenerateSpareParts().setSelected(options.isGenerateSpareParts()); + getComboPartGenerationMethod().setSelectedItem(options.getPartGenerationMethod()); getSpnStartingArmourWeight().setValue(options.getStartingArmourWeight()); if (getChkGenerateSpareAmmunition().isSelected() != options.isGenerateSpareAmmunition()) { getChkGenerateSpareAmmunition().doClick(); @@ -1891,6 +2206,15 @@ public void setOptions(final CompanyGenerationOptions options) { getChkPayForParts().setSelected(options.isPayForParts()); getChkPayForArmour().setSelected(options.isPayForArmour()); getChkPayForAmmunition().setSelected(options.isPayForAmmunition()); + + // Surprises + getChkGenerateSurprises().setSelected(options.isGenerateSurprises()); + getChkGenerateStarLeagueRoyalBox().setSelected(options.isGenerateStarLeagueRoyalBox()); + getChkGenerateStarLeagueRegularBox().setSelected(options.isGenerateStarLeagueRegularBox()); + getChkGenerateClanKeshikBox().setSelected(options.isGenerateClanKeshikBox()); + getChkGenerateClanFrontlineBox().setSelected(options.isGenerateClanFrontlineBox()); + getChkGenerateClanSecondLineBox().setSelected(options.isGenerateClanSecondLineBox()); + getChkGenerateExperimentalTechBox().setSelected(options.isGenerateExperimentalTechBox()); } /** @@ -1899,7 +2223,7 @@ public void setOptions(final CompanyGenerationOptions options) { public CompanyGenerationOptions createOptionsFromPanel() { final CompanyGenerationOptions options = new CompanyGenerationOptions(); // Base Information - options.setType(getCompanyGenerationType()); + options.setMethod(getCompanyGenerationMethod()); options.setFaction(getFaction()); options.setStartingPlanet(getStartingPlanet()); options.setGenerateMercenaryCompanyCommandLance(getChkGenerateMercenaryCompanyCommandLance().isSelected()); @@ -1907,6 +2231,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setIndividualLanceCount((Integer) getSpnIndividualLanceCount().getValue()); options.setLancesPerCompany((Integer) getSpnLancesPerCompany().getValue()); options.setLanceSize((Integer) getSpnLanceSize().getValue()); + options.setStarLeagueYear((Integer) getSpnStarLeagueYear().getValue()); // Personnel options.setSupportPersonnel(getSupportPersonnelNumbers()); @@ -1917,6 +2242,11 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setApplyOfficerStatBonusToWorstSkill(getChkApplyOfficerStatBonusToWorstSkill().isSelected()); options.setAssignBestOfficers(getChkAssignBestOfficers().isSelected()); options.setAutomaticallyAssignRanks(getChkAutomaticallyAssignRanks().isSelected()); + options.setAssignFounderFlag(getChkAssignFounderFlag().isSelected()); + options.setRunStartingSimulation(getChkRunStartingSimulation().isSelected()); + options.setSimulationDuration((Integer) getSpnSimulationDuration().getValue()); + options.setSimulateRandomMarriages(getChkSimulateRandomMarriages().isSelected()); + options.setSimulateRandomProcreation(getChkSimulateRandomProcreation().isSelected()); // Personnel Randomization options.setRandomizeOrigin(getChkRandomizeOrigin().isSelected()); @@ -1929,19 +2259,20 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Units options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); options.setAssignBestRollToUnitCommander(getChkAssignBestRollToUnitCommander().isSelected()); + options.setSortStarLeagueUnitsFirst(getChkSortStarLeagueUnitsFirst().isSelected()); options.setGroupByWeight(getChkGroupByWeight().isSelected()); + options.setGroupByQuality(getChkGroupByQuality().isSelected()); options.setKeepOfficerRollsSeparate(getChkKeepOfficerRollsSeparate().isSelected()); - options.setStarLeagueYear((Integer) getSpnStarLeagueYear().getValue()); options.setAssignTechsToUnits(getChkAssignTechsToUnits().isSelected()); // Unit - options.setForceNamingType(getForceNamingType()); + options.setForceNamingMethod(getForceNamingMethod()); options.setGenerateForceIcons(getChkGenerateForceIcons().isSelected()); // Spares options.setGenerateMothballedSpareUnits(getChkGenerateMothballedSpareUnits().isSelected()); options.setSparesPercentOfActiveUnits((Integer) getSpnSparesPercentOfActiveUnits().getValue()); - options.setGenerateSpareParts(getChkGenerateSpareParts().isSelected()); + options.setPartGenerationMethod(getPartGenerationMethod()); options.setStartingArmourWeight((Integer) getSpnStartingArmourWeight().getValue()); options.setGenerateSpareAmmunition(getChkGenerateSpareAmmunition().isSelected()); options.setNumberReloadsPerWeapon((Integer) getSpnNumberReloadsPerWeapon().getValue()); @@ -1964,6 +2295,15 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setPayForArmour(getChkPayForArmour().isSelected()); options.setPayForAmmunition(getChkPayForAmmunition().isSelected()); + // Surprises + options.setGenerateSurprises(getChkGenerateSurprises().isSelected()); + options.setGenerateStarLeagueRoyalBox(getChkGenerateStarLeagueRoyalBox().isSelected()); + options.setGenerateStarLeagueRegularBox(getChkGenerateStarLeagueRegularBox().isSelected()); + options.setGenerateClanKeshikBox(getChkGenerateClanKeshikBox().isSelected()); + options.setGenerateClanFrontlineBox(getChkGenerateClanFrontlineBox().isSelected()); + options.setGenerateClanSecondLineBox(getChkGenerateClanSecondLineBox().isSelected()); + options.setGenerateExperimentalTechBox(getChkGenerateExperimentalTechBox().isSelected()); + return options; } @@ -2029,7 +2369,7 @@ public boolean validateOptions() { //region File I/O public void importOptionsFromXML() { FileDialogs.openCompanyGenerationOptions(getFrame()) - .ifPresent(file -> setOptions(CompanyGenerationOptions.parseFromXML(file, getCampaign()))); + .ifPresent(file -> setOptions(CompanyGenerationOptions.parseFromXML(getCampaign(), file))); } public void exportOptionsToXML() { diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java index ab4756c14c..13be090a48 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java @@ -2,9 +2,8 @@ import megamek.common.Entity; import mekhq.campaign.personnel.Person; -import mekhq.campaign.universe.generators.companyGeneration.AbstractCompanyGenerator; +import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; -import javax.swing.*; import java.util.List; public class CompanyGenerationPanel { @@ -64,7 +63,7 @@ public void generate() { return; } - setCompanyGenerator(getCompanyGenerationType().getGenerator(getCampaign(), createOptionsFromPanel())); + setCompanyGenerator(getCompanyGenerationMethod().getGenerator(getCampaign(), createOptionsFromPanel())); setCombatPersonnel(getCompanyGenerator().generateCombatPersonnel(getCampaign())); setSupportPersonnel(getCompanyGenerator().generateSupportPersonnel(getCampaign())); From f10ab0021c68b4726ce940ee980ed98049d15ca7 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sat, 6 Mar 2021 08:08:37 -0700 Subject: [PATCH 016/115] Continuing to work on the surprise panel --- .../resources/mekhq/resources/GUI.properties | 4 +- .../AbstractCompanyGenerator.java | 31 ++--- .../CompanyGenerationOptions.java | 4 + .../view/CompanyGenerationOptionsPanel.java | 122 +++++------------- 4 files changed, 45 insertions(+), 116 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 9ba9667235..f96223becf 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -288,9 +288,11 @@ chkPayForAmmunition.text=Pay for Ammunition chkPayForAmmunition.toolTipText=Pay for the spare ammunition generated, if any is generated. ## Surprises Panel surprisesPanel.title=Surprises -surprisesPanel.toolTipText=Mystery Boxes each contain a 'Mech and between two and four parts.\u0020 +surprisesPanel.toolTipText=\u0020 chkGenerateSurprises.text=Generate Surprises chkGenerateSurprises.toolTipText=\u0020 +mysteryBoxPanel.title=Mystery Boxes +mysteryBoxPanel.toolTipText=Mystery Boxes each contain a 'Mech and between two and four parts.\u0020 ## Option Validation Warnings CompanyGenerationOptionsPanel.InvalidOptions.title=Error: Invalid Option Selection CompanyGenerationOptionsPanel.InvalidGenerationSize.text=You must select at least one company or independent lance to generate diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 77292f9aea..9deef167d9 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1366,31 +1366,13 @@ private void generateSurprises(final Campaign campaign) { final MysteryBoxType[] mysteryBoxTypes = MysteryBoxType.values(); final List mysteryBoxes = new ArrayList<>(); - for (int i = 0; i < ) - - if (getOptions().isGenerateStarLeagueRoyalBox()) { - - } - - if (getOptions().isGenerateStarLeagueRegularBox()) { - - } - - if (getOptions().isGenerateClanKeshikBox()) { - - } - - if (getOptions().isGenerateClanFrontlineBox()) { - - } - - if (getOptions().isGenerateClanSecondLineBox()) { - + for (int i = 0; i < getOptions().getGenerateMysteryBoxTypes().length; i++) { + if (getOptions().getGenerateMysteryBoxTypes()[i]) { + mysteryBoxes.add(mysteryBoxTypes[i].getMysteryBox()); + } } - if (getOptions().isGenerateExperimentalTechBox()) { - - } + // TODO : Processing of mystery boxes } //endregion Surprises @@ -1434,6 +1416,9 @@ public void applyToCampaign(final Campaign campaign, final List combatPe parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); armour.forEach(a -> campaign.getWarehouse().addPart(a, true)); ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); + + // Phase 6: Surprises! + generateSurprises(campaign); } private void applyPhaseOneToCampaign(final Campaign campaign, final List combatPersonnel, diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index 80b31a1411..af05831528 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -127,6 +127,7 @@ public class CompanyGenerationOptions implements Serializable { // Surprises private boolean generateSurprises; + private boolean generateMysteryBoxes; private boolean[] generateMysteryBoxTypes; //endregion Variable Declarations @@ -1117,6 +1118,9 @@ public void fillFromXML(final Node wn) { case "generateSurprises": setGenerateSurprises(Boolean.parseBoolean(wn2.getTextContent().trim())); break; + case "generateMysteryBoxes": + setGenerateMysteryBoxes(Boolean.parseBoolean(wn2.getTextContent().trim())); + break; case "generateMysteryBoxTypes": final String[] values = wn2.getTextContent().trim().split(","); final boolean[] booleans = new boolean[values.length]; diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java index dc62ee202d..5c332f460e 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java @@ -30,6 +30,7 @@ import mekhq.campaign.universe.PlanetarySystem; import mekhq.campaign.universe.enums.CompanyGenerationMethod; import mekhq.campaign.universe.enums.ForceNamingMethod; +import mekhq.campaign.universe.enums.MysteryBoxType; import mekhq.campaign.universe.enums.PartGenerationMethod; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.gui.FileDialogs; @@ -132,12 +133,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Surprises private JCheckBox chkGenerateSurprises; - private JCheckBox chkGenerateStarLeagueRoyalBox; - private JCheckBox chkGenerateStarLeagueRegularBox; - private JCheckBox chkGenerateClanKeshikBox; - private JCheckBox chkGenerateClanFrontlineBox; - private JCheckBox chkGenerateClanSecondLineBox; - private JCheckBox chkGenerateExperimentalTechBox; + private JCheckBox[] chkGenerateMysteryBoxTypes; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations @@ -788,52 +784,12 @@ public void setChkGenerateSurprises(final JCheckBox chkGenerateSurprises) { this.chkGenerateSurprises = chkGenerateSurprises; } - public JCheckBox getChkGenerateStarLeagueRoyalBox() { - return chkGenerateStarLeagueRoyalBox; + public JCheckBox[] getChkGenerateMysteryBoxTypes() { + return chkGenerateMysteryBoxTypes; } - public void setChkGenerateStarLeagueRoyalBox(final JCheckBox chkGenerateStarLeagueRoyalBox) { - this.chkGenerateStarLeagueRoyalBox = chkGenerateStarLeagueRoyalBox; - } - - public JCheckBox getChkGenerateStarLeagueRegularBox() { - return chkGenerateStarLeagueRegularBox; - } - - public void setChkGenerateStarLeagueRegularBox(final JCheckBox chkGenerateStarLeagueRegularBox) { - this.chkGenerateStarLeagueRegularBox = chkGenerateStarLeagueRegularBox; - } - - public JCheckBox getChkGenerateClanKeshikBox() { - return chkGenerateClanKeshikBox; - } - - public void setChkGenerateClanKeshikBox(final JCheckBox chkGenerateClanKeshikBox) { - this.chkGenerateClanKeshikBox = chkGenerateClanKeshikBox; - } - - public JCheckBox getChkGenerateClanFrontlineBox() { - return chkGenerateClanFrontlineBox; - } - - public void setChkGenerateClanFrontlineBox(final JCheckBox chkGenerateClanFrontlineBox) { - this.chkGenerateClanFrontlineBox = chkGenerateClanFrontlineBox; - } - - public JCheckBox getChkGenerateClanSecondLineBox() { - return chkGenerateClanSecondLineBox; - } - - public void setChkGenerateClanSecondLineBox(final JCheckBox chkGenerateClanSecondLineBox) { - this.chkGenerateClanSecondLineBox = chkGenerateClanSecondLineBox; - } - - public JCheckBox getChkGenerateExperimentalTechBox() { - return chkGenerateExperimentalTechBox; - } - - public void setChkGenerateExperimentalTechBox(final JCheckBox chkGenerateExperimentalTechBox) { - this.chkGenerateExperimentalTechBox = chkGenerateExperimentalTechBox; + public void setChkGenerateMysteryBoxTypes(JCheckBox... chkGenerateMysteryBoxTypes) { + this.chkGenerateMysteryBoxTypes = chkGenerateMysteryBoxTypes; } //endregion Surprises //endregion Getters/Setters @@ -1994,44 +1950,21 @@ private JPanel createFinancesPanel() { } private JPanel createSurprisesPanel() { + // Initialize Labels Used in ActionListeners + final JPanel mysteryBoxPanel = new JPanel(); + // Create Panel Components setChkGenerateSurprises(new JCheckBox(resources.getString("chkGenerateSurprises.text"))); getChkGenerateSurprises().setToolTipText(resources.getString("chkGenerateSurprises.toolTipText")); getChkGenerateSurprises().setName("chkGenerateSurprises"); getChkGenerateSurprises().addActionListener(evt -> { final boolean selected = getChkGenerateSurprises().isSelected(); - getChkGenerateStarLeagueRoyalBox().setEnabled(selected); - getChkGenerateStarLeagueRegularBox().setEnabled(selected); - getChkGenerateClanKeshikBox().setEnabled(selected); - getChkGenerateClanFrontlineBox().setEnabled(selected); - getChkGenerateClanSecondLineBox().setEnabled(selected); - getChkGenerateExperimentalTechBox().setEnabled(selected); + mysteryBoxPanel.setEnabled(selected); + for (final JCheckBox checkBox : getChkGenerateMysteryBoxTypes()) { + checkBox.setEnabled(selected); + } }); - setChkGenerateStarLeagueRoyalBox(new JCheckBox(resources.getString("chkGenerateStarLeagueRoyalBox.text"))); - getChkGenerateStarLeagueRoyalBox().setToolTipText(resources.getString("chkGenerateStarLeagueRoyalBox.toolTipText")); - getChkGenerateStarLeagueRoyalBox().setName("chkGenerateStarLeagueRoyalBox"); - - setChkGenerateStarLeagueRegularBox(new JCheckBox(resources.getString("chkGenerateStarLeagueRegularBox.text"))); - getChkGenerateStarLeagueRegularBox().setToolTipText(resources.getString("chkGenerateStarLeagueRegularBox.toolTipText")); - getChkGenerateStarLeagueRegularBox().setName("chkGenerateStarLeagueRegularBox"); - - setChkGenerateClanKeshikBox(new JCheckBox(resources.getString("chkGenerateClanKeshikBox.text"))); - getChkGenerateClanKeshikBox().setToolTipText(resources.getString("chkGenerateClanKeshikBox.toolTipText")); - getChkGenerateClanKeshikBox().setName("chkGenerateClanKeshikBox"); - - setChkGenerateClanFrontlineBox(new JCheckBox(resources.getString("chkGenerateClanFrontlineBox.text"))); - getChkGenerateClanFrontlineBox().setToolTipText(resources.getString("chkGenerateClanFrontlineBox.toolTipText")); - getChkGenerateClanFrontlineBox().setName("chkGenerateClanFrontlineBox"); - - setChkGenerateClanSecondLineBox(new JCheckBox(resources.getString("chkGenerateClanSecondLineBox.text"))); - getChkGenerateClanSecondLineBox().setToolTipText(resources.getString("chkGenerateClanSecondLineBox.toolTipText")); - getChkGenerateClanSecondLineBox().setName("chkGenerateClanSecondLineBox"); - - setChkGenerateExperimentalTechBox(new JCheckBox(resources.getString("chkGenerateExperimentalTechBox.text"))); - getChkGenerateExperimentalTechBox().setToolTipText(resources.getString("chkGenerateExperimentalTechBox.toolTipText")); - getChkGenerateExperimentalTechBox().setName("chkGenerateExperimentalTechBox"); - // Disable Panel by Default getChkGenerateSurprises().setSelected(true); getChkGenerateSurprises().doClick(); @@ -2050,27 +1983,32 @@ private JPanel createSurprisesPanel() { layout.setVerticalGroup( layout.createSequentialGroup() .addComponent(getChkGenerateSurprises()) - .addComponent(getChkGenerateStarLeagueRoyalBox()) - .addComponent(getChkGenerateStarLeagueRegularBox()) - .addComponent(getChkGenerateClanKeshikBox()) - .addComponent(getChkGenerateClanFrontlineBox()) - .addComponent(getChkGenerateClanSecondLineBox()) - .addComponent(getChkGenerateExperimentalTechBox()) + .addComponent(mysteryBoxPanel) ); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(getChkGenerateSurprises()) - .addComponent(getChkGenerateStarLeagueRoyalBox()) - .addComponent(getChkGenerateStarLeagueRegularBox()) - .addComponent(getChkGenerateClanKeshikBox()) - .addComponent(getChkGenerateClanFrontlineBox()) - .addComponent(getChkGenerateClanSecondLineBox()) - .addComponent(getChkGenerateExperimentalTechBox()) + .addComponent(mysteryBoxPanel) ); return panel; } + private void createMysteryBoxPanel(final JPanel panel) { + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("mysteryBoxPanel.title"))); + panel.setToolTipText(resources.getString("mysteryBoxPanel.toolTipText")); + panel.setName("mysteryBoxPanel"); + panel.setLayout(new GridLayout(0, 1)); + final MysteryBoxType[] mysteryBoxTypes = MysteryBoxType.values(); + setChkGenerateMysteryBoxTypes(new JCheckBox[mysteryBoxTypes.length]); + for (int i = 0; i < mysteryBoxTypes.length; i++) { + getChkGenerateMysteryBoxTypes()[i] = new JCheckBox(mysteryBoxTypes[i].toString()); + getChkGenerateMysteryBoxTypes()[i].setToolTipText(mysteryBoxTypes[i].getToolTipText()); + getChkGenerateMysteryBoxTypes()[i].setName("lbl" + mysteryBoxTypes[i].name()); + panel.add(getChkGenerateMysteryBoxTypes()[i]); + } + } + private List getFactionChoices() { final List factionChoices = new ArrayList<>(); From 491039e59c7d6f5b86779540baa5de171da3db5c Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 8 Mar 2021 13:55:36 -0700 Subject: [PATCH 017/115] Continuing to work on AtB Company Generation --- .../resources/mekhq/resources/GUI.properties | 2 + .../mekhq/resources/Universe.properties | 4 +- MekHQ/src/mekhq/campaign/CampaignOptions.java | 2 +- .../universe/enums/MysteryBoxType.java | 7 +- .../AbstractCompanyGenerator.java | 53 +++++- .../CompanyGenerationOptions.java | 160 ++++++++++-------- .../gui/dialog/CampaignOptionsDialog.java | 2 +- .../dialog/CampaignPresetSelectionDialog.java | 2 +- .../gui/dialog/CompanyGenerationDialog.java | 2 +- .../mekhq/gui/dialog/DateSelectionDialog.java | 2 +- .../CampaignPresetSelectionPanel.java | 3 +- .../{view => panels}/DateSelectionPanel.java | 2 +- .../panels/PersonnelHiringDetailPanel.java | 25 +++ .../CompanyGenerationOptionsPanel.java | 79 ++++++--- .../CompanyGenerationPanel.java | 20 ++- .../CompanyGenerationPersonnelPanel.java | 22 +++ .../CompanyGenerationUnitPanel.java | 22 +++ .../BulkPersonnelHiringRenderer.java | 143 ++++++++++++++++ .../CampaignPresetRenderer.java | 4 +- 19 files changed, 441 insertions(+), 115 deletions(-) rename MekHQ/src/mekhq/gui/{view => panels}/CampaignPresetSelectionPanel.java (94%) rename MekHQ/src/mekhq/gui/{view => panels}/DateSelectionPanel.java (94%) create mode 100644 MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java rename MekHQ/src/mekhq/gui/{view => panels/companyGeneration}/CompanyGenerationOptionsPanel.java (95%) rename MekHQ/src/mekhq/gui/{view => panels/companyGeneration}/CompanyGenerationPanel.java (78%) create mode 100644 MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPersonnelPanel.java create mode 100644 MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationUnitPanel.java create mode 100644 MekHQ/src/mekhq/gui/renderers/BulkPersonnelHiringRenderer.java rename MekHQ/src/mekhq/gui/{view => renderers}/CampaignPresetRenderer.java (96%) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index f96223becf..1163cb66d3 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -293,6 +293,8 @@ chkGenerateSurprises.text=Generate Surprises chkGenerateSurprises.toolTipText=\u0020 mysteryBoxPanel.title=Mystery Boxes mysteryBoxPanel.toolTipText=Mystery Boxes each contain a 'Mech and between two and four parts.\u0020 +chkGenerateMysteryBoxes.text=Generate Mystery Boxes +chkGenerateMysteryBoxes.toolTipText=\u0020 ## Option Validation Warnings CompanyGenerationOptionsPanel.InvalidOptions.title=Error: Invalid Option Selection CompanyGenerationOptionsPanel.InvalidGenerationSize.text=You must select at least one company or independent lance to generate diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index ef5950c733..cec4735e20 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -108,8 +108,8 @@ MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.text=Inner Sphere Experimental Tech Mys MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.toolTipText=\u0020 MysteryBoxType.CLAN_KESHIK.text=Clan Keshik Mystery Box MysteryBoxType.CLAN_KESHIK.toolTipText=\u0020 -MysteryBoxType.CLAN_FRONTLINE.text=Clan Frontline Mystery Box -MysteryBoxType.CLAN_FRONTLINE.toolTipText=\u0020 +MysteryBoxType.CLAN_FRONT_LINE.text=Clan Front Line Mystery Box +MysteryBoxType.CLAN_FRONT_LINE.toolTipText=\u0020 MysteryBoxType.CLAN_SECOND_LINE.text=Clan Second Line Mystery Box MysteryBoxType.CLAN_SECOND_LINE.toolTipText=\u0020 MysteryBoxType.CLAN_EXPERIMENTAL.text=Clan Experimental Tech Mystery Box diff --git a/MekHQ/src/mekhq/campaign/CampaignOptions.java b/MekHQ/src/mekhq/campaign/CampaignOptions.java index 8ea870910c..3726916ef5 100644 --- a/MekHQ/src/mekhq/campaign/CampaignOptions.java +++ b/MekHQ/src/mekhq/campaign/CampaignOptions.java @@ -3954,7 +3954,7 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve } else if (wn2.getNodeName().equalsIgnoreCase("massRepairOptions")) { retVal.setMassRepairOptions(MassRepairOption.parseListFromXML(wn2, version)); } else if (wn2.getNodeName().equals("companyGenerationOptions")) { - retVal.setCompanyGenerationOptions(new CompanyGenerationOptions(wn2)); + retVal.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn2)); } } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java index 1b733696b3..0f8f6e951d 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java @@ -38,7 +38,7 @@ public enum MysteryBoxType { STAR_LEAGUE_REGULAR("MysteryBoxType.STAR_LEAGUE_REGULAR.text", "MysteryBoxType.STAR_LEAGUE_REGULAR.toolTipText"), INNER_SPHERE_EXPERIMENTAL("MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.text", "MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.toolTipText"), CLAN_KESHIK("MysteryBoxType.CLAN_KESHIK.text", "MysteryBoxType.CLAN_KESHIK.toolTipText"), - CLAN_FRONTLINE("MysteryBoxType.CLAN_FRONTLINE.text", "MysteryBoxType.CLAN_FRONTLINE.toolTipText"), + CLAN_FRONT_LINE("MysteryBoxType.CLAN_FRONT_LINE.text", "MysteryBoxType.CLAN_FRONT_LINE.toolTipText"), CLAN_SECOND_LINE("MysteryBoxType.CLAN_SECOND_LINE.text", "MysteryBoxType.CLAN_SECOND_LINE.toolTipText"), CLAN_EXPERIMENTAL("MysteryBoxType.CLAN_EXPERIMENTAL.text", "MysteryBoxType.CLAN_EXPERIMENTAL.toolTipText"); //endregion Enum Declarations @@ -63,9 +63,6 @@ public String getToolTipText() { } //endregion Getters - //region Boolean Comparisons - //endregion Boolean Comparisons - public AbstractMysteryBox getMysteryBox() { switch (this) { case STAR_LEAGUE_ROYAL: @@ -76,7 +73,7 @@ public AbstractMysteryBox getMysteryBox() { return new InnerSphereExperimentalMysteryBox(); case CLAN_KESHIK: return new ClanKeshikMysteryBox(); - case CLAN_FRONTLINE: + case CLAN_FRONT_LINE: return new ClanFrontlineMysteryBox(); case CLAN_SECOND_LINE: return new ClanSecondLineMysteryBox(); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 9deef167d9..47dcb4ea11 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -102,6 +102,8 @@ * Implement: * centerPlanet * selectStartingContract + * All of the Surprises + * Finish Finances * * FIXME : * Backgrounds don't work @@ -952,7 +954,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, // Type // FIXME : I'm not working properly to determine the filename - final int weightClass = determineLanceWeightClass(campaign, force, isLance); + final int weightClass = determineForceWeightClass(campaign, force, isLance); final String weightClassName = EntityWeightClass.getClassName(weightClass); String filename = String.format("BattleMech %s.png", weightClassName); MekHQ.getLogger().warning(filename); @@ -987,7 +989,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, * @param isLance whether the force is a lance or a company * @return the weight class of the force */ - private int determineLanceWeightClass(final Campaign campaign, final Force force, + private int determineForceWeightClass(final Campaign campaign, final Force force, final boolean isLance) { double weight = 0.0; for (final UUID unitId : force.getAllUnits(true)) { @@ -1233,15 +1235,50 @@ private void processFinances(final Campaign campaign, final List personn final List armour, final List ammunition, final @Nullable Contract contract) { // TODO : Finish implementation - Money startingCash = generateStartingCash(); - final Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); + Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); if (getOptions().isPayForSetup()) { + final Money initialContractPayment = (contract == null) ? Money.zero() : contract.getTotalAdvanceAmount(); + startingCash = startingCash.plus(initialContractPayment); + minimumStartingFloat = minimumStartingFloat.plus(initialContractPayment); + + Money maximumPreLoanCost = startingCash.minus(minimumStartingFloat); + Money loan = Money.zero(); + final Money hiringCosts = calculateHiringCosts(personnel); + if (maximumPreLoanCost.isGreaterOrEqualThan(hiringCosts)) { + maximumPreLoanCost = maximumPreLoanCost.minus(hiringCosts); + } else if (getOptions().isStartingLoan()) { + loan = loan.plus(hiringCosts); + } + final Money unitCosts = calculateUnitCosts(units); + if (maximumPreLoanCost.isGreaterOrEqualThan(unitCosts)) { + maximumPreLoanCost = maximumPreLoanCost.minus(unitCosts); + } else if (getOptions().isStartingLoan()) { + loan = loan.plus(unitCosts); + } + final Money partCosts = calculatePartCosts(parts); + if (maximumPreLoanCost.isGreaterOrEqualThan(partCosts)) { + maximumPreLoanCost = maximumPreLoanCost.minus(partCosts); + } else if (getOptions().isStartingLoan()) { + loan = loan.plus(partCosts); + } + final Money armourCosts = calculateArmourCosts(armour); + if (maximumPreLoanCost.isGreaterOrEqualThan(armourCosts)) { + maximumPreLoanCost = maximumPreLoanCost.minus(armourCosts); + } else if (getOptions().isStartingLoan()) { + loan = loan.plus(armourCosts); + } + final Money ammunitionCosts = calculateAmmunitionCosts(ammunition); + if (maximumPreLoanCost.isGreaterOrEqualThan(ammunitionCosts)) { + maximumPreLoanCost = maximumPreLoanCost.minus(ammunitionCosts); + } else if (getOptions().isStartingLoan()) { + loan = loan.plus(ammunitionCosts); + } } else { campaign.addReport(""); startingCash = startingCash.isGreaterOrEqualThan(minimumStartingFloat) ? startingCash @@ -1364,6 +1401,14 @@ private void generateSurprises(final Campaign campaign) { return; } + generateMysteryBoxes(campaign); + } + + private void generateMysteryBoxes(final Campaign campaign) { + if (!getOptions().isGenerateMysteryBoxes()) { + return; + } + final MysteryBoxType[] mysteryBoxTypes = MysteryBoxType.values(); final List mysteryBoxes = new ArrayList<>(); for (int i = 0; i < getOptions().getGenerateMysteryBoxTypes().length; i++) { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index af05831528..779964cc7f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -127,12 +127,15 @@ public class CompanyGenerationOptions implements Serializable { // Surprises private boolean generateSurprises; - private boolean generateMysteryBoxes; - private boolean[] generateMysteryBoxTypes; + private boolean generateMysteryBoxes; // Not Implemented + private boolean[] generateMysteryBoxTypes; // Not Implemented //endregion Variable Declarations //region Constructors - public CompanyGenerationOptions() { + /** + * This is only to be used when reading from XML + */ + private CompanyGenerationOptions() { } @@ -230,11 +233,9 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp // Surprises setGenerateSurprises(true); + setGenerateMysteryBoxes(true); setGenerateMysteryBoxTypes(new boolean[MysteryBoxType.values().length]); - } - - public CompanyGenerationOptions(final Node wn) { - fillFromXML(wn); + getGenerateMysteryBoxTypes()[MysteryBoxType.STAR_LEAGUE_REGULAR.ordinal()] = true; } //endregion Constructors @@ -728,6 +729,14 @@ public void setGenerateSurprises(final boolean generateSurprises) { this.generateSurprises = generateSurprises; } + public boolean isGenerateMysteryBoxes() { + return generateMysteryBoxes; + } + + public void setGenerateMysteryBoxes(final boolean generateMysteryBoxes) { + this.generateMysteryBoxes = generateMysteryBoxes; + } + public boolean[] getGenerateMysteryBoxTypes() { return generateMysteryBoxTypes; } @@ -851,6 +860,7 @@ public void writeToXML(final PrintWriter pw, int indent) { // Surprises MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSurprises", isGenerateSurprises()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxes", isGenerateMysteryBoxes()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxTypes", getGenerateMysteryBoxTypes()); MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "companyGenerationOptions"); @@ -875,14 +885,15 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, fin for (int i = 0; i < nl.getLength(); i++) { final Node wn = nl.item(i); if ("companyGenerationOptions".equals(wn.getNodeName())) { - return new CompanyGenerationOptions(wn); + return parseFromXML(wn); } } MekHQ.getLogger().error("Failed to parse file, returning the default AtB options"); return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); } - public void fillFromXML(final Node wn) { + public static CompanyGenerationOptions parseFromXML(final Node wn) { + final CompanyGenerationOptions options = new CompanyGenerationOptions(); final NodeList nl = wn.getChildNodes(); try { for (int x = 0; x < nl.getLength(); x++) { @@ -890,42 +901,42 @@ public void fillFromXML(final Node wn) { switch (wn2.getNodeName()) { //region Base Information case "method": - setMethod(CompanyGenerationMethod.valueOf(wn2.getTextContent().trim())); + options.setMethod(CompanyGenerationMethod.valueOf(wn2.getTextContent().trim())); break; case "faction": - setFaction(Factions.getInstance().getFaction(wn2.getTextContent().trim())); + options.setFaction(Factions.getInstance().getFaction(wn2.getTextContent().trim())); break; case "specifyStartingPlanet": - setSpecifyStartingPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setSpecifyStartingPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "startingPlanet": String startingPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); String startingPlanetPlanetId = wn2.getTextContent().trim(); - setStartingPlanet(Systems.getInstance().getSystemById(startingPlanetSystemId).getPlanetById(startingPlanetPlanetId)); + options.setStartingPlanet(Systems.getInstance().getSystemById(startingPlanetSystemId).getPlanetById(startingPlanetPlanetId)); break; case "generateMercenaryCompanyCommandLance": - setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "companyCount": - setCompanyCount(Integer.parseInt(wn2.getTextContent().trim())); + options.setCompanyCount(Integer.parseInt(wn2.getTextContent().trim())); break; case "individualLanceCount": - setIndividualLanceCount(Integer.parseInt(wn2.getTextContent().trim())); + options.setIndividualLanceCount(Integer.parseInt(wn2.getTextContent().trim())); break; case "lancesPerCompany": - setLancesPerCompany(Integer.parseInt(wn2.getTextContent().trim())); + options.setLancesPerCompany(Integer.parseInt(wn2.getTextContent().trim())); break; case "lanceSize": - setLanceSize(Integer.parseInt(wn2.getTextContent().trim())); + options.setLanceSize(Integer.parseInt(wn2.getTextContent().trim())); break; case "starLeagueYear": - setStarLeagueYear(Integer.parseInt(wn2.getTextContent().trim())); + options.setStarLeagueYear(Integer.parseInt(wn2.getTextContent().trim())); break; //endregion Base Information //region Personnel case "supportPersonnel": { - setSupportPersonnel(new HashMap<>()); + options.setSupportPersonnel(new HashMap<>()); final NodeList nl2 = wn.getChildNodes(); for (int y = 0; y < nl2.getLength(); y++) { final Node wn3 = nl2.item(y); @@ -945,196 +956,197 @@ public void fillFromXML(final Node wn) { } } if ((role != -1) && (number != -1)) { - getSupportPersonnel().put(role, number); + options.getSupportPersonnel().put(role, number); } } } break; } case "poolAssistants": - setPoolAssistants(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPoolAssistants(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "generateCaptains": - setGenerateCaptains(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateCaptains(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignCompanyCommanderFlag": - setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "companyCommanderLanceOfficer": - setCompanyCommanderLanceOfficer(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setCompanyCommanderLanceOfficer(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "applyOfficerStatBonusToWorstSkill": - setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignBestOfficers": - setAssignBestOfficers(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignBestOfficers(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "automaticallyAssignRanks": - setAutomaticallyAssignRanks(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAutomaticallyAssignRanks(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignFounderFlag": - setAssignFounderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignFounderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "runStartingSimulation": - setRunStartingSimulation(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setRunStartingSimulation(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "simulationDuration": - setSimulationDuration(Integer.parseInt(wn2.getTextContent().trim())); + options.setSimulationDuration(Integer.parseInt(wn2.getTextContent().trim())); break; case "simulateRandomMarriages": - setSimulateRandomMarriages(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setSimulateRandomMarriages(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "simulateRandomProcreation": - setSimulateRandomProcreation(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setSimulateRandomProcreation(Boolean.parseBoolean(wn2.getTextContent().trim())); break; //endregion Personnel //region Personnel Randomization case "randomizeOrigin": - setRandomizeOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setRandomizeOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "randomizeAroundCentralPlanet": - setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "centralPlanet": String centralPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); String centralPlanetPlanetId = wn2.getTextContent().trim(); - setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); + options.setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); break; case "originSearchRadius": - setOriginSearchRadius(Integer.parseInt(wn2.getTextContent().trim())); + options.setOriginSearchRadius(Integer.parseInt(wn2.getTextContent().trim())); break; case "extraRandomOrigin": - setExtraRandomOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setExtraRandomOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "originDistanceScale": - setOriginDistanceScale(Double.parseDouble(wn2.getTextContent().trim())); + options.setOriginDistanceScale(Double.parseDouble(wn2.getTextContent().trim())); break; //endregion Personnel Randomization //region Units case "generateUnitsAsAttached": - setGenerateUnitsAsAttached(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignBestRollToUnitCommander": - setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "sortStarLeagueUnitsFirst": - setSortStarLeagueUnitsFirst(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setSortStarLeagueUnitsFirst(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "groupByWeight": - setGroupByWeight(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGroupByWeight(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "groupByQuality": - setGroupByQuality(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGroupByQuality(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "keepOfficerRollsSeparate": - setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "assignTechsToUnits": - setAssignTechsToUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignTechsToUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); break; //endregion Units //region Unit case "ForceNamingMethod": - setForceNamingMethod(ForceNamingMethod.valueOf(wn2.getTextContent().trim())); + options.setForceNamingMethod(ForceNamingMethod.valueOf(wn2.getTextContent().trim())); break; case "generateForceIcons": - setGenerateForceIcons(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateForceIcons(Boolean.parseBoolean(wn2.getTextContent().trim())); break; //endregion Units //region Spares case "generateMothballedSpareUnits": - setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "sparesPercentOfActiveUnits": - setSparesPercentOfActiveUnits(Integer.parseInt(wn2.getTextContent().trim())); + options.setSparesPercentOfActiveUnits(Integer.parseInt(wn2.getTextContent().trim())); break; case "partGenerationMethod": - setPartGenerationMethod(PartGenerationMethod.valueOf(wn2.getTextContent().trim())); + options.setPartGenerationMethod(PartGenerationMethod.valueOf(wn2.getTextContent().trim())); break; case "startingArmourWeight": - setStartingArmourWeight(Integer.parseInt(wn2.getTextContent().trim())); + options.setStartingArmourWeight(Integer.parseInt(wn2.getTextContent().trim())); break; case "generateSpareAmmunition": - setGenerateSpareAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateSpareAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "numberReloadsPerWeapon": - setNumberReloadsPerWeapon(Integer.parseInt(wn2.getTextContent().trim())); + options.setNumberReloadsPerWeapon(Integer.parseInt(wn2.getTextContent().trim())); break; case "generateFractionalMachineGunAmmunition": - setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); break; //endregion Spares //region Contracts case "selectStartingContract": - setSelectStartingContract(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setSelectStartingContract(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "startCourseToContractPlanet": - setStartCourseToContractPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setStartCourseToContractPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); break; //endregion Contracts //region Finances case "startingCash": - setStartingCash(Integer.parseInt(wn2.getTextContent().trim())); + options.setStartingCash(Integer.parseInt(wn2.getTextContent().trim())); break; case "randomizeStartingCash": - setRandomizeStartingCash(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setRandomizeStartingCash(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "randomStartingCashDiceCount": - setRandomStartingCashDiceCount(Integer.parseInt(wn2.getTextContent().trim())); + options.setRandomStartingCashDiceCount(Integer.parseInt(wn2.getTextContent().trim())); break; case "minimumStartingFloat": - setMinimumStartingFloat(Integer.parseInt(wn2.getTextContent().trim())); + options.setMinimumStartingFloat(Integer.parseInt(wn2.getTextContent().trim())); break; case "payForSetup": - setPayForSetup(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForSetup(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "startingLoan": - setStartingLoan(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setStartingLoan(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForPersonnel": - setPayForPersonnel(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForPersonnel(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForUnits": - setPayForUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForParts": - setPayForParts(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForParts(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForArmour": - setPayForArmour(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForArmour(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "payForAmmunition": - setPayForAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); break; //endregion Finances //region Surprises case "generateSurprises": - setGenerateSurprises(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateSurprises(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "generateMysteryBoxes": - setGenerateMysteryBoxes(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateMysteryBoxes(Boolean.parseBoolean(wn2.getTextContent().trim())); break; case "generateMysteryBoxTypes": final String[] values = wn2.getTextContent().trim().split(","); - final boolean[] booleans = new boolean[values.length]; - for (int i = 0; i < values.length; i++) { - booleans[i] = Boolean.parseBoolean(values[i]); + for (int i = 0; i < Math.min(values.length, options.getGenerateMysteryBoxTypes().length); i++) { + options.getGenerateMysteryBoxTypes()[i] = Boolean.parseBoolean(values[i]); } - setGenerateMysteryBoxTypes(booleans); break; //endregion Surprises } } } catch (Exception e) { MekHQ.getLogger().error(e); + return null; } + + return options; } //endregion File IO } diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index 0f0ef79d90..c2f4d15e26 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -107,7 +107,7 @@ import mekhq.gui.model.RankTableModel; import mekhq.gui.model.SortedComboBoxModel; import mekhq.gui.preferences.JWindowPreference; -import mekhq.gui.view.CompanyGenerationOptionsPanel; +import mekhq.gui.panels.companyGeneration.CompanyGenerationOptionsPanel; import mekhq.module.PersonnelMarketServiceManager; import mekhq.module.api.PersonnelMarketMethod; import mekhq.preferences.PreferencesNode; diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java index 70f346af24..71973a2999 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java @@ -20,7 +20,7 @@ import megamek.common.annotations.Nullable; import mekhq.campaign.GamePreset; -import mekhq.gui.view.CampaignPresetSelectionPanel; +import mekhq.gui.panels.CampaignPresetSelectionPanel; import javax.swing.*; import java.awt.*; diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index bbd51ae91c..b27603135a 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -26,7 +26,7 @@ import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.gui.enums.CompanyGenerationPanelType; -import mekhq.gui.view.CompanyGenerationOptionsPanel; +import mekhq.gui.panels.companyGeneration.CompanyGenerationOptionsPanel; import javax.swing.*; import java.awt.*; diff --git a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java index 7512f1938f..d881be4d64 100644 --- a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java @@ -18,7 +18,7 @@ */ package mekhq.gui.dialog; -import mekhq.gui.view.DateSelectionPanel; +import mekhq.gui.panels.DateSelectionPanel; import javax.swing.*; import java.awt.*; diff --git a/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java b/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java similarity index 94% rename from MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java rename to MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java index 3bcf6b0a71..1ad62cc447 100644 --- a/MekHQ/src/mekhq/gui/view/CampaignPresetSelectionPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java @@ -16,10 +16,11 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.gui.view; +package mekhq.gui.panels; import megamek.common.annotations.Nullable; import mekhq.campaign.GamePreset; +import mekhq.gui.renderers.CampaignPresetRenderer; import javax.swing.*; import java.awt.*; diff --git a/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java b/MekHQ/src/mekhq/gui/panels/DateSelectionPanel.java similarity index 94% rename from MekHQ/src/mekhq/gui/view/DateSelectionPanel.java rename to MekHQ/src/mekhq/gui/panels/DateSelectionPanel.java index 9fea8dd19f..166883f65e 100644 --- a/MekHQ/src/mekhq/gui/view/DateSelectionPanel.java +++ b/MekHQ/src/mekhq/gui/panels/DateSelectionPanel.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.gui.view; +package mekhq.gui.panels; import javax.swing.*; import java.time.LocalDate; diff --git a/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java b/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java new file mode 100644 index 0000000000..5c73f58384 --- /dev/null +++ b/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.panels; + +public class PersonnelHiringDetailPanel { + //region Variable Declarations + private + //endregion Variable Declarations +} diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationOptionsPanel.java similarity index 95% rename from MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java rename to MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationOptionsPanel.java index 5c332f460e..67db90b63e 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationOptionsPanel.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.gui.view; +package mekhq.gui.panels.companyGeneration; import megamek.common.annotations.Nullable; import megamek.common.util.EncodeControl; @@ -133,6 +133,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Surprises private JCheckBox chkGenerateSurprises; + private JCheckBox chkGenerateMysteryBoxes; private JCheckBox[] chkGenerateMysteryBoxTypes; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); @@ -784,11 +785,19 @@ public void setChkGenerateSurprises(final JCheckBox chkGenerateSurprises) { this.chkGenerateSurprises = chkGenerateSurprises; } + public JCheckBox getChkGenerateMysteryBoxes() { + return chkGenerateMysteryBoxes; + } + + public void setChkGenerateMysteryBoxes(final JCheckBox chkGenerateMysteryBoxes) { + this.chkGenerateMysteryBoxes = chkGenerateMysteryBoxes; + } + public JCheckBox[] getChkGenerateMysteryBoxTypes() { return chkGenerateMysteryBoxTypes; } - public void setChkGenerateMysteryBoxTypes(JCheckBox... chkGenerateMysteryBoxTypes) { + public void setChkGenerateMysteryBoxTypes(final JCheckBox... chkGenerateMysteryBoxTypes) { this.chkGenerateMysteryBoxTypes = chkGenerateMysteryBoxTypes; } //endregion Surprises @@ -1950,7 +1959,7 @@ private JPanel createFinancesPanel() { } private JPanel createSurprisesPanel() { - // Initialize Labels Used in ActionListeners + // Initialize Components Used in ActionListeners final JPanel mysteryBoxPanel = new JPanel(); // Create Panel Components @@ -1960,11 +1969,21 @@ private JPanel createSurprisesPanel() { getChkGenerateSurprises().addActionListener(evt -> { final boolean selected = getChkGenerateSurprises().isSelected(); mysteryBoxPanel.setEnabled(selected); - for (final JCheckBox checkBox : getChkGenerateMysteryBoxTypes()) { - checkBox.setEnabled(selected); + if (getChkGenerateMysteryBoxes().isSelected()) { + getChkGenerateMysteryBoxes().setEnabled(true); + if (selected) { + getChkGenerateMysteryBoxes().setSelected(false); + getChkGenerateMysteryBoxes().doClick(); + } else { + getChkGenerateMysteryBoxes().doClick(); + getChkGenerateMysteryBoxes().setSelected(true); + } } + getChkGenerateMysteryBoxes().setEnabled(selected); }); + createMysteryBoxPanel(mysteryBoxPanel); + // Disable Panel by Default getChkGenerateSurprises().setSelected(true); getChkGenerateSurprises().doClick(); @@ -1995,18 +2014,36 @@ private JPanel createSurprisesPanel() { } private void createMysteryBoxPanel(final JPanel panel) { + // Create Panel panel.setBorder(BorderFactory.createTitledBorder(resources.getString("mysteryBoxPanel.title"))); panel.setToolTipText(resources.getString("mysteryBoxPanel.toolTipText")); panel.setName("mysteryBoxPanel"); panel.setLayout(new GridLayout(0, 1)); + + // Create Panel Components + setChkGenerateMysteryBoxes(new JCheckBox(resources.getString("chkGenerateMysteryBoxes.text"))); + getChkGenerateMysteryBoxes().setToolTipText(resources.getString("chkGenerateMysteryBoxes.toolTipText")); + getChkGenerateMysteryBoxes().setName("chkGenerateMysteryBoxes"); + getChkGenerateMysteryBoxes().addActionListener(evt -> { + final boolean selected = getChkGenerateMysteryBoxes().isSelected(); + for (final JCheckBox checkBox : getChkGenerateMysteryBoxTypes()) { + checkBox.setEnabled(selected); + } + }); + panel.add(getChkGenerateMysteryBoxes()); + final MysteryBoxType[] mysteryBoxTypes = MysteryBoxType.values(); setChkGenerateMysteryBoxTypes(new JCheckBox[mysteryBoxTypes.length]); for (int i = 0; i < mysteryBoxTypes.length; i++) { getChkGenerateMysteryBoxTypes()[i] = new JCheckBox(mysteryBoxTypes[i].toString()); getChkGenerateMysteryBoxTypes()[i].setToolTipText(mysteryBoxTypes[i].getToolTipText()); - getChkGenerateMysteryBoxTypes()[i].setName("lbl" + mysteryBoxTypes[i].name()); + getChkGenerateMysteryBoxTypes()[i].setName("chk" + mysteryBoxTypes[i].name()); panel.add(getChkGenerateMysteryBoxTypes()[i]); } + + // Disable Panel by Default + getChkGenerateMysteryBoxes().setSelected(true); + getChkGenerateMysteryBoxes().doClick(); } private List getFactionChoices() { @@ -2146,20 +2183,23 @@ public void setOptions(final CompanyGenerationOptions options) { getChkPayForAmmunition().setSelected(options.isPayForAmmunition()); // Surprises - getChkGenerateSurprises().setSelected(options.isGenerateSurprises()); - getChkGenerateStarLeagueRoyalBox().setSelected(options.isGenerateStarLeagueRoyalBox()); - getChkGenerateStarLeagueRegularBox().setSelected(options.isGenerateStarLeagueRegularBox()); - getChkGenerateClanKeshikBox().setSelected(options.isGenerateClanKeshikBox()); - getChkGenerateClanFrontlineBox().setSelected(options.isGenerateClanFrontlineBox()); - getChkGenerateClanSecondLineBox().setSelected(options.isGenerateClanSecondLineBox()); - getChkGenerateExperimentalTechBox().setSelected(options.isGenerateExperimentalTechBox()); + if (getChkGenerateSurprises().isSelected() != options.isGenerateSurprises()) { + getChkGenerateSurprises().doClick(); + } + if (getChkGenerateMysteryBoxes().isSelected() != options.isGenerateMysteryBoxes()) { + getChkGenerateMysteryBoxes().doClick(); + } + for (int i = 0; i < getChkGenerateMysteryBoxTypes().length; i++) { + getChkGenerateMysteryBoxTypes()[i].setSelected(options.getGenerateMysteryBoxTypes()[i]); + } } /** * @return the CompanyGenerationOptions created from the current panel */ public CompanyGenerationOptions createOptionsFromPanel() { - final CompanyGenerationOptions options = new CompanyGenerationOptions(); + final CompanyGenerationOptions options = new CompanyGenerationOptions(getCompanyGenerationMethod(), getCampaign()); + // Base Information options.setMethod(getCompanyGenerationMethod()); options.setFaction(getFaction()); @@ -2235,12 +2275,11 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Surprises options.setGenerateSurprises(getChkGenerateSurprises().isSelected()); - options.setGenerateStarLeagueRoyalBox(getChkGenerateStarLeagueRoyalBox().isSelected()); - options.setGenerateStarLeagueRegularBox(getChkGenerateStarLeagueRegularBox().isSelected()); - options.setGenerateClanKeshikBox(getChkGenerateClanKeshikBox().isSelected()); - options.setGenerateClanFrontlineBox(getChkGenerateClanFrontlineBox().isSelected()); - options.setGenerateClanSecondLineBox(getChkGenerateClanSecondLineBox().isSelected()); - options.setGenerateExperimentalTechBox(getChkGenerateExperimentalTechBox().isSelected()); + options.setGenerateMysteryBoxes(getChkGenerateMysteryBoxes().isSelected()); + for (int i = 0; i < getChkGenerateMysteryBoxTypes().length; i++) { + options.getGenerateMysteryBoxTypes()[i] = true; + options.getGenerateMysteryBoxTypes()[i] = getChkGenerateMysteryBoxTypes()[i].isSelected(); + } return options; } diff --git a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPanel.java similarity index 78% rename from MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java rename to MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPanel.java index 13be090a48..cdf38790aa 100644 --- a/MekHQ/src/mekhq/gui/view/CompanyGenerationPanel.java +++ b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPanel.java @@ -1,4 +1,22 @@ -package mekhq.gui.view; +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.panels.companyGeneration; import megamek.common.Entity; import mekhq.campaign.personnel.Person; diff --git a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPersonnelPanel.java b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPersonnelPanel.java new file mode 100644 index 0000000000..47d18e2e70 --- /dev/null +++ b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPersonnelPanel.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.panels.companyGeneration; + +public class CompanyGenerationPersonnelPanel { +} diff --git a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationUnitPanel.java b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationUnitPanel.java new file mode 100644 index 0000000000..522079656c --- /dev/null +++ b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationUnitPanel.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.panels.companyGeneration; + +public class CompanyGenerationUnitPanel { +} diff --git a/MekHQ/src/mekhq/gui/renderers/BulkPersonnelHiringRenderer.java b/MekHQ/src/mekhq/gui/renderers/BulkPersonnelHiringRenderer.java new file mode 100644 index 0000000000..76b2bca01e --- /dev/null +++ b/MekHQ/src/mekhq/gui/renderers/BulkPersonnelHiringRenderer.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.renderers; + +import megamek.client.generator.RandomNameGenerator; +import megamek.common.annotations.Nullable; +import mekhq.campaign.Campaign; +import mekhq.campaign.personnel.Person; +import mekhq.gui.panels.PersonnelHiringDetailPanel; + +import javax.swing.*; +import java.awt.*; + +public class BulkPersonnelHiringRenderer extends JPanel implements ListCellRenderer { + //region Variable Declarations + private PersonnelHiringDetailPanel personnelHiringDetailPanel; + private JButton btnRandomName; + private JButton btnRandomPortrait; + private JButton btnRandomOrigin; + private JButton btnChoosePortrait; + private JButton btnEditPerson; + //endregion Variable Declarations + + //region Constructors + public BulkPersonnelHiringRenderer(final Campaign campaign, final boolean gm) { + initialize(campaign, gm); + } + //endregion Constructors + + //region Getters/Setters + public PersonnelHiringDetailPanel getPersonnelHiringDetailPanel() { + return personnelHiringDetailPanel; + } + + public void setPersonnelHiringDetailPanel(final PersonnelHiringDetailPanel personnelHiringDetailPanel) { + this.personnelHiringDetailPanel = personnelHiringDetailPanel; + } + + public JButton getBtnRandomName() { + return btnRandomName; + } + + public void setBtnRandomName(final JButton btnRandomName) { + this.btnRandomName = btnRandomName; + } + + public JButton getBtnRandomPortrait() { + return btnRandomPortrait; + } + + public void setBtnRandomPortrait(final JButton btnRandomPortrait) { + this.btnRandomPortrait = btnRandomPortrait; + } + + public JButton getBtnRandomOrigin() { + return btnRandomOrigin; + } + + public void setBtnRandomOrigin(final JButton btnRandomOrigin) { + this.btnRandomOrigin = btnRandomOrigin; + } + + public JButton getBtnChoosePortrait() { + return btnChoosePortrait; + } + + public void setBtnChoosePortrait(final JButton btnChoosePortrait) { + this.btnChoosePortrait = btnChoosePortrait; + } + + public JButton getBtnEditPerson() { + return btnEditPerson; + } + + public void setBtnEditPerson(final JButton btnEditPerson) { + this.btnEditPerson = btnEditPerson; + } + //endregion Getters/Setters + + //region Initialization + private void initialize(final Campaign campaign, final boolean gm) { + JButton button = new JButton(); + button.addActionListener(evt -> { + String factionCode = campaign.getCampaignOptions().useOriginFactionForNames() + ? getPerson().getOriginFaction().getShortName() + : RandomNameGenerator.getInstance().getChosenFaction(); + String[] name = RandomNameGenerator.getInstance().generateGivenNameSurnameSplit( + getPerson().getGender(), getPerson().isClanner(), factionCode); + getPerson().setGivenName(name[0]); + getPerson().setSurname(name[1]); + }); + + } + //endregion Initialization + + @Override + public Component getListCellRendererComponent(final JList list, + final Person value, final int index, + final boolean isSelected, + final boolean cellHasFocus) { + // JTextArea::setForeground and JTextArea::setBackground don't work properly with the default + // return, but by recreating the colour it works properly + final Color foreground = new Color(UIManager.getColor(isSelected + ? "Table.selectionForeground" : "Table.foreground").getRGB()); + final Color background = new Color(UIManager.getColor(isSelected + ? "Table.selectionBackground" : "Table.background").getRGB()); + setForeground(foreground); + setBackground(background); + getDescription().setForeground(foreground); + getDescription().setBackground(background); + + getLblTitle().setText(value.getTitle()); + getDescription().setText(value.getDescription()); + + return this; + } + + @Override + public Dimension getMinimumSize() { + return new Dimension(300, 100); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(400, 120); + } +} diff --git a/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java b/MekHQ/src/mekhq/gui/renderers/CampaignPresetRenderer.java similarity index 96% rename from MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java rename to MekHQ/src/mekhq/gui/renderers/CampaignPresetRenderer.java index 14788129f4..674085076d 100644 --- a/MekHQ/src/mekhq/gui/view/CampaignPresetRenderer.java +++ b/MekHQ/src/mekhq/gui/renderers/CampaignPresetRenderer.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.gui.view; +package mekhq.gui.renderers; import mekhq.campaign.GamePreset; @@ -73,6 +73,7 @@ private void initialize() { getDescription().setWrapStyleWord(true); add(getDescription()); } + //endregion Initialization @Override public Component getListCellRendererComponent(final JList list, @@ -95,7 +96,6 @@ public Component getListCellRendererComponent(final JList return this; } - //endregion Initialization @Override public Dimension getMinimumSize() { From 7df8ba05d18572ec6b2b6f4ea4e03c94ee32fce2 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 10 Mar 2021 15:23:24 -0700 Subject: [PATCH 018/115] Continuing to work on AtB Company Generation --- .../resources/mekhq/resources/GUI.properties | 37 +- .../AbstractCompanyGenerator.java | 116 +----- .../CompanyGenerationWizard.java | 176 ++++++++ .../gui/dialog/CampaignOptionsDialog.java | 2 +- .../gui/dialog/CompanyGenerationDialog.java | 2 +- .../CompanyGenerationOptionsPanel.java | 67 +-- .../panels/PersonnelHiringDetailPanel.java | 390 +++++++++++++++++- .../CompanyGenerationPanel.java | 111 ----- .../CompanyGenerationPersonnelPane.java} | 7 +- .../CompanyGenerationUnitPane.java} | 6 +- .../mekhq/gui/panes/PersonnelHiringPane.java | 4 + .../BulkPersonnelHiringRenderer.java | 143 ------- .../renderers/PersonnelHiringRenderer.java | 245 +++++++++++ 13 files changed, 893 insertions(+), 413 deletions(-) create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java rename MekHQ/src/mekhq/gui/panels/{companyGeneration => }/CompanyGenerationOptionsPanel.java (97%) delete mode 100644 MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPanel.java rename MekHQ/src/mekhq/gui/{panels/companyGeneration/CompanyGenerationUnitPanel.java => panes/CompanyGenerationPersonnelPane.java} (83%) rename MekHQ/src/mekhq/gui/{panels/companyGeneration/CompanyGenerationPersonnelPanel.java => panes/CompanyGenerationUnitPane.java} (84%) create mode 100644 MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java delete mode 100644 MekHQ/src/mekhq/gui/renderers/BulkPersonnelHiringRenderer.java create mode 100644 MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 1163cb66d3..c7181b6a0d 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -11,6 +11,8 @@ Import=Import Ok=Ok RestoreDefaults=Restore Defaults + + #### Dialog ### CampaignPresetSelectionDialog Class CampaignPresetSelectionDialog.title=Select Campaign Preset @@ -70,6 +72,8 @@ phenotypeGeneratedLabel.text=Generated Phenotype generateBloodnameButton.text=Generate Bloodname assignBloodnameButton.text=Assign Bloodname + + #### Enums ### LayeredForceIcon Enum LayeredForceIcon.types.text=Types @@ -147,7 +151,9 @@ PersonnelTabView.ADMINISTRATIVE_SKILLS.text=Admin Skills PersonnelTabView.BIOGRAPHICAL.text=Biographical Information PersonnelTabView.FLUFF.text=Fluff Information -#### View + + +#### Panels ### CompanyGenerationOptionsPanel Class ## Base Information Panel baseInformationPanel.title=Base Information @@ -310,3 +316,32 @@ CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? CompanyGenerationPanel.ImmediateApplicationWarning.text=Confirm immediate generation and application to campaign? CompanyGenerationPanel.StartupNag.title=Company Generator Information CompanyGenerationPanel.StartupNag.text=The Company Generator is an automated and expanded version of AtB company generation rules, expanded to handle a complete MekHQ setup.
All options override any specified in Campaign Options. This means that otherwise illegal decisions may be made based on the options selected in this generator.
The default settings are recommended for initial use, while options are provided to customize the generated company. + +### PersonnelHiringDetailPanel Class +PersonnelHiringDetailPanel.lblGender.text=Gender: %s +PersonnelHiringDetailPanel.lblBirthday.text=Birthday: %s (%s) +PersonnelHiringDetailPanel.lblOrigin.text=Origin: %s +PersonnelHiringDetailPanel.lblOrigin.Planet.text=Origin: %s (%s) +PersonnelHiringDetailPanel.lblCallsign.text=Callsign: %s +skillsPanel.title=Skills +abilitiesPanel.title=Abilities +implantsPanel.title=Implants +PersonnelHiringDetailPanel.lblEdge.text=Edge: %s +PersonnelHiringDetailPanel.lblToughness.text=Toughness: %s + + + +#### Renderers +### PersonnelHiringRenderer +btnRandomName.text=Randomize Name +btnRandomName.toolTipText= +btnRandomPortrait.text= +btnRandomPortrait.toolTipText= +btnRandomOrigin.text= +btnRandomOrigin.toolTipText= +btnRandomCallsign.text= +btnRandomCallsign.toolTipText= +btnChoosePortrait.text= +btnChoosePortrait.toolTipText= +btnEditPerson.text= +btnEditPerson.toolTipText= diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 47dcb4ea11..554bfa1c1f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -113,10 +113,6 @@ * Dialog Modify the buttons, and have them appear or disappear based on the current panel * Panel has odd whitespace usage * System, Planet text search - * - * Class Notes: - * {{@link AbstractCompanyGenerator#applyToCampaign}} takes the campaign and applies all changes to - * it. No method not directly called from there may alter the campaign. */ public abstract class AbstractCompanyGenerator { //region Variable Declarations @@ -228,7 +224,7 @@ private int determineFirstNonOfficer() { * This sets the planet to the starting planet specified, if that option is enabled * @param campaign the campaign to apply the location to */ - private void moveToStartingPlanet(final Campaign campaign) { + public void moveToStartingPlanet(final Campaign campaign) { if (getOptions().isSpecifyStartingPlanet()) { campaign.setLocation(new CurrentLocation(getOptions().getStartingPlanet().getParentSystem(), 0)); } @@ -446,7 +442,7 @@ public List generateSupportPersonnel(final Campaign campaign) { * @param campaign the campaign to use in creating the assistants * @param personnel the list of personnel to add the newly created assistants to */ - private void generateAssistants(final Campaign campaign, final List personnel) { + public void generateAssistants(final Campaign campaign, final List personnel) { // If you don't want to use pooled assistants, then this generates them as personnel instead if (!getOptions().isPoolAssistants()) { final int assistantRank; @@ -488,7 +484,7 @@ private void generateAssistants(final Campaign campaign, final List pers * @param campaign the campaign to use in processing and to add the personnel to * @param personnel the list of ALL personnel in the campaign */ - private void finalizePersonnel(final Campaign campaign, final List personnel) { + public void finalizePersonnel(final Campaign campaign, final List personnel) { // Assign the founder flag if we need to if (getOptions().isAssignFounderFlag()) { personnel.forEach(p -> p.setFounder(true)); @@ -705,8 +701,8 @@ protected MechSummary generateMechSummary(final Campaign campaign, * @param entities the list of generated entities, with null holding spaces without 'Mechs * @return the list of created units */ - private List createUnits(final Campaign campaign, List combatPersonnel, - final List entities) { + public List createUnits(final Campaign campaign, List combatPersonnel, + final List entities) { if (!getOptions().isKeepOfficerRollsSeparate()) { // Sorted into individual lances combatPersonnel = sortPersonnelIntoLances(combatPersonnel); } @@ -731,7 +727,7 @@ private List createUnits(final Campaign campaign, List combatPerso * @param supportPersonnel the list of support personnel including the techs to assign to units * @param units the list of units to have techs assigned to (order does not matter) */ - private void assignTechsToUnits(final List supportPersonnel, final List units) { + public void assignTechsToUnits(final List supportPersonnel, final List units) { if (!getOptions().isAssignTechsToUnits()) { return; } @@ -760,7 +756,7 @@ private void assignTechsToUnits(final List supportPersonnel, final List< * @param personnel the combat personnel to sort into their lances * @return a new List containing the sorted personnel */ - private List sortPersonnelIntoLances(final List personnel) { + public List sortPersonnelIntoLances(final List personnel) { final Person commander = personnel.get(0); List officers = new ArrayList<>(personnel.subList(1, determineFirstNonOfficer())); final List standardMechWarriors = new ArrayList<>(personnel.subList(determineFirstNonOfficer(), personnel.size())); @@ -824,7 +820,7 @@ private List sortPersonnelIntoLances(final List personnel) { * @param campaign the campaign to generate the unit within * @param personnel a CLONED list of personnel properly organized into lances */ - private void generateUnit(final Campaign campaign, final List personnel) { + public void generateUnit(final Campaign campaign, final List personnel) { final Force originForce = campaign.getForce(0); final Alphabet[] alphabet = Alphabet.values(); String background = ""; @@ -1080,8 +1076,8 @@ public List generateMothballedEntities(final Campaign campaign, final Li * @param mothballedEntities the list of generated spare 'Mech entities to add and mothball * @return the list of created units */ - private List createMothballedSpareUnits(final Campaign campaign, - final List mothballedEntities) { + public List createMothballedSpareUnits(final Campaign campaign, + final List mothballedEntities) { List mothballedUnits = new ArrayList<>(); for (final Entity mothballedEntity : mothballedEntities) { final Unit unit = campaign.addNewUnit(mothballedEntity, false, 0); @@ -1218,7 +1214,7 @@ private boolean ammoBinIsMachineGun(final AmmoBin ammoBin) { * @param campaign the campaign to apply changes to * @param contract the selected contract, if any */ - private void processContract(final Campaign campaign, final @Nullable Contract contract) { + public void processContract(final Campaign campaign, final @Nullable Contract contract) { if (contract == null) { return; } @@ -1230,10 +1226,10 @@ private void processContract(final Campaign campaign, final @Nullable Contract c //endregion Contract //region Finances - private void processFinances(final Campaign campaign, final List personnel, - final List units, final List parts, - final List armour, final List ammunition, - final @Nullable Contract contract) { + public void processFinances(final Campaign campaign, final List personnel, + final List units, final List parts, + final List armour, final List ammunition, + final @Nullable Contract contract) { // TODO : Finish implementation Money startingCash = generateStartingCash(); Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); @@ -1396,7 +1392,7 @@ private Money calculateAmmunitionCosts(final List ammunition) { //endregion Finances //region Surprises - private void generateSurprises(final Campaign campaign) { + public void generateSurprises(final Campaign campaign) { if (!getOptions().isGenerateSurprises()) { return; } @@ -1421,86 +1417,6 @@ private void generateMysteryBoxes(final Campaign campaign) { } //endregion Surprises - //region Apply to Campaign - /** - * TODO : UNFINISHED - * This method takes the campaign and applies all changes to it. No method not directly - * called from here may alter the campaign. - * - * @param campaign the campaign to apply the generation to - * @param combatPersonnel the list of generated combat personnel - * @param supportPersonnel the list of generated support personnel - * @param entities the list of generated entities, with null holding spaces without 'Mechs - * @param mothballedEntities the list of generated spare 'Mech entities to mothball - * @param contract the selected contract, or null if one has not been selected - */ - public void applyToCampaign(final Campaign campaign, final List combatPersonnel, - final List supportPersonnel, final List entities, - final List mothballedEntities, final @Nullable Contract contract) { - moveToStartingPlanet(campaign); - - // Phase One: Personnel, Units, and Unit - final List personnel = new ArrayList<>(); - final List units = new ArrayList<>(); - applyPhaseOneToCampaign(campaign, combatPersonnel, supportPersonnel, personnel, entities, units); - - // Phase 2: Spares - units.addAll(createMothballedSpareUnits(campaign, mothballedEntities)); - - final List parts = generateSpareParts(units); - final List armour = generateArmour(units); - final List ammunition = generateAmmunition(campaign, units); - - // Phase 3: Contract - processContract(campaign, contract); - - // Phase 4: Finances - processFinances(campaign, personnel, units, parts, armour, ammunition, contract); - - // Phase 5: Applying Spares - parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); - armour.forEach(a -> campaign.getWarehouse().addPart(a, true)); - ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); - - // Phase 6: Surprises! - generateSurprises(campaign); - } - - private void applyPhaseOneToCampaign(final Campaign campaign, final List combatPersonnel, - final List supportPersonnel, final List personnel, - final List entities, final List units) { - // Process Personnel - personnel.addAll(combatPersonnel); - personnel.addAll(supportPersonnel); - - // If we aren't using the pool, generate all of the Astechs and Medics required - generateAssistants(campaign, personnel); - - // This does all of the final personnel processing, including recruitment and running random - // marriages - finalizePersonnel(campaign, personnel); - - // We can only fill the pool after recruiting our support personnel - if (getOptions().isPoolAssistants()) { - campaign.fillAstechPool(); - campaign.fillMedicPool(); - } - - // Process Units - units.addAll(createUnits(campaign, combatPersonnel, entities)); - - // Assign Techs to Units - assignTechsToUnits(supportPersonnel, units); - - // Generate the Forces and Assign Units to them - generateUnit(campaign, sortPersonnelIntoLances(combatPersonnel)); - } - //endregion Apply to Campaign - - //region Revert Application to Campaign - // TODO : ADD ME - //endregion Revert Application to Campaign - //region Local Classes /** * This class contains the parameters used to generate a random mech, and allows sorting and diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java new file mode 100644 index 0000000000..dc3dbbf9bf --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGenerators; + +import megamek.common.Entity; +import megamek.common.annotations.Nullable; +import mekhq.campaign.Campaign; +import mekhq.campaign.mission.Contract; +import mekhq.campaign.parts.AmmoStorage; +import mekhq.campaign.parts.Armor; +import mekhq.campaign.parts.Part; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.unit.Unit; + +import java.util.ArrayList; +import java.util.List; + +public class CompanyGenerationWizard { + //region Variable Declarations + private final Campaign campaign; + private final AbstractCompanyGenerator generator; + //endregion Variable Declarations + + //region Constructors + public CompanyGenerationWizard(final Campaign campaign, final AbstractCompanyGenerator generator) { + this.campaign = campaign; + this.generator = generator; + } + //endregion Constructors + + //region Getters/Setters + public Campaign getCampaign() { + return campaign; + } + + public AbstractCompanyGenerator getGenerator() { + return generator; + } + //endregion Getters/Setters + + //region Apply to Campaign + /** + * TODO : UNFINISHED + * This method takes the campaign and applies all changes to it. No method not directly + * called from here may alter the campaign. + * + * @param campaign the campaign to apply the generation to + * @param combatPersonnel the list of generated combat personnel + * @param supportPersonnel the list of generated support personnel + * @param entities the list of generated entities, with null holding spaces without 'Mechs + * @param mothballedEntities the list of generated spare 'Mech entities to mothball + * @param contract the selected contract, or null if one has not been selected + */ + public void applyToCampaign(final Campaign campaign, final List combatPersonnel, + final List supportPersonnel, final List entities, + final List mothballedEntities, final @Nullable Contract contract) { + getGenerator().moveToStartingPlanet(campaign); + + // Phase One: Personnel, Units, and Unit + final List personnel = new ArrayList<>(); + final List units = new ArrayList<>(); + applyPhaseOneToCampaign(campaign, combatPersonnel, supportPersonnel, personnel, entities, units); + + // Phase 2: Spares + units.addAll(getGenerator().createMothballedSpareUnits(campaign, mothballedEntities)); + + final List parts = getGenerator().generateSpareParts(units); + final List armour = getGenerator().generateArmour(units); + final List ammunition = getGenerator().generateAmmunition(campaign, units); + + // Phase 3: Contract + getGenerator().processContract(campaign, contract); + + // Phase 4: Finances + getGenerator().processFinances(campaign, personnel, units, parts, armour, ammunition, contract); + + // Phase 5: Applying Spares + parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); + armour.forEach(a -> campaign.getWarehouse().addPart(a, true)); + ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); + + // Phase 6: Surprises! + getGenerator().generateSurprises(campaign); + } + + private void applyPhaseOneToCampaign(final Campaign campaign, final List combatPersonnel, + final List supportPersonnel, final List personnel, + final List entities, final List units) { + // Process Personnel + personnel.addAll(combatPersonnel); + personnel.addAll(supportPersonnel); + + // If we aren't using the pool, generate all of the Astechs and Medics required + getGenerator().generateAssistants(campaign, personnel); + + // This does all of the final personnel processing, including recruitment and running random + // marriages + getGenerator().finalizePersonnel(campaign, personnel); + + // We can only fill the pool after recruiting our support personnel + if (getGenerator().getOptions().isPoolAssistants()) { + campaign.fillAstechPool(); + campaign.fillMedicPool(); + } + + // Process Units + units.addAll(getGenerator().createUnits(campaign, combatPersonnel, entities)); + + // Assign Techs to Units + getGenerator().assignTechsToUnits(supportPersonnel, units); + + // Generate the Forces and Assign Units to them + getGenerator().generateUnit(campaign, getGenerator().sortPersonnelIntoLances(combatPersonnel)); + } + //endregion Apply to Campaign + + //region Revert Application to Campaign + // TODO : ADD ME + //endregion Revert Application to Campaign + + + /** + public void generate() { + if ((getCompanyGenerator() != null) && (JOptionPane.showConfirmDialog(getFrame(), + resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.text"), + resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.title"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { + return; + } else if (!validateOptions()) { + return; + } + + setCompanyGenerator(getCompanyGenerationMethod().getGenerator(getCampaign(), createOptionsFromPanel())); + + setCombatPersonnel(getCompanyGenerator().generateCombatPersonnel(getCampaign())); + setSupportPersonnel(getCompanyGenerator().generateSupportPersonnel(getCampaign())); + setEntities(getCompanyGenerator().generateUnits(getCampaign(), getCombatPersonnel())); + } + + public void apply() { + if (getCompanyGenerator() == null) { + if (JOptionPane.showConfirmDialog(getFrame(), + resources.getString("CompanyGenerationPanel.ImmediateApplicationWarning.text"), + resources.getString("CompanyGenerationPanel.ImmediateApplicationWarning.title"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { + generate(); + // Catch statement for bad data + if (getCompanyGenerator() == null) { + return; + } + } else { + return; + } + } + + getCompanyGenerator().applyToCampaign(getCampaign(), getCombatPersonnel(), + getSupportPersonnel(), getEntities()); + } + */ +} diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index c2f4d15e26..64ba11230a 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -107,7 +107,7 @@ import mekhq.gui.model.RankTableModel; import mekhq.gui.model.SortedComboBoxModel; import mekhq.gui.preferences.JWindowPreference; -import mekhq.gui.panels.companyGeneration.CompanyGenerationOptionsPanel; +import mekhq.gui.panels.CompanyGenerationOptionsPanel; import mekhq.module.PersonnelMarketServiceManager; import mekhq.module.api.PersonnelMarketMethod; import mekhq.preferences.PreferencesNode; diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index b27603135a..530cedb9e3 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -26,7 +26,7 @@ import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.gui.enums.CompanyGenerationPanelType; -import mekhq.gui.panels.companyGeneration.CompanyGenerationOptionsPanel; +import mekhq.gui.panels.CompanyGenerationOptionsPanel; import javax.swing.*; import java.awt.*; diff --git a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java similarity index 97% rename from MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationOptionsPanel.java rename to MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 67db90b63e..bec48a2abc 100644 --- a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.gui.panels.companyGeneration; +package mekhq.gui.panels; import megamek.common.annotations.Nullable; import megamek.common.util.EncodeControl; @@ -37,6 +37,7 @@ import javax.swing.*; import java.awt.*; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; @@ -49,8 +50,8 @@ public class CompanyGenerationOptionsPanel extends JPanel { //region Variable Declarations - private JFrame frame; - private Campaign campaign; + private final JFrame frame; + private final Campaign campaign; // Base Information private JComboBox comboCompanyGenerationMethod; @@ -142,8 +143,8 @@ public class CompanyGenerationOptionsPanel extends JPanel { //region Constructors public CompanyGenerationOptionsPanel(final JFrame frame, final Campaign campaign) { super(new GridBagLayout()); - setFrame(frame); - setCampaign(campaign); + this.frame = frame; + this.campaign = campaign; initialize(); @@ -160,18 +161,10 @@ public JFrame getFrame() { return frame; } - public void setFrame(final JFrame frame) { - this.frame = frame; - } - public Campaign getCampaign() { return campaign; } - public void setCampaign(final Campaign campaign) { - this.campaign = campaign; - } - //region Base Information public JComboBox getComboCompanyGenerationMethod() { return comboCompanyGenerationMethod; @@ -2051,7 +2044,7 @@ private List getFactionChoices() { for (final Faction faction : Factions.getInstance().getFactions()) { if (faction.validIn(getCampaign().getLocalDate())) { - factionChoices.add(new FactionChoice(faction, getCampaign().getGameYear())); + factionChoices.add(new FactionChoice(faction, getCampaign().getLocalDate())); } } @@ -2358,16 +2351,15 @@ public void exportOptionsToXML() { //region Static Classes private static class FactionChoice { //region Variable Declarations - private Faction faction; - private int year; - private String displayName; + private final Faction faction; + private final String displayName; //endregion Variable Declarations //region Constructors - public FactionChoice(final Faction faction, final int year) { - setFaction(faction); - setYear(year); - setDisplayName(); + public FactionChoice(final Faction faction, final LocalDate today) { + this.faction = faction; + this.displayName = String.format("%s [%s]", getFaction().getFullName(today.getYear()), + getFaction().getShortName()); } //endregion Constructors @@ -2375,23 +2367,6 @@ public FactionChoice(final Faction faction, final int year) { public Faction getFaction() { return faction; } - - public void setFaction(final Faction faction) { - this.faction = faction; - } - - public int getYear() { - return year; - } - - public void setYear(final int year) { - this.year = year; - } - - private void setDisplayName() { - this.displayName = String.format("%s [%s]", getFaction().getFullName(getYear()), - getFaction().getShortName()); - } //endregion Getters/Setters @Override @@ -2402,14 +2377,14 @@ public String toString() { private static class RoleToSpinner { //region Variable Declarations - private int role; - private JSpinner spinner; + private final int role; + private final JSpinner spinner; //endregion Variable Declarations //region Constructors public RoleToSpinner(final int role, final JSpinner spinner) { - setRole(role); - setSpinner(spinner); + this.role = role; + this.spinner = spinner; } //endregion Constructors @@ -2418,10 +2393,6 @@ public int getRole() { return role; } - public void setRole(final int role) { - this.role = role; - } - public JSpinner getSpinner() { return spinner; } @@ -2429,10 +2400,6 @@ public JSpinner getSpinner() { public int getValue() { return (Integer) getSpinner().getValue(); } - - public void setSpinner(final JSpinner spinner) { - this.spinner = spinner; - } //endregion Getters/Setters } //endregion Static Classes diff --git a/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java b/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java index 5c73f58384..8f88d0c1ce 100644 --- a/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java +++ b/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java @@ -18,8 +18,394 @@ */ package mekhq.gui.panels; -public class PersonnelHiringDetailPanel { +import megamek.common.annotations.Nullable; +import megamek.common.icons.Portrait; +import megamek.common.options.IOption; +import megamek.common.options.PilotOptions; +import megamek.common.util.EncodeControl; +import mekhq.Utilities; +import mekhq.campaign.Campaign; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.personnel.Skill; +import mekhq.campaign.personnel.enums.GenderDescriptors; +import mekhq.campaign.universe.PlanetarySystem; +import mekhq.gui.CampaignGUI; +import mekhq.gui.GuiTabType; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Enumeration; +import java.util.ResourceBundle; + +public class PersonnelHiringDetailPanel extends JPanel { //region Variable Declarations - private + private final CampaignGUI gui; + private final Campaign campaign; + private Person person; + + private JLabel lblPortrait; + private JLabel lblPrimaryRole; + private JLabel lblGender; + private JLabel lblBirthday; + private JLabel lblOrigin; + private JLabel lblCallsign; + private JPanel skillsPanel; + private JPanel abilitiesPanel; + private JPanel implantsPanel; + private JLabel lblEdge; + private JLabel lblToughness; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations + + //region Constructors + public PersonnelHiringDetailPanel(final @Nullable CampaignGUI gui, final Campaign campaign, + final @Nullable Person person, final boolean showOrigin) { + this.gui = gui; + this.campaign = campaign; + setPerson(person); + initialize(showOrigin); + updateValues(); + } + //endregion Constructors + + //region Getters/Setters + public @Nullable CampaignGUI getGUI() { + return gui; + } + + public Campaign getCampaign() { + return campaign; + } + + public @Nullable Person getPerson() { + return person; + } + + public void setPerson(final @Nullable Person person) { + this.person = person; + } + + public JLabel getLblPortrait() { + return lblPortrait; + } + + public void setLblPortrait(final JLabel lblPortrait) { + this.lblPortrait = lblPortrait; + } + + public JLabel getLblPrimaryRole() { + return lblPrimaryRole; + } + + public void setLblPrimaryRole(final JLabel lblPrimaryRole) { + this.lblPrimaryRole = lblPrimaryRole; + } + + public JLabel getLblGender() { + return lblGender; + } + + public void setLblGender(final JLabel lblGender) { + this.lblGender = lblGender; + } + + public JLabel getLblBirthday() { + return lblBirthday; + } + + public void setLblBirthday(final JLabel lblBirthday) { + this.lblBirthday = lblBirthday; + } + + public JLabel getLblOrigin() { + return lblOrigin; + } + + public void setLblOrigin(final JLabel lblOrigin) { + this.lblOrigin = lblOrigin; + } + + public JLabel getLblCallsign() { + return lblCallsign; + } + + public void setLblCallsign(final JLabel lblCallsign) { + this.lblCallsign = lblCallsign; + } + + public JPanel getSkillsPanel() { + return skillsPanel; + } + + public void setSkillsPanel(final JPanel skillsPanel) { + this.skillsPanel = skillsPanel; + } + + public JPanel getAbilitiesPanel() { + return abilitiesPanel; + } + + public void setAbilitiesPanel(final JPanel abilitiesPanel) { + this.abilitiesPanel = abilitiesPanel; + } + + public JPanel getImplantsPanel() { + return implantsPanel; + } + + public void setImplantsPanel(final JPanel implantsPanel) { + this.implantsPanel = implantsPanel; + } + + public JLabel getLblEdge() { + return lblEdge; + } + + public void setLblEdge(final JLabel lblEdge) { + this.lblEdge = lblEdge; + } + + public JLabel getLblToughness() { + return lblToughness; + } + + public void setLblToughness(final JLabel lblToughness) { + this.lblToughness = lblToughness; + } + //endregion Getters/Setters + + //region Initialization + private void initialize(final boolean showOrigin) { + // Create Panel Components + setLblPortrait(new JLabel(((getPerson() == null) ? new Portrait() : getPerson().getPortrait()) + .getImageIcon(150), SwingConstants.CENTER)); + getLblPortrait().setName("lblPortrait"); + + setLblPrimaryRole(new JLabel()); + getLblPrimaryRole().setName("lblPrimaryRole"); + + setLblGender(new JLabel()); + getLblGender().setName("lblGender"); + + setLblBirthday(new JLabel()); + getLblBirthday().setName("lblBirthday"); + + setLblOrigin(new JLabel()); + getLblOrigin().setName("lblOrigin"); + getLblOrigin().setVisible(showOrigin); + + setLblCallsign(new JLabel()); + getLblCallsign().setName("lblCallsign"); + + setSkillsPanel(new JPanel()); + getSkillsPanel().setBorder(BorderFactory.createTitledBorder(resources.getString("skillsPanel.title"))); + getSkillsPanel().setName("skillsPanel"); + + setAbilitiesPanel(new JPanel()); + getAbilitiesPanel().setBorder(BorderFactory.createTitledBorder(resources.getString("abilitiesPanel.title"))); + getAbilitiesPanel().setName("abilitiesPanel"); + getAbilitiesPanel().setVisible(getCampaign().getCampaignOptions().useAbilities()); + + setImplantsPanel(new JPanel()); + getImplantsPanel().setBorder(BorderFactory.createTitledBorder(resources.getString("implantsPanel.title"))); + getImplantsPanel().setName("implantsPanel"); + getImplantsPanel().setVisible(getCampaign().getCampaignOptions().useImplants()); + + setLblEdge(new JLabel()); + getLblEdge().setName("lblEdge"); + getLblEdge().setEnabled(getCampaign().getCampaignOptions().useEdge()); + + setLblToughness(new JLabel()); + getLblToughness().setName("lblToughness"); + getLblToughness().setEnabled(getCampaign().getCampaignOptions().useToughness()); + + // Layout the UI + setBorder(BorderFactory.createTitledBorder("")); + setName("personnelHiringDetailPanel"); + GroupLayout layout = new GroupLayout(this); + setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getLblPortrait()) + .addComponent(getLblPrimaryRole()) + .addComponent(getLblGender()) + .addComponent(getLblBirthday()) + .addComponent(getLblOrigin()) + .addComponent(getLblCallsign()) + .addComponent(getSkillsPanel()) + .addComponent(getAbilitiesPanel()) + .addComponent(getImplantsPanel()) + .addComponent(getLblEdge()) + .addComponent(getLblToughness()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(getLblPortrait()) + .addComponent(getLblPrimaryRole()) + .addComponent(getLblGender()) + .addComponent(getLblBirthday()) + .addComponent(getLblOrigin()) + .addComponent(getLblCallsign()) + .addComponent(getSkillsPanel()) + .addComponent(getAbilitiesPanel()) + .addComponent(getImplantsPanel()) + .addComponent(getLblEdge()) + .addComponent(getLblToughness()) + ); + } + //endregion Initialization + + //region Update Values + public void updateValues() { + if (getPerson() == null) { + return; + } + + setBorder(BorderFactory.createTitledBorder(getPerson().getFullTitle())); + + if (!getPerson().getPortrait().toString().equals(getLblPortrait().getToolTipText())) { + getLblPortrait().setIcon(getPerson().getPortrait().getImageIcon(150)); + getLblPortrait().setToolTipText(getPerson().getPortrait().toString()); + } + + getLblPrimaryRole().setText(Person.getRoleDesc(getPerson().getPrimaryRole(), getPerson().isClanner())); + + getLblGender().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblGender.text"), + GenderDescriptors.MALE_FEMALE.getDescriptorCapitalized(getPerson().getGender()))); + + getLblBirthday().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblBirthday.text"), + getPerson().getBirthday(), getPerson().getAge(getCampaign().getLocalDate()))); + + if (getLblOrigin().isVisible()) { + getLblOrigin().setText((getPerson().getOriginPlanet() == null) + ? String.format(resources.getString("PersonnelHiringDetailPanel.lblOrigin.text"), + getPerson().getOriginFaction().getFullName(getCampaign().getGameYear())) + : String.format(resources.getString("PersonnelHiringDetailPanel.lblOrigin.Planet.text"), + getPerson().getOriginPlanet().getName(getCampaign().getLocalDate()), + getPerson().getOriginFaction().getFullName(getCampaign().getGameYear()))); + if ((getGUI() != null) && (getPerson() != null) && (getPerson().getOriginPlanet() != null)) { + getLblOrigin().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + getLblOrigin().addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(final MouseEvent e) { + final PlanetarySystem system = getPerson().getOriginPlanet().getParentSystem(); + // Stay on the interstellar map if their origin planet is the primary planet... + if (system.getPrimaryPlanet().equals(getPerson().getOriginPlanet())) { + getGUI().getMapTab().switchSystemsMap(system); + } else { + // ... otherwise, dive on in to the system view! + getGUI().getMapTab().switchPlanetaryMap(getPerson().getOriginPlanet()); + } + getGUI().setSelectedTab(GuiTabType.MAP); + } + }); + } + } + + // TODO : Java 11 : Swap to using isBlank + if (!"-".equals(getPerson().getCallsign()) && !getPerson().getCallsign().trim().isEmpty()) { + getLblCallsign().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblCallsign.text"), getPerson().getCallsign())); + getLblCallsign().setVisible(true); + } else { + getLblCallsign().setVisible(false); + } + + recreateSkillsPanel(); + + if (getCampaign().getCampaignOptions().useAbilities()) { + recreateAbilitiesPanel(); + } + + if (getCampaign().getCampaignOptions().useImplants()) { + recreateImplantsPanel(); + } + + if (getLblEdge().isEnabled() && (getPerson().getEdge() > 0)) { + getLblEdge().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblEdge.text"), getPerson().getEdge())); + getLblEdge().setVisible(true); + } else { + getLblEdge().setVisible(false); + } + + if (getLblToughness().isEnabled() && (getPerson().getToughness() > 0)) { + getLblToughness().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblToughness.text"), getPerson().getToughness())); + getLblToughness().setVisible(true); + } else { + getLblToughness().setVisible(false); + } + } + + private void recreateSkillsPanel() { + getSkillsPanel().removeAll(); + + getSkillsPanel().setLayout(new GridLayout(0, 2)); + + for (final Skill skill : getPerson().getSkills().getSkills()) { + final String labelName = "lbl" + skill.getType().getName(); + JLabel lblSkillName = new JLabel(skill.getType().getName() + ":"); + lblSkillName.setName(labelName + "Name"); + getSkillsPanel().add(lblSkillName); + + JLabel lblSkillValue = new JLabel(skill.toString()); + lblSkillValue.setName(labelName + "Value"); + getSkillsPanel().add(lblSkillValue); + + lblSkillName.setLabelFor(lblSkillValue); + } + } + + private void recreateAbilitiesPanel() { + getAbilitiesPanel().removeAll(); + + if (getPerson().countOptions(PilotOptions.LVL3_ADVANTAGES) == 0) { + getAbilitiesPanel().setVisible(false); + return; + } + + getAbilitiesPanel().setLayout(new GridLayout(0, 1)); + getAbilitiesPanel().setVisible(true); + + for (Enumeration i = getPerson().getOptions(PilotOptions.LVL3_ADVANTAGES); i.hasMoreElements();) { + final IOption option = i.nextElement(); + + if (option.booleanValue()) { + JLabel lblAbilities = new JLabel(Utilities.getOptionDisplayName(option)); + lblAbilities.setToolTipText(option.getDescription()); + lblAbilities.setName("lblAbilities" + option.getName()); + getAbilitiesPanel().add(lblAbilities); + } + } + } + + private void recreateImplantsPanel() { + getImplantsPanel().removeAll(); + + if (getPerson().countOptions(PilotOptions.MD_ADVANTAGES) == 0) { + getImplantsPanel().setVisible(false); + return; + } + + getImplantsPanel().setLayout(new GridLayout(0, 1)); + getImplantsPanel().setVisible(true); + + for (Enumeration i = getPerson().getOptions(PilotOptions.MD_ADVANTAGES); i.hasMoreElements();) { + IOption option = i.nextElement(); + + if (option.booleanValue()) { + JLabel lblImplant = new JLabel(Utilities.getOptionDisplayName(option)); + lblImplant.setToolTipText(option.getDescription()); + lblImplant.setName("lblImplant" + option.getName()); + getImplantsPanel().add(lblImplant); + } + } + } + //endregion Update Values } diff --git a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPanel.java b/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPanel.java deleted file mode 100644 index cdf38790aa..0000000000 --- a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPanel.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.panels.companyGeneration; - -import megamek.common.Entity; -import mekhq.campaign.personnel.Person; -import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; - -import java.util.List; - -public class CompanyGenerationPanel { - //region Variable Declarations - private AbstractCompanyGenerator companyGenerator = null; - - // Data - private List combatPersonnel; - private List supportPersonnel; - private List entities; - //endregion Variable Declarations - - //region Getters/Setters - public AbstractCompanyGenerator getCompanyGenerator() { - return companyGenerator; - } - - public void setCompanyGenerator(AbstractCompanyGenerator companyGenerator) { - this.companyGenerator = companyGenerator; - } - - //region Data - public List getCombatPersonnel() { - return combatPersonnel; - } - - public void setCombatPersonnel(List combatPersonnel) { - this.combatPersonnel = combatPersonnel; - } - - public List getSupportPersonnel() { - return supportPersonnel; - } - - public void setSupportPersonnel(List supportPersonnel) { - this.supportPersonnel = supportPersonnel; - } - - public List getEntities() { - return entities; - } - - public void setEntities(List entities) { - this.entities = entities; - } - //endregion Data - //endregion Getters/Setters -/** - - public void generate() { - if ((getCompanyGenerator() != null) && (JOptionPane.showConfirmDialog(getFrame(), - resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.text"), - resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.title"), - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { - return; - } else if (!validateOptions()) { - return; - } - - setCompanyGenerator(getCompanyGenerationMethod().getGenerator(getCampaign(), createOptionsFromPanel())); - - setCombatPersonnel(getCompanyGenerator().generateCombatPersonnel(getCampaign())); - setSupportPersonnel(getCompanyGenerator().generateSupportPersonnel(getCampaign())); - setEntities(getCompanyGenerator().generateUnits(getCampaign(), getCombatPersonnel())); - } - - public void apply() { - if (getCompanyGenerator() == null) { - if (JOptionPane.showConfirmDialog(getFrame(), - resources.getString("CompanyGenerationPanel.ImmediateApplicationWarning.text"), - resources.getString("CompanyGenerationPanel.ImmediateApplicationWarning.title"), - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { - generate(); - // Catch statement for bad data - if (getCompanyGenerator() == null) { - return; - } - } else { - return; - } - } - - getCompanyGenerator().applyToCampaign(getCampaign(), getCombatPersonnel(), - getSupportPersonnel(), getEntities()); - } - */ -} diff --git a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationUnitPanel.java b/MekHQ/src/mekhq/gui/panes/CompanyGenerationPersonnelPane.java similarity index 83% rename from MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationUnitPanel.java rename to MekHQ/src/mekhq/gui/panes/CompanyGenerationPersonnelPane.java index 522079656c..73653489ca 100644 --- a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationUnitPanel.java +++ b/MekHQ/src/mekhq/gui/panes/CompanyGenerationPersonnelPane.java @@ -16,7 +16,10 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.gui.panels.companyGeneration; +package mekhq.gui.panes; -public class CompanyGenerationUnitPanel { +import javax.swing.*; + +public class CompanyGenerationPersonnelPane extends JScrollPane { + } diff --git a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPersonnelPanel.java b/MekHQ/src/mekhq/gui/panes/CompanyGenerationUnitPane.java similarity index 84% rename from MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPersonnelPanel.java rename to MekHQ/src/mekhq/gui/panes/CompanyGenerationUnitPane.java index 47d18e2e70..ec7538bc39 100644 --- a/MekHQ/src/mekhq/gui/panels/companyGeneration/CompanyGenerationPersonnelPanel.java +++ b/MekHQ/src/mekhq/gui/panes/CompanyGenerationUnitPane.java @@ -16,7 +16,9 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.gui.panels.companyGeneration; +package mekhq.gui.panes; -public class CompanyGenerationPersonnelPanel { +import javax.swing.*; + +public class CompanyGenerationUnitPane extends JScrollPane { } diff --git a/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java b/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java new file mode 100644 index 0000000000..e894c8582f --- /dev/null +++ b/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java @@ -0,0 +1,4 @@ +package mekhq.gui.panes; + +public class PersonnelHiringPane { +} diff --git a/MekHQ/src/mekhq/gui/renderers/BulkPersonnelHiringRenderer.java b/MekHQ/src/mekhq/gui/renderers/BulkPersonnelHiringRenderer.java deleted file mode 100644 index 76b2bca01e..0000000000 --- a/MekHQ/src/mekhq/gui/renderers/BulkPersonnelHiringRenderer.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.renderers; - -import megamek.client.generator.RandomNameGenerator; -import megamek.common.annotations.Nullable; -import mekhq.campaign.Campaign; -import mekhq.campaign.personnel.Person; -import mekhq.gui.panels.PersonnelHiringDetailPanel; - -import javax.swing.*; -import java.awt.*; - -public class BulkPersonnelHiringRenderer extends JPanel implements ListCellRenderer { - //region Variable Declarations - private PersonnelHiringDetailPanel personnelHiringDetailPanel; - private JButton btnRandomName; - private JButton btnRandomPortrait; - private JButton btnRandomOrigin; - private JButton btnChoosePortrait; - private JButton btnEditPerson; - //endregion Variable Declarations - - //region Constructors - public BulkPersonnelHiringRenderer(final Campaign campaign, final boolean gm) { - initialize(campaign, gm); - } - //endregion Constructors - - //region Getters/Setters - public PersonnelHiringDetailPanel getPersonnelHiringDetailPanel() { - return personnelHiringDetailPanel; - } - - public void setPersonnelHiringDetailPanel(final PersonnelHiringDetailPanel personnelHiringDetailPanel) { - this.personnelHiringDetailPanel = personnelHiringDetailPanel; - } - - public JButton getBtnRandomName() { - return btnRandomName; - } - - public void setBtnRandomName(final JButton btnRandomName) { - this.btnRandomName = btnRandomName; - } - - public JButton getBtnRandomPortrait() { - return btnRandomPortrait; - } - - public void setBtnRandomPortrait(final JButton btnRandomPortrait) { - this.btnRandomPortrait = btnRandomPortrait; - } - - public JButton getBtnRandomOrigin() { - return btnRandomOrigin; - } - - public void setBtnRandomOrigin(final JButton btnRandomOrigin) { - this.btnRandomOrigin = btnRandomOrigin; - } - - public JButton getBtnChoosePortrait() { - return btnChoosePortrait; - } - - public void setBtnChoosePortrait(final JButton btnChoosePortrait) { - this.btnChoosePortrait = btnChoosePortrait; - } - - public JButton getBtnEditPerson() { - return btnEditPerson; - } - - public void setBtnEditPerson(final JButton btnEditPerson) { - this.btnEditPerson = btnEditPerson; - } - //endregion Getters/Setters - - //region Initialization - private void initialize(final Campaign campaign, final boolean gm) { - JButton button = new JButton(); - button.addActionListener(evt -> { - String factionCode = campaign.getCampaignOptions().useOriginFactionForNames() - ? getPerson().getOriginFaction().getShortName() - : RandomNameGenerator.getInstance().getChosenFaction(); - String[] name = RandomNameGenerator.getInstance().generateGivenNameSurnameSplit( - getPerson().getGender(), getPerson().isClanner(), factionCode); - getPerson().setGivenName(name[0]); - getPerson().setSurname(name[1]); - }); - - } - //endregion Initialization - - @Override - public Component getListCellRendererComponent(final JList list, - final Person value, final int index, - final boolean isSelected, - final boolean cellHasFocus) { - // JTextArea::setForeground and JTextArea::setBackground don't work properly with the default - // return, but by recreating the colour it works properly - final Color foreground = new Color(UIManager.getColor(isSelected - ? "Table.selectionForeground" : "Table.foreground").getRGB()); - final Color background = new Color(UIManager.getColor(isSelected - ? "Table.selectionBackground" : "Table.background").getRGB()); - setForeground(foreground); - setBackground(background); - getDescription().setForeground(foreground); - getDescription().setBackground(background); - - getLblTitle().setText(value.getTitle()); - getDescription().setText(value.getDescription()); - - return this; - } - - @Override - public Dimension getMinimumSize() { - return new Dimension(300, 100); - } - - @Override - public Dimension getPreferredSize() { - return new Dimension(400, 120); - } -} diff --git a/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java b/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java new file mode 100644 index 0000000000..fe1bc68b9b --- /dev/null +++ b/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.renderers; + +import megamek.client.generator.RandomCallsignGenerator; +import megamek.client.generator.RandomNameGenerator; +import megamek.client.ui.swing.dialog.imageChooser.AbstractIconChooserDialog; +import megamek.client.ui.swing.dialog.imageChooser.PortraitChooserDialog; +import megamek.common.annotations.Nullable; +import megamek.common.enums.Gender; +import megamek.common.util.EncodeControl; +import mekhq.campaign.Campaign; +import mekhq.campaign.personnel.Person; +import mekhq.gui.CampaignGUI; +import mekhq.gui.dialog.CustomizePersonDialog; +import mekhq.gui.panels.PersonnelHiringDetailPanel; + +import javax.swing.*; +import java.awt.*; +import java.util.ResourceBundle; + +public class PersonnelHiringRenderer extends JPanel implements ListCellRenderer { + //region Variable Declarations + private final JFrame frame; + private PersonnelHiringDetailPanel personnelHiringDetailPanel; + private JButton btnRandomName; + private JButton btnRandomPortrait; + private JButton btnRandomOrigin; + private JButton btnRandomCallsign; + private JButton btnChoosePortrait; + private JButton btnEditPerson; + + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); + //endregion Variable Declarations + + //region Constructors + public PersonnelHiringRenderer(final JFrame frame, final @Nullable CampaignGUI gui, + final Campaign campaign, final boolean gm) { + this.frame = frame; + initialize(gui, campaign, gm); + } + //endregion Constructors + + //region Getters/Setters + public JFrame getFrame() { + return frame; + } + + public PersonnelHiringDetailPanel getPersonnelHiringDetailPanel() { + return personnelHiringDetailPanel; + } + + public void setPersonnelHiringDetailPanel(final PersonnelHiringDetailPanel personnelHiringDetailPanel) { + this.personnelHiringDetailPanel = personnelHiringDetailPanel; + } + + public JButton getBtnRandomName() { + return btnRandomName; + } + + public void setBtnRandomName(final JButton btnRandomName) { + this.btnRandomName = btnRandomName; + } + + public JButton getBtnRandomPortrait() { + return btnRandomPortrait; + } + + public void setBtnRandomPortrait(final JButton btnRandomPortrait) { + this.btnRandomPortrait = btnRandomPortrait; + } + + public JButton getBtnRandomOrigin() { + return btnRandomOrigin; + } + + public void setBtnRandomOrigin(final JButton btnRandomOrigin) { + this.btnRandomOrigin = btnRandomOrigin; + } + + public JButton getBtnRandomCallsign() { + return btnRandomCallsign; + } + + public void setBtnRandomCallsign(final JButton btnRandomCallsign) { + this.btnRandomCallsign = btnRandomCallsign; + } + + public JButton getBtnChoosePortrait() { + return btnChoosePortrait; + } + + public void setBtnChoosePortrait(final JButton btnChoosePortrait) { + this.btnChoosePortrait = btnChoosePortrait; + } + + public JButton getBtnEditPerson() { + return btnEditPerson; + } + + public void setBtnEditPerson(final JButton btnEditPerson) { + this.btnEditPerson = btnEditPerson; + } + //endregion Getters/Setters + + //region Initialization + private void initialize(final @Nullable CampaignGUI gui, final Campaign campaign, final boolean gm) { + setPersonnelHiringDetailPanel(new PersonnelHiringDetailPanel(gui, campaign, null, true)); + + setBtnRandomName(new JButton(resources.getString("btnRandomName.text"))); + getBtnRandomName().setToolTipText(resources.getString("btnRandomName.toolTipText")); + getBtnRandomName().setName("btnRandomName"); + getBtnRandomName().addActionListener(evt -> { + final Person person = getPersonnelHiringDetailPanel().getPerson(); + if (person == null) { + return; + } + String factionCode = campaign.getCampaignOptions().useOriginFactionForNames() + ? person.getOriginFaction().getShortName() + : RandomNameGenerator.getInstance().getChosenFaction(); + String[] name = RandomNameGenerator.getInstance().generateGivenNameSurnameSplit( + person.getGender(), person.isClanner(), factionCode); + person.setGivenName(name[0]); + person.setSurname(name[1]); + getPersonnelHiringDetailPanel().updateValues(); + }); + + setBtnRandomPortrait(new JButton(resources.getString("btnRandomPortrait.text"))); + getBtnRandomPortrait().setToolTipText(resources.getString("btnRandomPortrait.toolTipText")); + getBtnRandomPortrait().setName("btnRandomPortrait"); + getBtnRandomPortrait().addActionListener(evt -> { + final Person person = getPersonnelHiringDetailPanel().getPerson(); + if (person != null) { + campaign.assignRandomPortraitFor(person); + getPersonnelHiringDetailPanel().updateValues(); + } + }); + + setBtnRandomOrigin(new JButton(resources.getString("btnRandomOrigin.text"))); + getBtnRandomOrigin().setToolTipText(resources.getString("btnRandomOrigin.toolTipText")); + getBtnRandomOrigin().setName("btnRandomOrigin"); + getBtnRandomOrigin().addActionListener(evt -> { + final Person person = getPersonnelHiringDetailPanel().getPerson(); + if (person != null) { + campaign.assignRandomOriginFor(person); + getPersonnelHiringDetailPanel().updateValues(); + } + }); + + setBtnRandomCallsign(new JButton(resources.getString("btnRandomCallsign.text"))); + getBtnRandomCallsign().setToolTipText(resources.getString("btnRandomCallsign.toolTipText")); + getBtnRandomCallsign().setName("btnRandomCallsign"); + getBtnRandomCallsign().addActionListener(evt -> { + final Person person = getPersonnelHiringDetailPanel().getPerson(); + if (person != null) { + person.setCallsign(RandomCallsignGenerator.getInstance().generate()); + getPersonnelHiringDetailPanel().updateValues(); + } + }); + + setBtnChoosePortrait(new JButton(resources.getString("btnChoosePortrait.text"))); + getBtnChoosePortrait().setToolTipText(resources.getString("btnChoosePortrait.toolTipText")); + getBtnChoosePortrait().setName("btnChoosePortrait"); + getBtnChoosePortrait().addActionListener(evt -> { + final Person person = getPersonnelHiringDetailPanel().getPerson(); + if (person == null) { + return; + } + AbstractIconChooserDialog portraitDialog = new PortraitChooserDialog(getFrame(), person.getPortrait()); + if ((portraitDialog.showDialog() == JOptionPane.OK_OPTION) && (portraitDialog.getSelectedItem() != null)) { + person.setPortrait(portraitDialog.getSelectedItem()); + getPersonnelHiringDetailPanel().updateValues(); + } + }); + + if (gm) { + setBtnEditPerson(new JButton(resources.getString("btnEditPerson.text"))); + getBtnEditPerson().setToolTipText(resources.getString("btnEditPerson.toolTipText")); + getBtnEditPerson().setName("btnEditPerson"); + getBtnEditPerson().addActionListener(evt -> { + final Person person = getPersonnelHiringDetailPanel().getPerson(); + if (person == null) { + return; + } + final Gender gender = person.getGender(); + new CustomizePersonDialog(getFrame(), true, person, campaign).setVisible(true); + if (gender != person.getGender()) { + campaign.assignRandomPortraitFor(person); + } + getPersonnelHiringDetailPanel().updateValues(); + }); + } + } + //endregion Initialization + + @Override + public Component getListCellRendererComponent(final JList list, + final Person value, final int index, + final boolean isSelected, + final boolean cellHasFocus) { + // JTextArea::setForeground and JTextArea::setBackground don't work properly with the default + // return, but by recreating the colour it works properly + final Color foreground = new Color(UIManager.getColor(isSelected + ? "Table.selectionForeground" : "Table.foreground").getRGB()); + final Color background = new Color(UIManager.getColor(isSelected + ? "Table.selectionBackground" : "Table.background").getRGB()); + setForeground(foreground); + setBackground(background); + /* + getDescription().setForeground(foreground); + getDescription().setBackground(background); + + getLblTitle().setText(value.getTitle()); + getDescription().setText(value.getDescription()); + */ + + return this; + } + + @Override + public Dimension getMinimumSize() { + return new Dimension(300, 100); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(400, 120); + } +} From 5b3ee7e737d0a818bc2da3699e787efb542c32ce Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 10 Mar 2021 15:30:31 -0700 Subject: [PATCH 019/115] Readding the campaign application stage --- .../AbstractCompanyGenerator.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 554bfa1c1f..424d2df5db 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1417,6 +1417,82 @@ private void generateMysteryBoxes(final Campaign campaign) { } //endregion Surprises + //region Apply to Campaign + /** + * TODO : UNFINISHED + * This method takes the campaign and applies all changes to it. No method not directly + * called from here may alter the campaign. + * + * @param campaign the campaign to apply the generation to + * @param combatPersonnel the list of generated combat personnel + * @param supportPersonnel the list of generated support personnel + * @param entities the list of generated entities, with null holding spaces without 'Mechs + * @param mothballedEntities the list of generated spare 'Mech entities to mothball + * @param contract the selected contract, or null if one has not been selected + */ + public void applyToCampaign(final Campaign campaign, final List combatPersonnel, + final List supportPersonnel, final List entities, + final List mothballedEntities, final @Nullable Contract contract) { + moveToStartingPlanet(campaign); + + // Phase One: Personnel, Units, and Unit + final List personnel = new ArrayList<>(); + final List units = new ArrayList<>(); + applyPhaseOneToCampaign(campaign, combatPersonnel, supportPersonnel, personnel, entities, units); + + // Phase 2: Spares + units.addAll(createMothballedSpareUnits(campaign, mothballedEntities)); + + final List parts = generateSpareParts(units); + final List armour = generateArmour(units); + final List ammunition = generateAmmunition(campaign, units); + + // Phase 3: Contract + processContract(campaign, contract); + + // Phase 4: Finances + processFinances(campaign, personnel, units, parts, armour, ammunition, contract); + + // Phase 5: Applying Spares + parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); + armour.forEach(a -> campaign.getWarehouse().addPart(a, true)); + ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); + + // Phase 6: Surprises! + generateSurprises(campaign); + } + + private void applyPhaseOneToCampaign(final Campaign campaign, final List combatPersonnel, + final List supportPersonnel, final List personnel, + final List entities, final List units) { + // Process Personnel + personnel.addAll(combatPersonnel); + personnel.addAll(supportPersonnel); + + // If we aren't using the pool, generate all of the Astechs and Medics required + generateAssistants(campaign, personnel); + + // This does all of the final personnel processing, including recruitment and running random + // marriages + finalizePersonnel(campaign, personnel); + + // We can only fill the pool after recruiting our support personnel + if (getOptions().isPoolAssistants()) { + campaign.fillAstechPool(); + campaign.fillMedicPool(); + } + + // Process Units + units.addAll(createUnits(campaign, combatPersonnel, entities)); + + // Assign Techs to Units + assignTechsToUnits(supportPersonnel, units); + + // Generate the Forces and Assign Units to them + generateUnit(campaign, sortPersonnelIntoLances(combatPersonnel)); + } + //endregion Apply to Campaign + //region Local Classes /** * This class contains the parameters used to generate a random mech, and allows sorting and From 90d9a3a1d2fe92c93a18c6801f92d395af571d8a Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 10 Mar 2021 15:43:14 -0700 Subject: [PATCH 020/115] Pushing a temporary fix --- .../panels/CampaignPresetSelectionPanel.java | 7 ++++++- .../mekhq/gui/panes/PersonnelHiringPane.java | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java b/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java index 1ad62cc447..937b845fbd 100644 --- a/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java @@ -58,7 +58,12 @@ private void initialize() { setPreferredSize(new Dimension(500, 400)); DefaultListModel listModel = new DefaultListModel<>(); - listModel.addAll(GamePreset.getGamePresetsIn()); + // TODO : Java 11 + //listModel.addAll(GamePreset.getGamePresetsIn()); + + for (GamePreset preset : GamePreset.getGamePresetsIn()) { + listModel.addElement(preset); + } setPresets(new JList<>(listModel)); getPresets().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); diff --git a/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java b/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java index e894c8582f..8a1497b167 100644 --- a/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java +++ b/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java @@ -1,3 +1,21 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ package mekhq.gui.panes; public class PersonnelHiringPane { From f8d95a18a888d6f0c96ea06e6c0e54348dc570e1 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Thu, 11 Mar 2021 15:00:57 -0700 Subject: [PATCH 021/115] Continuing to work on getting the generation backend completed --- .../resources/mekhq/resources/GUI.properties | 36 +- .../mekhq/resources/Universe.properties | 18 +- .../enums/CompanyGenerationPersonType.java | 60 ++ .../universe/enums/MysteryBoxType.java | 13 +- .../AbstractCompanyGenerator.java | 890 ++++++++++-------- .../AtBCompanyGenerator.java | 2 +- .../AtBRandomMechParameters.java | 67 ++ .../CompanyGenerationOptions.java | 20 +- .../CompanyGenerationPersonTracker.java | 79 ++ .../CompanyGenerationWizard.java | 93 +- .../WindchildCompanyGenerator.java | 2 +- .../mysteryBoxes/AbstractClanMysteryBox.java | 22 - .../AbstractInnerSphereMysteryBox.java | 22 - .../mysteryBoxes/AbstractMysteryBox.java | 30 - .../ClanExperimentalMysteryBox.java | 22 - .../mysteryBoxes/ClanFrontlineMysteryBox.java | 22 - .../mysteryBoxes/ClanKeshikMysteryBox.java | 22 - .../ClanSecondLineMysteryBox.java | 22 - .../InnerSphereExperimentalMysteryBox.java | 22 - .../StarLeagueRegularMysteryBox.java | 22 - .../StarLeagueRoyalMysteryBox.java | 22 - .../ThirdSuccessionWarMysteryBox.java | 22 - .../gui/dialog/CompanyGenerationDialog.java | 26 +- .../panels/CompanyGenerationOptionsPanel.java | 19 +- 24 files changed, 751 insertions(+), 824 deletions(-) create mode 100644 MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBRandomMechParameters.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractClanMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractInnerSphereMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanExperimentalMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanFrontlineMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanKeshikMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanSecondLineMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/InnerSphereExperimentalMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRegularMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRoyalMysteryBox.java delete mode 100644 MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ThirdSuccessionWarMysteryBox.java diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index c7181b6a0d..124ccc2b24 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -188,8 +188,6 @@ chkGenerateCaptains.text=Generate Captains chkGenerateCaptains.toolTipText=This creates Captains for every company after the first, or for every company when using a mercenary company command lance.
They have two officer skill increases, and are assigned the rank of Captain. chkAssignCompanyCommanderFlag.text=Assign Commander Flag chkAssignCompanyCommanderFlag.toolTipText=This assigns the Commander flag to the generated Company Commander, designating them as the overall commander for the mercenary company. -chkCompanyCommanderLanceOfficer.text=Generate Company Commander as Lance Officer -chkCompanyCommanderLanceOfficer.toolTipText=When enabled the company commander has their own lance without any other officers.
Otherwise, the lance containing the company commander will also contain a Lieutenant. chkApplyOfficerStatBonusToWorstSkill.text=Apply Officer Stat Bonus to Weaker Skill chkApplyOfficerStatBonusToWorstSkill.toolTipText=This applies the single officer stat bonus to the weaker of their primary skills, normally piloting. chkAssignBestOfficers.text=Assign Best Officers @@ -293,14 +291,14 @@ chkPayForArmour.toolTipText=Pay for the spare armour generated, if any is genera chkPayForAmmunition.text=Pay for Ammunition chkPayForAmmunition.toolTipText=Pay for the spare ammunition generated, if any is generated. ## Surprises Panel -surprisesPanel.title=Surprises -surprisesPanel.toolTipText=\u0020 +surprisesPanel.title=Surprises (Unimplemented) +surprisesPanel.toolTipText=Surprises are applied to the campaign immediately, with no user input, at the end of company generation. chkGenerateSurprises.text=Generate Surprises -chkGenerateSurprises.toolTipText=\u0020 +chkGenerateSurprises.toolTipText=Allow the generation of surprises. These are applied to the campaign immediately, at the end of company generation. mysteryBoxPanel.title=Mystery Boxes -mysteryBoxPanel.toolTipText=Mystery Boxes each contain a 'Mech and between two and four parts.\u0020 +mysteryBoxPanel.toolTipText=Mystery Boxes each contain a 'Mech and between two and four parts randomly determined based on the individual type. chkGenerateMysteryBoxes.text=Generate Mystery Boxes -chkGenerateMysteryBoxes.toolTipText=\u0020 +chkGenerateMysteryBoxes.toolTipText=Allow the generation of enabled mystery box types, if any are enabled. ## Option Validation Warnings CompanyGenerationOptionsPanel.InvalidOptions.title=Error: Invalid Option Selection CompanyGenerationOptionsPanel.InvalidGenerationSize.text=You must select at least one company or independent lance to generate @@ -334,14 +332,16 @@ PersonnelHiringDetailPanel.lblToughness.text=Toughness: %s #### Renderers ### PersonnelHiringRenderer btnRandomName.text=Randomize Name -btnRandomName.toolTipText= -btnRandomPortrait.text= -btnRandomPortrait.toolTipText= -btnRandomOrigin.text= -btnRandomOrigin.toolTipText= -btnRandomCallsign.text= -btnRandomCallsign.toolTipText= -btnChoosePortrait.text= -btnChoosePortrait.toolTipText= -btnEditPerson.text= -btnEditPerson.toolTipText= +btnRandomName.toolTipText=Generates a random name for the person. +btnRandomPortrait.text=Randomize Portrait +btnRandomPortrait.toolTipText=Generates a new random portrait for the person, if possible. +btnRandomOrigin.text=Randomize Origin +btnRandomOrigin.toolTipText=Generates a random origin faction and planet for the person. +btnRandomCallsign.text=Randomize Callsign +btnRandomCallsign.toolTipText=Generates a random callsign for the person. +btnChoosePortrait.text=Choose Portrait +btnChoosePortrait.toolTipText=Manually select the portrait for the current person. +btnEditPerson.text=Edit Person +btnEditPerson.toolTipText=Edit the current person. This functionality is GM-restricted. +btnRandomizePerson.text=Randomize Person +btnRandomizePerson.toolTipText=Generates a new person using the supplied parameters. This functionality is GM-restricted. diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index cec4735e20..0cce94c00a 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -99,21 +99,21 @@ ForceNamingMethod.GREEK_ALPHABET.toolTipText=This generates names using th # MysteryBoxType Enum MysteryBoxType.THIRD_SUCCESSION_WAR.text=Third Succession War Mystery Box -MysteryBoxType.THIRD_SUCCESSION_WAR.toolTipText=\u0020 -MysteryBoxType.STAR_LEAGUE_ROYAL.text=Star League Royal Mystery Box -MysteryBoxType.STAR_LEAGUE_ROYAL.toolTipText=\u0020 +MysteryBoxType.THIRD_SUCCESSION_WAR.toolTipText=This generates a random BattleMech and two to four parts based on the year 3000.
Expect a light to medium IntroTech BattleMech and some common equipment, but you can never tell what one might find salvageable on the battleground. +MysteryBoxType.STAR_LEAGUE_ROYAL.text=Star League Royal Division Mystery Box +MysteryBoxType.STAR_LEAGUE_ROYAL.toolTipText=This generates a random BattleMech and two to four parts based on the units of the Star League Royal Division.
Expect the best technology of the Star League and their preferred 'Mechs. MysteryBoxType.STAR_LEAGUE_REGULAR.text=Star League Defence Force Mystery Box -MysteryBoxType.STAR_LEAGUE_REGULAR.toolTipText=\u0020 +MysteryBoxType.STAR_LEAGUE_REGULAR.toolTipText=This generates a random BattleMech and two to four parts based on the units of the Star League Regular Army. MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.text=Inner Sphere Experimental Tech Mystery Box -MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.toolTipText=\u0020 +MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.toolTipText=This generates a random experimental Inner Sphere BattleMech and two to four experimental parts based on the current campaign date.
Expect weird and wacky technology and new, rare, and/or unusual Inner Sphere 'Mechs and parts from this mystery box. MysteryBoxType.CLAN_KESHIK.text=Clan Keshik Mystery Box -MysteryBoxType.CLAN_KESHIK.toolTipText=\u0020 +MysteryBoxType.CLAN_KESHIK.toolTipText=This generates a random Clan 'Mech used by their Keshik forces and two to four parts based on the current year.
Expect the best technology of the Clans, as used by their elite.
This returns an Star League Royal Mystery Box if the current year predates the Clans. MysteryBoxType.CLAN_FRONT_LINE.text=Clan Front Line Mystery Box -MysteryBoxType.CLAN_FRONT_LINE.toolTipText=\u0020 +MysteryBoxType.CLAN_FRONT_LINE.toolTipText=This generate a Clan front line 'Mech and two to four parts based on the current year.
This returns an Star League Royal Mystery Box if the current year predates the Clans. MysteryBoxType.CLAN_SECOND_LINE.text=Clan Second Line Mystery Box -MysteryBoxType.CLAN_SECOND_LINE.toolTipText=\u0020 +MysteryBoxType.CLAN_SECOND_LINE.toolTipText=This generate a Clan second line 'Mech and two to four parts based on the current year.
This returns an Star League Defence Force Mystery Box if the current year predates the Clans. MysteryBoxType.CLAN_EXPERIMENTAL.text=Clan Experimental Tech Mystery Box -MysteryBoxType.CLAN_EXPERIMENTAL.toolTipText=\u0020 +MysteryBoxType.CLAN_EXPERIMENTAL.toolTipText=This generates a random experimental Clan BattleMech and two to four experimental Clan parts based on the current campaign date.
Expect weird and wacky Clan technology, unusual 'Mechs... or maybe just getting them early!
This returns an Inner Sphere Experimental Mystery Box if the current year predates the Clans. # PartGenerationMethod Enum PartGenerationMethod.DISABLED.text=Disabled diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java new file mode 100644 index 0000000000..4d7bf0aaec --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.enums; + +public enum CompanyGenerationPersonType { + //region Enum Declarations + COMPANY_COMMANDER, + CAPTAIN, + LIEUTENANT, + MECHWARRIOR, + SUPPORT, + ASSISTANT; + //endregion Enum Declarations + + //region Boolean Comparisons + public boolean isCompanyCommander() { + return this == COMPANY_COMMANDER; + } + + public boolean isCaptain() { + return this == CAPTAIN; + } + + public boolean isLieutenant() { + return this == LIEUTENANT; + } + + public boolean isMechWarrior() { + return this == MECHWARRIOR; + } + + public boolean isSupport() { + return this == SUPPORT; + } + + public boolean isOfficer() { + return isCaptain() || isLieutenant(); + } + + public boolean isCombat() { + return isCompanyCommander() || isCaptain() || isLieutenant() || isMechWarrior(); + } + //endregion Boolean Comparisons +} diff --git a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java index 0f8f6e951d..11e1d25eda 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java @@ -19,15 +19,6 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.AbstractMysteryBox; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.ClanExperimentalMysteryBox; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.ClanFrontlineMysteryBox; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.ClanKeshikMysteryBox; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.ClanSecondLineMysteryBox; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.InnerSphereExperimentalMysteryBox; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.StarLeagueRegularMysteryBox; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.StarLeagueRoyalMysteryBox; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.ThirdSuccessionWarMysteryBox; import java.util.ResourceBundle; @@ -63,6 +54,7 @@ public String getToolTipText() { } //endregion Getters +/* public AbstractMysteryBox getMysteryBox() { switch (this) { case STAR_LEAGUE_ROYAL: @@ -74,7 +66,7 @@ public AbstractMysteryBox getMysteryBox() { case CLAN_KESHIK: return new ClanKeshikMysteryBox(); case CLAN_FRONT_LINE: - return new ClanFrontlineMysteryBox(); + return new ClanFrontLineMysteryBox(); case CLAN_SECOND_LINE: return new ClanSecondLineMysteryBox(); case CLAN_EXPERIMENTAL: @@ -84,6 +76,7 @@ public AbstractMysteryBox getMysteryBox() { return new ThirdSuccessionWarMysteryBox(); } } +*/ @Override public String toString() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 424d2df5db..687c3cead8 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -55,8 +55,7 @@ import mekhq.campaign.universe.RangedPlanetSelector; import mekhq.campaign.universe.enums.Alphabet; import mekhq.campaign.universe.enums.CompanyGenerationMethod; -import mekhq.campaign.universe.enums.MysteryBoxType; -import mekhq.campaign.universe.randomEvent.mysteryBoxes.AbstractMysteryBox; +import mekhq.campaign.universe.enums.CompanyGenerationPersonType; import mekhq.campaign.work.WorkTime; import mekhq.gui.enums.LayeredForceIcon; @@ -76,10 +75,8 @@ /** * Startup: - * First Panel (initial startup only): Client Options * Second Panel: Presets, Date, Starting Faction, Starting Planet, AtB * Third Panel: Campaign Options - * Fourth Panel: MegaMek Options * Fifth Panel: Start of the Company Generator * * Ideas: @@ -95,10 +92,8 @@ * Button that lets you pop out the options panel with everything disabled * * TODO : - * Mercenaries may customize their mechs, with clantech if enabled only post-3055 - * Unit weight sorting needs more options and variants... like an isolate SL units, keep SL units to highest ranked officers, that kind of thing + * Mercenaries may customize their 'Mechs, with clantech if enabled only post-3055 * Finish the personnel randomization overrides - * Cleanup the dialog, have it disable and enable based on variable values * Implement: * centerPlanet * selectStartingContract @@ -113,11 +108,18 @@ * Dialog Modify the buttons, and have them appear or disappear based on the current panel * Panel has odd whitespace usage * System, Planet text search + * + * Phase Two: + * TODO: + * Implement Surprises + * Implement Mystery Boxes + * Add MekHQ Options as a panel during the startup, but only for the first load (use a MekHQ Option to track it) + * Add MegaMek Options as a panel during the startup */ public abstract class AbstractCompanyGenerator { //region Variable Declarations private final CompanyGenerationMethod method; - private final CompanyGenerationOptions options; + private CompanyGenerationOptions options; private AbstractPersonnelGenerator personnelGenerator; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); @@ -127,7 +129,7 @@ public abstract class AbstractCompanyGenerator { protected AbstractCompanyGenerator(final Campaign campaign, final CompanyGenerationMethod method, final CompanyGenerationOptions options) { this.method = method; - this.options = options; + setOptions(options); createPersonnelGenerator(campaign); } //endregion Constructors @@ -141,6 +143,10 @@ public CompanyGenerationOptions getOptions() { return options; } + public void setOptions(final CompanyGenerationOptions options) { + this.options = options; + } + public AbstractPersonnelGenerator getPersonnelGenerator() { return personnelGenerator; } @@ -195,7 +201,7 @@ private AbstractPlanetSelector createPlanetSelector() { /** * @return the number of lances to generate */ - private int determineNumberLances() { + private int determineNumberOfLances() { return (getOptions().getCompanyCount() * getOptions().getLancesPerCompany()) + getOptions().getIndividualLanceCount() + (getOptions().isGenerateMercenaryCompanyCommandLance() ? 1 : 0); @@ -204,19 +210,12 @@ private int determineNumberLances() { /** * @return the number of Captains */ - private int determineNumberCaptains() { + private int determineNumberOfCaptains() { return getOptions().isGenerateCaptains() ? Math.max((getOptions().getCompanyCount() - (getOptions().isGenerateMercenaryCompanyCommandLance() ? 0 : 1)), 0) : 0; } - - /** - * @return the index of the first non-officer - */ - private int determineFirstNonOfficer() { - return determineNumberLances() + (getOptions().isCompanyCommanderLanceOfficer() ? 0 : 1); - } //endregion Determination Methods //region Base Information @@ -224,7 +223,7 @@ private int determineFirstNonOfficer() { * This sets the planet to the starting planet specified, if that option is enabled * @param campaign the campaign to apply the location to */ - public void moveToStartingPlanet(final Campaign campaign) { + private void moveToStartingPlanet(final Campaign campaign) { if (getOptions().isSpecifyStartingPlanet()) { campaign.setLocation(new CurrentLocation(getOptions().getStartingPlanet().getParentSystem(), 0)); } @@ -232,38 +231,49 @@ public void moveToStartingPlanet(final Campaign campaign) { //endregion Base Information //region Personnel + /** + * @param campaign the campaign to use to generate the personnel + * @return the list of generated personnel within their individual trackers + */ + public List generatePersonnel(final Campaign campaign) { + final List trackers = generateCombatPersonnel(campaign); + trackers.addAll(generateSupportPersonnel(campaign)); + return trackers; + } + //region Combat Personnel /** * @param campaign the campaign to use to generate the combat personnel - * @return the list of generated combat personnel + * @return the list of generated combat personnel within their individual trackers */ - public List generateCombatPersonnel(final Campaign campaign) { - List combatPersonnel = new ArrayList<>(); - final int numMechWarriors = determineNumberLances() * getOptions().getLanceSize(); + private List generateCombatPersonnel(final Campaign campaign) { + final List trackers = new ArrayList<>(); + final int numMechWarriors = determineNumberOfLances() * getOptions().getLanceSize(); for (int i = 0; i < numMechWarriors; i++) { - combatPersonnel.add(campaign.newPerson(Person.T_MECHWARRIOR, getPersonnelGenerator())); + trackers.add(new CompanyGenerationPersonTracker( + campaign.newPerson(Person.T_MECHWARRIOR, getPersonnelGenerator()))); } // Default Sort is Tactical Genius First - Comparator personnelSorter = Comparator.comparing( - (Person p) -> p.getOptions().booleanOption(OptionsConstants.MISC_TACTICAL_GENIUS)); + Comparator personnelSorter = Comparator.comparing( + t -> t.getPerson().getOptions().booleanOption(OptionsConstants.MISC_TACTICAL_GENIUS)); if (getOptions().isAssignBestOfficers()) { - personnelSorter = personnelSorter.thenComparingInt((Person p) -> p.getExperienceLevel(false)) + personnelSorter = personnelSorter.thenComparingInt(t -> t.getPerson().getExperienceLevel(false)) .reversed() - .thenComparingInt(p -> p.getSkillLevel(SkillType.S_LEADER) - + p.getSkillLevel(SkillType.S_STRATEGY) + p.getSkillLevel(SkillType.S_TACTICS)) + .thenComparingInt(t -> t.getPerson().getSkillLevel(SkillType.S_LEADER) + + t.getPerson().getSkillLevel(SkillType.S_STRATEGY) + t.getPerson().getSkillLevel(SkillType.S_TACTICS)) .reversed(); } - combatPersonnel.sort(personnelSorter); + trackers.sort(personnelSorter); - generateCommandingOfficer(combatPersonnel.get(0), numMechWarriors); + generateCommandingOfficer(trackers.get(0), numMechWarriors); - generateOfficers(combatPersonnel); + generateOfficers(trackers); - generateStandardMechWarriors(combatPersonnel); + generateStandardMechWarriors(trackers); - return combatPersonnel; + return trackers; } /** @@ -273,17 +283,19 @@ public List generateCombatPersonnel(final Campaign campaign) { * 3) Gets two random officer skill increases * 4) Gets the highest rank possible assigned to them * - * @param commandingOfficer the commanding officer + * @param commandingOfficer the commanding officer's tracker * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ - private void generateCommandingOfficer(final Person commandingOfficer, final int numMechWarriors) { - commandingOfficer.setCommander(getOptions().isAssignCompanyCommanderFlag()); - commandingOfficer.improveSkill(SkillType.S_GUN_MECH); - commandingOfficer.improveSkill(SkillType.S_PILOT_MECH); - assignRandomOfficerSkillIncrease(commandingOfficer, 2); + private void generateCommandingOfficer(final CompanyGenerationPersonTracker commandingOfficer, + final int numMechWarriors) { + commandingOfficer.setPersonType(CompanyGenerationPersonType.COMPANY_COMMANDER); + commandingOfficer.getPerson().setCommander(getOptions().isAssignCompanyCommanderFlag()); + commandingOfficer.getPerson().improveSkill(SkillType.S_GUN_MECH); + commandingOfficer.getPerson().improveSkill(SkillType.S_PILOT_MECH); + assignRandomOfficerSkillIncrease(commandingOfficer.getPerson(), 2); if (getOptions().isAutomaticallyAssignRanks()) { - generateCommandingOfficerRank(commandingOfficer, numMechWarriors); + generateCommandingOfficerRank(commandingOfficer.getPerson(), numMechWarriors); } } @@ -294,7 +306,25 @@ private void generateCommandingOfficer(final Person commandingOfficer, final int protected abstract void generateCommandingOfficerRank(final Person commandingOfficer, final int numMechWarriors); /** - * This generates officers based on the provided options. + * This generates the initial officer list and assigns the type + * + * @param trackers the list of all generated personnel in their trackers + */ + private void generateOfficers(final List trackers) { + // First, we need to determine the captain threshold + final int captainThreshold = determineNumberOfCaptains() + 1; + // Starting at 1, as 0 is the mercenary company commander + for (int i = 1; i < determineNumberOfLances(); i++) { + // Set the Person Type on the tracker, so we can properly reroll later + trackers.get(i).setPersonType((i < captainThreshold) ? CompanyGenerationPersonType.CAPTAIN + : CompanyGenerationPersonType.LIEUTENANT); + // Generate the individual officer + generateOfficer(trackers.get(i).getPerson(), trackers.get(i).getPersonType()); + } + } + + /** + * This generates an officer based on the provided options. * * Custom addition for larger generation: * For every company (with a mercenary company command lance) or for every company @@ -308,50 +338,47 @@ private void generateCommandingOfficer(final Person commandingOfficer, final int * 2) Two random officer skill increases if they are a Captain, otherwise they get one * 3) A rank of O4 - Captain for Captains, otherwise O3 - Lieutenant * - * @param personnel the list of all generated personnel + * @param officer the officer to generate + * @param type the type of the officer (Captain or Lieutenant) */ - private void generateOfficers(final List personnel) { - int captains = determineNumberCaptains(); - // Starting at 1, as 0 is the mercenary company commander - for (int i = 1; i < determineFirstNonOfficer(); i++) { - final Person officer = personnel.get(i); - - // Improve Skills - final Skill gunnery = officer.getSkill(SkillType.S_GUN_MECH); - final Skill piloting = officer.getSkill(SkillType.S_PILOT_MECH); - if ((gunnery == null) && (piloting != null)) { - officer.improveSkill(SkillType.S_GUN_MECH); - } else if ((gunnery != null) && (piloting == null)) { - officer.improveSkill(SkillType.S_PILOT_MECH); - } else if (gunnery == null) { - // Both are null... this shouldn't occur. In this case, boost both - officer.improveSkill(SkillType.S_GUN_MECH); - officer.improveSkill(SkillType.S_PILOT_MECH); - } else { - officer.improveSkill((gunnery.getLevel() > piloting.getLevel() - && getOptions().isApplyOfficerStatBonusToWorstSkill() ? piloting : gunnery) - .getType().getName()); - } + private void generateOfficer(final Person officer, final CompanyGenerationPersonType type) { + if (!type.isOfficer()) { + MekHQ.getLogger().error(officer.getFullTitle() + " is not a valid officer for the officer generation, cannot generate them as an officer."); + return; + } - if (captains > 0) { - // Assign Random Officer Skill Increase - assignRandomOfficerSkillIncrease(officer, 2); + // Improve Skills + final Skill gunnery = officer.getSkill(SkillType.S_GUN_MECH); + final Skill piloting = officer.getSkill(SkillType.S_PILOT_MECH); + if ((gunnery == null) && (piloting != null)) { + officer.improveSkill(SkillType.S_GUN_MECH); + } else if ((gunnery != null) && (piloting == null)) { + officer.improveSkill(SkillType.S_PILOT_MECH); + } else if (gunnery == null) { + // Both are null... this shouldn't occur. In this case, boost both + officer.improveSkill(SkillType.S_GUN_MECH); + officer.improveSkill(SkillType.S_PILOT_MECH); + } else { + officer.improveSkill((((gunnery.getLevel() > piloting.getLevel()) + && getOptions().isApplyOfficerStatBonusToWorstSkill()) ? piloting : gunnery) + .getType().getName()); + } - if (getOptions().isAutomaticallyAssignRanks()) { - // Assign Rank of O4 - Captain - officer.setRankNumeric(Ranks.RWO_MAX + 4); - } + if (type.isCaptain()) { + // Assign Random Officer Skill Increase + assignRandomOfficerSkillIncrease(officer, 2); - // Decrement the number of captains left to generate - captains--; - } else { - // Assign Random Officer Skill Increase - assignRandomOfficerSkillIncrease(officer, 1); + if (getOptions().isAutomaticallyAssignRanks()) { + // Assign Rank of O4 - Captain + officer.setRankNumeric(Ranks.RWO_MAX + 4); + } + } else { + // Assign Random Officer Skill Increase + assignRandomOfficerSkillIncrease(officer, 1); - if (getOptions().isAutomaticallyAssignRanks()) { - // Assign Rank of O3 - Lieutenant - officer.setRankNumeric(Ranks.RWO_MAX + 3); - } + if (getOptions().isAutomaticallyAssignRanks()) { + // Assign Rank of O3 - Lieutenant + officer.setRankNumeric(Ranks.RWO_MAX + 3); } } } @@ -389,18 +416,30 @@ private void assignRandomOfficerSkillIncrease(final Person person, final int boo } } /** - * Sets up a standard MechWarrior - * 1) Assigns rank of E12 - Sergeant, or E4 for Clan, WoB, and ComStar + * Sets up standard MechWarriors from the provided trackers * - * @param personnel the list of all generated personnel + * @param trackers the list of all generated trackers */ - private void generateStandardMechWarriors(final List personnel) { - final boolean isClanComStarOrWoB = getOptions().getFaction().isComStarOrWoB() - || getOptions().getFaction().isClan(); - for (int i = determineFirstNonOfficer(); i < personnel.size(); i++) { - if (getOptions().isAutomaticallyAssignRanks()) { - personnel.get(i).setRankNumeric(isClanComStarOrWoB ? 4 : 12); + private void generateStandardMechWarriors(final List trackers) { + for (final CompanyGenerationPersonTracker tracker : trackers) { + if (!tracker.getPersonType().isMechWarrior()) { + continue; } + + generateStandardMechWarrior(tracker.getPerson()); + } + } + + /** + * This sets up a standard MechWarrior + * 1) Assigns rank of E12 - Sergeant, or E4 for Clan, WoB, and ComStar + * + * @param person the MechWarrior to set up + */ + private void generateStandardMechWarrior(final Person person) { + if (getOptions().isAutomaticallyAssignRanks()) { + person.setRankNumeric((getOptions().getFaction().isComStarOrWoB() + || getOptions().getFaction().isClan()) ? 4 : 12); } } //endregion Combat Personnel @@ -410,71 +449,84 @@ private void generateStandardMechWarriors(final List personnel) { * @param campaign the campaign to generate from * @return a list of all support personnel */ - public List generateSupportPersonnel(final Campaign campaign) { - final List supportPersonnel = new ArrayList<>(); + private List generateSupportPersonnel(final Campaign campaign) { + final List trackers = new ArrayList<>(); for (final Map.Entry entry : getOptions().getSupportPersonnel().entrySet()) { for (int i = 0; i < entry.getValue(); i++) { - final Person person = campaign.newPerson(entry.getKey(), getPersonnelGenerator()); - // All support personnel get assigned is their rank - if (getOptions().isAutomaticallyAssignRanks()) { - switch (campaign.getRanks().getRankSystem()) { - case Ranks.RS_CCWH: - case Ranks.RS_CL: - break; - case Ranks.RS_COM: - case Ranks.RS_WOB: - case Ranks.RS_MOC: - person.setRankNumeric(4); - break; - default: - person.setRankNumeric(8); - break; - } - } - supportPersonnel.add(person); + trackers.add(new CompanyGenerationPersonTracker( + generateSupportPerson(campaign, entry.getKey()), CompanyGenerationPersonType.SUPPORT)); } } - return supportPersonnel; + return trackers; } /** - * @param campaign the campaign to use in creating the assistants - * @param personnel the list of personnel to add the newly created assistants to + * @param campaign the campaign to generate from + * @param role the created person's primary role + * @return the newly created support person with the provided role */ - public void generateAssistants(final Campaign campaign, final List personnel) { - // If you don't want to use pooled assistants, then this generates them as personnel instead - if (!getOptions().isPoolAssistants()) { - final int assistantRank; + private Person generateSupportPerson(final Campaign campaign, final int role) { + final Person person = campaign.newPerson(role, getPersonnelGenerator()); + // All support personnel get assigned Corporal or equivalent as their rank + if (getOptions().isAutomaticallyAssignRanks()) { switch (campaign.getRanks().getRankSystem()) { case Ranks.RS_CCWH: case Ranks.RS_CL: - assistantRank = 0; break; case Ranks.RS_COM: case Ranks.RS_WOB: case Ranks.RS_MOC: - assistantRank = 4; + person.setRankNumeric(4); break; default: - assistantRank = 2; + person.setRankNumeric(8); break; } + } + return person; + } - for (int i = 0; i < campaign.getAstechNeed(); i++) { - final Person astech = campaign.newPerson(Person.T_ASTECH, getPersonnelGenerator()); - if (getOptions().isAutomaticallyAssignRanks()) { - astech.setRankNumeric(assistantRank); - } - personnel.add(astech); + /** + * @param campaign the campaign to use in creating the assistants + * @param trackers the trackers to add the newly created assistants to + */ + private void generateAssistants(final Campaign campaign, final List trackers) { + // If you don't want to use pooled assistants, then this generates them as personnel instead + if (getOptions().isPoolAssistants()) { + return; + } + + final int assistantRank; + switch (campaign.getRanks().getRankSystem()) { + case Ranks.RS_CCWH: + case Ranks.RS_CL: + assistantRank = 0; + break; + case Ranks.RS_COM: + case Ranks.RS_WOB: + case Ranks.RS_MOC: + assistantRank = 4; + break; + default: + assistantRank = 2; + break; + } + + for (int i = 0; i < campaign.getAstechNeed(); i++) { + final Person astech = campaign.newPerson(Person.T_ASTECH, getPersonnelGenerator()); + if (getOptions().isAutomaticallyAssignRanks()) { + astech.setRankNumeric(assistantRank); } - for (int i = 0; i < campaign.getMedicsNeed(); i++) { - final Person medic = campaign.newPerson(Person.T_MEDIC, getPersonnelGenerator()); - if (getOptions().isAutomaticallyAssignRanks()) { - medic.setRankNumeric(assistantRank); - } - personnel.add(medic); + trackers.add(new CompanyGenerationPersonTracker(astech, CompanyGenerationPersonType.ASSISTANT)); + } + + for (int i = 0; i < campaign.getMedicsNeed(); i++) { + final Person medic = campaign.newPerson(Person.T_MEDIC, getPersonnelGenerator()); + if (getOptions().isAutomaticallyAssignRanks()) { + medic.setRankNumeric(assistantRank); } + trackers.add(new CompanyGenerationPersonTracker(medic, CompanyGenerationPersonType.ASSISTANT)); } } //endregion Support Personnel @@ -482,17 +534,17 @@ public void generateAssistants(final Campaign campaign, final List perso /** * This does the final personnel processing * @param campaign the campaign to use in processing and to add the personnel to - * @param personnel the list of ALL personnel in the campaign + * @param trackers ALL trackers for the campaign */ - public void finalizePersonnel(final Campaign campaign, final List personnel) { + private void finalizePersonnel(final Campaign campaign, final List trackers) { // Assign the founder flag if we need to if (getOptions().isAssignFounderFlag()) { - personnel.forEach(p -> p.setFounder(true)); + trackers.forEach(t -> t.getPerson().setFounder(true)); } // Recruit all of the personnel, GM-style so that the initial hiring cost is calculated as // part of the financial model - personnel.forEach(p -> campaign.recruitPerson(p, true)); + trackers.forEach(t -> campaign.recruitPerson(t.getPerson(), true)); // Now that they are recruited, we can simulate backwards a few years and generate marriages // and children @@ -501,16 +553,16 @@ public void finalizePersonnel(final Campaign campaign, final List person while (date.isBefore(campaign.getLocalDate())) { date = date.plusDays(1); - for (final Person person : personnel) { + for (final CompanyGenerationPersonTracker tracker : trackers) { if (getOptions().isSimulateRandomMarriages()) { - person.randomMarriage(campaign, date); + tracker.getPerson().randomMarriage(campaign, date); } - if (getOptions().isSimulateRandomProcreation() && person.getGender().isFemale()) { - if (person.isPregnant() && (date.compareTo(person.getDueDate()) == 0)) { - person.birth(campaign, date); + if (getOptions().isSimulateRandomProcreation() && tracker.getPerson().getGender().isFemale()) { + if (tracker.getPerson().isPregnant() && (date.compareTo(tracker.getPerson().getDueDate()) == 0)) { + tracker.getPerson().birth(campaign, date); } else { - person.procreate(campaign, date); + tracker.getPerson().procreate(campaign, date); } } } @@ -520,29 +572,22 @@ public void finalizePersonnel(final Campaign campaign, final List person //endregion Personnel //region Units + //region Unit Generation Parameters /** - * @param campaign the campaign to generate for - * @param combatPersonnel the list of all combat personnel - * @return the list of all generated entities, with null holding spaces without 'Mechs + * This generates the unit generation parameters and assigns them to their trackers + * + * @param trackers the list of all personnel trackers */ - public List generateUnits(final Campaign campaign, List combatPersonnel) { - final int firstNonOfficer = determineFirstNonOfficer(); - final List parameters = createUnitGenerationParameters(combatPersonnel, firstNonOfficer); - - // This parses through all combat personnel and checks if the roll is SL. - // If it is, reroll the weight with a max value of 12 - for (int i = 0; i < combatPersonnel.size(); i++) { - if (parameters.get(i).isStarLeague()) { - parameters.get(i).setWeight(determineBattleMechWeight(Math.min(Utilities.dice(2, 6) - + ((i == 0) ? 2 : ((i < firstNonOfficer) ? 1 : 0)), 12))); - } - } + public void generateUnitGenerationParameters(List trackers) { + // First, we need to create the unit generation parameters + final List parameters = createUnitGenerationParameters(trackers); + // Then, we need to separate out the best roll for the unit commander if that option is enabled if (getOptions().isAssignBestRollToUnitCommander()) { int bestIndex = 0; - RandomMechParameters bestParameters = parameters.get(bestIndex); + AtBRandomMechParameters bestParameters = parameters.get(bestIndex); for (int i = 1; i < parameters.size(); i++) { - final RandomMechParameters checkParameters = parameters.get(i); + final AtBRandomMechParameters checkParameters = parameters.get(i); if (bestParameters.isStarLeague() == checkParameters.isStarLeague()) { if (bestParameters.getWeight() == checkParameters.getWeight()) { if (bestParameters.getQuality() < checkParameters.getQuality()) { @@ -564,21 +609,23 @@ public List generateUnits(final Campaign campaign, List combatPe } } - Comparator parametersComparator = (o1, o2) -> 0; + // Now, we need to apply the various sorts based on the provided options + Comparator parametersComparator = (p1, p2) -> 0; if (getOptions().isSortStarLeagueUnitsFirst()) { - parametersComparator = parametersComparator.thenComparing(RandomMechParameters::isStarLeague).reversed(); + parametersComparator = parametersComparator.thenComparing(AtBRandomMechParameters::isStarLeague).reversed(); } if (getOptions().isGroupByWeight()) { - parametersComparator = parametersComparator.thenComparingInt(RandomMechParameters::getWeight).reversed(); + parametersComparator = parametersComparator.thenComparingInt(AtBRandomMechParameters::getWeight).reversed(); } if (getOptions().isGroupByQuality()) { - parametersComparator = parametersComparator.thenComparingInt(RandomMechParameters::getQuality).reversed(); + parametersComparator = parametersComparator.thenComparingInt(AtBRandomMechParameters::getQuality).reversed(); } if (getOptions().isKeepOfficerRollsSeparate()) { + final int firstNonOfficer = determineNumberOfLances(); parameters.subList(getOptions().isAssignBestRollToUnitCommander() ? 1 : 0, firstNonOfficer).sort(parametersComparator); parameters.subList(firstNonOfficer, parameters.size()).sort(parametersComparator); } else { @@ -589,30 +636,80 @@ public List generateUnits(final Campaign campaign, List combatPe } else { parameters.sort(parametersComparator); } - combatPersonnel = sortPersonnelIntoLances(combatPersonnel); + + trackers = sortPersonnelIntoLances(trackers); } - return generateEntities(campaign, parameters, combatPersonnel); + // Now that everything is nicely sorted, we can set the parameters. Parameters will ALWAYS + // be of a length equal to or less than that of trackers, as we don't generate parameters + // for support personnel. + for (int i = 0; i < parameters.size(); i++) { + trackers.get(i).setParameters(parameters.get(i)); + } + } + + /** + * @param trackers the list of all personnel trackers + * @return a list of the generated RandomMechParameters. These have NOT been assigned to the + * individual trackers + */ + private List createUnitGenerationParameters( + final List trackers) { + final List parameters = new ArrayList<>(); + trackers.forEach(tracker -> { + if (tracker.getPersonType().isCombat()) { + parameters.add(createUnitGenerationParameter(tracker)); + } + }); + return parameters; } /** - * @param combatPersonnel the list of all combat personnel - * @param firstNonOfficer the index of the first non-officer - * @return a list of RandomMechParameters + * Creates an individual set of parameters, rerolling the weight if Star League is rolled originally + * @param tracker the tracker to generate the parameters based on + * @return the created parameters */ - protected List createUnitGenerationParameters( - final List combatPersonnel, final int firstNonOfficer) { - List parameters = new ArrayList<>(); - for (int i = 0; i < combatPersonnel.size(); i++) { - final int modifier = (i == 0) ? 2 : ((i < firstNonOfficer) ? 1 : 0); - parameters.add(new RandomMechParameters( - determineBattleMechWeight(Utilities.dice(2, 6) + modifier), - determineBattleMechQuality(Utilities.dice(2, 6) + modifier) - )); + private AtBRandomMechParameters createUnitGenerationParameter(final CompanyGenerationPersonTracker tracker) { + final AtBRandomMechParameters parameters = new AtBRandomMechParameters( + rollBattleMechWeight(tracker, true), rollBattleMechQuality(tracker)); + if (parameters.isStarLeague()) { + parameters.setWeight(rollBattleMechWeight(tracker, false)); } return parameters; } + /** + * @param tracker the tracker to get the unit generation parameter modifier for + * @return the modifier value + */ + private int getUnitGenerationParameterModifier(final CompanyGenerationPersonTracker tracker) { + switch (tracker.getPersonType()) { + case COMPANY_COMMANDER: + return 2; + case CAPTAIN: + case LIEUTENANT: + return 1; + case MECHWARRIOR: + return 0; + default: + // Shouldn't be hit, but a safety for attempting non-combat generation + return -20; + } + } + + /** + * @param tracker the tracker to roll based on + * @param initialRoll if this isn't the initial roll, then we need to cap the value at 12 + * @return the weight to use in generating the BattleMech + */ + private int rollBattleMechWeight(final CompanyGenerationPersonTracker tracker, final boolean initialRoll) { + int roll = Utilities.dice(2, 6) + getUnitGenerationParameterModifier(tracker); + if (!initialRoll) { + roll = Math.min(roll, 12); + } + return determineBattleMechWeight(roll); + } + /** * @param roll the modified roll to use * @return the generated EntityWeightClass magic int @@ -621,26 +718,104 @@ protected List createUnitGenerationParameters( */ protected abstract int determineBattleMechWeight(final int roll); + /** + * @param tracker the tracker to roll based on + * @return the quality to use in generating the BattleMech + */ + private int rollBattleMechQuality(final CompanyGenerationPersonTracker tracker) { + return determineBattleMechQuality(Utilities.dice(2, 6) + + getUnitGenerationParameterModifier(tracker)); + } + /** * @param roll the modified roll to use * @return the generated IUnitRating magic int for Dragoon Quality */ protected abstract int determineBattleMechQuality(final int roll); + /** + * @param trackers the trackers to sort into their lances + * @return a new List containing the sorted personnel + */ + private List sortPersonnelIntoLances( + final List trackers) { + // We start by creating the return list, the Captains list, the Lieutenants list + // and the MechWarriors list + final List sortedTrackers = new ArrayList<>(); + final List captains = trackers.stream().filter(tracker -> + tracker.getPersonType().isCaptain()).collect(Collectors.toList()); + final List lieutenants = trackers.stream().filter(tracker -> + tracker.getPersonType().isLieutenant()).collect(Collectors.toList()); + final List standardMechWarriors = trackers.stream().filter(tracker -> + tracker.getPersonType().isMechWarrior()).collect(Collectors.toList()); + + // Sort Command Lance + sortedTrackers.addAll(organizeTrackersIntoLance(trackers.get(0), standardMechWarriors)); + + // If the command lance is part of a company, we sort the rest of that company immediately + if (!getOptions().isGenerateMercenaryCompanyCommandLance() && (getOptions().getCompanyCount() > 0)) { + for (int i = 1; i < getOptions().getLancesPerCompany(); i++) { + sortedTrackers.addAll(organizeTrackersIntoLance(lieutenants.remove(0), standardMechWarriors)); + } + } + + // Sort into Companies + while (!captains.isEmpty()) { + // Assign the Captain's Lance + sortedTrackers.addAll(organizeTrackersIntoLance(captains.remove(0), standardMechWarriors)); + // Then assign the other lances + for (int y = 1; y < getOptions().getLancesPerCompany(); y++) { + sortedTrackers.addAll(organizeTrackersIntoLance(lieutenants.remove(0), standardMechWarriors)); + } + } + + // Sort any individual lances + while (!lieutenants.isEmpty()) { + sortedTrackers.addAll(organizeTrackersIntoLance(lieutenants.remove(0), standardMechWarriors)); + } + + return sortedTrackers; + } /** - * @param campaign the campaign to generate for - * @param parameters the list of all parameters to use in generation - * @param combatPersonnel the list of all combat personnel - * @return the list of all generated entities, with null holding spaces without 'Mechs + * + * @param officer + * @param standardMechWarriors + * @return */ - private List generateEntities(final Campaign campaign, - final List parameters, - final List combatPersonnel) { - List entities = new ArrayList<>(); - for (int i = 0; i < parameters.size(); i++) { - entities.add(generateEntity(campaign, parameters.get(i), combatPersonnel.get(i).getOriginFaction())); + private List organizeTrackersIntoLance( + final CompanyGenerationPersonTracker officer, + final List standardMechWarriors) { + final List trackers = new ArrayList<>(); + trackers.add(officer); + if (standardMechWarriors.size() <= getOptions().getLanceSize() - 1) { + trackers.addAll(standardMechWarriors); + standardMechWarriors.clear(); + } else { + for (int i = 1; (i < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); i++) { + trackers.add(standardMechWarriors.remove(0)); + } } - return entities; + return trackers; + } + //endregion Unit Generation Parameters + + //region Entities + /** + * @param campaign the campaign to generate for + * @param trackers the list of all personnel trackers + */ + public void generateEntities(final Campaign campaign, + final List trackers) { + trackers.forEach(tracker -> generateEntity(campaign, tracker)); + } + + /** + * This generates a single entity and assigns it to the specified tracker. + * @param campaign the campaign to generate for + * @param tracker the tracker to generate based on the parameters and to assign the result to + */ + private void generateEntity(final Campaign campaign, final CompanyGenerationPersonTracker tracker) { + tracker.setEntity(generateEntity(campaign, tracker.getParameters(), tracker.getPerson().getOriginFaction())); } /** @@ -650,9 +825,9 @@ private List generateEntities(final Campaign campaign, * @param faction the faction to generate the Entity from * @return the entity generated, or null otherwise */ - public @Nullable Entity generateEntity(final Campaign campaign, - final RandomMechParameters parameters, - final Faction faction) { + private @Nullable Entity generateEntity(final Campaign campaign, + final AtBRandomMechParameters parameters, + final Faction faction) { // Ultra-Light means no mech generated if (parameters.getWeight() == EntityWeightClass.WEIGHT_ULTRA_LIGHT) { return null; @@ -676,7 +851,7 @@ private List generateEntities(final Campaign campaign, * @return the MechSummary generated from the provided parameters */ protected abstract MechSummary generateMechSummary(final Campaign campaign, - final RandomMechParameters parameters, + final AtBRandomMechParameters parameters, final Faction faction); /** @@ -687,53 +862,51 @@ protected abstract MechSummary generateMechSummary(final Campaign campaign, * @return the MechSummary generated from the provided parameters */ protected MechSummary generateMechSummary(final Campaign campaign, - final RandomMechParameters parameters, + final AtBRandomMechParameters parameters, final String faction, int year) { Predicate filter = ms -> (!campaign.getCampaignOptions().limitByYear() || (year > ms.getYear())); return campaign.getUnitGenerator().generate(faction, UnitType.MEK, parameters.getWeight(), year, parameters.getQuality(), filter); } + //endregion Entities /** * @param campaign the campaign to add the units to - * @param combatPersonnel the list of combat personnel to assign to units - * @param entities the list of generated entities, with null holding spaces without 'Mechs + * @param trackers the list of trackers to assign to their units * @return the list of created units */ - public List createUnits(final Campaign campaign, List combatPersonnel, - final List entities) { - if (!getOptions().isKeepOfficerRollsSeparate()) { // Sorted into individual lances - combatPersonnel = sortPersonnelIntoLances(combatPersonnel); - } - + private List createUnits(final Campaign campaign, + final List trackers) { final List units = new ArrayList<>(); - for (int i = 0; i < entities.size(); i++) { - if (entities.get(i) != null) { - final Unit unit = campaign.addNewUnit(entities.get(i), false, 0); - if (i < combatPersonnel.size()) { - unit.addPilotOrSoldier(combatPersonnel.get(i)); - if (getOptions().isGenerateUnitsAsAttached()) { - combatPersonnel.get(i).setOriginalUnit(unit); - } - } - units.add(unit); + for (final CompanyGenerationPersonTracker tracker : trackers) { + if (tracker.getEntity() == null) { + continue; } + + final Unit unit = campaign.addNewUnit(tracker.getEntity(), false, 0); + unit.addPilotOrSoldier(tracker.getPerson()); + if (getOptions().isGenerateUnitsAsAttached()) { + tracker.getPerson().setOriginalUnit(unit); + } + units.add(unit); } return units; } /** - * @param supportPersonnel the list of support personnel including the techs to assign to units + * @param trackers the list of trackers including the support 'Mech techs * @param units the list of units to have techs assigned to (order does not matter) */ - public void assignTechsToUnits(final List supportPersonnel, final List units) { + private void assignTechsToUnits(final List trackers, final List units) { if (!getOptions().isAssignTechsToUnits()) { return; } - final List mechTechs = supportPersonnel.parallelStream() - .filter(p -> p.getPrimaryRole() == Person.T_MECH_TECH).collect(Collectors.toList()); + final List mechTechs = trackers.parallelStream() + .filter(tracker -> tracker.getPersonType().isSupport()) + .filter(tracker -> tracker.getPerson().getPrimaryRole() == Person.T_MECH_TECH) + .collect(Collectors.toList()); if (mechTechs.size() == 0) { return; } @@ -741,7 +914,7 @@ public void assignTechsToUnits(final List supportPersonnel, final List supportPersonnel, final List sortPersonnelIntoLances(final List personnel) { - final Person commander = personnel.get(0); - List officers = new ArrayList<>(personnel.subList(1, determineFirstNonOfficer())); - final List standardMechWarriors = new ArrayList<>(personnel.subList(determineFirstNonOfficer(), personnel.size())); - final List sortedPersonnel = new ArrayList<>(); - - // Sort Command Lance - sortedPersonnel.add(commander); - if (!getOptions().isCompanyCommanderLanceOfficer()) { - // This removes the first non-Captain officer, as Captains each get their own companies - sortedPersonnel.add(officers.remove(determineNumberCaptains())); - } - for (int i = sortedPersonnel.size() - 1; i < getOptions().getLanceSize(); i++) { - sortedPersonnel.add(standardMechWarriors.remove(0)); - } - - // If the command lance is part of a company, we sort the rest of that company immediately - if (!getOptions().isGenerateMercenaryCompanyCommandLance() && (getOptions().getCompanyCount() > 0)) { - for (int i = 1; i < getOptions().getLancesPerCompany(); i++) { - // This removes the first non-Captain officer, as Captains each get their own companies - sortedPersonnel.add(officers.remove(determineNumberCaptains())); - for (int y = 1; (y < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); y++) { - sortedPersonnel.add(standardMechWarriors.remove(0)); - } - } - } - - // Sort into Companies - int numberCaptains = determineNumberCaptains(); - for (int i = 0; i < determineNumberCaptains(); i++) { - // Assign the Captain's Lance - sortedPersonnel.add(officers.remove(0)); - numberCaptains--; - for (int y = 1; (y < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); y++) { - sortedPersonnel.add(standardMechWarriors.remove(0)); - } - // Then assign the other lances - for (int y = 1; y < getOptions().getLancesPerCompany(); y++) { - // This removes the first non-Captain officer, as Captains each get their own companies - sortedPersonnel.add(officers.remove(numberCaptains)); - for (int z = 1; (z < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); z++) { - sortedPersonnel.add(standardMechWarriors.remove(0)); - } - } - } - - // Sort any individual lances - final int originalOfficersSize = officers.size(); - for (int i = 0; i < originalOfficersSize; i++) { - sortedPersonnel.add(officers.remove(0)); - for (int y = 1; (y < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); y++) { - sortedPersonnel.add(standardMechWarriors.remove(0)); - } - } - - return sortedPersonnel; - } - /** * This generates the TO&E structure, and assigns personnel to their individual lances. - * This is called after all dialog modifications to personnel. * @param campaign the campaign to generate the unit within - * @param personnel a CLONED list of personnel properly organized into lances + * @param trackers a CLONED list of trackers properly organized into lances */ - public void generateUnit(final Campaign campaign, final List personnel) { + private void generateUnit(final Campaign campaign, final List trackers) { final Force originForce = campaign.getForce(0); final Alphabet[] alphabet = Alphabet.values(); String background = ""; @@ -869,7 +979,7 @@ public void generateUnit(final Campaign campaign, final List personnel) // Generate the Mercenary Company Command Lance if (getOptions().isGenerateMercenaryCompanyCommandLance()) { - Force commandLance = createLance(campaign, originForce, personnel, campaign.getName() + Force commandLance = createLance(campaign, originForce, trackers, campaign.getName() + resources.getString("AbstractCompanyGenerator.commandLance.text"), background); commandLance.getIconMap().put(LayeredForceIcon.SPECIAL_MODIFIER.getLayerPath(), new Vector<>()); commandLance.getIconMap().get(LayeredForceIcon.SPECIAL_MODIFIER.getLayerPath()).add("HQ indicator.png"); @@ -881,7 +991,7 @@ public void generateUnit(final Campaign campaign, final List personnel) + resources.getString("AbstractCompanyGenerator.company.text")); campaign.addForce(company, originForce); for (int y = 0; y < getOptions().getLancesPerCompany(); y++) { - createLance(campaign, company, personnel, alphabet[y], background); + createLance(campaign, company, trackers, alphabet[y], background); } if (getOptions().isGenerateForceIcons()) { @@ -891,7 +1001,7 @@ public void generateUnit(final Campaign campaign, final List personnel) // Create Individual Lances for (int i = 0 ; i < getOptions().getIndividualLanceCount(); i++) { - createLance(campaign, originForce, personnel, alphabet[i + getOptions().getCompanyCount()], background); + createLance(campaign, originForce, trackers, alphabet[i + getOptions().getCompanyCount()], background); } } @@ -899,13 +1009,14 @@ public void generateUnit(final Campaign campaign, final List personnel) * This creates a lance with a standard name * @param campaign the campaign to generate the unit within * @param head the force to append the new lance to - * @param personnel the list of personnel, properly ordered to be assigned to the lance + * @param trackers the list of trackers, properly ordered to be assigned to the lance * @param alphabet the alphabet value to determine the lance name from * @param background the background filename */ - private void createLance(final Campaign campaign, final Force head, final List personnel, + private void createLance(final Campaign campaign, final Force head, + final List trackers, final Alphabet alphabet, final String background) { - createLance(campaign, head, personnel, + createLance(campaign, head, trackers, getOptions().getForceNamingMethod().getValue(alphabet) + resources.getString("AbstractCompanyGenerator.lance.text"), background); @@ -914,17 +1025,18 @@ private void createLance(final Campaign campaign, final Force head, final List

personnel, + private Force createLance(final Campaign campaign, final Force head, + final List trackers, final String name, final String background) { Force lance = new Force(name); campaign.addForce(lance, head); - for (int i = 0; (i < getOptions().getLanceSize()) && !personnel.isEmpty(); i++) { - campaign.addUnitToForce(personnel.remove(0).getUnit(), lance); + for (int i = 0; (i < getOptions().getLanceSize()) && !trackers.isEmpty(); i++) { + campaign.addUnitToForce(trackers.remove(0).getPerson().getUnit(), lance); } if (getOptions().isGenerateForceIcons()) { @@ -1016,17 +1128,19 @@ private int determineForceWeightClass(final Campaign campaign, final Force force /** * This generates any mothballed spare entities for the force * @param campaign the campaign to generate for - * @param entities the generated combat entities + * @param trackers the trackers containing the generated combat entities * @return the list of all generated entities to mothball as spares */ - public List generateMothballedEntities(final Campaign campaign, final List entities) { + public List generateMothballedEntities(final Campaign campaign, + final List trackers) { // Determine how many entities to generate final int numberMothballedEntities; if (getOptions().isGenerateMothballedSpareUnits() && (getOptions().getSparesPercentOfActiveUnits() > 0)) { // No free units for null rolls! numberMothballedEntities = Math.toIntExact(Math.round( - entities.stream().filter(Objects::nonNull).count() + trackers.stream().map(CompanyGenerationPersonTracker::getEntity) + .filter(Objects::nonNull).count() * (getOptions().getSparesPercentOfActiveUnits() / 100.0))); } else { numberMothballedEntities = 0; @@ -1052,7 +1166,7 @@ public List generateMothballedEntities(final Campaign campaign, final Li } // Create the parameters to generate the 'Mech from - final RandomMechParameters parameters = new RandomMechParameters( + final AtBRandomMechParameters parameters = new AtBRandomMechParameters( determineBattleMechWeight(Utilities.dice(2, 6)), determineBattleMechQuality(Utilities.dice(2, 6)) ); @@ -1076,9 +1190,9 @@ public List generateMothballedEntities(final Campaign campaign, final Li * @param mothballedEntities the list of generated spare 'Mech entities to add and mothball * @return the list of created units */ - public List createMothballedSpareUnits(final Campaign campaign, - final List mothballedEntities) { - List mothballedUnits = new ArrayList<>(); + private List createMothballedSpareUnits(final Campaign campaign, + final List mothballedEntities) { + final List mothballedUnits = new ArrayList<>(); for (final Entity mothballedEntity : mothballedEntities) { final Unit unit = campaign.addNewUnit(mothballedEntity, false, 0); unit.completeMothball(); @@ -1180,8 +1294,7 @@ public List generateAmmunition(final Campaign campaign, final List< final List ammunition = new ArrayList<>(); final boolean generateReloads = getOptions().getNumberReloadsPerWeapon() > 0; ammoBins.forEach(ammoBin -> { - if (getOptions().isGenerateFractionalMachineGunAmmunition() - && ammoBinIsMachineGun(ammoBin)) { + if (getOptions().isGenerateFractionalMachineGunAmmunition() && ammoBinIsMachineGun(ammoBin)) { ammunition.add(new AmmoStorage(0, ammoBin.getType(), 50, campaign)); } else if (generateReloads) { ammunition.add(new AmmoStorage(0, ammoBin.getType(), @@ -1214,7 +1327,7 @@ private boolean ammoBinIsMachineGun(final AmmoBin ammoBin) { * @param campaign the campaign to apply changes to * @param contract the selected contract, if any */ - public void processContract(final Campaign campaign, final @Nullable Contract contract) { + private void processContract(final Campaign campaign, final @Nullable Contract contract) { if (contract == null) { return; } @@ -1226,10 +1339,11 @@ public void processContract(final Campaign campaign, final @Nullable Contract co //endregion Contract //region Finances - public void processFinances(final Campaign campaign, final List personnel, - final List units, final List parts, - final List armour, final List ammunition, - final @Nullable Contract contract) { + private void processFinances(final Campaign campaign, + final List trackers, + final List units, final List parts, + final List armour, final List ammunition, + final @Nullable Contract contract) { // TODO : Finish implementation Money startingCash = generateStartingCash(); Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); @@ -1241,7 +1355,7 @@ public void processFinances(final Campaign campaign, final List personne Money maximumPreLoanCost = startingCash.minus(minimumStartingFloat); Money loan = Money.zero(); - final Money hiringCosts = calculateHiringCosts(personnel); + final Money hiringCosts = calculateHiringCosts(trackers); if (maximumPreLoanCost.isGreaterOrEqualThan(hiringCosts)) { maximumPreLoanCost = maximumPreLoanCost.minus(hiringCosts); } else if (getOptions().isStartingLoan()) { @@ -1289,7 +1403,7 @@ public void processFinances(final Campaign campaign, final List personne /** * @return the amount of starting cash generated for the Mercenary Company */ - public Money generateStartingCash() { + private Money generateStartingCash() { return getOptions().isRandomizeStartingCash() ? rollRandomStartingCash() : Money.of(getOptions().getStartingCash()); } @@ -1304,17 +1418,17 @@ private Money rollRandomStartingCash() { } /** - * @param personnel the list of personnel to get the hiring cost for + * @param trackers the trackers containing the personnel to get the hiring cost for * @return the cost of hiring the personnel, or zero if you aren't paying for hiring costs */ - private Money calculateHiringCosts(final List personnel) { + private Money calculateHiringCosts(final List trackers) { if (!getOptions().isPayForPersonnel()) { return Money.zero(); } Money hiringCosts = Money.zero(); - for (final Person person : personnel) { - hiringCosts = hiringCosts.plus(person.getSalary().multipliedBy(2)); + for (final CompanyGenerationPersonTracker tracker : trackers) { + hiringCosts = hiringCosts.plus(tracker.getPerson().getSalary().multipliedBy(2)); } return hiringCosts; } @@ -1392,7 +1506,8 @@ private Money calculateAmmunitionCosts(final List ammunition) { //endregion Finances //region Surprises - public void generateSurprises(final Campaign campaign) { +/* + private void generateSurprises(final Campaign campaign) { if (!getOptions().isGenerateSurprises()) { return; } @@ -1415,129 +1530,98 @@ private void generateMysteryBoxes(final Campaign campaign) { // TODO : Processing of mystery boxes } + */ //endregion Surprises //region Apply to Campaign /** - * TODO : UNFINISHED - * This method takes the campaign and applies all changes to it. No method not directly - * called from here may alter the campaign. + * Phase Zero: Anything that is to be run BEFORE starting generation * * @param campaign the campaign to apply the generation to - * @param combatPersonnel the list of generated combat personnel - * @param supportPersonnel the list of generated support personnel - * @param entities the list of generated entities, with null holding spaces without 'Mechs - * @param mothballedEntities the list of generated spare 'Mech entities to mothball - * @param contract the selected contract, or null if one has not been selected */ - public void applyToCampaign(final Campaign campaign, final List combatPersonnel, - final List supportPersonnel, final List entities, - final List mothballedEntities, final @Nullable Contract contract) { + public void applyPhaseZeroToCampaign(final Campaign campaign) { + // Move to Starting Planet moveToStartingPlanet(campaign); - - // Phase One: Personnel, Units, and Unit - final List personnel = new ArrayList<>(); - final List units = new ArrayList<>(); - applyPhaseOneToCampaign(campaign, combatPersonnel, supportPersonnel, personnel, entities, units); - - // Phase 2: Spares - units.addAll(createMothballedSpareUnits(campaign, mothballedEntities)); - - final List parts = generateSpareParts(units); - final List armour = generateArmour(units); - final List ammunition = generateAmmunition(campaign, units); - - // Phase 3: Contract - processContract(campaign, contract); - - // Phase 4: Finances - processFinances(campaign, personnel, units, parts, armour, ammunition, contract); - - // Phase 5: Applying Spares - parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); - armour.forEach(a -> campaign.getWarehouse().addPart(a, true)); - ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); - - // Phase 6: Surprises! - generateSurprises(campaign); } - private void applyPhaseOneToCampaign(final Campaign campaign, final List combatPersonnel, - final List supportPersonnel, final List personnel, - final List entities, final List units) { + /** + * Phase One: Starting Planet and Finalizing Personnel, Unit, and Units + * + * @param campaign the campaign to apply the generation to + * @param trackers the trackers containing all of the data required for Phase One + * @return a list of the newly created units to add to the campaign + */ + public List applyPhaseOneToCampaign(final Campaign campaign, + final List trackers) { // Process Personnel - personnel.addAll(combatPersonnel); - personnel.addAll(supportPersonnel); - // If we aren't using the pool, generate all of the Astechs and Medics required - generateAssistants(campaign, personnel); + generateAssistants(campaign, trackers); // This does all of the final personnel processing, including recruitment and running random // marriages - finalizePersonnel(campaign, personnel); + finalizePersonnel(campaign, trackers); - // We can only fill the pool after recruiting our support personnel + // We can only fill the pool after finalizing and recruiting our support personnel if (getOptions().isPoolAssistants()) { campaign.fillAstechPool(); campaign.fillMedicPool(); } // Process Units - units.addAll(createUnits(campaign, combatPersonnel, entities)); + final List units = createUnits(campaign, trackers); // Assign Techs to Units - assignTechsToUnits(supportPersonnel, units); + assignTechsToUnits(trackers, units); // Generate the Forces and Assign Units to them - generateUnit(campaign, sortPersonnelIntoLances(combatPersonnel)); + generateUnit(campaign, trackers); + + return units; } - //endregion Apply to Campaign - //region Local Classes /** - * This class contains the parameters used to generate a random mech, and allows sorting and - * swapping the order of rolled parameters while keeping them connected. + * Phase Two: Finalizing Spares + * + * @param campaign the campaign to apply the generation to + * @param mothballedEntities the generated mothballed spare entities + * @param parts the generated spare parts + * @param armour the generated spare armour + * @param ammunition the generated spare armour + * @return a list of the generated mothballed spare units */ - protected static class RandomMechParameters { - //region Variable Declarations - private int weight; - private int quality; - private boolean starLeague; - //endregion Variable Declarations - - //region Constructors - public RandomMechParameters(final int weight, final int quality) { - setWeight(weight); - setQuality(quality); - setStarLeague(weight == EntityWeightClass.WEIGHT_SUPER_HEAVY); - } - //endregion Constructors - - //region Getters/Setters - public int getWeight() { - return weight; - } - - public void setWeight(final int weight) { - this.weight = weight; - } - - public int getQuality() { - return quality; - } + public List applyPhaseTwoToCampaign(final Campaign campaign, final List mothballedEntities, + final List parts, final List armour, + final List ammunition) { + final List mothballedUnits = createMothballedSpareUnits(campaign, mothballedEntities); + parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); + armour.forEach(a -> campaign.getWarehouse().addPart(a, true)); + ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); + return mothballedUnits; + } - public void setQuality(final int quality) { - this.quality = quality; - } - public boolean isStarLeague() { - return starLeague; - } + /** + * Phase Three: Finalizing Contract and Finances + * + * @param campaign the campaign to apply the generation to + * @param trackers the trackers containing all of the data required for Phase One, which + * includes all Personnel + * @param units the units added to the campaign, including any mothballed units + * @param parts the spare parts generated + * @param armour the spare armour generated + * @param ammunition the spare ammunition generated + * @param contract the contract selected, if any + */ + public void applyPhaseThreeToCampaign(final Campaign campaign, + final List trackers, + final List units, final List parts, + final List armour, final List ammunition, + final @Nullable Contract contract) { + // Process Contract + processContract(campaign, contract); - public void setStarLeague(final boolean starLeague) { - this.starLeague = starLeague; - } - //endregion Getters/Setters + // Process Finances + processFinances(campaign, trackers, units, parts, armour, ammunition, contract); } - //endregion Local Classes + //endregion Apply to Campaign } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index adfdddecbc..2c1f13a62e 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -120,7 +120,7 @@ protected int determineBattleMechQuality(int roll) { */ @Override protected MechSummary generateMechSummary(final Campaign campaign, - final RandomMechParameters parameters, + final AtBRandomMechParameters parameters, final Faction faction) { if (parameters.isStarLeague() && !faction.isComStarOrWoB()) { if (faction.isClan()) { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBRandomMechParameters.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBRandomMechParameters.java new file mode 100644 index 0000000000..56699fd3cc --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBRandomMechParameters.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGenerators; + +import megamek.common.EntityWeightClass; + +/** + * This class contains the parameters used to generate a random mech, and allows sorting and + * swapping the order of rolled parameters while keeping them connected. + */ +public class AtBRandomMechParameters { + //region Variable Declarations + private int weight; + private int quality; + private boolean starLeague; + //endregion Variable Declarations + + //region Constructors + public AtBRandomMechParameters(final int weight, final int quality) { + setWeight(weight); + setQuality(quality); + setStarLeague(weight == EntityWeightClass.WEIGHT_SUPER_HEAVY); + } + //endregion Constructors + + //region Getters/Setters + public int getWeight() { + return weight; + } + + public void setWeight(final int weight) { + this.weight = weight; + } + + public int getQuality() { + return quality; + } + + public void setQuality(final int quality) { + this.quality = quality; + } + + public boolean isStarLeague() { + return starLeague; + } + + public void setStarLeague(final boolean starLeague) { + this.starLeague = starLeague; + } + //endregion Getters/Setters +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index 779964cc7f..8f1e192d97 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -68,7 +68,6 @@ public class CompanyGenerationOptions implements Serializable { private boolean poolAssistants; private boolean generateCaptains; private boolean assignCompanyCommanderFlag; - private boolean companyCommanderLanceOfficer; private boolean applyOfficerStatBonusToWorstSkill; private boolean assignBestOfficers; private boolean automaticallyAssignRanks; @@ -126,7 +125,7 @@ public class CompanyGenerationOptions implements Serializable { private boolean payForAmmunition; // Surprises - private boolean generateSurprises; + private boolean generateSurprises; // Not Implemented private boolean generateMysteryBoxes; // Not Implemented private boolean[] generateMysteryBoxTypes; // Not Implemented //endregion Variable Declarations @@ -174,7 +173,6 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp setPoolAssistants(true); setGenerateCaptains(method.isWindchild()); setAssignCompanyCommanderFlag(true); - setCompanyCommanderLanceOfficer(method.isWindchild()); setApplyOfficerStatBonusToWorstSkill(method.isWindchild()); setAssignBestOfficers(method.isWindchild()); setAutomaticallyAssignRanks(true); @@ -355,14 +353,6 @@ public void setAssignCompanyCommanderFlag(final boolean assignCompanyCommanderFl this.assignCompanyCommanderFlag = assignCompanyCommanderFlag; } - public boolean isCompanyCommanderLanceOfficer() { - return companyCommanderLanceOfficer; - } - - public void setCompanyCommanderLanceOfficer(final boolean companyCommanderLanceOfficer) { - this.companyCommanderLanceOfficer = companyCommanderLanceOfficer; - } - public boolean isApplyOfficerStatBonusToWorstSkill() { return applyOfficerStatBonusToWorstSkill; } @@ -800,7 +790,6 @@ public void writeToXML(final PrintWriter pw, int indent) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "poolAssistants", isPoolAssistants()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateCaptains", isGenerateCaptains()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignCompanyCommanderFlag", isAssignCompanyCommanderFlag()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "companyCommanderLanceOfficer", isCompanyCommanderLanceOfficer()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "applyOfficerStatBonusToWorstSkill", isApplyOfficerStatBonusToWorstSkill()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestOfficers", isAssignBestOfficers()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "automaticallyAssignRanks", isAutomaticallyAssignRanks()); @@ -829,7 +818,7 @@ public void writeToXML(final PrintWriter pw, int indent) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignTechsToUnits", isAssignTechsToUnits()); // Unit - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "ForceNamingMethod", getForceNamingMethod().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "forceNamingMethod", getForceNamingMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateForceIcons", isGenerateForceIcons()); // Spares @@ -971,9 +960,6 @@ public static CompanyGenerationOptions parseFromXML(final Node wn) { case "assignCompanyCommanderFlag": options.setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); break; - case "companyCommanderLanceOfficer": - options.setCompanyCommanderLanceOfficer(Boolean.parseBoolean(wn2.getTextContent().trim())); - break; case "applyOfficerStatBonusToWorstSkill": options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn2.getTextContent().trim())); break; @@ -1048,7 +1034,7 @@ public static CompanyGenerationOptions parseFromXML(final Node wn) { //endregion Units //region Unit - case "ForceNamingMethod": + case "forceNamingMethod": options.setForceNamingMethod(ForceNamingMethod.valueOf(wn2.getTextContent().trim())); break; case "generateForceIcons": diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java new file mode 100644 index 0000000000..6be47acb49 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGenerators; + +import megamek.common.Entity; +import megamek.common.annotations.Nullable; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.unit.Unit; +import mekhq.campaign.universe.enums.CompanyGenerationPersonType; + +public class CompanyGenerationPersonTracker { + //region Variable Declarations + private Person person; + private CompanyGenerationPersonType personType; + private AtBRandomMechParameters parameters; + private Entity entity; + //endregion Variable Declarations + + //region Constructors + public CompanyGenerationPersonTracker(final Person person) { + this(person, CompanyGenerationPersonType.MECHWARRIOR); + } + + public CompanyGenerationPersonTracker(final Person person, final CompanyGenerationPersonType personType) { + setPerson(person); + setPersonType(personType); + } + //endregion Constructors + + //region Getters/Setters + public Person getPerson() { + return person; + } + + public void setPerson(final Person person) { + this.person = person; + } + + public CompanyGenerationPersonType getPersonType() { + return personType; + } + + public void setPersonType(final CompanyGenerationPersonType personType) { + this.personType = personType; + } + + public AtBRandomMechParameters getParameters() { + return parameters; + } + + public void setParameters(final AtBRandomMechParameters parameters) { + this.parameters = parameters; + } + + public @Nullable Entity getEntity() { + return entity; + } + + public void setEntity(final @Nullable Entity entity) { + this.entity = entity; + } + //endregion Getters/Setters +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java index dc3dbbf9bf..df5157e6bd 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java @@ -18,18 +18,7 @@ */ package mekhq.campaign.universe.generators.companyGenerators; -import megamek.common.Entity; -import megamek.common.annotations.Nullable; import mekhq.campaign.Campaign; -import mekhq.campaign.mission.Contract; -import mekhq.campaign.parts.AmmoStorage; -import mekhq.campaign.parts.Armor; -import mekhq.campaign.parts.Part; -import mekhq.campaign.personnel.Person; -import mekhq.campaign.unit.Unit; - -import java.util.ArrayList; -import java.util.List; public class CompanyGenerationWizard { //region Variable Declarations @@ -54,88 +43,8 @@ public AbstractCompanyGenerator getGenerator() { } //endregion Getters/Setters - //region Apply to Campaign - /** - * TODO : UNFINISHED - * This method takes the campaign and applies all changes to it. No method not directly - * called from here may alter the campaign. - * - * @param campaign the campaign to apply the generation to - * @param combatPersonnel the list of generated combat personnel - * @param supportPersonnel the list of generated support personnel - * @param entities the list of generated entities, with null holding spaces without 'Mechs - * @param mothballedEntities the list of generated spare 'Mech entities to mothball - * @param contract the selected contract, or null if one has not been selected - */ - public void applyToCampaign(final Campaign campaign, final List combatPersonnel, - final List supportPersonnel, final List entities, - final List mothballedEntities, final @Nullable Contract contract) { - getGenerator().moveToStartingPlanet(campaign); - - // Phase One: Personnel, Units, and Unit - final List personnel = new ArrayList<>(); - final List units = new ArrayList<>(); - applyPhaseOneToCampaign(campaign, combatPersonnel, supportPersonnel, personnel, entities, units); - - // Phase 2: Spares - units.addAll(getGenerator().createMothballedSpareUnits(campaign, mothballedEntities)); - - final List parts = getGenerator().generateSpareParts(units); - final List armour = getGenerator().generateArmour(units); - final List ammunition = getGenerator().generateAmmunition(campaign, units); - - // Phase 3: Contract - getGenerator().processContract(campaign, contract); - - // Phase 4: Finances - getGenerator().processFinances(campaign, personnel, units, parts, armour, ammunition, contract); - - // Phase 5: Applying Spares - parts.forEach(p -> campaign.getWarehouse().addPart(p, true)); - armour.forEach(a -> campaign.getWarehouse().addPart(a, true)); - ammunition.forEach(a -> campaign.getWarehouse().addPart(a, true)); - - // Phase 6: Surprises! - getGenerator().generateSurprises(campaign); - } - - private void applyPhaseOneToCampaign(final Campaign campaign, final List combatPersonnel, - final List supportPersonnel, final List personnel, - final List entities, final List units) { - // Process Personnel - personnel.addAll(combatPersonnel); - personnel.addAll(supportPersonnel); - - // If we aren't using the pool, generate all of the Astechs and Medics required - getGenerator().generateAssistants(campaign, personnel); - - // This does all of the final personnel processing, including recruitment and running random - // marriages - getGenerator().finalizePersonnel(campaign, personnel); - - // We can only fill the pool after recruiting our support personnel - if (getGenerator().getOptions().isPoolAssistants()) { - campaign.fillAstechPool(); - campaign.fillMedicPool(); - } - - // Process Units - units.addAll(getGenerator().createUnits(campaign, combatPersonnel, entities)); - - // Assign Techs to Units - getGenerator().assignTechsToUnits(supportPersonnel, units); - - // Generate the Forces and Assign Units to them - getGenerator().generateUnit(campaign, getGenerator().sortPersonnelIntoLances(combatPersonnel)); - } - //endregion Apply to Campaign - - //region Revert Application to Campaign - // TODO : ADD ME - //endregion Revert Application to Campaign - - /** + /* public void generate() { if ((getCompanyGenerator() != null) && (JOptionPane.showConfirmDialog(getFrame(), resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.text"), diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 64673d8283..b5a29b91a1 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -125,7 +125,7 @@ protected int determineBattleMechQuality(int roll) { */ @Override protected MechSummary generateMechSummary(final Campaign campaign, - final RandomMechParameters parameters, + final AtBRandomMechParameters parameters, final Faction faction) { if (parameters.isStarLeague()) { if (faction.isClan()) { diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractClanMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractClanMysteryBox.java deleted file mode 100644 index 0e7051158f..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractClanMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public abstract class AbstractClanMysteryBox extends AbstractMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractInnerSphereMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractInnerSphereMysteryBox.java deleted file mode 100644 index 7d3e858e52..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractInnerSphereMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class AbstractInnerSphereMysteryBox extends AbstractMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractMysteryBox.java deleted file mode 100644 index a2ab8e7e4c..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/AbstractMysteryBox.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public abstract class AbstractMysteryBox { - //region Variable Declarations - //endregion Variable Declarations - - //region Constructors - //endregion Constructors - - //region Getters/Setters - //endregion Getters/Setters -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanExperimentalMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanExperimentalMysteryBox.java deleted file mode 100644 index 2a4c4c118d..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanExperimentalMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class ClanExperimentalMysteryBox extends AbstractClanMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanFrontlineMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanFrontlineMysteryBox.java deleted file mode 100644 index 14764820ed..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanFrontlineMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class ClanFrontlineMysteryBox extends AbstractClanMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanKeshikMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanKeshikMysteryBox.java deleted file mode 100644 index b0a8b82591..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanKeshikMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class ClanKeshikMysteryBox extends AbstractClanMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanSecondLineMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanSecondLineMysteryBox.java deleted file mode 100644 index 1e23a362b0..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ClanSecondLineMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class ClanSecondLineMysteryBox extends AbstractClanMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/InnerSphereExperimentalMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/InnerSphereExperimentalMysteryBox.java deleted file mode 100644 index 95851c2b7a..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/InnerSphereExperimentalMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class InnerSphereExperimentalMysteryBox extends AbstractInnerSphereMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRegularMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRegularMysteryBox.java deleted file mode 100644 index 06f04491a1..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRegularMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class StarLeagueRegularMysteryBox extends AbstractMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRoyalMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRoyalMysteryBox.java deleted file mode 100644 index aaf8fa071e..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/StarLeagueRoyalMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class StarLeagueRoyalMysteryBox extends StarLeagueRegularMysteryBox { -} diff --git a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ThirdSuccessionWarMysteryBox.java b/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ThirdSuccessionWarMysteryBox.java deleted file mode 100644 index ca4483c90a..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/randomEvent/mysteryBoxes/ThirdSuccessionWarMysteryBox.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.randomEvent.mysteryBoxes; - -public class ThirdSuccessionWarMysteryBox extends AbstractInnerSphereMysteryBox { -} diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 530cedb9e3..b932d16b19 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -22,9 +22,13 @@ import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.mission.Contract; -import mekhq.campaign.personnel.Person; +import mekhq.campaign.parts.AmmoStorage; +import mekhq.campaign.parts.Armor; +import mekhq.campaign.parts.Part; +import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationPersonTracker; import mekhq.gui.enums.CompanyGenerationPanelType; import mekhq.gui.panels.CompanyGenerationOptionsPanel; @@ -160,11 +164,21 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { protected void okAction() { final CompanyGenerationOptions options = getCompanyGenerationOptionsPanel().createOptionsFromPanel(); final AbstractCompanyGenerator generator = options.getMethod().getGenerator(getCampaign(), options); - final List combatPersonnel = generator.generateCombatPersonnel(getCampaign()); - final List supportPersonnel = generator.generateSupportPersonnel(getCampaign()); - final List entities = generator.generateUnits(getCampaign(), combatPersonnel); - final List mothballedEntities = generator.generateMothballedEntities(getCampaign(), entities); + + generator.applyPhaseZeroToCampaign(getCampaign()); + + final List trackers = generator.generatePersonnel(getCampaign()); + generator.generateUnitGenerationParameters(trackers); + generator.generateEntities(getCampaign(), trackers); + final List units = generator.applyPhaseOneToCampaign(getCampaign(), trackers); + + final List mothballedEntities = generator.generateMothballedEntities(getCampaign(), trackers); + final List parts = generator.generateSpareParts(units); + final List armour = generator.generateArmour(units); + final List ammunition = generator.generateAmmunition(getCampaign(), units); + units.addAll(generator.applyPhaseTwoToCampaign(getCampaign(), mothballedEntities, parts, armour, ammunition)); + final Contract contract = null; - generator.applyToCampaign(getCampaign(), combatPersonnel, supportPersonnel, entities, mothballedEntities, contract); + generator.applyPhaseThreeToCampaign(getCampaign(), trackers, units, parts, armour, ammunition, contract); } } diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index bec48a2abc..605bb6d234 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -73,7 +73,6 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkPoolAssistants; private JCheckBox chkGenerateCaptains; private JCheckBox chkAssignCompanyCommanderFlag; - private JCheckBox chkCompanyCommanderLanceOfficer; private JCheckBox chkApplyOfficerStatBonusToWorstSkill; private JCheckBox chkAssignBestOfficers; private JCheckBox chkAutomaticallyAssignRanks; @@ -355,14 +354,6 @@ public void setChkAssignCompanyCommanderFlag(final JCheckBox chkAssignCompanyCom this.chkAssignCompanyCommanderFlag = chkAssignCompanyCommanderFlag; } - public JCheckBox getChkCompanyCommanderLanceOfficer() { - return chkCompanyCommanderLanceOfficer; - } - - public void setChkCompanyCommanderLanceOfficer(final JCheckBox chkCompanyCommanderLanceOfficer) { - this.chkCompanyCommanderLanceOfficer = chkCompanyCommanderLanceOfficer; - } - public JCheckBox getChkApplyOfficerStatBonusToWorstSkill() { return chkApplyOfficerStatBonusToWorstSkill; } @@ -1116,10 +1107,6 @@ private JPanel createPersonnelPanel() { getChkAssignCompanyCommanderFlag().setToolTipText(resources.getString("chkAssignCompanyCommanderFlag.toolTipText")); getChkAssignCompanyCommanderFlag().setName("chkAssignCompanyCommanderFlag"); - setChkCompanyCommanderLanceOfficer(new JCheckBox(resources.getString("chkCompanyCommanderLanceOfficer.text"))); - getChkCompanyCommanderLanceOfficer().setToolTipText(resources.getString("chkCompanyCommanderLanceOfficer.toolTipText")); - getChkCompanyCommanderLanceOfficer().setName("chkCompanyCommanderLanceOfficer"); - setChkApplyOfficerStatBonusToWorstSkill(new JCheckBox(resources.getString("chkApplyOfficerStatBonusToWorstSkill.text"))); getChkApplyOfficerStatBonusToWorstSkill().setToolTipText(resources.getString("chkApplyOfficerStatBonusToWorstSkill.toolTipText")); getChkApplyOfficerStatBonusToWorstSkill().setName("chkApplyOfficerStatBonusToWorstSkill"); @@ -1187,7 +1174,6 @@ private JPanel createPersonnelPanel() { .addComponent(getChkPoolAssistants()) .addComponent(getChkGenerateCaptains()) .addComponent(getChkAssignCompanyCommanderFlag()) - .addComponent(getChkCompanyCommanderLanceOfficer()) .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) .addComponent(getChkAssignBestOfficers()) .addComponent(getChkAutomaticallyAssignRanks()) @@ -1207,7 +1193,6 @@ private JPanel createPersonnelPanel() { .addComponent(getChkPoolAssistants()) .addComponent(getChkGenerateCaptains()) .addComponent(getChkAssignCompanyCommanderFlag()) - .addComponent(getChkCompanyCommanderLanceOfficer()) .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) .addComponent(getChkAssignBestOfficers()) .addComponent(getChkAutomaticallyAssignRanks()) @@ -1980,12 +1965,14 @@ private JPanel createSurprisesPanel() { // Disable Panel by Default getChkGenerateSurprises().setSelected(true); getChkGenerateSurprises().doClick(); + getChkGenerateSurprises().setEnabled(false); // Layout the UI JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("surprisesPanel.title"))); panel.setToolTipText(resources.getString("surprisesPanel.toolTipText")); panel.setName("surprisesPanel"); + panel.setEnabled(false); GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); @@ -2103,7 +2090,6 @@ public void setOptions(final CompanyGenerationOptions options) { getChkPoolAssistants().setSelected(options.isPoolAssistants()); getChkGenerateCaptains().setSelected(options.isGenerateCaptains()); getChkAssignCompanyCommanderFlag().setSelected(options.isAssignCompanyCommanderFlag()); - getChkCompanyCommanderLanceOfficer().setSelected(options.isCompanyCommanderLanceOfficer()); getChkApplyOfficerStatBonusToWorstSkill().setSelected(options.isApplyOfficerStatBonusToWorstSkill()); getChkAssignBestOfficers().setSelected(options.isAssignBestOfficers()); getChkAutomaticallyAssignRanks().setSelected(options.isAutomaticallyAssignRanks()); @@ -2209,7 +2195,6 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setPoolAssistants(getChkPoolAssistants().isSelected()); options.setGenerateCaptains(getChkGenerateCaptains().isSelected()); options.setAssignCompanyCommanderFlag(getChkAssignCompanyCommanderFlag().isSelected()); - options.setCompanyCommanderLanceOfficer(getChkCompanyCommanderLanceOfficer().isSelected()); options.setApplyOfficerStatBonusToWorstSkill(getChkApplyOfficerStatBonusToWorstSkill().isSelected()); options.setAssignBestOfficers(getChkAssignBestOfficers().isSelected()); options.setAutomaticallyAssignRanks(getChkAutomaticallyAssignRanks().isSelected()); From 7b06e0063c51983db6732978ce692b3e7607fe88 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Thu, 11 Mar 2021 19:46:33 -0700 Subject: [PATCH 022/115] Starting to move to wizard --- .../CompanyGenerationWizard.java | 27 +++++++++++++++++++ .../gui/dialog/CompanyGenerationDialog.java | 14 ---------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java index df5157e6bd..2f6a2dbd19 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java @@ -18,7 +18,15 @@ */ package mekhq.campaign.universe.generators.companyGenerators; +import megamek.common.Entity; import mekhq.campaign.Campaign; +import mekhq.campaign.mission.Contract; +import mekhq.campaign.parts.AmmoStorage; +import mekhq.campaign.parts.Armor; +import mekhq.campaign.parts.Part; +import mekhq.campaign.unit.Unit; + +import java.util.List; public class CompanyGenerationWizard { //region Variable Declarations @@ -43,6 +51,25 @@ public AbstractCompanyGenerator getGenerator() { } //endregion Getters/Setters + public void set() { + generator.applyPhaseZeroToCampaign(getCampaign()); + + final List trackers = generator.generatePersonnel(getCampaign()); + generator.generateUnitGenerationParameters(trackers); + generator.generateEntities(getCampaign(), trackers); + final List units = generator.applyPhaseOneToCampaign(getCampaign(), trackers); + + final List mothballedEntities = generator.generateMothballedEntities(getCampaign(), trackers); + final List parts = generator.generateSpareParts(units); + final List armour = generator.generateArmour(units); + final List ammunition = generator.generateAmmunition(getCampaign(), units); + units.addAll(generator.applyPhaseTwoToCampaign(getCampaign(), mothballedEntities, parts, armour, ammunition)); + + final Contract contract = null; + generator.applyPhaseThreeToCampaign(getCampaign(), trackers, units, parts, armour, ammunition, contract); + } + + /* public void generate() { diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index b932d16b19..b0e6d9473a 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -165,20 +165,6 @@ protected void okAction() { final CompanyGenerationOptions options = getCompanyGenerationOptionsPanel().createOptionsFromPanel(); final AbstractCompanyGenerator generator = options.getMethod().getGenerator(getCampaign(), options); - generator.applyPhaseZeroToCampaign(getCampaign()); - final List trackers = generator.generatePersonnel(getCampaign()); - generator.generateUnitGenerationParameters(trackers); - generator.generateEntities(getCampaign(), trackers); - final List units = generator.applyPhaseOneToCampaign(getCampaign(), trackers); - - final List mothballedEntities = generator.generateMothballedEntities(getCampaign(), trackers); - final List parts = generator.generateSpareParts(units); - final List armour = generator.generateArmour(units); - final List ammunition = generator.generateAmmunition(getCampaign(), units); - units.addAll(generator.applyPhaseTwoToCampaign(getCampaign(), mothballedEntities, parts, armour, ammunition)); - - final Contract contract = null; - generator.applyPhaseThreeToCampaign(getCampaign(), trackers, units, parts, armour, ammunition, contract); } } From ebf96d41a458c32c69a0c74b185b8a2592c82f72 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 14 Mar 2021 11:01:03 -0600 Subject: [PATCH 023/115] Moving to new base components --- .../mekhq/gui/dialog/CampaignPresetSelectionDialog.java | 7 ++++--- MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java index 71973a2999..f2c4d3ca22 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignPresetSelectionDialog.java @@ -20,20 +20,21 @@ import megamek.common.annotations.Nullable; import mekhq.campaign.GamePreset; +import mekhq.gui.baseComponents.AbstractMHQButtonDialog; import mekhq.gui.panels.CampaignPresetSelectionPanel; import javax.swing.*; import java.awt.*; -public class CampaignPresetSelectionDialog extends BaseButtonDialog { +public class CampaignPresetSelectionDialog extends AbstractMHQButtonDialog { //region Variable Declarations private CampaignPresetSelectionPanel presetSelectionPanel; //endregion Variable Declarations //region Constructors protected CampaignPresetSelectionDialog(final JFrame parent) { - super(parent, "CampaignPresetSelectionDialog.title"); - initialize("CampaignPresetSelectionDialog"); + super(parent, "CampaignPresetSelectionDialog", "CampaignPresetSelectionDialog.title"); + initialize(); } //endregion Constructors diff --git a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java index d881be4d64..a2932d63c5 100644 --- a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java @@ -18,13 +18,14 @@ */ package mekhq.gui.dialog; +import mekhq.gui.baseComponents.AbstractMHQButtonDialog; import mekhq.gui.panels.DateSelectionPanel; import javax.swing.*; import java.awt.*; import java.time.LocalDate; -public class DateSelectionDialog extends BaseButtonDialog { +public class DateSelectionDialog extends AbstractMHQButtonDialog { //region Variable Declarations private LocalDate initialDate; @@ -33,9 +34,9 @@ public class DateSelectionDialog extends BaseButtonDialog { //region Constructors public DateSelectionDialog(final JFrame frame, final LocalDate initialDate) { - super(frame, "DateSelectionDialog.title"); + super(frame, "DateSelectionDialog", "DateSelectionDialog.title"); setInitialDate(initialDate); - initialize("DateSelectionDialog"); + initialize(); } //endregion Constructors From 29756067aeb7e4b700a3986d0740007067f4d4b1 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 9 Apr 2021 09:24:22 -0600 Subject: [PATCH 024/115] Fixing the formatting in CampaignOptionsDialog properties --- .../resources/mekhq/resources/CampaignOptionsDialog.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties b/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties index 815b4db104..9d7ce20980 100644 --- a/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties @@ -457,6 +457,6 @@ chkUnitMarketReportRefresh.text=Display a report when unit market refreshes chkAssignPortraitOnRoleChange.text=Automatically assign portrait on role change chkAssignPortraitOnRoleChange.toolTipText=With this enabled, a person without a portrait will automatically gain a random portrait when their primary role is switched to one of those selected below -#start Company Generation Options Tab +## Company Generation Options Tab companyGenerationOptionsPanel.title=Company Generation #end Company Generation Options Tab From 893ce8cecf783ba99f85c638aadbf7a453575c8e Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 9 Apr 2021 09:37:16 -0600 Subject: [PATCH 025/115] Cleaning up the MekHQ Options added thus far --- .../mekhq/resources/MekHqOptionsDialog.properties | 8 +++++--- MekHQ/src/mekhq/MekHQOptions.java | 12 ++++++++++-- MekHQ/src/mekhq/MekHqConstants.java | 1 + MekHQ/src/mekhq/gui/FileDialogs.java | 4 ++-- MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java | 9 +++++++++ 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties index ec92316eea..d1154acf08 100644 --- a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties @@ -11,8 +11,10 @@ labelLongDisplayDateFormat.text=Long Display Date Format invalidDateFormat.error=Invalid Date Format optionHistoricalDailyLog.text=Temporarily Retain Daily Log History optionHistoricalDailyLog.toolTipText=Keeps a limited historical daily report in-memory during the gaming session. May result in increased memory usage. +optionCompanyGeneratorStartup.text=Company Generator Startup outside of AtB +optionCompanyGeneratorStartup.toolTipText=Adds the ability to use the company generator on startup outside of AtB campaigns. optionShowCompanyGenerator.text=Show Company Generator -optionShowCompanyGenerator.toolTipText=This option displays the company generator during startup outside of AtB and adds a company generator menu item under the Manage Campaign header on the menu bar. +optionShowCompanyGenerator.toolTipText=Add a company generator menu item under the Manage Campaign header on the menu bar to allow one to generate a company after startup. labelCommandCenterDisplay.text=Command Center Display Options optionCommandCenterUseUnitMarket.text=Find Units Links to Unit Market (if enabled) @@ -47,11 +49,11 @@ optionWriteCustomsToXML.text=Write Custom Units to Campaign XML optionSaveMothballState.text=Save Unit State Before Mothballing optionSaveMothballState.toolTipText=This option allows you to disable saving of the unit's crew and force before being mothballed for restoration post-mothball. optionSaveCompanyGenerationOptions.text=Save Company Generation Options with Campaign Options -optionSaveCompanyGenerationOptions.toolTipText=This option allows you to save your company generation options with the campaign options. +optionSaveCompanyGenerationOptions.toolTipText=Save your company generation options as part of the campaign options. #Miscellaneous Tab miscellaneousTab.title=Miscellaneous Options labelStartGameDelay.text=Delay Timer -optionStartGameDelay.toolTipText=Number of milliseconds to wait before sending another unit. If the application tends to hang when starting a game in MegaMek or does not transfer all units or settings, try increasing this value. +optionStartGameDelay.toolTipText=Number of milliseconds to wait before sending another unit.
If the application tends to hang when starting a game in MegaMek or does not transfer all units or settings, try increasing this value. labelDefaultCompanyGenerationMethod.text=Default Company Generation Method labelDefaultCompanyGenerationMethod.toolTipText=This is the default company generation method to be used on load. diff --git a/MekHQ/src/mekhq/MekHQOptions.java b/MekHQ/src/mekhq/MekHQOptions.java index ff138b0bf2..738a5a01ab 100644 --- a/MekHQ/src/mekhq/MekHQOptions.java +++ b/MekHQ/src/mekhq/MekHQOptions.java @@ -65,11 +65,19 @@ public void setHistoricalDailyLog(boolean value) { userPreferences.node(MekHqConstants.DISPLAY_NODE).putBoolean(MekHqConstants.HISTORICAL_DAILY_LOG, value); } + public boolean getCompanyGeneratorStartup() { + return userPreferences.node(MekHqConstants.DISPLAY_NODE).getBoolean(MekHqConstants.COMPANY_GENERATOR_STARTUP, false); + } + + public void setCompanyGeneratorStartup(final boolean value) { + userPreferences.node(MekHqConstants.DISPLAY_NODE).putBoolean(MekHqConstants.COMPANY_GENERATOR_STARTUP, value); + } + public boolean getShowCompanyGenerator() { return userPreferences.node(MekHqConstants.DISPLAY_NODE).getBoolean(MekHqConstants.SHOW_COMPANY_GENERATOR, false); } - public void setShowCompanyGenerator(boolean value) { + public void setShowCompanyGenerator(final boolean value) { userPreferences.node(MekHqConstants.DISPLAY_NODE).putBoolean(MekHqConstants.SHOW_COMPANY_GENERATOR, value); } @@ -219,7 +227,7 @@ public boolean getSaveCompanyGenerationOptions() { return userPreferences.node(MekHqConstants.XML_SAVES_NODE).getBoolean(MekHqConstants.SAVE_COMPANY_GENERATION_OPTIONS, false); } - public void setSaveCompanyGenerationOptions(boolean value) { + public void setSaveCompanyGenerationOptions(final boolean value) { userPreferences.node(MekHqConstants.XML_SAVES_NODE).putBoolean(MekHqConstants.SAVE_COMPANY_GENERATION_OPTIONS, value); } //endregion Campaign XML Save Options diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index dd8631f7b9..944eb1b55c 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -28,6 +28,7 @@ public final class MekHqConstants { public static final String LONG_DISPLAY_DATE_FORMAT = "longDisplayDateFormat"; public static final String HISTORICAL_DAILY_LOG = "historicalDailyLog"; public static final int MAX_HISTORICAL_LOG_DAYS = 120; // max number of days that will be stored in the history, also used as a limit in the UI + public static final String COMPANY_GENERATOR_STARTUP = "companyGeneratorStartup"; public static final String SHOW_COMPANY_GENERATOR = "showCompanyGenerator"; // region Command Center diff --git a/MekHQ/src/mekhq/gui/FileDialogs.java b/MekHQ/src/mekhq/gui/FileDialogs.java index 60d847194a..d724432860 100644 --- a/MekHQ/src/mekhq/gui/FileDialogs.java +++ b/MekHQ/src/mekhq/gui/FileDialogs.java @@ -291,7 +291,7 @@ public static Optional saveStarMap(JFrame frame) { * * @return the file selected, if any */ - public static Optional openCompanyGenerationOptions(JFrame frame) { + public static Optional openCompanyGenerationOptions(final JFrame frame) { Optional value = GUI.fileDialogOpen(frame, "Load Company Generation Options", FileType.XML, MekHQ.getMekHQOptions().getCompanyGenerationDirectoryPath()); @@ -304,7 +304,7 @@ public static Optional openCompanyGenerationOptions(JFrame frame) { * * @return the file selected, if any */ - public static Optional saveCompanyGenerationOptions(JFrame frame) { + public static Optional saveCompanyGenerationOptions(final JFrame frame) { Optional value = GUI.fileDialogSave(frame, "Save Company Generation Options", FileType.XML, MekHQ.getMekHQOptions().getCompanyGenerationDirectoryPath(), "myoptions.xml"); diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index 4f68a28f74..b5a9f97744 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -39,6 +39,7 @@ public class MekHqOptionsDialog extends AbstractMHQButtonDialog { private JTextField optionDisplayDateFormat; private JTextField optionLongDisplayDateFormat; private JCheckBox optionHistoricalDailyLog; + private JCheckBox optionCompanyGeneratorStartup; private JCheckBox optionShowCompanyGenerator; //region Command Center Display @@ -126,6 +127,10 @@ private JPanel createDisplayTab() { optionHistoricalDailyLog = new JCheckBox(resources.getString("optionHistoricalDailyLog.text")); optionHistoricalDailyLog.setToolTipText(resources.getString("optionHistoricalDailyLog.toolTipText")); + optionCompanyGeneratorStartup = new JCheckBox(resources.getString("optionCompanyGeneratorStartup.text")); + optionCompanyGeneratorStartup.setToolTipText(resources.getString("optionCompanyGeneratorStartup.toolTipText")); + optionCompanyGeneratorStartup.setName("optionCompanyGeneratorStartup"); + optionShowCompanyGenerator = new JCheckBox(resources.getString("optionShowCompanyGenerator.text")); optionShowCompanyGenerator.setToolTipText(resources.getString("optionShowCompanyGenerator.toolTipText")); optionShowCompanyGenerator.setName("optionShowCompanyGenerator"); @@ -182,6 +187,7 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(optionLongDisplayDateFormat) .addComponent(labelLongDisplayDateFormatExample, GroupLayout.Alignment.TRAILING)) .addComponent(optionHistoricalDailyLog) + .addComponent(optionCompanyGeneratorStartup) .addComponent(optionShowCompanyGenerator) .addComponent(labelCommandCenterDisplay) .addComponent(optionCommandCenterUseUnitMarket) @@ -205,6 +211,7 @@ public Component getListCellRendererComponent(JList list, Object value, int i .addComponent(optionLongDisplayDateFormat) .addComponent(labelLongDisplayDateFormatExample)) .addComponent(optionHistoricalDailyLog) + .addComponent(optionCompanyGeneratorStartup) .addComponent(optionShowCompanyGenerator) .addComponent(labelCommandCenterDisplay) .addComponent(optionCommandCenterUseUnitMarket) @@ -419,6 +426,7 @@ protected void okAction() { MekHQ.getMekHQOptions().setLongDisplayDateFormat(optionLongDisplayDateFormat.getText()); } MekHQ.getMekHQOptions().setHistoricalDailyLog(optionHistoricalDailyLog.isSelected()); + MekHQ.getMekHQOptions().setCompanyGeneratorStartup(optionCompanyGeneratorStartup.isSelected()); MekHQ.getMekHQOptions().setShowCompanyGenerator(optionShowCompanyGenerator.isSelected()); MekHQ.getMekHQOptions().setCommandCenterUseUnitMarket(optionCommandCenterUseUnitMarket.isSelected()); MekHQ.getMekHQOptions().setCommandCenterMRMS(optionCommandCenterMRMS.isSelected()); @@ -450,6 +458,7 @@ private void setInitialState() { optionDisplayDateFormat.setText(MekHQ.getMekHQOptions().getDisplayDateFormat()); optionLongDisplayDateFormat.setText(MekHQ.getMekHQOptions().getLongDisplayDateFormat()); optionHistoricalDailyLog.setSelected(MekHQ.getMekHQOptions().getHistoricalDailyLog()); + optionCompanyGeneratorStartup.setSelected(MekHQ.getMekHQOptions().getCompanyGeneratorStartup()); optionShowCompanyGenerator.setSelected(MekHQ.getMekHQOptions().getShowCompanyGenerator()); optionCommandCenterUseUnitMarket.setSelected(MekHQ.getMekHQOptions().getCommandCenterUseUnitMarket()); optionCommandCenterMRMS.setSelected(MekHQ.getMekHQOptions().getCommandCenterMRMS()); From 0c68c4fb91fb900788a61f67a02d3b0c029cfb80 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 9 Apr 2021 09:46:58 -0600 Subject: [PATCH 026/115] Adding future proofing by tracking the version on CompanyGenerationOptions Export --- MekHQ/src/mekhq/campaign/CampaignOptions.java | 4 +-- .../CompanyGenerationOptions.java | 25 ++++++++++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/CampaignOptions.java b/MekHQ/src/mekhq/campaign/CampaignOptions.java index 5255c9820e..4cfdaa1436 100644 --- a/MekHQ/src/mekhq/campaign/CampaignOptions.java +++ b/MekHQ/src/mekhq/campaign/CampaignOptions.java @@ -3423,7 +3423,7 @@ public void writeToXml(PrintWriter pw1, int indent) { //region Company Generation Options if ((getCompanyGenerationOptions() != null) && MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()) { - getCompanyGenerationOptions().writeToXML(pw1, indent); + getCompanyGenerationOptions().writeToXML(pw1, indent, null); } //endregion Company Generation Options MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw1, --indent, "campaignOptions"); @@ -4014,7 +4014,7 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve //region Company Generation } else if (wn2.getNodeName().equals("companyGenerationOptions")) { - retVal.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn2)); + retVal.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn2, version)); //endregion Company Generation //region Legacy diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index 8f1e192d97..04e8ab797e 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -18,8 +18,10 @@ */ package mekhq.campaign.universe.generators.companyGenerators; +import megamek.common.annotations.Nullable; import mekhq.MekHQ; import mekhq.MekHqXmlUtil; +import mekhq.Version; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.Person; import mekhq.campaign.universe.Faction; @@ -46,6 +48,7 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import java.util.ResourceBundle; public class CompanyGenerationOptions implements Serializable { //region Variable Declarations @@ -752,18 +755,20 @@ public void writeToFile(File file) { OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8); PrintWriter pw = new PrintWriter(osw)) { // Then save it out to that file. - writeToXML(pw); + pw.println(""); + writeToXML(pw, 0, ResourceBundle.getBundle("mekhq.resources.MekHQ").getString("Application.version")); } catch (Exception e) { MekHQ.getLogger().error(e); } } - public void writeToXML(final PrintWriter pw) { - writeToXML(pw, 0); - } - - public void writeToXML(final PrintWriter pw, int indent) { - MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "companyGenerationOptions"); + public void writeToXML(final PrintWriter pw, int indent, final @Nullable String version) { + if (version == null) { + MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "companyGenerationOptions"); + } else { + pw.println(String.format("%s", + MekHqXmlUtil.indentStr(indent++), version)); + } // Base Information MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "method", getMethod().name()); @@ -870,18 +875,20 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, fin return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); } element.normalize(); + + final Version version = new Version(element.getAttribute("version")); final NodeList nl = element.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { final Node wn = nl.item(i); if ("companyGenerationOptions".equals(wn.getNodeName())) { - return parseFromXML(wn); + return parseFromXML(wn, version); } } MekHQ.getLogger().error("Failed to parse file, returning the default AtB options"); return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); } - public static CompanyGenerationOptions parseFromXML(final Node wn) { + public static CompanyGenerationOptions parseFromXML(final Node wn, final Version version) { final CompanyGenerationOptions options = new CompanyGenerationOptions(); final NodeList nl = wn.getChildNodes(); try { From 29912f77b575c847185fe6a381a9f8f8338ac7e4 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 9 Apr 2021 10:25:05 -0600 Subject: [PATCH 027/115] Isolating Starting Simulation into its own panel, swapping to using JDisableablePanel for surprises, and a few other minor fixes --- .../resources/mekhq/resources/GUI.properties | 20 +- MekHQ/src/mekhq/campaign/CampaignOptions.java | 5 +- .../AbstractCompanyGenerator.java | 15 +- .../CompanyGenerationOptions.java | 256 +++++++------ .../panels/CompanyGenerationOptionsPanel.java | 356 ++++++++++-------- 5 files changed, 348 insertions(+), 304 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 24fdfb58d2..19662c9f07 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -242,14 +242,6 @@ chkAutomaticallyAssignRanks.text=Automatically Assign Ranks chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command
while MechWarriors are assigned Sergeant ranks and support personnel are assigned Corporal ranks. chkAssignFounderFlag.text=Assign Founder Flag chkAssignFounderFlag.toolTipText=This automatically applies the founder flag to all generated personnel. -chkRunStartingSimulation.text=Run Starting Simulation -chkRunStartingSimulation.toolTipText=This will simulate any enabled simulations for duration years, starting that length before the current day. -lblSimulationDuration.text=Starting Simulation Duration -lblSimulationDuration.toolTipText=This is the duration, in years, of the starting simulation -chkSimulateRandomMarriages.text=Simulate Random Marriages -chkSimulateRandomMarriages.toolTipText=This runs random marriages for the duration of the simulation. -chkSimulateRandomProcreation.text=Simulate Random Procreation -chkSimulateRandomProcreation.toolTipText=This runs random procreation for the duration of the simulation. ## Personnel Randomization Panel personnelRandomizationPanel.title=Personnel Randomization chkRandomizeOrigin.text=Randomize Origin @@ -266,6 +258,16 @@ chkExtraRandomOrigin.text=Extra Random Planetary Origin chkExtraRandomOrigin.toolTipText=When selected random origin is randomized to the planetary level, rather than just randomizing to the system level
(with the planet being the primary planet). lblOriginDistanceScale.text=Origin Distance Scaling Factor lblOriginDistanceScale.toolTipText=A scaling factor to apply to planetary distances during weighting when randomizing the faction and planetary origins.
Values above 1.0 prefer the current location, while values closer to 0.1 spread out the faction selection. +## Starting Simulation Panel +startingSimulationPanel.title=Starting Simulation +chkRunStartingSimulation.text=Run Starting Simulation +chkRunStartingSimulation.toolTipText=This will simulate any enabled simulations for duration years, starting that length before the current day. +lblSimulationDuration.text=Starting Simulation Duration +lblSimulationDuration.toolTipText=This is the duration, in years, of the starting simulation +chkSimulateRandomMarriages.text=Simulate Random Marriages +chkSimulateRandomMarriages.toolTipText=This runs random marriages for the duration of the simulation. +chkSimulateRandomProcreation.text=Simulate Random Procreation +chkSimulateRandomProcreation.toolTipText=This runs random procreation for the duration of the simulation. ## Units Panel unitsPanel.title=Units chkGenerateUnitsAsAttached.text=Generate Units as Attached @@ -296,7 +298,7 @@ chkGenerateMothballedSpareUnits.text=Generate Mothballed Spare Units chkGenerateMothballedSpareUnits.toolTipText=This generates the specified percentage of active units as mothballed spares kept by the company to replace destroyed 'Mechs. lblSparesPercentOfActiveUnits.text=Generated Percentage of Active Units lblSparesPercentOfActiveUnits.toolTipText=This is the percentage of active units for which a mothballed unit will be generated. -lblPartGenerationMethod.text=Generate Spare Parts +lblPartGenerationMethod.text=Spare Part Generation Method lblPartGenerationMethod.toolTipText=This generates spare parts for the unit based on the specified generation method, normally using the units generated include any generated as mothballed spares. lblStartingArmourWeight.text=Starting Armour Weight lblStartingArmourWeight.toolTipText=This is the weight of spare armour to generate at the start of the campaign. Each type of armour is generated based on the percentage weight it is of the total armour, rounded to the nearest point.
The recommended value to use is 20 tons per lance. diff --git a/MekHQ/src/mekhq/campaign/CampaignOptions.java b/MekHQ/src/mekhq/campaign/CampaignOptions.java index 4cfdaa1436..acfef93955 100644 --- a/MekHQ/src/mekhq/campaign/CampaignOptions.java +++ b/MekHQ/src/mekhq/campaign/CampaignOptions.java @@ -4014,7 +4014,10 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve //region Company Generation } else if (wn2.getNodeName().equals("companyGenerationOptions")) { - retVal.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn2, version)); + if (!wn2.hasChildNodes()) { + continue; + } + retVal.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn2.getChildNodes(), version)); //endregion Company Generation //region Legacy diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 687c3cead8..a7e937709d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -72,6 +72,7 @@ import java.util.Vector; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Startup: @@ -97,7 +98,6 @@ * Implement: * centerPlanet * selectStartingContract - * All of the Surprises * Finish Finances * * FIXME : @@ -261,8 +261,8 @@ private List generateCombatPersonnel(final Campa if (getOptions().isAssignBestOfficers()) { personnelSorter = personnelSorter.thenComparingInt(t -> t.getPerson().getExperienceLevel(false)) .reversed() - .thenComparingInt(t -> t.getPerson().getSkillLevel(SkillType.S_LEADER) - + t.getPerson().getSkillLevel(SkillType.S_STRATEGY) + t.getPerson().getSkillLevel(SkillType.S_TACTICS)) + .thenComparingInt(t -> Stream.of(SkillType.S_LEADER, SkillType.S_STRATEGY, SkillType.S_TACTICS) + .mapToInt(s -> t.getPerson().getSkillLevel(s)).sum()) .reversed(); } trackers.sort(personnelSorter); @@ -655,13 +655,8 @@ public void generateUnitGenerationParameters(List createUnitGenerationParameters( final List trackers) { - final List parameters = new ArrayList<>(); - trackers.forEach(tracker -> { - if (tracker.getPersonType().isCombat()) { - parameters.add(createUnitGenerationParameter(tracker)); - } - }); - return parameters; + return trackers.stream().filter(tracker -> tracker.getPersonType().isCombat()) + .map(this::createUnitGenerationParameter).collect(Collectors.toList()); } /** diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index 04e8ab797e..94a40a2995 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -75,10 +75,6 @@ public class CompanyGenerationOptions implements Serializable { private boolean assignBestOfficers; private boolean automaticallyAssignRanks; private boolean assignFounderFlag; - private boolean runStartingSimulation; - private int simulationDuration; - private boolean simulateRandomMarriages; - private boolean simulateRandomProcreation; // Personnel Randomization private boolean randomizeOrigin; @@ -88,6 +84,12 @@ public class CompanyGenerationOptions implements Serializable { private boolean extraRandomOrigin; private double originDistanceScale; + // Starting Simulation + private boolean runStartingSimulation; + private int simulationDuration; + private boolean simulateRandomMarriages; + private boolean simulateRandomProcreation; + // Units private boolean generateUnitsAsAttached; private boolean assignBestRollToUnitCommander; @@ -180,10 +182,6 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp setAssignBestOfficers(method.isWindchild()); setAutomaticallyAssignRanks(true); setAssignFounderFlag(true); - setRunStartingSimulation(method.isWindchild()); - setSimulationDuration(5); - setSimulateRandomMarriages(method.isWindchild()); - setSimulateRandomProcreation(method.isWindchild()); // Personnel Randomization setRandomizeOrigin(true); @@ -193,6 +191,12 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp setExtraRandomOrigin(false); setOriginDistanceScale(0.2); + // Starting Simulation + setRunStartingSimulation(method.isWindchild()); + setSimulationDuration(5); + setSimulateRandomMarriages(method.isWindchild()); + setSimulateRandomProcreation(method.isWindchild()); + // Units setGenerateUnitsAsAttached(method.isAtB()); setAssignBestRollToUnitCommander(method.isWindchild()); @@ -387,38 +391,6 @@ public boolean isAssignFounderFlag() { public void setAssignFounderFlag(final boolean assignFounderFlag) { this.assignFounderFlag = assignFounderFlag; } - - public boolean isRunStartingSimulation() { - return runStartingSimulation; - } - - public void setRunStartingSimulation(final boolean runStartingSimulation) { - this.runStartingSimulation = runStartingSimulation; - } - - public int getSimulationDuration() { - return simulationDuration; - } - - public void setSimulationDuration(final int simulationDuration) { - this.simulationDuration = simulationDuration; - } - - public boolean isSimulateRandomMarriages() { - return simulateRandomMarriages; - } - - public void setSimulateRandomMarriages(final boolean simulateRandomMarriages) { - this.simulateRandomMarriages = simulateRandomMarriages; - } - - public boolean isSimulateRandomProcreation() { - return simulateRandomProcreation; - } - - public void setSimulateRandomProcreation(final boolean simulateRandomProcreation) { - this.simulateRandomProcreation = simulateRandomProcreation; - } //endregion Personnel //region Personnel Randomization @@ -471,6 +443,40 @@ public void setOriginDistanceScale(final double originDistanceScale) { } //endregion Personnel Randomization + //region Starting Simulation + public boolean isRunStartingSimulation() { + return runStartingSimulation; + } + + public void setRunStartingSimulation(final boolean runStartingSimulation) { + this.runStartingSimulation = runStartingSimulation; + } + + public int getSimulationDuration() { + return simulationDuration; + } + + public void setSimulationDuration(final int simulationDuration) { + this.simulationDuration = simulationDuration; + } + + public boolean isSimulateRandomMarriages() { + return simulateRandomMarriages; + } + + public void setSimulateRandomMarriages(final boolean simulateRandomMarriages) { + this.simulateRandomMarriages = simulateRandomMarriages; + } + + public boolean isSimulateRandomProcreation() { + return simulateRandomProcreation; + } + + public void setSimulateRandomProcreation(final boolean simulateRandomProcreation) { + this.simulateRandomProcreation = simulateRandomProcreation; + } + //endregion Starting Simulation + //region Units public boolean isGenerateUnitsAsAttached() { return generateUnitsAsAttached; @@ -799,10 +805,6 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestOfficers", isAssignBestOfficers()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "automaticallyAssignRanks", isAutomaticallyAssignRanks()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignFounderFlag", isAssignFounderFlag()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "runStartingSimulation", isRunStartingSimulation()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulationDuration", getSimulationDuration()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomMarriages", isSimulateRandomMarriages()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomProcreation", isSimulateRandomProcreation()); // Personnel Randomization MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeOrigin", isRandomizeOrigin()); @@ -813,6 +815,12 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "extraRandomOrigin", isExtraRandomOrigin()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originDistanceScale", getOriginDistanceScale()); + // Starting Simulation + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "runStartingSimulation", isRunStartingSimulation()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulationDuration", getSimulationDuration()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomMarriages", isSimulateRandomMarriages()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomProcreation", isSimulateRandomProcreation()); + // Units MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToUnitCommander", isAssignBestRollToUnitCommander()); @@ -880,53 +888,60 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, fin final NodeList nl = element.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { final Node wn = nl.item(i); - if ("companyGenerationOptions".equals(wn.getNodeName())) { - return parseFromXML(wn, version); + if ("companyGenerationOptions".equals(wn.getNodeName()) && wn.hasChildNodes()) { + final CompanyGenerationOptions options = parseFromXML(wn.getChildNodes(), version); + return (options == null) + ? new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign) + : options; } } MekHQ.getLogger().error("Failed to parse file, returning the default AtB options"); return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); } - public static CompanyGenerationOptions parseFromXML(final Node wn, final Version version) { + /** + * @param nl the node list to parse the options from + * @param version the Version of the XML to parse from. This is included for future-proofing + * @return the parsed company generation options, or null if the parsing fails + */ + public static @Nullable CompanyGenerationOptions parseFromXML(final NodeList nl, final Version version) { final CompanyGenerationOptions options = new CompanyGenerationOptions(); - final NodeList nl = wn.getChildNodes(); try { for (int x = 0; x < nl.getLength(); x++) { - final Node wn2 = nl.item(x); - switch (wn2.getNodeName()) { + final Node wn = nl.item(x); + switch (wn.getNodeName()) { //region Base Information case "method": - options.setMethod(CompanyGenerationMethod.valueOf(wn2.getTextContent().trim())); + options.setMethod(CompanyGenerationMethod.valueOf(wn.getTextContent().trim())); break; case "faction": - options.setFaction(Factions.getInstance().getFaction(wn2.getTextContent().trim())); + options.setFaction(Factions.getInstance().getFaction(wn.getTextContent().trim())); break; case "specifyStartingPlanet": - options.setSpecifyStartingPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setSpecifyStartingPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "startingPlanet": - String startingPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); - String startingPlanetPlanetId = wn2.getTextContent().trim(); + String startingPlanetSystemId = wn.getAttributes().getNamedItem("systemId").getTextContent().trim(); + String startingPlanetPlanetId = wn.getTextContent().trim(); options.setStartingPlanet(Systems.getInstance().getSystemById(startingPlanetSystemId).getPlanetById(startingPlanetPlanetId)); break; case "generateMercenaryCompanyCommandLance": - options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "companyCount": - options.setCompanyCount(Integer.parseInt(wn2.getTextContent().trim())); + options.setCompanyCount(Integer.parseInt(wn.getTextContent().trim())); break; case "individualLanceCount": - options.setIndividualLanceCount(Integer.parseInt(wn2.getTextContent().trim())); + options.setIndividualLanceCount(Integer.parseInt(wn.getTextContent().trim())); break; case "lancesPerCompany": - options.setLancesPerCompany(Integer.parseInt(wn2.getTextContent().trim())); + options.setLancesPerCompany(Integer.parseInt(wn.getTextContent().trim())); break; case "lanceSize": - options.setLanceSize(Integer.parseInt(wn2.getTextContent().trim())); + options.setLanceSize(Integer.parseInt(wn.getTextContent().trim())); break; case "starLeagueYear": - options.setStarLeagueYear(Integer.parseInt(wn2.getTextContent().trim())); + options.setStarLeagueYear(Integer.parseInt(wn.getTextContent().trim())); break; //endregion Base Information @@ -959,174 +974,177 @@ public static CompanyGenerationOptions parseFromXML(final Node wn, final Version break; } case "poolAssistants": - options.setPoolAssistants(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPoolAssistants(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "generateCaptains": - options.setGenerateCaptains(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateCaptains(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "assignCompanyCommanderFlag": - options.setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "applyOfficerStatBonusToWorstSkill": - options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "assignBestOfficers": - options.setAssignBestOfficers(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignBestOfficers(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "automaticallyAssignRanks": - options.setAutomaticallyAssignRanks(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAutomaticallyAssignRanks(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "assignFounderFlag": - options.setAssignFounderFlag(Boolean.parseBoolean(wn2.getTextContent().trim())); - break; - case "runStartingSimulation": - options.setRunStartingSimulation(Boolean.parseBoolean(wn2.getTextContent().trim())); - break; - case "simulationDuration": - options.setSimulationDuration(Integer.parseInt(wn2.getTextContent().trim())); - break; - case "simulateRandomMarriages": - options.setSimulateRandomMarriages(Boolean.parseBoolean(wn2.getTextContent().trim())); - break; - case "simulateRandomProcreation": - options.setSimulateRandomProcreation(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignFounderFlag(Boolean.parseBoolean(wn.getTextContent().trim())); break; //endregion Personnel //region Personnel Randomization case "randomizeOrigin": - options.setRandomizeOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setRandomizeOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "randomizeAroundCentralPlanet": - options.setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "centralPlanet": - String centralPlanetSystemId = wn2.getAttributes().getNamedItem("systemId").getTextContent().trim(); - String centralPlanetPlanetId = wn2.getTextContent().trim(); + String centralPlanetSystemId = wn.getAttributes().getNamedItem("systemId").getTextContent().trim(); + String centralPlanetPlanetId = wn.getTextContent().trim(); options.setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); break; case "originSearchRadius": - options.setOriginSearchRadius(Integer.parseInt(wn2.getTextContent().trim())); + options.setOriginSearchRadius(Integer.parseInt(wn.getTextContent().trim())); break; case "extraRandomOrigin": - options.setExtraRandomOrigin(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setExtraRandomOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "originDistanceScale": - options.setOriginDistanceScale(Double.parseDouble(wn2.getTextContent().trim())); + options.setOriginDistanceScale(Double.parseDouble(wn.getTextContent().trim())); break; //endregion Personnel Randomization + //region Starting Simulation + case "runStartingSimulation": + options.setRunStartingSimulation(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "simulationDuration": + options.setSimulationDuration(Integer.parseInt(wn.getTextContent().trim())); + break; + case "simulateRandomMarriages": + options.setSimulateRandomMarriages(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "simulateRandomProcreation": + options.setSimulateRandomProcreation(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + //endregion Starting Simulation + //region Units case "generateUnitsAsAttached": - options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "assignBestRollToUnitCommander": - options.setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "sortStarLeagueUnitsFirst": - options.setSortStarLeagueUnitsFirst(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setSortStarLeagueUnitsFirst(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "groupByWeight": - options.setGroupByWeight(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGroupByWeight(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "groupByQuality": - options.setGroupByQuality(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGroupByQuality(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "keepOfficerRollsSeparate": - options.setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "assignTechsToUnits": - options.setAssignTechsToUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setAssignTechsToUnits(Boolean.parseBoolean(wn.getTextContent().trim())); break; //endregion Units //region Unit case "forceNamingMethod": - options.setForceNamingMethod(ForceNamingMethod.valueOf(wn2.getTextContent().trim())); + options.setForceNamingMethod(ForceNamingMethod.valueOf(wn.getTextContent().trim())); break; case "generateForceIcons": - options.setGenerateForceIcons(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateForceIcons(Boolean.parseBoolean(wn.getTextContent().trim())); break; //endregion Units //region Spares case "generateMothballedSpareUnits": - options.setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "sparesPercentOfActiveUnits": - options.setSparesPercentOfActiveUnits(Integer.parseInt(wn2.getTextContent().trim())); + options.setSparesPercentOfActiveUnits(Integer.parseInt(wn.getTextContent().trim())); break; case "partGenerationMethod": - options.setPartGenerationMethod(PartGenerationMethod.valueOf(wn2.getTextContent().trim())); + options.setPartGenerationMethod(PartGenerationMethod.valueOf(wn.getTextContent().trim())); break; case "startingArmourWeight": - options.setStartingArmourWeight(Integer.parseInt(wn2.getTextContent().trim())); + options.setStartingArmourWeight(Integer.parseInt(wn.getTextContent().trim())); break; case "generateSpareAmmunition": - options.setGenerateSpareAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateSpareAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "numberReloadsPerWeapon": - options.setNumberReloadsPerWeapon(Integer.parseInt(wn2.getTextContent().trim())); + options.setNumberReloadsPerWeapon(Integer.parseInt(wn.getTextContent().trim())); break; case "generateFractionalMachineGunAmmunition": - options.setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); break; //endregion Spares //region Contracts case "selectStartingContract": - options.setSelectStartingContract(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setSelectStartingContract(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "startCourseToContractPlanet": - options.setStartCourseToContractPlanet(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setStartCourseToContractPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); break; //endregion Contracts //region Finances case "startingCash": - options.setStartingCash(Integer.parseInt(wn2.getTextContent().trim())); + options.setStartingCash(Integer.parseInt(wn.getTextContent().trim())); break; case "randomizeStartingCash": - options.setRandomizeStartingCash(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setRandomizeStartingCash(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "randomStartingCashDiceCount": - options.setRandomStartingCashDiceCount(Integer.parseInt(wn2.getTextContent().trim())); + options.setRandomStartingCashDiceCount(Integer.parseInt(wn.getTextContent().trim())); break; case "minimumStartingFloat": - options.setMinimumStartingFloat(Integer.parseInt(wn2.getTextContent().trim())); + options.setMinimumStartingFloat(Integer.parseInt(wn.getTextContent().trim())); break; case "payForSetup": - options.setPayForSetup(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForSetup(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "startingLoan": - options.setStartingLoan(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setStartingLoan(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "payForPersonnel": - options.setPayForPersonnel(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForPersonnel(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "payForUnits": - options.setPayForUnits(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForUnits(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "payForParts": - options.setPayForParts(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForParts(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "payForArmour": - options.setPayForArmour(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForArmour(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "payForAmmunition": - options.setPayForAmmunition(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setPayForAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); break; //endregion Finances //region Surprises case "generateSurprises": - options.setGenerateSurprises(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateSurprises(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "generateMysteryBoxes": - options.setGenerateMysteryBoxes(Boolean.parseBoolean(wn2.getTextContent().trim())); + options.setGenerateMysteryBoxes(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "generateMysteryBoxTypes": - final String[] values = wn2.getTextContent().trim().split(","); + final String[] values = wn.getTextContent().trim().split(","); for (int i = 0; i < Math.min(values.length, options.getGenerateMysteryBoxTypes().length); i++) { options.getGenerateMysteryBoxTypes()[i] = Boolean.parseBoolean(values[i]); } diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 3ab839b5b4..b0709c02bc 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -34,6 +34,7 @@ import mekhq.campaign.universe.enums.PartGenerationMethod; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.gui.FileDialogs; +import mekhq.gui.baseComponents.JDisableablePanel; import javax.swing.*; import java.awt.*; @@ -77,10 +78,6 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkAssignBestOfficers; private JCheckBox chkAutomaticallyAssignRanks; private JCheckBox chkAssignFounderFlag; - private JCheckBox chkRunStartingSimulation; - private JSpinner spnSimulationDuration; - private JCheckBox chkSimulateRandomMarriages; - private JCheckBox chkSimulateRandomProcreation; // Personnel Randomization private JCheckBox chkRandomizeOrigin; @@ -92,6 +89,12 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkExtraRandomOrigin; private JSpinner spnOriginDistanceScale; + // Starting Simulation + private JCheckBox chkRunStartingSimulation; + private JSpinner spnSimulationDuration; + private JCheckBox chkSimulateRandomMarriages; + private JCheckBox chkSimulateRandomProcreation; + // Units private JCheckBox chkGenerateUnitsAsAttached; private JCheckBox chkAssignBestRollToUnitCommander; @@ -385,38 +388,6 @@ public JCheckBox getChkAssignFounderFlag() { public void setChkAssignFounderFlag(final JCheckBox chkAssignFounderFlag) { this.chkAssignFounderFlag = chkAssignFounderFlag; } - - public JCheckBox getChkRunStartingSimulation() { - return chkRunStartingSimulation; - } - - public void setChkRunStartingSimulation(final JCheckBox chkRunStartingSimulation) { - this.chkRunStartingSimulation = chkRunStartingSimulation; - } - - public JSpinner getSpnSimulationDuration() { - return spnSimulationDuration; - } - - public void setSpnSimulationDuration(final JSpinner spnSimulationDuration) { - this.spnSimulationDuration = spnSimulationDuration; - } - - public JCheckBox getChkSimulateRandomMarriages() { - return chkSimulateRandomMarriages; - } - - public void setChkSimulateRandomMarriages(final JCheckBox chkSimulateRandomMarriages) { - this.chkSimulateRandomMarriages = chkSimulateRandomMarriages; - } - - public JCheckBox getChkSimulateRandomProcreation() { - return chkSimulateRandomProcreation; - } - - public void setChkSimulateRandomProcreation(final JCheckBox chkSimulateRandomProcreation) { - this.chkSimulateRandomProcreation = chkSimulateRandomProcreation; - } //endregion Personnel //region Personnel Randomization @@ -510,6 +481,40 @@ public void setSpnOriginDistanceScale(final JSpinner spnOriginDistanceScale) { } //endregion Personnel Randomization + //region Starting Simulation + public JCheckBox getChkRunStartingSimulation() { + return chkRunStartingSimulation; + } + + public void setChkRunStartingSimulation(final JCheckBox chkRunStartingSimulation) { + this.chkRunStartingSimulation = chkRunStartingSimulation; + } + + public JSpinner getSpnSimulationDuration() { + return spnSimulationDuration; + } + + public void setSpnSimulationDuration(final JSpinner spnSimulationDuration) { + this.spnSimulationDuration = spnSimulationDuration; + } + + public JCheckBox getChkSimulateRandomMarriages() { + return chkSimulateRandomMarriages; + } + + public void setChkSimulateRandomMarriages(final JCheckBox chkSimulateRandomMarriages) { + this.chkSimulateRandomMarriages = chkSimulateRandomMarriages; + } + + public JCheckBox getChkSimulateRandomProcreation() { + return chkSimulateRandomProcreation; + } + + public void setChkSimulateRandomProcreation(final JCheckBox chkSimulateRandomProcreation) { + this.chkSimulateRandomProcreation = chkSimulateRandomProcreation; + } + //endregion Starting Simulation + //region Units public JCheckBox getChkGenerateUnitsAsAttached() { return chkGenerateUnitsAsAttached; @@ -814,33 +819,36 @@ private void initialize() { add(createPersonnelRandomizationPanel(), gbc); gbc.gridx++; - add(createUnitsPanel(), gbc); + add(createStartingSimulationPanel(), gbc); gbc.gridx = 0; gbc.gridy++; - add(createUnitPanel(), gbc); + add(createUnitsPanel(), gbc); gbc.gridx++; - add(createSparesPanel(), gbc); + add(createUnitPanel(), gbc); gbc.gridx = 0; gbc.gridy++; - add(createContractsPanel(), gbc); + add(createSparesPanel(), gbc); gbc.gridx++; - add(createFinancesPanel(), gbc); + add(createContractsPanel(), gbc); gbc.gridx = 0; gbc.gridy++; + add(createFinancesPanel(), gbc); + + gbc.gridx++; add(createSurprisesPanel(), gbc); } private JPanel createBaseInformationPanel() { // Initialize Labels Used in ActionListeners - JLabel lblStartingPlanet = new JLabel(); + final JLabel lblStartingPlanet = new JLabel(); // Create Panel Components - JLabel lblCompanyGenerationMethod = new JLabel(resources.getString("lblCompanyGenerationMethod.text")); + final JLabel lblCompanyGenerationMethod = new JLabel(resources.getString("lblCompanyGenerationMethod.text")); lblCompanyGenerationMethod.setToolTipText(resources.getString("lblCompanyGenerationMethod.toolTipText")); lblCompanyGenerationMethod.setName("lblCompanyGenerationMethod"); @@ -859,7 +867,7 @@ public Component getListCellRendererComponent(final JList list, final Object } }); - JLabel lblFaction = new JLabel(resources.getString("Faction.text")); + final JLabel lblFaction = new JLabel(resources.getString("Faction.text")); lblFaction.setToolTipText(resources.getString("lblFaction.toolTipText")); lblFaction.setName("lblFaction"); @@ -954,7 +962,7 @@ public Component getListCellRendererComponent(final JList list, final Object getChkGenerateMercenaryCompanyCommandLance().setToolTipText(resources.getString("chkGenerateMercenaryCompanyCommandLance.toolTipText")); getChkGenerateMercenaryCompanyCommandLance().setName("chkGenerateMercenaryCompanyCommandLance"); - JLabel lblCompanyCount = new JLabel(resources.getString("lblCompanyCount.text")); + final JLabel lblCompanyCount = new JLabel(resources.getString("lblCompanyCount.text")); lblCompanyCount.setToolTipText(resources.getString("lblCompanyCount.toolTipText")); lblCompanyCount.setName("lblCompanyCount"); @@ -962,7 +970,7 @@ public Component getListCellRendererComponent(final JList list, final Object getSpnCompanyCount().setToolTipText(resources.getString("lblCompanyCount.toolTipText")); getSpnCompanyCount().setName("spnCompanyCount"); - JLabel lblIndividualLanceCount = new JLabel(resources.getString("lblIndividualLanceCount.text")); + final JLabel lblIndividualLanceCount = new JLabel(resources.getString("lblIndividualLanceCount.text")); lblIndividualLanceCount.setToolTipText(resources.getString("lblIndividualLanceCount.toolTipText")); lblIndividualLanceCount.setName("lblIndividualLanceCount"); @@ -970,7 +978,7 @@ public Component getListCellRendererComponent(final JList list, final Object getSpnIndividualLanceCount().setToolTipText(resources.getString("lblIndividualLanceCount.toolTipText")); getSpnIndividualLanceCount().setName("spnIndividualLanceCount"); - JLabel lblLancesPerCompany = new JLabel(resources.getString("lblLancesPerCompany.text")); + final JLabel lblLancesPerCompany = new JLabel(resources.getString("lblLancesPerCompany.text")); lblLancesPerCompany.setToolTipText(resources.getString("lblLancesPerCompany.toolTipText")); lblLancesPerCompany.setName("lblLancesPerCompany"); @@ -978,7 +986,7 @@ public Component getListCellRendererComponent(final JList list, final Object getSpnLancesPerCompany().setToolTipText(resources.getString("lblLancesPerCompany.toolTipText")); getSpnLancesPerCompany().setName("spnLancesPerCompany"); - JLabel lblLanceSize = new JLabel(resources.getString("lblLanceSize.text")); + final JLabel lblLanceSize = new JLabel(resources.getString("lblLanceSize.text")); lblLanceSize.setToolTipText(resources.getString("lblLanceSize.toolTipText")); lblLanceSize.setName("lblLanceSize"); @@ -986,7 +994,7 @@ public Component getListCellRendererComponent(final JList list, final Object getSpnLanceSize().setToolTipText(resources.getString("lblLanceSize.toolTipText")); getSpnLanceSize().setName("spnLanceSize"); - JLabel lblStarLeagueYear = new JLabel(resources.getString("lblStarLeagueYear.text")); + final JLabel lblStarLeagueYear = new JLabel(resources.getString("lblStarLeagueYear.text")); lblStarLeagueYear.setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); lblStarLeagueYear.setName("lblStarLeagueYear"); @@ -1010,10 +1018,10 @@ public Component getListCellRendererComponent(final JList list, final Object getChkSpecifyStartingSystem().doClick(); // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("baseInformationPanel.title"))); panel.setName("baseInformationPanel"); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1080,20 +1088,18 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(lblStarLeagueYear) .addComponent(getSpnStarLeagueYear())) ); + return panel; } private JPanel createPersonnelPanel() { - // Initialize Labels Used in ActionListeners - JLabel lblSimulationDuration = new JLabel(); - // Create Panel Components setLblTotalSupportPersonnel(new JLabel()); updateLblTotalSupportPersonnel(0); getLblTotalSupportPersonnel().setToolTipText(resources.getString("lblTotalSupportPersonnel.toolTipText")); getLblTotalSupportPersonnel().setName("lblTotalSupportPersonnel"); - JPanel supportPersonnelNumbersPanel = createSupportPersonnelNumbersPanel(); + final JPanel supportPersonnelNumbersPanel = createSupportPersonnelNumbersPanel(); setChkPoolAssistants(new JCheckBox(resources.getString("chkPoolAssistants.text"))); getChkPoolAssistants().setToolTipText(resources.getString("chkPoolAssistants.toolTipText")); @@ -1123,45 +1129,11 @@ private JPanel createPersonnelPanel() { getChkAssignFounderFlag().setToolTipText(resources.getString("chkAssignFounderFlag.toolTipText")); getChkAssignFounderFlag().setName("chkAssignFounderFlag"); - setChkRunStartingSimulation(new JCheckBox(resources.getString("chkRunStartingSimulation.text"))); - getChkRunStartingSimulation().setToolTipText(resources.getString("chkRunStartingSimulation.toolTipText")); - getChkRunStartingSimulation().setName("chkRunStartingSimulation"); - getChkRunStartingSimulation().addActionListener(evt -> { - final boolean selected = getChkRunStartingSimulation().isSelected(); - lblSimulationDuration.setEnabled(selected); - getSpnSimulationDuration().setEnabled(selected); - getChkSimulateRandomMarriages().setEnabled(selected); - getChkSimulateRandomProcreation().setEnabled(selected); - }); - - lblSimulationDuration.setText(resources.getString("lblSimulationDuration.text")); - lblSimulationDuration.setToolTipText(resources.getString("lblSimulationDuration.toolTipText")); - lblSimulationDuration.setName("lblSimulationDuration"); - - setSpnSimulationDuration(new JSpinner(new SpinnerNumberModel(0, 0, 25, 1))); - getSpnSimulationDuration().setToolTipText(resources.getString("lblSimulationDuration.toolTipText")); - getSpnSimulationDuration().setName("spnSimulationDuration"); - - setChkSimulateRandomMarriages(new JCheckBox(resources.getString("chkSimulateRandomMarriages.text"))); - getChkSimulateRandomMarriages().setToolTipText(resources.getString("chkSimulateRandomMarriages.toolTipText")); - getChkSimulateRandomMarriages().setName("chkSimulateRandomMarriages"); - - setChkSimulateRandomProcreation(new JCheckBox(resources.getString("chkSimulateRandomProcreation.text"))); - getChkSimulateRandomProcreation().setToolTipText(resources.getString("chkSimulateRandomProcreation.toolTipText")); - getChkSimulateRandomProcreation().setName("chkSimulateRandomProcreation"); - - // Programmatically Assign Accessibility Labels - lblSimulationDuration.setLabelFor(getSpnSimulationDuration()); - - // Disable Panel Portions by Default - getChkRunStartingSimulation().setSelected(true); - getChkRunStartingSimulation().doClick(); - // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("personnelPanel.title"))); panel.setName("personnelPanel"); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1178,12 +1150,6 @@ private JPanel createPersonnelPanel() { .addComponent(getChkAssignBestOfficers()) .addComponent(getChkAutomaticallyAssignRanks()) .addComponent(getChkAssignFounderFlag()) - .addComponent(getChkRunStartingSimulation()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(lblSimulationDuration) - .addComponent(getSpnSimulationDuration(), GroupLayout.Alignment.LEADING)) - .addComponent(getChkSimulateRandomMarriages()) - .addComponent(getChkSimulateRandomProcreation()) ); layout.setHorizontalGroup( @@ -1197,15 +1163,8 @@ private JPanel createPersonnelPanel() { .addComponent(getChkAssignBestOfficers()) .addComponent(getChkAutomaticallyAssignRanks()) .addComponent(getChkAssignFounderFlag()) - .addComponent(getChkRunStartingSimulation()) - .addGroup(layout.createSequentialGroup() - .addComponent(lblSimulationDuration) - .addComponent(getSpnSimulationDuration())) - .addComponent(getChkSimulateRandomMarriages()) - .addComponent(getChkSimulateRandomProcreation()) ); - return panel; } @@ -1307,7 +1266,7 @@ private JPanel createSupportPersonnelNumbersPanel() { setSpnSupportPersonnelNumbers(rtsArray); // Layout the UI - JPanel panel = new JPanel(new GridLayout(6, 3)); + final JPanel panel = new JPanel(new GridLayout(6, 3)); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("supportPersonnelNumbersPanel.title"))); panel.setName("supportPersonnelNumbersPanel"); @@ -1334,9 +1293,9 @@ private JPanel createSupportPersonnelNumbersPanel() { private JPanel createPersonnelRandomizationPanel() { // Initialize Labels Used in ActionListeners - JLabel lblCentralPlanet = new JLabel(); - JLabel lblOriginSearchRadius = new JLabel(); - JLabel lblOriginDistanceScale = new JLabel(); + final JLabel lblCentralPlanet = new JLabel(); + final JLabel lblOriginSearchRadius = new JLabel(); + final JLabel lblOriginDistanceScale = new JLabel(); // Create Panel Components setChkRandomizeOrigin(new JCheckBox(resources.getString("chkRandomizeOrigin.text"))); @@ -1450,10 +1409,10 @@ public Component getListCellRendererComponent(final JList list, final Object getChkRandomizeOrigin().doClick(); // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("personnelRandomizationPanel.title"))); panel.setName("personnelRandomizationPanel"); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1496,6 +1455,79 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(lblOriginDistanceScale) .addComponent(getSpnOriginDistanceScale())) ); + + return panel; + } + + private JPanel createStartingSimulationPanel() { + // Initialize Labels Used in ActionListeners + final JLabel lblSimulationDuration = new JLabel(); + + // Create Panel Components + setChkRunStartingSimulation(new JCheckBox(resources.getString("chkRunStartingSimulation.text"))); + getChkRunStartingSimulation().setToolTipText(resources.getString("chkRunStartingSimulation.toolTipText")); + getChkRunStartingSimulation().setName("chkRunStartingSimulation"); + getChkRunStartingSimulation().addActionListener(evt -> { + final boolean selected = getChkRunStartingSimulation().isSelected(); + lblSimulationDuration.setEnabled(selected); + getSpnSimulationDuration().setEnabled(selected); + getChkSimulateRandomMarriages().setEnabled(selected); + getChkSimulateRandomProcreation().setEnabled(selected); + }); + + lblSimulationDuration.setText(resources.getString("lblSimulationDuration.text")); + lblSimulationDuration.setToolTipText(resources.getString("lblSimulationDuration.toolTipText")); + lblSimulationDuration.setName("lblSimulationDuration"); + + setSpnSimulationDuration(new JSpinner(new SpinnerNumberModel(0, 0, 25, 1))); + getSpnSimulationDuration().setToolTipText(resources.getString("lblSimulationDuration.toolTipText")); + getSpnSimulationDuration().setName("spnSimulationDuration"); + + setChkSimulateRandomMarriages(new JCheckBox(resources.getString("chkSimulateRandomMarriages.text"))); + getChkSimulateRandomMarriages().setToolTipText(resources.getString("chkSimulateRandomMarriages.toolTipText")); + getChkSimulateRandomMarriages().setName("chkSimulateRandomMarriages"); + + setChkSimulateRandomProcreation(new JCheckBox(resources.getString("chkSimulateRandomProcreation.text"))); + getChkSimulateRandomProcreation().setToolTipText(resources.getString("chkSimulateRandomProcreation.toolTipText")); + getChkSimulateRandomProcreation().setName("chkSimulateRandomProcreation"); + + // Programmatically Assign Accessibility Labels + lblSimulationDuration.setLabelFor(getSpnSimulationDuration()); + + // Disable Panel Portions by Default + getChkRunStartingSimulation().setSelected(true); + getChkRunStartingSimulation().doClick(); + + // Layout the UI + final JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("startingSimulationPanel.title"))); + panel.setName("startingSimulationPanel"); + final GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getChkRunStartingSimulation()) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblSimulationDuration) + .addComponent(getSpnSimulationDuration(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkSimulateRandomMarriages()) + .addComponent(getChkSimulateRandomProcreation()) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(getChkRunStartingSimulation()) + .addGroup(layout.createSequentialGroup() + .addComponent(lblSimulationDuration) + .addComponent(getSpnSimulationDuration())) + .addComponent(getChkSimulateRandomMarriages()) + .addComponent(getChkSimulateRandomProcreation()) + ); + return panel; } @@ -1621,8 +1653,8 @@ public Component getListCellRendererComponent(final JList list, final Object private JPanel createSparesPanel() { // Initialize Labels Used in ActionListeners - JLabel lblSparesPercentOfActiveUnits = new JLabel(); - JLabel lblNumberReloadsPerWeapon = new JLabel(); + final JLabel lblSparesPercentOfActiveUnits = new JLabel(); + final JLabel lblNumberReloadsPerWeapon = new JLabel(); // Create Panel Components setChkGenerateMothballedSpareUnits(new JCheckBox(resources.getString("chkGenerateMothballedSpareUnits.text"))); @@ -1642,7 +1674,7 @@ private JPanel createSparesPanel() { getSpnSparesPercentOfActiveUnits().setToolTipText(resources.getString("chkGenerateMothballedSpareUnits.toolTipText")); getSpnSparesPercentOfActiveUnits().setName("spnGenerateMothballedSpareUnits"); - JLabel lblPartGenerationMethod = new JLabel(resources.getString("lblPartGenerationMethod.text")); + final JLabel lblPartGenerationMethod = new JLabel(resources.getString("lblPartGenerationMethod.text")); lblPartGenerationMethod.setToolTipText(resources.getString("lblPartGenerationMethod.toolTipText")); lblPartGenerationMethod.setName("lblPartGenerationMethod"); @@ -1662,7 +1694,7 @@ public Component getListCellRendererComponent(final JList list, final Object } }); - JLabel lblStartingArmourWeight = new JLabel(resources.getString("lblStartingArmourWeight.text")); + final JLabel lblStartingArmourWeight = new JLabel(resources.getString("lblStartingArmourWeight.text")); lblStartingArmourWeight.setToolTipText(resources.getString("lblStartingArmourWeight.toolTipText")); lblStartingArmourWeight.setName("lblStartingArmourWeight"); @@ -1705,10 +1737,10 @@ public Component getListCellRendererComponent(final JList list, final Object getChkGenerateSpareAmmunition().doClick(); // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("sparesPanel.title"))); panel.setName("sparesPanel"); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1751,6 +1783,7 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getSpnNumberReloadsPerWeapon())) .addComponent(getChkGenerateFractionalMachineGunAmmunition()) ); + return panel; } @@ -1773,10 +1806,10 @@ private JPanel createContractsPanel() { getChkSelectStartingContract().doClick(); // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("contractsPanel.title"))); panel.setName("contractsPanel"); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1793,15 +1826,16 @@ private JPanel createContractsPanel() { .addComponent(getChkSelectStartingContract()) .addComponent(getChkStartCourseToContractPlanet()) ); + return panel; } private JPanel createFinancesPanel() { // Initialize Labels Used in ActionListeners - JLabel lblRandomStartingCashDiceCount = new JLabel(); + final JLabel lblRandomStartingCashDiceCount = new JLabel(); // Create Panel Components - JLabel lblStartingCash = new JLabel(resources.getString("lblStartingCash.text")); + final JLabel lblStartingCash = new JLabel(resources.getString("lblStartingCash.text")); lblStartingCash.setToolTipText(resources.getString("lblStartingCash.toolTipText")); lblStartingCash.setName("lblStartingCash"); @@ -1828,7 +1862,7 @@ private JPanel createFinancesPanel() { getSpnRandomStartingCashDiceCount().setToolTipText(resources.getString("lblRandomStartingCashDiceCount.toolTipText")); getSpnRandomStartingCashDiceCount().setName("spnRandomStartingCashDiceCount"); - JLabel lblMinimumStartingFloat = new JLabel(resources.getString("lblMinimumStartingFloat.text")); + final JLabel lblMinimumStartingFloat = new JLabel(resources.getString("lblMinimumStartingFloat.text")); lblMinimumStartingFloat.setToolTipText(resources.getString("lblMinimumStartingFloat.toolTipText")); lblMinimumStartingFloat.setName("lblMinimumStartingFloat"); @@ -1883,10 +1917,10 @@ private JPanel createFinancesPanel() { getChkRandomizeStartingCash().doClick(); // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financesPanel.title"))); panel.setName("financesPanel"); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1933,12 +1967,13 @@ private JPanel createFinancesPanel() { .addComponent(getChkPayForArmour()) .addComponent(getChkPayForAmmunition()) ); + return panel; } private JPanel createSurprisesPanel() { // Initialize Components Used in ActionListeners - final JPanel mysteryBoxPanel = new JPanel(); + final JPanel mysteryBoxPanel = new JDisableablePanel("mysteryBoxPanel"); // Create Panel Components setChkGenerateSurprises(new JCheckBox(resources.getString("chkGenerateSurprises.text"))); @@ -1946,34 +1981,28 @@ private JPanel createSurprisesPanel() { getChkGenerateSurprises().setName("chkGenerateSurprises"); getChkGenerateSurprises().addActionListener(evt -> { final boolean selected = getChkGenerateSurprises().isSelected(); - mysteryBoxPanel.setEnabled(selected); - if (getChkGenerateMysteryBoxes().isSelected()) { - getChkGenerateMysteryBoxes().setEnabled(true); - if (selected) { - getChkGenerateMysteryBoxes().setSelected(false); - getChkGenerateMysteryBoxes().doClick(); - } else { - getChkGenerateMysteryBoxes().doClick(); - getChkGenerateMysteryBoxes().setSelected(true); - } - } getChkGenerateMysteryBoxes().setEnabled(selected); + mysteryBoxPanel.setEnabled(selected && getChkGenerateMysteryBoxes().isSelected()); }); + setChkGenerateMysteryBoxes(new JCheckBox(resources.getString("chkGenerateMysteryBoxes.text"))); + getChkGenerateMysteryBoxes().setToolTipText(resources.getString("chkGenerateMysteryBoxes.toolTipText")); + getChkGenerateMysteryBoxes().setName("chkGenerateMysteryBoxes"); + getChkGenerateMysteryBoxes().addActionListener(evt -> mysteryBoxPanel.setEnabled( + getChkGenerateMysteryBoxes().isSelected())); + createMysteryBoxPanel(mysteryBoxPanel); // Disable Panel by Default getChkGenerateSurprises().setSelected(true); getChkGenerateSurprises().doClick(); - getChkGenerateSurprises().setEnabled(false); // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("surprisesPanel.title"))); panel.setToolTipText(resources.getString("surprisesPanel.toolTipText")); panel.setName("surprisesPanel"); - panel.setEnabled(false); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1982,14 +2011,23 @@ private JPanel createSurprisesPanel() { layout.setVerticalGroup( layout.createSequentialGroup() .addComponent(getChkGenerateSurprises()) + .addComponent(getChkGenerateMysteryBoxes()) .addComponent(mysteryBoxPanel) ); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(getChkGenerateSurprises()) + .addComponent(getChkGenerateMysteryBoxes()) .addComponent(mysteryBoxPanel) ); + + // TODO : Remove me and implement Surprises + panel.setEnabled(false); + getChkGenerateSurprises().setEnabled(false); + getChkGenerateMysteryBoxes().setEnabled(false); + mysteryBoxPanel.setEnabled(false); + return panel; } @@ -1997,21 +2035,9 @@ private void createMysteryBoxPanel(final JPanel panel) { // Create Panel panel.setBorder(BorderFactory.createTitledBorder(resources.getString("mysteryBoxPanel.title"))); panel.setToolTipText(resources.getString("mysteryBoxPanel.toolTipText")); - panel.setName("mysteryBoxPanel"); panel.setLayout(new GridLayout(0, 1)); // Create Panel Components - setChkGenerateMysteryBoxes(new JCheckBox(resources.getString("chkGenerateMysteryBoxes.text"))); - getChkGenerateMysteryBoxes().setToolTipText(resources.getString("chkGenerateMysteryBoxes.toolTipText")); - getChkGenerateMysteryBoxes().setName("chkGenerateMysteryBoxes"); - getChkGenerateMysteryBoxes().addActionListener(evt -> { - final boolean selected = getChkGenerateMysteryBoxes().isSelected(); - for (final JCheckBox checkBox : getChkGenerateMysteryBoxTypes()) { - checkBox.setEnabled(selected); - } - }); - panel.add(getChkGenerateMysteryBoxes()); - final MysteryBoxType[] mysteryBoxTypes = MysteryBoxType.values(); setChkGenerateMysteryBoxTypes(new JCheckBox[mysteryBoxTypes.length]); for (int i = 0; i < mysteryBoxTypes.length; i++) { @@ -2020,10 +2046,6 @@ private void createMysteryBoxPanel(final JPanel panel) { getChkGenerateMysteryBoxTypes()[i].setName("chk" + mysteryBoxTypes[i].name()); panel.add(getChkGenerateMysteryBoxTypes()[i]); } - - // Disable Panel by Default - getChkGenerateMysteryBoxes().setSelected(true); - getChkGenerateMysteryBoxes().doClick(); } private List getFactionChoices() { @@ -2094,12 +2116,6 @@ public void setOptions(final CompanyGenerationOptions options) { getChkAssignBestOfficers().setSelected(options.isAssignBestOfficers()); getChkAutomaticallyAssignRanks().setSelected(options.isAutomaticallyAssignRanks()); getChkAssignFounderFlag().setSelected(options.isAssignFounderFlag()); - if (getChkRunStartingSimulation().isSelected() != options.isRunStartingSimulation()) { - getChkRunStartingSimulation().doClick(); - } - getSpnSimulationDuration().setValue(options.getSimulationDuration()); - getChkSimulateRandomMarriages().setSelected(options.isSimulateRandomMarriages()); - getChkSimulateRandomProcreation().setSelected(options.isSimulateRandomProcreation()); // Personnel Randomization if (getChkRandomizeOrigin().isSelected() != options.isRandomizeOrigin()) { @@ -2116,6 +2132,14 @@ public void setOptions(final CompanyGenerationOptions options) { getChkExtraRandomOrigin().setSelected(options.isExtraRandomOrigin()); getSpnOriginDistanceScale().setValue(options.getOriginDistanceScale()); + // Starting Simulation + if (getChkRunStartingSimulation().isSelected() != options.isRunStartingSimulation()) { + getChkRunStartingSimulation().doClick(); + } + getSpnSimulationDuration().setValue(options.getSimulationDuration()); + getChkSimulateRandomMarriages().setSelected(options.isSimulateRandomMarriages()); + getChkSimulateRandomProcreation().setSelected(options.isSimulateRandomProcreation()); + // Units getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); getChkAssignBestRollToUnitCommander().setSelected(options.isAssignBestRollToUnitCommander()); @@ -2199,10 +2223,6 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setAssignBestOfficers(getChkAssignBestOfficers().isSelected()); options.setAutomaticallyAssignRanks(getChkAutomaticallyAssignRanks().isSelected()); options.setAssignFounderFlag(getChkAssignFounderFlag().isSelected()); - options.setRunStartingSimulation(getChkRunStartingSimulation().isSelected()); - options.setSimulationDuration((Integer) getSpnSimulationDuration().getValue()); - options.setSimulateRandomMarriages(getChkSimulateRandomMarriages().isSelected()); - options.setSimulateRandomProcreation(getChkSimulateRandomProcreation().isSelected()); // Personnel Randomization options.setRandomizeOrigin(getChkRandomizeOrigin().isSelected()); @@ -2212,6 +2232,12 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setExtraRandomOrigin(getChkExtraRandomOrigin().isSelected()); options.setOriginDistanceScale((Double) getSpnOriginDistanceScale().getValue()); + // Starting Simulation + options.setRunStartingSimulation(getChkRunStartingSimulation().isSelected()); + options.setSimulationDuration((Integer) getSpnSimulationDuration().getValue()); + options.setSimulateRandomMarriages(getChkSimulateRandomMarriages().isSelected()); + options.setSimulateRandomProcreation(getChkSimulateRandomProcreation().isSelected()); + // Units options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); options.setAssignBestRollToUnitCommander(getChkAssignBestRollToUnitCommander().isSelected()); From ab8e6a3fd3505daa90c420bc68bbbae53c9813b4 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 9 Apr 2021 10:32:56 -0600 Subject: [PATCH 028/115] Merging the multiple part generators into a single generator --- .../universe/enums/PartGenerationMethod.java | 10 ++--- .../partGenerators/DoublePartGenerator.java | 44 ------------------- .../partGenerators/MishraPartGenerator.java | 2 +- ...erator.java => MultiplePartGenerator.java} | 24 ++++++---- .../partGenerators/SinglePartGenerator.java | 40 ----------------- 5 files changed, 20 insertions(+), 100 deletions(-) delete mode 100644 MekHQ/src/mekhq/campaign/universe/generators/partGenerators/DoublePartGenerator.java rename MekHQ/src/mekhq/campaign/universe/generators/partGenerators/{TriplePartGenerator.java => MultiplePartGenerator.java} (67%) delete mode 100644 MekHQ/src/mekhq/campaign/universe/generators/partGenerators/SinglePartGenerator.java diff --git a/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java index 0d732c411d..1160eb5e2d 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java @@ -21,10 +21,8 @@ import megamek.common.util.EncodeControl; import mekhq.MekHQ; import mekhq.campaign.universe.generators.partGenerators.AbstractPartGenerator; -import mekhq.campaign.universe.generators.partGenerators.DoublePartGenerator; import mekhq.campaign.universe.generators.partGenerators.MishraPartGenerator; -import mekhq.campaign.universe.generators.partGenerators.SinglePartGenerator; -import mekhq.campaign.universe.generators.partGenerators.TriplePartGenerator; +import mekhq.campaign.universe.generators.partGenerators.MultiplePartGenerator; import mekhq.campaign.universe.generators.partGenerators.WindchildPartGenerator; import java.util.ResourceBundle; @@ -70,11 +68,11 @@ public AbstractPartGenerator getGenerator() { case MISHRA: return new MishraPartGenerator(); case SINGLE: - return new SinglePartGenerator(); + return new MultiplePartGenerator(this, 1); case DOUBLE: - return new DoublePartGenerator(); + return new MultiplePartGenerator(this, 2); case TRIPLE: - return new TriplePartGenerator(); + return new MultiplePartGenerator(this, 3); case DISABLED: MekHQ.getLogger().error("Attempted to get generator for a disabled part generator. Returning Windchild"); case WINDCHILD: diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/DoublePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/DoublePartGenerator.java deleted file mode 100644 index d82507daaa..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/DoublePartGenerator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.generators.partGenerators; - -import mekhq.campaign.parts.Part; -import mekhq.campaign.universe.enums.PartGenerationMethod; - -import java.util.ArrayList; -import java.util.List; - -public class DoublePartGenerator extends AbstractPartGenerator { - //region Constructors - public DoublePartGenerator() { - super(PartGenerationMethod.DOUBLE); - } - //endregion Constructors - - @Override - public List generate(final List inputParts) { - final List parts = new ArrayList<>(); - inputParts.forEach(inputPart -> { - final Part part = clonePart(inputPart); - part.setQuantity(part.getQuantity() * 2); - parts.add(part); - }); - return parts; - } -} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java index 5abc2c63ba..540f18a84c 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java @@ -34,7 +34,7 @@ * MASC is capped at 1 per type * Any other parts are capped at 6. */ -public class MishraPartGenerator extends TriplePartGenerator { +public class MishraPartGenerator extends MultiplePartGenerator { //region Constructors public MishraPartGenerator() { super(PartGenerationMethod.MISHRA); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/TriplePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java similarity index 67% rename from MekHQ/src/mekhq/campaign/universe/generators/partGenerators/TriplePartGenerator.java rename to MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java index 9624e93b86..029a784c6f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/TriplePartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java @@ -24,23 +24,29 @@ import java.util.ArrayList; import java.util.List; -public class TriplePartGenerator extends AbstractPartGenerator { - //region Constructors - public TriplePartGenerator() { - this(PartGenerationMethod.TRIPLE); - } +public class MultiplePartGenerator extends AbstractPartGenerator { + //region Variable Declarations + private final int multiple; + //endregion Variable Declarations - protected TriplePartGenerator(final PartGenerationMethod method) { + //region Constructors + public MultiplePartGenerator(final PartGenerationMethod method, final int multiple) { super(method); + this.multiple = multiple; } //endregion Constructors + //region Getters + public int getMultiple() { + return multiple; + } + //endregion Getters + @Override public List generate(final List inputParts) { final List parts = new ArrayList<>(); - inputParts.forEach(inputPart -> { - final Part part = clonePart(inputPart); - part.setQuantity(part.getQuantity() * 3); + inputParts.stream().map(this::clonePart).forEach(part -> { + part.setQuantity(part.getQuantity() * getMultiple()); parts.add(part); }); return parts; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/SinglePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/SinglePartGenerator.java deleted file mode 100644 index c7e35122e8..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/SinglePartGenerator.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.generators.partGenerators; - -import mekhq.campaign.parts.Part; -import mekhq.campaign.universe.enums.PartGenerationMethod; - -import java.util.ArrayList; -import java.util.List; - -public class SinglePartGenerator extends AbstractPartGenerator { - //region Constructors - public SinglePartGenerator() { - super(PartGenerationMethod.SINGLE); - } - //endregion Constructors - - @Override - public List generate(final List inputParts) { - final List parts = new ArrayList<>(); - inputParts.forEach(part -> parts.add(clonePart(part))); - return parts; - } -} From c21be84883c24be99388df005114220689ac5af1 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 9 Apr 2021 10:33:17 -0600 Subject: [PATCH 029/115] Adding missed file from previous commit --- .../generators/partGenerators/MishraPartGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java index 540f18a84c..dc67ff490d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java @@ -37,12 +37,12 @@ public class MishraPartGenerator extends MultiplePartGenerator { //region Constructors public MishraPartGenerator() { - super(PartGenerationMethod.MISHRA); + super(PartGenerationMethod.MISHRA, 3); } //endregion Constructors @Override public List generate(final List inputParts) { - return new ArrayList<>(); + return super.generate(inputParts); } } From e0adf393ead60a87b2f666e2102da968d49e8d34 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 9 Apr 2021 11:19:02 -0600 Subject: [PATCH 030/115] Adding the new generation version to the GUI and bugfixes --- .../AbstractCompanyGenerator.java | 9 +++---- .../CompanyGenerationPersonTracker.java | 6 +++-- .../gui/dialog/CompanyGenerationDialog.java | 24 ++++++++++++++++++- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index a7e937709d..5437f53f58 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -801,7 +801,8 @@ private List organizeTrackersIntoLance( */ public void generateEntities(final Campaign campaign, final List trackers) { - trackers.forEach(tracker -> generateEntity(campaign, tracker)); + trackers.stream().filter(tracker -> tracker.getPersonType().isCombat()) + .forEach(tracker -> generateEntity(campaign, tracker)); } /** @@ -832,8 +833,8 @@ private void generateEntity(final Campaign campaign, final CompanyGenerationPers try { return new MechFileParser(mechSummary.getSourceFile(), mechSummary.getEntryName()).getEntity(); - } catch (Exception e) { - MekHQ.getLogger().error("Failed to generate entity", e); + } catch (Exception ignored) { + MekHQ.getLogger().error("Failed to generate entity"); } return null; @@ -1569,7 +1570,7 @@ public List applyPhaseOneToCampaign(final Campaign campaign, assignTechsToUnits(trackers, units); // Generate the Forces and Assign Units to them - generateUnit(campaign, trackers); + generateUnit(campaign, sortPersonnelIntoLances(trackers)); return units; } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java index 6be47acb49..c96842be3b 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java @@ -40,6 +40,8 @@ public CompanyGenerationPersonTracker(final Person person) { public CompanyGenerationPersonTracker(final Person person, final CompanyGenerationPersonType personType) { setPerson(person); setPersonType(personType); + setParameters(null); + setEntity(null); } //endregion Constructors @@ -60,11 +62,11 @@ public void setPersonType(final CompanyGenerationPersonType personType) { this.personType = personType; } - public AtBRandomMechParameters getParameters() { + public @Nullable AtBRandomMechParameters getParameters() { return parameters; } - public void setParameters(final AtBRandomMechParameters parameters) { + public void setParameters(final @Nullable AtBRandomMechParameters parameters) { this.parameters = parameters; } diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index c4b854a72b..f9454ee60a 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -18,16 +18,24 @@ */ package mekhq.gui.dialog; +import megamek.common.Entity; import mekhq.MekHQ; import mekhq.campaign.Campaign; +import mekhq.campaign.mission.Contract; +import mekhq.campaign.parts.AmmoStorage; +import mekhq.campaign.parts.Armor; +import mekhq.campaign.parts.Part; +import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationPersonTracker; import mekhq.gui.baseComponents.AbstractMHQButtonDialog; import mekhq.gui.enums.CompanyGenerationPanelType; import mekhq.gui.panels.CompanyGenerationOptionsPanel; import javax.swing.*; import java.awt.*; +import java.util.List; public class CompanyGenerationDialog extends AbstractMHQButtonDialog { //region Variable Declarations @@ -157,6 +165,20 @@ private JPanel initializeCompanyGenerationOptionsButtonPanel() { protected void okAction() { final CompanyGenerationOptions options = getCompanyGenerationOptionsPanel().createOptionsFromPanel(); final AbstractCompanyGenerator generator = options.getMethod().getGenerator(getCampaign(), options); - // TODO : I'm a bit missing + generator.applyPhaseZeroToCampaign(getCampaign()); + + final List trackers = generator.generatePersonnel(getCampaign()); + generator.generateUnitGenerationParameters(trackers); + generator.generateEntities(getCampaign(), trackers); + final List units = generator.applyPhaseOneToCampaign(getCampaign(), trackers); + + final List mothballedEntities = generator.generateMothballedEntities(getCampaign(), trackers); + final List parts = generator.generateSpareParts(units); + final List armour = generator.generateArmour(units); + final List ammunition = generator.generateAmmunition(getCampaign(), units); + units.addAll(generator.applyPhaseTwoToCampaign(getCampaign(), mothballedEntities, parts, armour, ammunition)); + + final Contract contract = null; + generator.applyPhaseThreeToCampaign(getCampaign(), trackers, units, parts, armour, ammunition, contract); } } From 7710b8c6e7e6883f996256664dc988619f69dc8e Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 9 Apr 2021 11:52:20 -0600 Subject: [PATCH 031/115] Applying changes from personal review --- MekHQ/src/mekhq/campaign/force/Force.java | 3 +-- .../AbstractCompanyGenerator.java | 9 +++---- .../AtBCompanyGenerator.java | 4 +-- .../WindchildCompanyGenerator.java | 6 ++--- MekHQ/src/mekhq/gui/CampaignGUI.java | 3 +-- .../mekhq/gui/dialog/MekHqOptionsDialog.java | 25 +++++++++++-------- .../panels/CampaignPresetSelectionPanel.java | 7 +----- .../panels/PersonnelHiringDetailPanel.java | 3 +-- 8 files changed, 28 insertions(+), 32 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/force/Force.java b/MekHQ/src/mekhq/campaign/force/Force.java index 8d9c656e11..e06c5e44c8 100644 --- a/MekHQ/src/mekhq/campaign/force/Force.java +++ b/MekHQ/src/mekhq/campaign/force/Force.java @@ -389,8 +389,7 @@ public void writeToXml(PrintWriter pw1, int indent) { if (!getCamouflage().hasDefaultFilename()) { MekHqXmlUtil.writeSimpleXmlTag(pw1, indent, "camouflageFilename", getCamouflage().getFilename()); } - // TODO : Java 11 : swap to isBlank - if (!getDescription().trim().isEmpty()) { + if (!getDescription().isBlank()) { MekHqXmlUtil.writeSimpleXmlTag(pw1, indent, "desc", desc); } MekHqXmlUtil.writeSimpleXmlTag(pw1, indent, "combatForce", combatForce); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 5437f53f58..b0dd316285 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -811,7 +811,8 @@ public void generateEntities(final Campaign campaign, * @param tracker the tracker to generate based on the parameters and to assign the result to */ private void generateEntity(final Campaign campaign, final CompanyGenerationPersonTracker tracker) { - tracker.setEntity(generateEntity(campaign, tracker.getParameters(), tracker.getPerson().getOriginFaction())); + tracker.setEntity((tracker.getParameters() == null) ? null + : generateEntity(campaign, tracker.getParameters(), tracker.getPerson().getOriginFaction())); } /** @@ -960,8 +961,7 @@ private void generateUnit(final Campaign campaign, final List()); iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); } @@ -1073,8 +1073,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, iconMap.get(LayeredForceIcon.FORMATION.getLayerPath()).add(isLance ? "04 Lance.png" : "06 Company.png"); // Background - // TODO : Java 11 : isBlank - if (!background.trim().isEmpty()) { + if (!background.isBlank()) { iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index 2c1f13a62e..aae5ca9132 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -61,7 +61,7 @@ protected void generateCommandingOfficerRank(final Person commandingOfficer, fin * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables */ @Override - protected int determineBattleMechWeight(int roll) { + protected int determineBattleMechWeight(final int roll) { switch (roll) { case 2: case 3: @@ -89,7 +89,7 @@ protected int determineBattleMechWeight(int roll) { * @return the generated IUnitRating magic int for Dragoon Quality */ @Override - protected int determineBattleMechQuality(int roll) { + protected int determineBattleMechQuality(final int roll) { switch (roll) { case 2: case 3: diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index b5a29b91a1..d34f87882d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -41,7 +41,7 @@ public WindchildCompanyGenerator(final Campaign campaign, final CompanyGeneratio * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ @Override - protected void generateCommandingOfficerRank(Person commandingOfficer, int numMechWarriors) { + protected void generateCommandingOfficerRank(final Person commandingOfficer, final int numMechWarriors) { if (numMechWarriors > 36) { commandingOfficer.setRankNumeric(Ranks.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); } else if (numMechWarriors > 12) { @@ -64,7 +64,7 @@ protected void generateCommandingOfficerRank(Person commandingOfficer, int numMe * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables */ @Override - protected int determineBattleMechWeight(int roll) { + protected int determineBattleMechWeight(final int roll) { switch (roll) { case 2: case 3: @@ -92,7 +92,7 @@ protected int determineBattleMechWeight(int roll) { * @return the generated IUnitRating magic int for Dragoon Quality */ @Override - protected int determineBattleMechQuality(int roll) { + protected int determineBattleMechQuality(final int roll) { switch (roll) { case 2: case 3: diff --git a/MekHQ/src/mekhq/gui/CampaignGUI.java b/MekHQ/src/mekhq/gui/CampaignGUI.java index 22b62a382d..2d3386bbc9 100644 --- a/MekHQ/src/mekhq/gui/CampaignGUI.java +++ b/MekHQ/src/mekhq/gui/CampaignGUI.java @@ -2223,8 +2223,7 @@ protected void loadPartsFile() { protected void loadOptionsFile() { Optional maybeFile = FileDialogs.openCampaignOptions(frame); - // TODO : Java 11: Swap to isEmpty - if (!maybeFile.isPresent()) { + if (maybeFile.isEmpty()) { return; } diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index b5a9f97744..c9795539c3 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -108,6 +108,7 @@ protected Container createCenterPane() { } private JPanel createDisplayTab() { + // Create Panel Components JLabel labelDisplayDateFormat = new JLabel(resources.getString("labelDisplayDateFormat.text")); JLabel labelDisplayDateFormatExample = new JLabel(); optionDisplayDateFormat = new JTextField(); @@ -154,12 +155,12 @@ private JPanel createDisplayTab() { optionPersonnelFilterStyle = new JComboBox<>(PersonnelFilterStyle.values()); optionPersonnelFilterStyle.setRenderer(new DefaultListCellRenderer() { @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (isSelected && (index > -1)) { - list.setToolTipText((list.getSelectedValue() instanceof PersonnelFilterStyle) - ? ((PersonnelFilterStyle) list.getSelectedValue()).getToolTipText() : ""); + if (value instanceof PersonnelFilterStyle) { + list.setToolTipText(((PersonnelFilterStyle) list.getSelectedValue()).getToolTipText()); } return this; } @@ -227,6 +228,7 @@ public Component getListCellRendererComponent(JList list, Object value, int i } private JPanel createAutosaveTab() { + // Create Panel Components optionNoSave = new JRadioButton(resources.getString("optionNoSave.text")); optionNoSave.setMnemonic(KeyEvent.VK_N); @@ -295,6 +297,7 @@ private JPanel createAutosaveTab() { } private JPanel createNewDayTab() { + // Create Panel Components optionNewDayMRMS = new JCheckBox(resources.getString("optionNewDayMRMS.text")); // Layout the UI @@ -319,6 +322,7 @@ private JPanel createNewDayTab() { } private JPanel createCampaignXMLSaveTab() { + // Create Panel Components optionPreferGzippedOutput = new JCheckBox(resources.getString("optionPreferGzippedOutput.text")); optionPreferGzippedOutput.setToolTipText(resources.getString("optionPreferGzippedOutput.toolTipText")); @@ -361,6 +365,7 @@ private JPanel createCampaignXMLSaveTab() { } private JPanel createMiscellaneousTab() { + // Create Panel Components JLabel labelStartGameDelay = new JLabel(resources.getString("labelStartGameDelay.text")); labelStartGameDelay.setToolTipText(resources.getString("optionStartGameDelay.toolTipText")); @@ -373,12 +378,12 @@ private JPanel createMiscellaneousTab() { optionDefaultCompanyGenerationMethod = new JComboBox<>(CompanyGenerationMethod.values()); optionDefaultCompanyGenerationMethod.setRenderer(new DefaultListCellRenderer() { @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (isSelected && (index > -1)) { - list.setToolTipText((list.getSelectedValue() instanceof CompanyGenerationMethod) - ? ((CompanyGenerationMethod) list.getSelectedValue()).getToolTipText() : ""); + if (value instanceof CompanyGenerationMethod) { + list.setToolTipText(((CompanyGenerationMethod) list.getSelectedValue()).getToolTipText()); } return this; } diff --git a/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java b/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java index 937b845fbd..1ad62cc447 100644 --- a/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java @@ -58,12 +58,7 @@ private void initialize() { setPreferredSize(new Dimension(500, 400)); DefaultListModel listModel = new DefaultListModel<>(); - // TODO : Java 11 - //listModel.addAll(GamePreset.getGamePresetsIn()); - - for (GamePreset preset : GamePreset.getGamePresetsIn()) { - listModel.addElement(preset); - } + listModel.addAll(GamePreset.getGamePresetsIn()); setPresets(new JList<>(listModel)); getPresets().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); diff --git a/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java b/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java index 8f88d0c1ce..2d51c28752 100644 --- a/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java +++ b/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java @@ -310,8 +310,7 @@ public void mouseClicked(final MouseEvent e) { } } - // TODO : Java 11 : Swap to using isBlank - if (!"-".equals(getPerson().getCallsign()) && !getPerson().getCallsign().trim().isEmpty()) { + if (!"-".equals(getPerson().getCallsign()) && !getPerson().getCallsign().isBlank()) { getLblCallsign().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblCallsign.text"), getPerson().getCallsign())); getLblCallsign().setVisible(true); } else { From 424c66a1952c38c5954faf7ac5e9a0a951d78e2f Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 2 Jun 2021 16:22:48 -0400 Subject: [PATCH 032/115] Quick fix for the order of operations --- .../generators/companyGenerators/AbstractCompanyGenerator.java | 2 +- .../generators/companyGenerators/AtBCompanyGenerator.java | 2 +- .../generators/companyGenerators/WindchildCompanyGenerator.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 169f5dc7dd..61dde0269b 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -127,7 +127,7 @@ public abstract class AbstractCompanyGenerator { //endregion Variable Declarations //region Constructors - protected AbstractCompanyGenerator(final Campaign campaign, final CompanyGenerationMethod method, + protected AbstractCompanyGenerator(final CompanyGenerationMethod method, final Campaign campaign, final CompanyGenerationOptions options) { this.method = method; setOptions(options); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index 5b85891bc3..083fc62d1e 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -30,7 +30,7 @@ public class AtBCompanyGenerator extends AbstractCompanyGenerator { //region Constructors public AtBCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { - super(campaign, CompanyGenerationMethod.AGAINST_THE_BOT, options); + super(CompanyGenerationMethod.AGAINST_THE_BOT, campaign, options); } //endregion Constructors diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 9f9cf90e25..f69612ac74 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -30,7 +30,7 @@ public class WindchildCompanyGenerator extends AbstractCompanyGenerator { //region Constructors public WindchildCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { - super(campaign, CompanyGenerationMethod.WINDCHILD, options); + super(CompanyGenerationMethod.WINDCHILD, campaign, options); } //endregion Constructors From 45520c732c7f381df3f60110b08d7ec7412ce27d Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 18 Oct 2021 17:47:59 -0400 Subject: [PATCH 033/115] Reverting date changes and applying any bugfixes required for a build --- .../AbstractCompanyGenerator.java | 5 +- .../gui/dialog/AddOrEditKillEntryDialog.java | 6 +- .../dialog/AddOrEditMissionEntryDialog.java | 6 +- .../dialog/AddOrEditPersonnelEntryDialog.java | 6 +- .../gui/dialog/CampaignOptionsDialog.java | 4 +- .../gui/dialog/CustomizePersonDialog.java | 52 +++++++------ .../gui/dialog/CustomizeScenarioDialog.java | 26 ++++--- MekHQ/src/mekhq/gui/dialog/DateChooser.java | 67 +++++++++++++---- .../mekhq/gui/dialog/DateSelectionDialog.java | 75 ------------------- .../gui/dialog/EditTransactionDialog.java | 6 +- .../mekhq/gui/dialog/NewContractDialog.java | 23 +++--- .../gui/dialog/NewPlanetaryEventDialog.java | 9 +-- .../src/mekhq/gui/enums/LayeredForceIcon.java | 2 +- .../panels/CampaignPresetSelectionPanel.java | 73 ------------------ .../mekhq/gui/panels/DateSelectionPanel.java | 47 ------------ .../renderers/PersonnelHiringRenderer.java | 2 +- 16 files changed, 130 insertions(+), 279 deletions(-) delete mode 100644 MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java delete mode 100644 MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java delete mode 100644 MekHQ/src/mekhq/gui/panels/DateSelectionPanel.java diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 61dde0269b..d48971a9b7 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -34,6 +34,7 @@ import mekhq.campaign.CurrentLocation; import mekhq.campaign.finances.Money; import mekhq.campaign.finances.Transaction; +import mekhq.campaign.finances.enums.TransactionType; import mekhq.campaign.force.Force; import mekhq.campaign.mission.Contract; import mekhq.campaign.parts.AmmoStorage; @@ -1390,8 +1391,8 @@ private void processFinances(final Campaign campaign, startingCash = startingCash.isGreaterOrEqualThan(minimumStartingFloat) ? startingCash : minimumStartingFloat; if (!startingCash.isZero()) { - campaign.getFinances().credit(startingCash, Transaction.C_START, - resources.getString(""), campaign.getLocalDate()); + campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, + resources.getString("")); } } } diff --git a/MekHQ/src/mekhq/gui/dialog/AddOrEditKillEntryDialog.java b/MekHQ/src/mekhq/gui/dialog/AddOrEditKillEntryDialog.java index 57796b2e1e..6c36d3c43a 100644 --- a/MekHQ/src/mekhq/gui/dialog/AddOrEditKillEntryDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/AddOrEditKillEntryDialog.java @@ -202,9 +202,9 @@ private void btnCloseActionPerformed(ActionEvent evt) { } private void changeDate() { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, date); - if (dateSelectionDialog.showDialog().isConfirmed()) { - date = dateSelectionDialog.getDate(); + DateChooser dc = new DateChooser(frame, date); + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + date = dc.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/AddOrEditMissionEntryDialog.java b/MekHQ/src/mekhq/gui/dialog/AddOrEditMissionEntryDialog.java index 5d8be1f45d..5becdd6349 100644 --- a/MekHQ/src/mekhq/gui/dialog/AddOrEditMissionEntryDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/AddOrEditMissionEntryDialog.java @@ -158,9 +158,9 @@ private void setUserPreferences() { } private void changeDate() { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, newDate); - if (dateSelectionDialog.showDialog().isConfirmed()) { - newDate = dateSelectionDialog.getDate(); + DateChooser dc = new DateChooser(frame, newDate); + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + newDate = dc.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(newDate)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/AddOrEditPersonnelEntryDialog.java b/MekHQ/src/mekhq/gui/dialog/AddOrEditPersonnelEntryDialog.java index 56bb0c8b54..a6954cf332 100644 --- a/MekHQ/src/mekhq/gui/dialog/AddOrEditPersonnelEntryDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/AddOrEditPersonnelEntryDialog.java @@ -147,9 +147,9 @@ protected void okAction() { } private void changeDate() { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(getFrame(), getDate()); - if (dateSelectionDialog.showDialog().isConfirmed()) { - setDate(dateSelectionDialog.getDate()); + DateChooser dc = new DateChooser(getFrame(), getDate()); + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + setDate(dc.getDate()); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(getDate())); } } diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index df9233eba3..3d13da4094 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -3287,8 +3287,8 @@ public Component getListCellRendererComponent(JList list, Object value, int i //region Company Generation Options if (MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()) { - companyGenerationOptionsPanel = new CompanyGenerationOptionsPanel(frame, campaign); - tabOptions.addTab(resourceMap.getString("companyGenerationOptionsPanel.title"), new JScrollPane(companyGenerationOptionsPanel)); + companyGenerationOptionsPanel = new CompanyGenerationOptionsPanel(getFrame(), campaign); + getOptionsPane().addTab(resourceMap.getString("companyGenerationOptionsPanel.title"), new JScrollPane(companyGenerationOptionsPanel)); } //endregion Company Generation Options diff --git a/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java b/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java index 89c314a7e5..2fa56c181e 100644 --- a/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CustomizePersonDialog.java @@ -29,7 +29,6 @@ import megamek.client.generator.RandomNameGenerator; import megamek.client.generator.RandomCallsignGenerator; -import megamek.common.annotations.Nullable; import megamek.common.enums.Gender; import megamek.client.ui.swing.DialogOptionComponent; import megamek.client.ui.swing.DialogOptionListener; @@ -423,7 +422,7 @@ public Component getListCellRendererComponent(final JList list, } choiceSystem.addActionListener(evt -> { // Update the clan check box based on the new selected faction - PlanetarySystem selectedSystem = (PlanetarySystem) choiceSystem.getSelectedItem(); + PlanetarySystem selectedSystem = (PlanetarySystem)choiceSystem.getSelectedItem(); choicePlanet.setSelectedIndex(-1); updatePlanetsComboBoxModel(planetsModel, selectedSystem); @@ -901,10 +900,10 @@ private DefaultComboBoxModel getPlanetarySystemsComboBoxModel(F } private void filterPlanetarySystemsForOurFaction(boolean onlyOurFaction) { - PlanetarySystem selectedSystem = (PlanetarySystem) choiceSystem.getSelectedItem(); - Planet selectedPlanet = (Planet) choicePlanet.getSelectedItem(); + PlanetarySystem selectedSystem = (PlanetarySystem)choiceSystem.getSelectedItem(); + Planet selectedPlanet = (Planet)choicePlanet.getSelectedItem(); if (onlyOurFaction && choiceFaction.getSelectedItem() != null) { - Faction faction = (Faction) choiceFaction.getSelectedItem(); + Faction faction = (Faction)choiceFaction.getSelectedItem(); DefaultComboBoxModel model = getPlanetarySystemsComboBoxModel(faction); if (model.getIndexOf(selectedSystem) < 0) { @@ -912,19 +911,18 @@ private void filterPlanetarySystemsForOurFaction(boolean onlyOurFaction) { selectedPlanet = null; } - updatePlanetsComboBoxModel((DefaultComboBoxModel) choicePlanet.getModel(), null); + updatePlanetsComboBoxModel((DefaultComboBoxModel)choicePlanet.getModel(), null); choiceSystem.setModel(model); } else { choiceSystem.setModel(allSystems); } choiceSystem.setSelectedItem(selectedSystem); - updatePlanetsComboBoxModel((DefaultComboBoxModel) choicePlanet.getModel(), selectedSystem); + updatePlanetsComboBoxModel((DefaultComboBoxModel)choicePlanet.getModel(), selectedSystem); choicePlanet.setSelectedItem(selectedPlanet); } - private void updatePlanetsComboBoxModel(DefaultComboBoxModel planetsModel, - @Nullable PlanetarySystem planetarySystem) { + private void updatePlanetsComboBoxModel(DefaultComboBoxModel planetsModel, PlanetarySystem planetarySystem) { planetsModel.removeAllElements(); if (planetarySystem != null) { planetsModel.addElement(planetarySystem.getPrimaryPlanet()); @@ -1251,35 +1249,43 @@ private void changeValueEnabled(String type) { skillBonus.get(type).setEnabled(skillChks.get(type).isSelected()); } - private void btnDateActionPerformed(final ActionEvent evt) { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, birthdate); - if (dateSelectionDialog.showDialog().isConfirmed()) { - birthdate = dateSelectionDialog.getDate(); + private void btnDateActionPerformed(ActionEvent evt) { + // show the date chooser + DateChooser dc = new DateChooser(frame, birthdate); + // user can either choose a date or cancel by closing + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + birthdate = dc.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(birthdate)); lblAge.setText(getAge() + " " + resourceMap.getString("age")); } } - private void btnServiceDateActionPerformed(final ActionEvent evt) { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, recruitment); - if (dateSelectionDialog.showDialog().isConfirmed()) { - recruitment = dateSelectionDialog.getDate(); + private void btnServiceDateActionPerformed(ActionEvent evt) { + // show the date chooser + DateChooser dc = new DateChooser(frame, recruitment); + // user can either choose a date or cancel by closing + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + recruitment = dc.getDate(); btnServiceDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(recruitment)); } } private void btnRankDateActionPerformed() { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, lastRankChangeDate); - if (dateSelectionDialog.showDialog().isConfirmed()) { - lastRankChangeDate = dateSelectionDialog.getDate(); + // show the date chooser + DateChooser dc = new DateChooser(frame, lastRankChangeDate); + // user can either choose a date or cancel by closing + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + lastRankChangeDate = dc.getDate(); btnRankDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(lastRankChangeDate)); } } private void btnRetirementDateActionPerformed() { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, retirement); - if (dateSelectionDialog.showDialog().isConfirmed()) { - retirement = dateSelectionDialog.getDate(); + // show the date chooser + DateChooser dc = new DateChooser(frame, retirement); + // user can either choose a date or cancel by closing + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + retirement = dc.getDate(); btnRetirementDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(retirement)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/CustomizeScenarioDialog.java b/MekHQ/src/mekhq/gui/dialog/CustomizeScenarioDialog.java index d04da1a05f..2d6b7005e5 100644 --- a/MekHQ/src/mekhq/gui/dialog/CustomizeScenarioDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CustomizeScenarioDialog.java @@ -55,7 +55,7 @@ * @author Taharqa */ public class CustomizeScenarioDialog extends JDialog { - private static final long serialVersionUID = -8038099101234445018L; + private static final long serialVersionUID = -8038099101234445018L; private JFrame frame; private Scenario scenario; private Mission mission; @@ -115,7 +115,7 @@ public CustomizeScenarioDialog(JFrame parent, boolean modal, Scenario s, Mission } private void initComponents() { - java.awt.GridBagConstraints gridBagConstraints; + java.awt.GridBagConstraints gridBagConstraints; txtName = new javax.swing.JTextField(); lblName = new javax.swing.JLabel(); @@ -270,7 +270,7 @@ public Component getListCellRendererComponent(final JList list, final Object JButton btnLoad = new JButton("Generate From Template"); btnLoad.addActionListener(this::btnLoadActionPerformed); panBtn.add(btnLoad); - } else if ((mission instanceof AtBContract) && + } else if ((mission instanceof AtBContract) && (scenario instanceof AtBDynamicScenario) && (scenario.getStatus().isCurrent())) { JButton btnFinalize = new JButton(); @@ -320,11 +320,11 @@ private void btnOKActionPerformed(ActionEvent evt) { if (txtReport != null) { scenario.setReport(txtReport.getText()); } - + if (choiceStatus.getSelectedItem() != null) { scenario.setStatus((ScenarioStatus) choiceStatus.getSelectedItem()); } - + scenario.setDate(date); } scenario.resetLoot(); @@ -376,19 +376,21 @@ private void btnCloseActionPerformed(ActionEvent evt) { } private void changeDate() { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, date); - if (dateSelectionDialog.showDialog().isConfirmed()) { + // show the date chooser + DateChooser dc = new DateChooser(frame, date); + // user can either choose a date or cancel by closing + if (dc.showDateChooser() == DateChooser.OK_OPTION) { if (scenario.getStatus().isCurrent()) { - if (dateSelectionDialog.getDate().isBefore(campaign.getLocalDate())) { + if (dc.getDate().isBefore(campaign.getLocalDate())) { JOptionPane.showMessageDialog(frame, "You cannot choose a date before the current date for a pending battle.", "Invalid date", JOptionPane.ERROR_MESSAGE); return; } else { - final LocalDate nextMonday = campaign.getLocalDate().with(TemporalAdjusters.next(DayOfWeek.MONDAY)); + LocalDate nextMonday = campaign.getLocalDate().with(TemporalAdjusters.next(DayOfWeek.MONDAY)); - if (!dateSelectionDialog.getDate().isBefore(nextMonday)) { + if (!dc.getDate().isBefore(nextMonday)) { JOptionPane.showMessageDialog(frame, "You cannot choose a date beyond the current week.", "Invalid date", @@ -396,14 +398,14 @@ private void changeDate() { return; } } - } else if (dateSelectionDialog.getDate().isAfter(campaign.getLocalDate())) { + } else if (dc.getDate().isAfter(campaign.getLocalDate())) { JOptionPane.showMessageDialog(frame, "You cannot choose a date after the current date.", "Invalid date", JOptionPane.ERROR_MESSAGE); return; } - date = dateSelectionDialog.getDate(); + date = dc.getDate(); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); } } diff --git a/MekHQ/src/mekhq/gui/dialog/DateChooser.java b/MekHQ/src/mekhq/gui/dialog/DateChooser.java index 31e3098e83..aa5a4e84d6 100644 --- a/MekHQ/src/mekhq/gui/dialog/DateChooser.java +++ b/MekHQ/src/mekhq/gui/dialog/DateChooser.java @@ -20,6 +20,8 @@ import javax.swing.text.DefaultFormatterFactory; import mekhq.MekHQ; +import megamek.client.ui.preferences.JWindowPreference; +import megamek.client.ui.preferences.PreferencesNode; /** * Hovanes Gambaryan Henry Demirchian CSUN, CS 585 Professor Mike Barnes @@ -48,6 +50,10 @@ * == DateChooser.OK_OPTION) { date = dc.getDate(); } */ public class DateChooser extends JDialog implements ActionListener, FocusListener, KeyListener { + private static final long serialVersionUID = 4353945278962427075L; + public static final int OK_OPTION = 1; + public static final int CANCEL_OPTION = 2; + private static final List monthNames; static { monthNames = new ArrayList<>(12); @@ -60,7 +66,7 @@ public class DateChooser extends JDialog implements ActionListener, FocusListene monthNames.add("July"); monthNames.add("August"); monthNames.add("September"); - monthNames.add("October"); + monthNames.add("October "); monthNames.add("November"); monthNames.add("December"); } @@ -70,6 +76,7 @@ public class DateChooser extends JDialog implements ActionListener, FocusListene private JLabel monthLabel; private JLabel yearLabel; private JPanel dayGrid; + private boolean ready; // Stores the user-input date. private JFormattedTextField dateField; @@ -112,7 +119,6 @@ public DateChooser(JFrame owner, LocalDate d) { // build the panel with year and navigation buttons yearPane.add(navButton[2] = new JButton("<<")); - // Month::getDisplayName yearPane.add( yearLabel = new JLabel(String.valueOf(date.getYear()), JLabel.CENTER), BorderLayout.CENTER); @@ -170,10 +176,41 @@ public String valueToString(Object value) { dateField.setColumns(10); setResizable(false); + ready = false; pack(); // center this dialog over the owner setLocationRelativeTo(owner); + setUserPreferences(); + } + + private void setUserPreferences() { + PreferencesNode preferences = MekHQ.getPreferences().forClass(DateChooser.class); + + this.setName("dialog"); + preferences.manage(new JWindowPreference(this)); + } + + /** + * Return the last selected date for this instance of DateChooser + */ + public LocalDate getDate() { + return date; + } + + /** + * Displays a DateChooser dialog on the screen. If a new date is selected + * returnsor OK_OPTION. If the action is canceled returns CANCEL_OPTION. + * Both of the returned values are defined as static constants. + */ + public int showDateChooser() { + ready = false; + setVisible(true); + if (ready) { + return OK_OPTION; + } else { + return CANCEL_OPTION; + } } /** @@ -233,6 +270,7 @@ public void actionPerformed(ActionEvent evt) { MekHQ.getLogger().error(e); } date = LocalDate.of(y, m, d); + ready = true; //Set the date field to the new date. dateField.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); @@ -249,6 +287,7 @@ public void actionPerformed(ActionEvent evt) { */ private void setDate(LocalDate date) { this.date = date; + ready = true; monthLabel.setText(monthNames.get(date.getMonth().ordinal())); yearLabel.setText(String.valueOf(date.getYear())); dateField.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(date)); @@ -401,16 +440,16 @@ public void focusLost(FocusEvent e) { */ private LocalDate parseDate(String dateString) { DateTimeFormatter[] dateFormats = new DateTimeFormatter[] - { - DateTimeFormatter.ofPattern(MekHQ.getMekHQOptions().getDisplayDateFormat()), - DateTimeFormatter.ofPattern(MekHQ.getMekHQOptions().getLongDisplayDateFormat()), - DateTimeFormatter.ofPattern("MMMM d, yyyy"), - DateTimeFormatter.ofPattern("E, MMMM d, yyyy G"), - DateTimeFormatter.ofPattern("E, MMMM d, yyyy"), - DateTimeFormatter.ofPattern("MMM d, yyyy"), - DateTimeFormatter.ofPattern("MM/dd/yyyy"), - DateTimeFormatter.ISO_LOCAL_DATE - }; + { + DateTimeFormatter.ofPattern(MekHQ.getMekHQOptions().getDisplayDateFormat()), + DateTimeFormatter.ofPattern(MekHQ.getMekHQOptions().getLongDisplayDateFormat()), + DateTimeFormatter.ofPattern("MMMM d, yyyy"), + DateTimeFormatter.ofPattern("E, MMMM d, yyyy G"), + DateTimeFormatter.ofPattern("E, MMMM d, yyyy"), + DateTimeFormatter.ofPattern("MMM d, yyyy"), + DateTimeFormatter.ofPattern("MM/dd/yyyy"), + DateTimeFormatter.ISO_LOCAL_DATE + }; for (DateTimeFormatter format : dateFormats) { try { return LocalDate.parse(dateString, format); @@ -453,9 +492,7 @@ public void keyReleased(KeyEvent e) { private void updateDateFromDateField() { LocalDate newDate = parseDate(dateField.getText()); if (newDate == null) { - JOptionPane.showMessageDialog(this, - "Invalid Date Format\nTry: yyyy-MM-dd", "Date Format", - JOptionPane.WARNING_MESSAGE); + JOptionPane.showMessageDialog(this, "Invalid Date Format\nTry: yyyy-MM-dd", "Date Format", JOptionPane.WARNING_MESSAGE); return; } setDate(newDate); diff --git a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java b/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java deleted file mode 100644 index a2932d63c5..0000000000 --- a/MekHQ/src/mekhq/gui/dialog/DateSelectionDialog.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.dialog; - -import mekhq.gui.baseComponents.AbstractMHQButtonDialog; -import mekhq.gui.panels.DateSelectionPanel; - -import javax.swing.*; -import java.awt.*; -import java.time.LocalDate; - -public class DateSelectionDialog extends AbstractMHQButtonDialog { - //region Variable Declarations - private LocalDate initialDate; - - private DateSelectionPanel dateSelectionPanel; - //endregion Variable Declarations - - //region Constructors - public DateSelectionDialog(final JFrame frame, final LocalDate initialDate) { - super(frame, "DateSelectionDialog", "DateSelectionDialog.title"); - setInitialDate(initialDate); - initialize(); - } - //endregion Constructors - - //region Getters/Setters - public LocalDate getInitialDate() { - return initialDate; - } - - public void setInitialDate(LocalDate initialDate) { - this.initialDate = initialDate; - } - - public DateSelectionPanel getDateSelectionPanel() { - return dateSelectionPanel; - } - - public void setDateSelectionPanel(final DateSelectionPanel dateSelectionPanel) { - this.dateSelectionPanel = dateSelectionPanel; - } - - /** - * @return the specified date - */ - public LocalDate getDate() { - return getResult().isConfirmed() ? getDateSelectionPanel().getDate() : getInitialDate(); - } - //endregion Getters/Setters - - //region Initialization - @Override - protected Container createCenterPane() { - setDateSelectionPanel(new DateSelectionPanel(getInitialDate())); - return getDateSelectionPanel(); - } - //endregion Initialization -} diff --git a/MekHQ/src/mekhq/gui/dialog/EditTransactionDialog.java b/MekHQ/src/mekhq/gui/dialog/EditTransactionDialog.java index 2a7f04eed6..78942fb3c6 100644 --- a/MekHQ/src/mekhq/gui/dialog/EditTransactionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/EditTransactionDialog.java @@ -184,9 +184,9 @@ public void actionPerformed(ActionEvent e) { } else if (cancelButton.equals(e.getSource())) { setVisible(false); } else if (dateButton.equals(e.getSource())) { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(parent, getNewTransaction().getDate()); - if (dateSelectionDialog.showDialog().isConfirmed()) { - dateButton.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(dateSelectionDialog.getDate())); + DateChooser chooser = new DateChooser(parent, newTransaction.getDate()); + if (chooser.showDateChooser() == DateChooser.OK_OPTION) { + dateButton.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(chooser.getDate())); } } } diff --git a/MekHQ/src/mekhq/gui/dialog/NewContractDialog.java b/MekHQ/src/mekhq/gui/dialog/NewContractDialog.java index 46317dd74d..2c445cc3be 100644 --- a/MekHQ/src/mekhq/gui/dialog/NewContractDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/NewContractDialog.java @@ -694,17 +694,18 @@ protected void btnOKActionPerformed(ActionEvent evt) { } private void changeStartDate() { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog(frame, contract.getStartDate()); - if (dateSelectionDialog.showDialog().isConfirmed() - && !contract.getStartDate().equals(dateSelectionDialog.getDate())) { - if (campaign.getLocalDate().isAfter(dateSelectionDialog.getDate())) { - JOptionPane.showMessageDialog(frame, - "You cannot choose a start date before the current date.", - "Invalid date", - JOptionPane.ERROR_MESSAGE); - return; - } - contract.setStartDate(dateSelectionDialog.getDate()); + // show the date chooser + DateChooser dc = new DateChooser(frame, contract.getStartDate()); + // user can either choose a date or cancel by closing + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + if (campaign.getLocalDate().isAfter(dc.getDate())) { + JOptionPane.showMessageDialog(frame, + "You cannot choose a start date before the current date.", + "Invalid date", + JOptionPane.ERROR_MESSAGE); + return; + } + contract.setStartDate(dc.getDate()); contract.calculateContract(campaign); btnDate.setText(MekHQ.getMekHQOptions().getDisplayFormattedDate(contract.getStartDate())); } diff --git a/MekHQ/src/mekhq/gui/dialog/NewPlanetaryEventDialog.java b/MekHQ/src/mekhq/gui/dialog/NewPlanetaryEventDialog.java index 549c4d0ba5..cb56a0ba68 100644 --- a/MekHQ/src/mekhq/gui/dialog/NewPlanetaryEventDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/NewPlanetaryEventDialog.java @@ -164,15 +164,14 @@ public void actionPerformed(ActionEvent e) { dateButton = new JButton(new AbstractAction() { private static final long serialVersionUID = 5708871251030417524L; { - putValue(SHORT_DESCRIPTION, resourceMap.getString("setDay.tooltip")); + putValue(SHORT_DESCRIPTION, resourceMap.getString("setDay.tooltip")); //$NON-NLS-1$ } @Override public void actionPerformed(ActionEvent e) { - final DateSelectionDialog dateSelectionDialog = new DateSelectionDialog( - ((content instanceof JFrame) ? (JFrame) content : null), date); - if (dateSelectionDialog.showDialog().isConfirmed() && !date.equals(dateSelectionDialog.getDate())) { - date = dateSelectionDialog.getDate(); + DateChooser dc = new DateChooser((content instanceof JFrame) ? (JFrame) content : null, date); + if (dc.showDateChooser() == DateChooser.OK_OPTION) { + date = dc.getDate(); updateDate(); } } diff --git a/MekHQ/src/mekhq/gui/enums/LayeredForceIcon.java b/MekHQ/src/mekhq/gui/enums/LayeredForceIcon.java index 9b64640fe0..b20538c917 100644 --- a/MekHQ/src/mekhq/gui/enums/LayeredForceIcon.java +++ b/MekHQ/src/mekhq/gui/enums/LayeredForceIcon.java @@ -52,6 +52,7 @@ public enum LayeredForceIcon { private final String layerPath; private final String tableName; private final int listSelectionModel; + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations @@ -71,7 +72,6 @@ public String getToolTipText() { return toolTipText; } - //region Getters public String getLayerPath() { return layerPath; } diff --git a/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java b/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java deleted file mode 100644 index 1ad62cc447..0000000000 --- a/MekHQ/src/mekhq/gui/panels/CampaignPresetSelectionPanel.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.panels; - -import megamek.common.annotations.Nullable; -import mekhq.campaign.GamePreset; -import mekhq.gui.renderers.CampaignPresetRenderer; - -import javax.swing.*; -import java.awt.*; - -public class CampaignPresetSelectionPanel extends JPanel { - //region Variable Declarations - private JList presets; - //endregion Variable Declarations - - //region Constructors - public CampaignPresetSelectionPanel() { - initialize(); - } - //endregion Constructors - - //region Getters/Setters - public JList getPresets() { - return presets; - } - - public void setPresets(final JList presets) { - this.presets = presets; - } - - public @Nullable GamePreset getSelectedPreset() { - return getPresets().getSelectedValue(); - } - //endregion Getters/Setters - - //region Initialization - private void initialize() { - setName("campaignPresetSelectionPanel"); - setLayout(new GridLayout(1, 1)); - setMinimumSize(new Dimension(335, 130)); - setPreferredSize(new Dimension(500, 400)); - - DefaultListModel listModel = new DefaultListModel<>(); - listModel.addAll(GamePreset.getGamePresetsIn()); - - setPresets(new JList<>(listModel)); - getPresets().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - getPresets().setSelectedIndex(0); - getPresets().setLayoutOrientation(JList.VERTICAL); - getPresets().setCellRenderer(new CampaignPresetRenderer()); - - add(new JScrollPane(getPresets(), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, - JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)); - } - //endregion Initialization -} diff --git a/MekHQ/src/mekhq/gui/panels/DateSelectionPanel.java b/MekHQ/src/mekhq/gui/panels/DateSelectionPanel.java deleted file mode 100644 index 166883f65e..0000000000 --- a/MekHQ/src/mekhq/gui/panels/DateSelectionPanel.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.panels; - -import javax.swing.*; -import java.time.LocalDate; - -public class DateSelectionPanel extends JPanel { - //region Variable Declarations - private LocalDate date; - //endregion Variable Declarations - - //region Constructors - public DateSelectionPanel(final LocalDate date) { - initialize(date); - this.date = date; // remove - } - //endregion Constructors - - //region Getters/Setters - public LocalDate getDate() { - return date; - } - //endregion Getters/Setters - - //region Initialization - private void initialize(final LocalDate date) { - - } - //endregion Initialization -} diff --git a/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java b/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java index 1040860da2..870cc0232c 100644 --- a/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java +++ b/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java @@ -182,7 +182,7 @@ private void initialize(final @Nullable CampaignGUI gui, final Campaign campaign if (person == null) { return; } - AbstractIconChooserDialog portraitDialog = new PortraitChooserDialog(getFrame(), person.getPortrait()); + final PortraitChooserDialog portraitDialog = new PortraitChooserDialog(getFrame(), person.getPortrait()); if (portraitDialog.showDialog().isConfirmed() && (portraitDialog.getSelectedItem() != null)) { person.setPortrait(portraitDialog.getSelectedItem()); getPersonnelHiringDetailPanel().updateValues(); From 50578b1a672723b775bfea6cfadce7853e6da6de Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 18 Oct 2021 18:05:47 -0400 Subject: [PATCH 034/115] Removing unused classes and reducing class changes --- MekHQ/src/mekhq/MekHqXmlUtil.java | 1 + MekHQ/src/mekhq/gui/dialog/DateChooser.java | 20 +++++----- .../mekhq/gui/dialog/NewCampaignDialog.java | 4 -- MekHQ/src/mekhq/gui/enums/DialogResult.java | 38 ------------------- .../panes/CompanyGenerationPersonnelPane.java | 25 ------------ .../gui/panes/CompanyGenerationUnitPane.java | 24 ------------ .../mekhq/gui/panes/PersonnelHiringPane.java | 22 ----------- 7 files changed, 11 insertions(+), 123 deletions(-) delete mode 100644 MekHQ/src/mekhq/gui/dialog/NewCampaignDialog.java delete mode 100644 MekHQ/src/mekhq/gui/enums/DialogResult.java delete mode 100644 MekHQ/src/mekhq/gui/panes/CompanyGenerationPersonnelPane.java delete mode 100644 MekHQ/src/mekhq/gui/panes/CompanyGenerationUnitPane.java delete mode 100644 MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java diff --git a/MekHQ/src/mekhq/MekHqXmlUtil.java b/MekHQ/src/mekhq/MekHqXmlUtil.java index 68f7985ea8..fb5df4d02e 100644 --- a/MekHQ/src/mekhq/MekHqXmlUtil.java +++ b/MekHQ/src/mekhq/MekHqXmlUtil.java @@ -441,6 +441,7 @@ private static String getMovementString(Tank e, int indentLvl) { * @return The generated string. */ private static String getTankCritString(Tank e, int indentLvl) { + String retVal = MekHqXmlUtil.indentStr(indentLvl) + ". - */ -package mekhq.gui.enums; - -public enum DialogResult { - //region Enum Declarations - CONFIRMED, - CANCELLED; - //endregion Enum Declarations - - //region Boolean Comparison Methods - public boolean isConfirmed() { - return this == CONFIRMED; - } - - public boolean isCancelled() { - return this == CANCELLED; - } - //endregion Boolean Comparison Methods -} diff --git a/MekHQ/src/mekhq/gui/panes/CompanyGenerationPersonnelPane.java b/MekHQ/src/mekhq/gui/panes/CompanyGenerationPersonnelPane.java deleted file mode 100644 index 73653489ca..0000000000 --- a/MekHQ/src/mekhq/gui/panes/CompanyGenerationPersonnelPane.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.panes; - -import javax.swing.*; - -public class CompanyGenerationPersonnelPane extends JScrollPane { - -} diff --git a/MekHQ/src/mekhq/gui/panes/CompanyGenerationUnitPane.java b/MekHQ/src/mekhq/gui/panes/CompanyGenerationUnitPane.java deleted file mode 100644 index ec7538bc39..0000000000 --- a/MekHQ/src/mekhq/gui/panes/CompanyGenerationUnitPane.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.panes; - -import javax.swing.*; - -public class CompanyGenerationUnitPane extends JScrollPane { -} diff --git a/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java b/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java deleted file mode 100644 index 8a1497b167..0000000000 --- a/MekHQ/src/mekhq/gui/panes/PersonnelHiringPane.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.panes; - -public class PersonnelHiringPane { -} From bf35926f5e2433a8378de8b63c53c5ac5dcc3cce Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 18 Oct 2021 18:18:11 -0400 Subject: [PATCH 035/115] Removing GUI components not required for phase 2 --- .../gui/enums/CompanyGenerationPanelType.java | 78 ---- .../panels/PersonnelHiringDetailPanel.java | 410 ------------------ .../renderers/PersonnelHiringRenderer.java | 245 ----------- 3 files changed, 733 deletions(-) delete mode 100644 MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java delete mode 100644 MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java delete mode 100644 MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java diff --git a/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java b/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java deleted file mode 100644 index 8d640aae25..0000000000 --- a/MekHQ/src/mekhq/gui/enums/CompanyGenerationPanelType.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.enums; - -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; - -public enum CompanyGenerationPanelType { - OPTIONS, - PERSONNEL, - UNITS, - UNIT, - SPARES, - CONTRACTS, - FINANCES, - OVERVIEW; - - public CompanyGenerationPanelType getNextPanelType(final CompanyGenerationOptions options) { - switch (this) { - case OPTIONS: - return PERSONNEL; - case PERSONNEL: - return UNITS; - case UNITS: - return UNIT; - case UNIT: - return SPARES; - case SPARES: - return options.isSelectStartingContract() ? CONTRACTS - : (options.isRandomizeStartingCash() || options.isPayForSetup()) ? FINANCES - : OVERVIEW; - case CONTRACTS: - return (options.isRandomizeStartingCash() || options.isPayForSetup()) ? FINANCES - : OVERVIEW; - case FINANCES: - case OVERVIEW: - default: - return OVERVIEW; - } - } - - public CompanyGenerationPanelType getPreviousPanelType(final CompanyGenerationOptions options) { - switch (this) { - case OPTIONS: - case PERSONNEL: - return OPTIONS; - case UNITS: - return PERSONNEL; - case UNIT: - return UNITS; - case SPARES: - return UNIT; - case CONTRACTS: - return SPARES; - case FINANCES: - return options.isSelectStartingContract() ? CONTRACTS : SPARES; - case OVERVIEW: - default: - return (options.isRandomizeStartingCash() || options.isPayForSetup()) ? FINANCES - : options.isSelectStartingContract() ? CONTRACTS : SPARES; - } - } -} diff --git a/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java b/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java deleted file mode 100644 index fdabc4fb96..0000000000 --- a/MekHQ/src/mekhq/gui/panels/PersonnelHiringDetailPanel.java +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.panels; - -import megamek.common.annotations.Nullable; -import megamek.common.icons.Portrait; -import megamek.common.options.IOption; -import megamek.common.options.PilotOptions; -import megamek.common.util.EncodeControl; -import mekhq.Utilities; -import mekhq.campaign.Campaign; -import mekhq.campaign.personnel.Person; -import mekhq.campaign.personnel.Skill; -import mekhq.campaign.personnel.enums.GenderDescriptors; -import mekhq.campaign.universe.PlanetarySystem; -import mekhq.gui.CampaignGUI; -import mekhq.gui.GuiTabType; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.Enumeration; -import java.util.ResourceBundle; - -public class PersonnelHiringDetailPanel extends JPanel { - //region Variable Declarations - private final CampaignGUI gui; - private final Campaign campaign; - private Person person; - - private JLabel lblPortrait; - private JLabel lblPrimaryRole; - private JLabel lblGender; - private JLabel lblBirthday; - private JLabel lblOrigin; - private JLabel lblCallsign; - private JPanel skillsPanel; - private JPanel abilitiesPanel; - private JPanel implantsPanel; - private JLabel lblEdge; - private JLabel lblToughness; - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); - //endregion Variable Declarations - - //region Constructors - public PersonnelHiringDetailPanel(final @Nullable CampaignGUI gui, final Campaign campaign, - final @Nullable Person person, final boolean showOrigin) { - this.gui = gui; - this.campaign = campaign; - setPerson(person); - initialize(showOrigin); - updateValues(); - } - //endregion Constructors - - //region Getters/Setters - public @Nullable CampaignGUI getGUI() { - return gui; - } - - public Campaign getCampaign() { - return campaign; - } - - public @Nullable Person getPerson() { - return person; - } - - public void setPerson(final @Nullable Person person) { - this.person = person; - } - - public JLabel getLblPortrait() { - return lblPortrait; - } - - public void setLblPortrait(final JLabel lblPortrait) { - this.lblPortrait = lblPortrait; - } - - public JLabel getLblPrimaryRole() { - return lblPrimaryRole; - } - - public void setLblPrimaryRole(final JLabel lblPrimaryRole) { - this.lblPrimaryRole = lblPrimaryRole; - } - - public JLabel getLblGender() { - return lblGender; - } - - public void setLblGender(final JLabel lblGender) { - this.lblGender = lblGender; - } - - public JLabel getLblBirthday() { - return lblBirthday; - } - - public void setLblBirthday(final JLabel lblBirthday) { - this.lblBirthday = lblBirthday; - } - - public JLabel getLblOrigin() { - return lblOrigin; - } - - public void setLblOrigin(final JLabel lblOrigin) { - this.lblOrigin = lblOrigin; - } - - public JLabel getLblCallsign() { - return lblCallsign; - } - - public void setLblCallsign(final JLabel lblCallsign) { - this.lblCallsign = lblCallsign; - } - - public JPanel getSkillsPanel() { - return skillsPanel; - } - - public void setSkillsPanel(final JPanel skillsPanel) { - this.skillsPanel = skillsPanel; - } - - public JPanel getAbilitiesPanel() { - return abilitiesPanel; - } - - public void setAbilitiesPanel(final JPanel abilitiesPanel) { - this.abilitiesPanel = abilitiesPanel; - } - - public JPanel getImplantsPanel() { - return implantsPanel; - } - - public void setImplantsPanel(final JPanel implantsPanel) { - this.implantsPanel = implantsPanel; - } - - public JLabel getLblEdge() { - return lblEdge; - } - - public void setLblEdge(final JLabel lblEdge) { - this.lblEdge = lblEdge; - } - - public JLabel getLblToughness() { - return lblToughness; - } - - public void setLblToughness(final JLabel lblToughness) { - this.lblToughness = lblToughness; - } - //endregion Getters/Setters - - //region Initialization - private void initialize(final boolean showOrigin) { - // Create Panel Components - setLblPortrait(new JLabel(((getPerson() == null) ? new Portrait() : getPerson().getPortrait()) - .getImageIcon(150), SwingConstants.CENTER)); - getLblPortrait().setName("lblPortrait"); - - setLblPrimaryRole(new JLabel()); - getLblPrimaryRole().setName("lblPrimaryRole"); - - setLblGender(new JLabel()); - getLblGender().setName("lblGender"); - - setLblBirthday(new JLabel()); - getLblBirthday().setName("lblBirthday"); - - setLblOrigin(new JLabel()); - getLblOrigin().setName("lblOrigin"); - getLblOrigin().setVisible(showOrigin); - - setLblCallsign(new JLabel()); - getLblCallsign().setName("lblCallsign"); - - setSkillsPanel(new JPanel()); - getSkillsPanel().setBorder(BorderFactory.createTitledBorder(resources.getString("skillsPanel.title"))); - getSkillsPanel().setName("skillsPanel"); - - setAbilitiesPanel(new JPanel()); - getAbilitiesPanel().setBorder(BorderFactory.createTitledBorder(resources.getString("abilitiesPanel.title"))); - getAbilitiesPanel().setName("abilitiesPanel"); - getAbilitiesPanel().setVisible(getCampaign().getCampaignOptions().useAbilities()); - - setImplantsPanel(new JPanel()); - getImplantsPanel().setBorder(BorderFactory.createTitledBorder(resources.getString("implantsPanel.title"))); - getImplantsPanel().setName("implantsPanel"); - getImplantsPanel().setVisible(getCampaign().getCampaignOptions().useImplants()); - - setLblEdge(new JLabel()); - getLblEdge().setName("lblEdge"); - getLblEdge().setEnabled(getCampaign().getCampaignOptions().useEdge()); - - setLblToughness(new JLabel()); - getLblToughness().setName("lblToughness"); - getLblToughness().setEnabled(getCampaign().getCampaignOptions().useToughness()); - - // Layout the UI - setBorder(BorderFactory.createTitledBorder("")); - setName("personnelHiringDetailPanel"); - GroupLayout layout = new GroupLayout(this); - setLayout(layout); - - layout.setAutoCreateGaps(true); - layout.setAutoCreateContainerGaps(true); - - layout.setVerticalGroup( - layout.createSequentialGroup() - .addComponent(getLblPortrait()) - .addComponent(getLblPrimaryRole()) - .addComponent(getLblGender()) - .addComponent(getLblBirthday()) - .addComponent(getLblOrigin()) - .addComponent(getLblCallsign()) - .addComponent(getSkillsPanel()) - .addComponent(getAbilitiesPanel()) - .addComponent(getImplantsPanel()) - .addComponent(getLblEdge()) - .addComponent(getLblToughness()) - ); - - layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) - .addComponent(getLblPortrait()) - .addComponent(getLblPrimaryRole()) - .addComponent(getLblGender()) - .addComponent(getLblBirthday()) - .addComponent(getLblOrigin()) - .addComponent(getLblCallsign()) - .addComponent(getSkillsPanel()) - .addComponent(getAbilitiesPanel()) - .addComponent(getImplantsPanel()) - .addComponent(getLblEdge()) - .addComponent(getLblToughness()) - ); - } - //endregion Initialization - - //region Update Values - public void updateValues() { - if (getPerson() == null) { - return; - } - - setBorder(BorderFactory.createTitledBorder(getPerson().getFullTitle())); - - if (!getPerson().getPortrait().toString().equals(getLblPortrait().getToolTipText())) { - getLblPortrait().setIcon(getPerson().getPortrait().getImageIcon(150)); - getLblPortrait().setToolTipText(getPerson().getPortrait().toString()); - } - - getLblPrimaryRole().setText(getPerson().getPrimaryRole().getName(getPerson().isClanner())); - - getLblGender().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblGender.text"), - GenderDescriptors.MALE_FEMALE.getDescriptorCapitalized(getPerson().getGender()))); - - getLblBirthday().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblBirthday.text"), - getPerson().getBirthday(), getPerson().getAge(getCampaign().getLocalDate()))); - - if (getLblOrigin().isVisible()) { - getLblOrigin().setText((getPerson().getOriginPlanet() == null) - ? String.format(resources.getString("PersonnelHiringDetailPanel.lblOrigin.text"), - getPerson().getOriginFaction().getFullName(getCampaign().getGameYear())) - : String.format(resources.getString("PersonnelHiringDetailPanel.lblOrigin.Planet.text"), - getPerson().getOriginPlanet().getName(getCampaign().getLocalDate()), - getPerson().getOriginFaction().getFullName(getCampaign().getGameYear()))); - if ((getGUI() != null) && (getPerson() != null) && (getPerson().getOriginPlanet() != null)) { - getLblOrigin().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - getLblOrigin().addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(final MouseEvent e) { - final PlanetarySystem system = getPerson().getOriginPlanet().getParentSystem(); - // Stay on the interstellar map if their origin planet is the primary planet... - if (system.getPrimaryPlanet().equals(getPerson().getOriginPlanet())) { - getGUI().getMapTab().switchSystemsMap(system); - } else { - // ... otherwise, dive on in to the system view! - getGUI().getMapTab().switchPlanetaryMap(getPerson().getOriginPlanet()); - } - getGUI().setSelectedTab(GuiTabType.MAP); - } - }); - } - } - - if (!"-".equals(getPerson().getCallsign()) && !getPerson().getCallsign().isBlank()) { - getLblCallsign().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblCallsign.text"), getPerson().getCallsign())); - getLblCallsign().setVisible(true); - } else { - getLblCallsign().setVisible(false); - } - - recreateSkillsPanel(); - - if (getCampaign().getCampaignOptions().useAbilities()) { - recreateAbilitiesPanel(); - } - - if (getCampaign().getCampaignOptions().useImplants()) { - recreateImplantsPanel(); - } - - if (getLblEdge().isEnabled() && (getPerson().getEdge() > 0)) { - getLblEdge().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblEdge.text"), getPerson().getEdge())); - getLblEdge().setVisible(true); - } else { - getLblEdge().setVisible(false); - } - - if (getLblToughness().isEnabled() && (getPerson().getToughness() > 0)) { - getLblToughness().setText(String.format(resources.getString("PersonnelHiringDetailPanel.lblToughness.text"), getPerson().getToughness())); - getLblToughness().setVisible(true); - } else { - getLblToughness().setVisible(false); - } - } - - private void recreateSkillsPanel() { - getSkillsPanel().removeAll(); - - getSkillsPanel().setLayout(new GridLayout(0, 2)); - - for (final Skill skill : getPerson().getSkills().getSkills()) { - final String labelName = "lbl" + skill.getType().getName(); - JLabel lblSkillName = new JLabel(skill.getType().getName() + ":"); - lblSkillName.setName(labelName + "Name"); - getSkillsPanel().add(lblSkillName); - - JLabel lblSkillValue = new JLabel(skill.toString()); - lblSkillValue.setName(labelName + "Value"); - getSkillsPanel().add(lblSkillValue); - - lblSkillName.setLabelFor(lblSkillValue); - } - } - - private void recreateAbilitiesPanel() { - getAbilitiesPanel().removeAll(); - - if (getPerson().countOptions(PilotOptions.LVL3_ADVANTAGES) == 0) { - getAbilitiesPanel().setVisible(false); - return; - } - - getAbilitiesPanel().setLayout(new GridLayout(0, 1)); - getAbilitiesPanel().setVisible(true); - - for (Enumeration i = getPerson().getOptions(PilotOptions.LVL3_ADVANTAGES); i.hasMoreElements();) { - final IOption option = i.nextElement(); - - if (option.booleanValue()) { - JLabel lblAbilities = new JLabel(Utilities.getOptionDisplayName(option)); - lblAbilities.setToolTipText(option.getDescription()); - lblAbilities.setName("lblAbilities" + option.getName()); - getAbilitiesPanel().add(lblAbilities); - } - } - } - - private void recreateImplantsPanel() { - getImplantsPanel().removeAll(); - - if (getPerson().countOptions(PilotOptions.MD_ADVANTAGES) == 0) { - getImplantsPanel().setVisible(false); - return; - } - - getImplantsPanel().setLayout(new GridLayout(0, 1)); - getImplantsPanel().setVisible(true); - - for (Enumeration i = getPerson().getOptions(PilotOptions.MD_ADVANTAGES); i.hasMoreElements();) { - IOption option = i.nextElement(); - - if (option.booleanValue()) { - JLabel lblImplant = new JLabel(Utilities.getOptionDisplayName(option)); - lblImplant.setToolTipText(option.getDescription()); - lblImplant.setName("lblImplant" + option.getName()); - getImplantsPanel().add(lblImplant); - } - } - } - //endregion Update Values -} diff --git a/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java b/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java deleted file mode 100644 index 870cc0232c..0000000000 --- a/MekHQ/src/mekhq/gui/renderers/PersonnelHiringRenderer.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.gui.renderers; - -import megamek.client.generator.RandomCallsignGenerator; -import megamek.client.generator.RandomNameGenerator; -import megamek.client.ui.dialogs.AbstractIconChooserDialog; -import megamek.client.ui.dialogs.PortraitChooserDialog; -import megamek.common.annotations.Nullable; -import megamek.common.enums.Gender; -import megamek.common.util.EncodeControl; -import mekhq.campaign.Campaign; -import mekhq.campaign.personnel.Person; -import mekhq.gui.CampaignGUI; -import mekhq.gui.dialog.CustomizePersonDialog; -import mekhq.gui.panels.PersonnelHiringDetailPanel; - -import javax.swing.*; -import java.awt.*; -import java.util.ResourceBundle; - -public class PersonnelHiringRenderer extends JPanel implements ListCellRenderer { - //region Variable Declarations - private final JFrame frame; - private PersonnelHiringDetailPanel personnelHiringDetailPanel; - private JButton btnRandomName; - private JButton btnRandomPortrait; - private JButton btnRandomOrigin; - private JButton btnRandomCallsign; - private JButton btnChoosePortrait; - private JButton btnEditPerson; - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); - //endregion Variable Declarations - - //region Constructors - public PersonnelHiringRenderer(final JFrame frame, final @Nullable CampaignGUI gui, - final Campaign campaign, final boolean gm) { - this.frame = frame; - initialize(gui, campaign, gm); - } - //endregion Constructors - - //region Getters/Setters - public JFrame getFrame() { - return frame; - } - - public PersonnelHiringDetailPanel getPersonnelHiringDetailPanel() { - return personnelHiringDetailPanel; - } - - public void setPersonnelHiringDetailPanel(final PersonnelHiringDetailPanel personnelHiringDetailPanel) { - this.personnelHiringDetailPanel = personnelHiringDetailPanel; - } - - public JButton getBtnRandomName() { - return btnRandomName; - } - - public void setBtnRandomName(final JButton btnRandomName) { - this.btnRandomName = btnRandomName; - } - - public JButton getBtnRandomPortrait() { - return btnRandomPortrait; - } - - public void setBtnRandomPortrait(final JButton btnRandomPortrait) { - this.btnRandomPortrait = btnRandomPortrait; - } - - public JButton getBtnRandomOrigin() { - return btnRandomOrigin; - } - - public void setBtnRandomOrigin(final JButton btnRandomOrigin) { - this.btnRandomOrigin = btnRandomOrigin; - } - - public JButton getBtnRandomCallsign() { - return btnRandomCallsign; - } - - public void setBtnRandomCallsign(final JButton btnRandomCallsign) { - this.btnRandomCallsign = btnRandomCallsign; - } - - public JButton getBtnChoosePortrait() { - return btnChoosePortrait; - } - - public void setBtnChoosePortrait(final JButton btnChoosePortrait) { - this.btnChoosePortrait = btnChoosePortrait; - } - - public JButton getBtnEditPerson() { - return btnEditPerson; - } - - public void setBtnEditPerson(final JButton btnEditPerson) { - this.btnEditPerson = btnEditPerson; - } - //endregion Getters/Setters - - //region Initialization - private void initialize(final @Nullable CampaignGUI gui, final Campaign campaign, final boolean gm) { - setPersonnelHiringDetailPanel(new PersonnelHiringDetailPanel(gui, campaign, null, true)); - - setBtnRandomName(new JButton(resources.getString("btnRandomName.text"))); - getBtnRandomName().setToolTipText(resources.getString("btnRandomName.toolTipText")); - getBtnRandomName().setName("btnRandomName"); - getBtnRandomName().addActionListener(evt -> { - final Person person = getPersonnelHiringDetailPanel().getPerson(); - if (person == null) { - return; - } - String factionCode = campaign.getCampaignOptions().useOriginFactionForNames() - ? person.getOriginFaction().getShortName() - : RandomNameGenerator.getInstance().getChosenFaction(); - String[] name = RandomNameGenerator.getInstance().generateGivenNameSurnameSplit( - person.getGender(), person.isClanner(), factionCode); - person.setGivenName(name[0]); - person.setSurname(name[1]); - getPersonnelHiringDetailPanel().updateValues(); - }); - - setBtnRandomPortrait(new JButton(resources.getString("btnRandomPortrait.text"))); - getBtnRandomPortrait().setToolTipText(resources.getString("btnRandomPortrait.toolTipText")); - getBtnRandomPortrait().setName("btnRandomPortrait"); - getBtnRandomPortrait().addActionListener(evt -> { - final Person person = getPersonnelHiringDetailPanel().getPerson(); - if (person != null) { - campaign.assignRandomPortraitFor(person); - getPersonnelHiringDetailPanel().updateValues(); - } - }); - - setBtnRandomOrigin(new JButton(resources.getString("btnRandomOrigin.text"))); - getBtnRandomOrigin().setToolTipText(resources.getString("btnRandomOrigin.toolTipText")); - getBtnRandomOrigin().setName("btnRandomOrigin"); - getBtnRandomOrigin().addActionListener(evt -> { - final Person person = getPersonnelHiringDetailPanel().getPerson(); - if (person != null) { - campaign.assignRandomOriginFor(person); - getPersonnelHiringDetailPanel().updateValues(); - } - }); - - setBtnRandomCallsign(new JButton(resources.getString("btnRandomCallsign.text"))); - getBtnRandomCallsign().setToolTipText(resources.getString("btnRandomCallsign.toolTipText")); - getBtnRandomCallsign().setName("btnRandomCallsign"); - getBtnRandomCallsign().addActionListener(evt -> { - final Person person = getPersonnelHiringDetailPanel().getPerson(); - if (person != null) { - person.setCallsign(RandomCallsignGenerator.getInstance().generate()); - getPersonnelHiringDetailPanel().updateValues(); - } - }); - - setBtnChoosePortrait(new JButton(resources.getString("btnChoosePortrait.text"))); - getBtnChoosePortrait().setToolTipText(resources.getString("btnChoosePortrait.toolTipText")); - getBtnChoosePortrait().setName("btnChoosePortrait"); - getBtnChoosePortrait().addActionListener(evt -> { - final Person person = getPersonnelHiringDetailPanel().getPerson(); - if (person == null) { - return; - } - final PortraitChooserDialog portraitDialog = new PortraitChooserDialog(getFrame(), person.getPortrait()); - if (portraitDialog.showDialog().isConfirmed() && (portraitDialog.getSelectedItem() != null)) { - person.setPortrait(portraitDialog.getSelectedItem()); - getPersonnelHiringDetailPanel().updateValues(); - } - }); - - if (gm) { - setBtnEditPerson(new JButton(resources.getString("btnEditPerson.text"))); - getBtnEditPerson().setToolTipText(resources.getString("btnEditPerson.toolTipText")); - getBtnEditPerson().setName("btnEditPerson"); - getBtnEditPerson().addActionListener(evt -> { - final Person person = getPersonnelHiringDetailPanel().getPerson(); - if (person == null) { - return; - } - final Gender gender = person.getGender(); - new CustomizePersonDialog(getFrame(), true, person, campaign).setVisible(true); - if (gender != person.getGender()) { - campaign.assignRandomPortraitFor(person); - } - getPersonnelHiringDetailPanel().updateValues(); - }); - } - } - //endregion Initialization - - @Override - public Component getListCellRendererComponent(final JList list, - final Person value, final int index, - final boolean isSelected, - final boolean cellHasFocus) { - // JTextArea::setForeground and JTextArea::setBackground don't work properly with the default - // return, but by recreating the colour it works properly - final Color foreground = new Color(UIManager.getColor(isSelected - ? "Table.selectionForeground" : "Table.foreground").getRGB()); - final Color background = new Color(UIManager.getColor(isSelected - ? "Table.selectionBackground" : "Table.background").getRGB()); - setForeground(foreground); - setBackground(background); - /* - getDescription().setForeground(foreground); - getDescription().setBackground(background); - - getLblTitle().setText(value.getTitle()); - getDescription().setText(value.getDescription()); - */ - - return this; - } - - @Override - public Dimension getMinimumSize() { - return new Dimension(300, 100); - } - - @Override - public Dimension getPreferredSize() { - return new Dimension(400, 120); - } -} From 4e2d3bcb93cfed5fbe353f3424d9573dd5638a20 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Mon, 18 Oct 2021 18:33:19 -0400 Subject: [PATCH 036/115] Removing the last of the future GUI code --- .../resources/mekhq/resources/GUI.properties | 44 +---------------- .../gui/dialog/CompanyGenerationDialog.java | 48 +------------------ 2 files changed, 3 insertions(+), 89 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index deb5a2ff97..b9acc2f549 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -304,8 +304,6 @@ btnNewQuinquennial.toolTipText=Advance to the first day of the next quinquennial btnNewDecade.text=New Decade btnNewDecade.toolTipText=Advance to the first day of the next decade (e.g. 01-JAN-3030, 01-JAN-3040) - - ### CampaignPresetSelectionDialog Class CampaignPresetSelectionDialog.title=Select Campaign Preset @@ -374,9 +372,6 @@ CustomRankSystemCreationDialog.BlankRankSystemCode.text=The entered rank system CustomRankSystemCreationDialog.BlankRankSystemName.text=The entered rank system name cannot be blank. CustomRankSystemCreationDialog.DuplicateCode.text=The entered rank system code cannot duplicate an existing code, as all rank systems must have a unique system code. -### DateSelectionDialog Class -DateSelectionDialog.title=Select Date - ### GMToolsDialog Class GMToolsDialog.title=GM Tools ## General Tab @@ -643,7 +638,7 @@ UnitMarketTableModel.columnNames=Market,Type,Weight Class,Unit,Price,Percent,Del -#### Panels +##### Panels #### CampaignPresetPanel Class btnEditPreset.toolTipText=Edit the selected preset, which allows you to make changes to it and overwrite the current saved preset. @@ -802,24 +797,6 @@ CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text=The specified num CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.title=Under Half Maximum Support Personnel CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.text=The specified number of support personnel to generate is under half the recommended maximum number of support personnel. Select "Ok" to continue, or "Cancel" to make changes to these Company Generation Options. -### CompanyGenerationPanel Class -CompanyGenerationPanel.ImmediateApplicationWarning.title=Immediately Apply? -CompanyGenerationPanel.ImmediateApplicationWarning.text=Confirm immediate generation and application to campaign? -CompanyGenerationPanel.StartupNag.title=Company Generator Information -CompanyGenerationPanel.StartupNag.text=The Company Generator is an automated and expanded version of AtB company generation rules, expanded to handle a complete MekHQ setup.
All options override any specified in Campaign Options. This means that otherwise illegal decisions may be made based on the options selected in this generator.
The default settings are recommended for initial use, while options are provided to customize the generated company. - -### PersonnelHiringDetailPanel Class -PersonnelHiringDetailPanel.lblGender.text=Gender: %s -PersonnelHiringDetailPanel.lblBirthday.text=Birthday: %s (%s) -PersonnelHiringDetailPanel.lblOrigin.text=Origin: %s -PersonnelHiringDetailPanel.lblOrigin.Planet.text=Origin: %s (%s) -PersonnelHiringDetailPanel.lblCallsign.text=Callsign: %s -skillsPanel.title=Skills -abilitiesPanel.title=Abilities -implantsPanel.title=Implants -PersonnelHiringDetailPanel.lblEdge.text=Edge: %s -PersonnelHiringDetailPanel.lblToughness.text=Toughness: %s - ##### Panes @@ -869,22 +846,3 @@ UnitMarketPane.UnitDeliveryLength.report=Unit will be delive ### Financial Statements UnitMarketPane.PurchasedUnit.finances=Purchased %s UnitMarketPane.PurchasedUnitBlackMarketSwindled.finances=Purchased %s (lost on black market) - - - -#### Renderers -### PersonnelHiringRenderer -btnRandomName.text=Randomize Name -btnRandomName.toolTipText=Generates a random name for the person. -btnRandomPortrait.text=Randomize Portrait -btnRandomPortrait.toolTipText=Generates a new random portrait for the person, if possible. -btnRandomOrigin.text=Randomize Origin -btnRandomOrigin.toolTipText=Generates a random origin faction and planet for the person. -btnRandomCallsign.text=Randomize Callsign -btnRandomCallsign.toolTipText=Generates a random callsign for the person. -btnChoosePortrait.text=Choose Portrait -btnChoosePortrait.toolTipText=Manually select the portrait for the current person. -btnEditPerson.text=Edit Person -btnEditPerson.toolTipText=Edit the current person. This functionality is GM-restricted. -btnRandomizePerson.text=Randomize Person -btnRandomizePerson.toolTipText=Generates a new person using the supplied parameters. This functionality is GM-restricted. diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index f9454ee60a..dedab3dec9 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -30,7 +30,6 @@ import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationPersonTracker; import mekhq.gui.baseComponents.AbstractMHQButtonDialog; -import mekhq.gui.enums.CompanyGenerationPanelType; import mekhq.gui.panels.CompanyGenerationOptionsPanel; import javax.swing.*; @@ -40,7 +39,6 @@ public class CompanyGenerationDialog extends AbstractMHQButtonDialog { //region Variable Declarations private Campaign campaign; - private CompanyGenerationPanelType currentPanelType; private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; //endregion Variable Declarations @@ -48,7 +46,6 @@ public class CompanyGenerationDialog extends AbstractMHQButtonDialog { public CompanyGenerationDialog(final JFrame frame, final Campaign campaign) { super(frame, "CompanyGenerationDialog", "CompanyGenerationDialog.title"); setCampaign(campaign); - setCurrentPanelType(CompanyGenerationPanelType.OPTIONS); initialize(); } //endregion Constructors @@ -62,14 +59,6 @@ public void setCampaign(final Campaign campaign) { this.campaign = campaign; } - public CompanyGenerationPanelType getCurrentPanelType() { - return currentPanelType; - } - - public void setCurrentPanelType(final CompanyGenerationPanelType currentPanelType) { - this.currentPanelType = currentPanelType; - } - public CompanyGenerationOptionsPanel getCompanyGenerationOptionsPanel() { return companyGenerationOptionsPanel; } @@ -80,47 +69,14 @@ public void setCompanyGenerationOptionsPanel(final CompanyGenerationOptionsPanel //endregion Getters/Setters //region Initialization - /** - * @return the center pane - */ @Override protected Container createCenterPane() { - switch (getCurrentPanelType()) { - case PERSONNEL: - case UNITS: - case UNIT: - case SPARES: - case CONTRACTS: - case FINANCES: - case OVERVIEW: - case OPTIONS: - default: - return new JScrollPane(initializeCompanyGenerationOptionsPanel(getCampaign())); - } - } - - private JPanel initializeCompanyGenerationOptionsPanel(final Campaign campaign) { - setCompanyGenerationOptionsPanel(new CompanyGenerationOptionsPanel(getFrame(), campaign)); - return getCompanyGenerationOptionsPanel(); + setCompanyGenerationOptionsPanel(new CompanyGenerationOptionsPanel(getFrame(), getCampaign())); + return new JScrollPane(getCompanyGenerationOptionsPanel()); } @Override protected JPanel createButtonPanel() { - switch (getCurrentPanelType()) { - case PERSONNEL: - case UNITS: - case UNIT: - case SPARES: - case CONTRACTS: - case FINANCES: - case OVERVIEW: - case OPTIONS: - default: - return initializeCompanyGenerationOptionsButtonPanel(); - } - } - - private JPanel initializeCompanyGenerationOptionsButtonPanel() { JPanel panel = new JPanel(new GridLayout(2, 3)); JButton cancelButton = new JButton(resources.getString("Cancel.text")); From efdb274ef5d3e9c361c8b4e76b075d843ea743b5 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Tue, 19 Oct 2021 18:54:30 -0400 Subject: [PATCH 037/115] Modernizing the universe enums and expanding on missing values --- .../mekhq/resources/Universe.properties | 51 +++++- .../campaign/universe/enums/Alphabet.java | 169 +++++++++++++++--- .../enums/CompanyGenerationMethod.java | 7 +- .../enums/CompanyGenerationPersonType.java | 48 ++++- .../universe/enums/ForceNamingMethod.java | 24 ++- .../universe/enums/MysteryBoxType.java | 37 +++- .../universe/enums/PartGenerationMethod.java | 29 ++- 7 files changed, 311 insertions(+), 54 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 0cce94c00a..2ee821dfa7 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -56,6 +56,32 @@ Alphabets.W.icao1956.text=Whiskey Alphabets.X.icao1956.text=Xray Alphabets.Y.icao1956.text=Yankee Alphabets.Z.icao1956.text=Zulu +Alphabets.A.english.text=A +Alphabets.B.english.text=B +Alphabets.C.english.text=C +Alphabets.D.english.text=D +Alphabets.E.english.text=E +Alphabets.F.english.text=F +Alphabets.G.english.text=G +Alphabets.H.english.text=H +Alphabets.I.english.text=I +Alphabets.J.english.text=J +Alphabets.K.english.text=K +Alphabets.L.english.text=L +Alphabets.M.english.text=M +Alphabets.N.english.text=N +Alphabets.O.english.text=O +Alphabets.P.english.text=P +Alphabets.Q.english.text=Q +Alphabets.R.english.text=R +Alphabets.S.english.text=S +Alphabets.T.english.text=T +Alphabets.U.english.text=U +Alphabets.V.english.text=V +Alphabets.W.english.text=W +Alphabets.X.english.text=X +Alphabets.Y.english.text=Y +Alphabets.Z.english.text=Z Alphabets.A.greek.text=Alpha Alphabets.B.greek.text=Beta Alphabets.C.greek.text=Gamma @@ -87,15 +113,32 @@ Alphabets.Z.greek.text=Dio CompanyGenerationMethod.AGAINST_THE_BOT.text=AtB CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the AtB rules to generate a mercenary company. CompanyGenerationMethod.WINDCHILD.text=Windchild -CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that ensures all personnel have units and creates a heavier force. +CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that ensures all personnel have units, creates a heavier force, and .
The 'Mech weight class and quality rolls are also modified, with + +# CompanyGenerationPersonType Enum +CompanyGenerationPersonType.COMPANY_COMMANDER.text=Company Commander +CompanyGenerationPersonType.COMPANY_COMMANDER.toolTipText=They are the person who leads the entire Mercenary company. +CompanyGenerationPersonType.CAPTAIN.text=Captain +CompanyGenerationPersonType.CAPTAIN.toolTipText=They lead a BattleMech company from their BattleMech. +CompanyGenerationPersonType.LIEUTENANT.text=Lieutenant +CompanyGenerationPersonType.LIEUTENANT.toolTipText=They lead a BattleMech lance from their BattleMech. +CompanyGenerationPersonType.MECHWARRIOR.text=MechWarrior +CompanyGenerationPersonType.MECHWARRIOR.toolTipText=They pilot a BattleMech. +CompanyGenerationPersonType.SUPPORT.text=Support +CompanyGenerationPersonType.SUPPORT.toolTipText=They are one of the primary support personnel (techs, doctors, or administrators) for the Mercenary company. +CompanyGenerationPersonType.ASSISTANT.text=Assistant +CompanyGenerationPersonType.ASSISTANT.toolTipText=They assist one of the primary support personnel as a Medic or Astech. + # ForceNamingMethod Enum ForceNamingMethod.CCB_1943.text=CCB (1943) -ForceNamingMethod.CCB_1943.toolTipText=This generates names using the Combined Communications Board's WW2 calling alphabet as settled upon in 1943. Produces names like "Able Lance", "Charlie Company", and "Easy Company". +ForceNamingMethod.CCB_1943.toolTipText=This generates names using the Combined Communications Board's WW2 calling alphabet as settled upon in 1943.
Produces names like "Able Lance", "Charlie Company", and "Easy Company". ForceNamingMethod.ICAO_1956.text=ICAO (1956) -ForceNamingMethod.ICAO_1956.toolTipText=This generates names using the International Radiotelephony Spelling Alphabet, also known as the NATO phonetic alphabet. Produces names like "Bravo Lance", "Charlie Company", and "Hotel Lance" +ForceNamingMethod.ICAO_1956.toolTipText=This generates names using the International Radiotelephony Spelling Alphabet, also known as the NATO phonetic alphabet.
Produces names like "Bravo Lance", "Charlie Company", and "Hotel Lance" +ForceNamingMethod.ENGLISH_ALPHABET.text=English Alphabet +ForceNamingMethod.ENGLISH_ALPHABET.toolTipText=This generates names using the English Alphabet.
Produces names like "A Lance", "V Company", and "X Lance". ForceNamingMethod.GREEK_ALPHABET.text=Greek Alphabet -ForceNamingMethod.GREEK_ALPHABET.toolTipText=This generates names using the Greek Alphabet, with one and two taking the place of the final two characters as Greek only has 24 characters. Produces names like "Alpha Lance", "Beta Company", and "Omega Lance". +ForceNamingMethod.GREEK_ALPHABET.toolTipText=This generates names using the Greek Alphabet, with one and two taking the place of the final two characters as Greek only has 24 characters.
Produces names like "Alpha Lance", "Beta Company", and "Omega Lance". # MysteryBoxType Enum MysteryBoxType.THIRD_SUCCESSION_WAR.text=Third Succession War Mystery Box diff --git a/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java b/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java index b94455536d..5bce3aaefe 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java @@ -24,46 +24,47 @@ public enum Alphabet { //region Enum Declarations - A("Alphabets.A.ccb1943.text", "Alphabets.A.icao1956.text", "Alphabets.A.greek.text"), - B("Alphabets.B.ccb1943.text", "Alphabets.B.icao1956.text", "Alphabets.B.greek.text"), - C("Alphabets.C.ccb1943.text", "Alphabets.C.icao1956.text", "Alphabets.C.greek.text"), - D("Alphabets.D.ccb1943.text", "Alphabets.D.icao1956.text", "Alphabets.D.greek.text"), - E("Alphabets.E.ccb1943.text", "Alphabets.E.icao1956.text", "Alphabets.E.greek.text"), - F("Alphabets.F.ccb1943.text", "Alphabets.F.icao1956.text", "Alphabets.F.greek.text"), - G("Alphabets.G.ccb1943.text", "Alphabets.G.icao1956.text", "Alphabets.G.greek.text"), - H("Alphabets.H.ccb1943.text", "Alphabets.H.icao1956.text", "Alphabets.H.greek.text"), - I("Alphabets.I.ccb1943.text", "Alphabets.I.icao1956.text", "Alphabets.I.greek.text"), - J("Alphabets.J.ccb1943.text", "Alphabets.J.icao1956.text", "Alphabets.J.greek.text"), - K("Alphabets.K.ccb1943.text", "Alphabets.K.icao1956.text", "Alphabets.K.greek.text"), - L("Alphabets.L.ccb1943.text", "Alphabets.L.icao1956.text", "Alphabets.L.greek.text"), - M("Alphabets.M.ccb1943.text", "Alphabets.M.icao1956.text", "Alphabets.M.greek.text"), - N("Alphabets.N.ccb1943.text", "Alphabets.N.icao1956.text", "Alphabets.N.greek.text"), - O("Alphabets.O.ccb1943.text", "Alphabets.O.icao1956.text", "Alphabets.O.greek.text"), - P("Alphabets.P.ccb1943.text", "Alphabets.P.icao1956.text", "Alphabets.P.greek.text"), - Q("Alphabets.Q.ccb1943.text", "Alphabets.Q.icao1956.text", "Alphabets.Q.greek.text"), - R("Alphabets.R.ccb1943.text", "Alphabets.R.icao1956.text", "Alphabets.R.greek.text"), - S("Alphabets.S.ccb1943.text", "Alphabets.S.icao1956.text", "Alphabets.S.greek.text"), - T("Alphabets.T.ccb1943.text", "Alphabets.T.icao1956.text", "Alphabets.T.greek.text"), - U("Alphabets.U.ccb1943.text", "Alphabets.U.icao1956.text", "Alphabets.U.greek.text"), - V("Alphabets.V.ccb1943.text", "Alphabets.V.icao1956.text", "Alphabets.V.greek.text"), - W("Alphabets.W.ccb1943.text", "Alphabets.W.icao1956.text", "Alphabets.W.greek.text"), - X("Alphabets.X.ccb1943.text", "Alphabets.X.icao1956.text", "Alphabets.X.greek.text"), - Y("Alphabets.Y.ccb1943.text", "Alphabets.Y.icao1956.text", "Alphabets.Y.greek.text"), - Z("Alphabets.Z.ccb1943.text", "Alphabets.Z.icao1956.text", "Alphabets.Z.greek.text"); + A("Alphabets.A.ccb1943.text", "Alphabets.A.icao1956.text", "Alphabets.A.english.text", "Alphabets.A.greek.text"), + B("Alphabets.B.ccb1943.text", "Alphabets.B.icao1956.text", "Alphabets.B.english.text", "Alphabets.B.greek.text"), + C("Alphabets.C.ccb1943.text", "Alphabets.C.icao1956.text", "Alphabets.C.english.text", "Alphabets.C.greek.text"), + D("Alphabets.D.ccb1943.text", "Alphabets.D.icao1956.text", "Alphabets.D.english.text", "Alphabets.D.greek.text"), + E("Alphabets.E.ccb1943.text", "Alphabets.E.icao1956.text", "Alphabets.E.english.text", "Alphabets.E.greek.text"), + F("Alphabets.F.ccb1943.text", "Alphabets.F.icao1956.text", "Alphabets.F.english.text", "Alphabets.F.greek.text"), + G("Alphabets.G.ccb1943.text", "Alphabets.G.icao1956.text", "Alphabets.G.english.text", "Alphabets.G.greek.text"), + H("Alphabets.H.ccb1943.text", "Alphabets.H.icao1956.text", "Alphabets.H.english.text", "Alphabets.H.greek.text"), + I("Alphabets.I.ccb1943.text", "Alphabets.I.icao1956.text", "Alphabets.I.english.text", "Alphabets.I.greek.text"), + J("Alphabets.J.ccb1943.text", "Alphabets.J.icao1956.text", "Alphabets.J.english.text", "Alphabets.J.greek.text"), + K("Alphabets.K.ccb1943.text", "Alphabets.K.icao1956.text", "Alphabets.K.english.text", "Alphabets.K.greek.text"), + L("Alphabets.L.ccb1943.text", "Alphabets.L.icao1956.text", "Alphabets.L.english.text", "Alphabets.L.greek.text"), + M("Alphabets.M.ccb1943.text", "Alphabets.M.icao1956.text", "Alphabets.M.english.text", "Alphabets.M.greek.text"), + N("Alphabets.N.ccb1943.text", "Alphabets.N.icao1956.text", "Alphabets.N.english.text", "Alphabets.N.greek.text"), + O("Alphabets.O.ccb1943.text", "Alphabets.O.icao1956.text", "Alphabets.O.english.text", "Alphabets.O.greek.text"), + P("Alphabets.P.ccb1943.text", "Alphabets.P.icao1956.text", "Alphabets.P.english.text", "Alphabets.P.greek.text"), + Q("Alphabets.Q.ccb1943.text", "Alphabets.Q.icao1956.text", "Alphabets.Q.english.text", "Alphabets.Q.greek.text"), + R("Alphabets.R.ccb1943.text", "Alphabets.R.icao1956.text", "Alphabets.R.english.text", "Alphabets.R.greek.text"), + S("Alphabets.S.ccb1943.text", "Alphabets.S.icao1956.text", "Alphabets.S.english.text", "Alphabets.S.greek.text"), + T("Alphabets.T.ccb1943.text", "Alphabets.T.icao1956.text", "Alphabets.T.english.text", "Alphabets.T.greek.text"), + U("Alphabets.U.ccb1943.text", "Alphabets.U.icao1956.text", "Alphabets.U.english.text", "Alphabets.U.greek.text"), + V("Alphabets.V.ccb1943.text", "Alphabets.V.icao1956.text", "Alphabets.V.english.text", "Alphabets.V.greek.text"), + W("Alphabets.W.ccb1943.text", "Alphabets.W.icao1956.text", "Alphabets.W.english.text", "Alphabets.W.greek.text"), + X("Alphabets.X.ccb1943.text", "Alphabets.X.icao1956.text", "Alphabets.X.english.text", "Alphabets.X.greek.text"), + Y("Alphabets.Y.ccb1943.text", "Alphabets.Y.icao1956.text", "Alphabets.Y.english.text", "Alphabets.Y.greek.text"), + Z("Alphabets.Z.ccb1943.text", "Alphabets.Z.icao1956.text", "Alphabets.Z.english.text", "Alphabets.Z.greek.text"); //endregion Enum Declarations //region Variable Declarations private final String ccb1943; // CCB 1943 Military Phonetic Alphabet private final String icao1956; // ICAO 1956 Military Phonetic Alphabet + private final String english; // English Alphabet private final String greek; // Greek Alphabet - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors - Alphabet(final String ccb1943, final String icao1956, final String greek) { + Alphabet(final String ccb1943, final String icao1956, final String english, final String greek) { + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); this.ccb1943 = resources.getString(ccb1943); this.icao1956 = resources.getString(icao1956); + this.english = resources.getString(english); this.greek = resources.getString(greek); } //endregion Constructors @@ -77,8 +78,118 @@ public String getICAO1956() { return icao1956; } + public String getEnglish() { + return english; + } + public String getGreek() { return greek; } //endregion Getters + + //region Boolean Comparison Methods + public boolean isA() { + return this == A; + } + + public boolean isB() { + return this == B; + } + + public boolean isC() { + return this == C; + } + + public boolean isD() { + return this == D; + } + + public boolean isE() { + return this == E; + } + + public boolean isF() { + return this == F; + } + + public boolean isG() { + return this == G; + } + + public boolean isH() { + return this == H; + } + + public boolean isI() { + return this == I; + } + + public boolean isJ() { + return this == J; + } + + public boolean isK() { + return this == K; + } + + public boolean isL() { + return this == L; + } + + public boolean isM() { + return this == M; + } + + public boolean isN() { + return this == N; + } + + public boolean isO() { + return this == O; + } + + public boolean isP() { + return this == P; + } + + public boolean isQ() { + return this == Q; + } + + public boolean isR() { + return this == R; + } + + public boolean isS() { + return this == S; + } + + public boolean isT() { + return this == T; + } + + public boolean isU() { + return this == U; + } + + public boolean isV() { + return this == V; + } + + public boolean isW() { + return this == W; + } + + public boolean isX() { + return this == X; + } + + public boolean isY() { + return this == Y; + } + + public boolean isZ() { + return this == Z; + } + //endregion Boolean Comparison Methods } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java index f00eaf1fd5..9399fdd89d 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java @@ -36,12 +36,11 @@ public enum CompanyGenerationMethod { //region Variable Declarations private final String name; private final String toolTipText; - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors CompanyGenerationMethod(final String name, final String toolTipText) { + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } @@ -53,7 +52,7 @@ public String getToolTipText() { } //endregion Getters - //region Boolean Comparisons + //region Boolean Comparison Methods public boolean isAtB() { return this == AGAINST_THE_BOT; } @@ -61,7 +60,7 @@ public boolean isAtB() { public boolean isWindchild() { return this == WINDCHILD; } - //endregion Boolean Comparisons + //endregion Boolean Comparison Methods public AbstractCompanyGenerator getGenerator(final Campaign campaign, final CompanyGenerationOptions options) { diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java index 4d7bf0aaec..b028453931 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java @@ -18,17 +18,40 @@ */ package mekhq.campaign.universe.enums; +import megamek.common.util.EncodeControl; + +import java.util.ResourceBundle; + public enum CompanyGenerationPersonType { //region Enum Declarations - COMPANY_COMMANDER, - CAPTAIN, - LIEUTENANT, - MECHWARRIOR, - SUPPORT, - ASSISTANT; + COMPANY_COMMANDER("CompanyGenerationPersonType.COMPANY_COMMANDER.text", "CompanyGenerationPersonType.COMPANY_COMMANDER.toolTipText"), + CAPTAIN("CompanyGenerationPersonType.CAPTAIN.text", "CompanyGenerationPersonType.CAPTAIN.toolTipText"), + LIEUTENANT("CompanyGenerationPersonType.LIEUTENANT.text", "CompanyGenerationPersonType.LIEUTENANT.toolTipText"), + MECHWARRIOR("CompanyGenerationPersonType.MECHWARRIOR.text", "CompanyGenerationPersonType.MECHWARRIOR.toolTipText"), + SUPPORT("CompanyGenerationPersonType.SUPPORT.text", "CompanyGenerationPersonType.SUPPORT.toolTipText"), + ASSISTANT("CompanyGenerationPersonType.ASSISTANT.text", "CompanyGenerationPersonType.ASSISTANT.toolTipText"); //endregion Enum Declarations - //region Boolean Comparisons + //region Variable Declarations + private final String name; + private final String toolTipText; + //endregion Variable Declarations + + //region Constructors + CompanyGenerationPersonType(final String name, final String toolTipText) { + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Personnel", new EncodeControl()); + this.name = resources.getString(name); + this.toolTipText = resources.getString(toolTipText); + } + //endregion Constructors + + //region Getters + public String getToolTipText() { + return toolTipText; + } + //endregion Getters + + //region Boolean Comparison Methods public boolean isCompanyCommander() { return this == COMPANY_COMMANDER; } @@ -49,6 +72,10 @@ public boolean isSupport() { return this == SUPPORT; } + public boolean isAssistant() { + return this == ASSISTANT; + } + public boolean isOfficer() { return isCaptain() || isLieutenant(); } @@ -56,5 +83,10 @@ public boolean isOfficer() { public boolean isCombat() { return isCompanyCommander() || isCaptain() || isLieutenant() || isMechWarrior(); } - //endregion Boolean Comparisons + //endregion Boolean Comparison Methods + + @Override + public String toString() { + return name; + } } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java index 3bca46ec52..4cab8b0faa 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java @@ -26,18 +26,18 @@ public enum ForceNamingMethod { //region Enum Declarations CCB_1943("ForceNamingMethod.CCB_1943.text", "ForceNamingMethod.CCB_1943.toolTipText"), ICAO_1956("ForceNamingMethod.ICAO_1956.text", "ForceNamingMethod.ICAO_1956.toolTipText"), + ENGLISH_ALPHABET("ForceNamingMethod.ENGLISH_ALPHABET.text", "ForceNamingMethod.ENGLISH_ALPHABET.toolTipText"), GREEK_ALPHABET("ForceNamingMethod.GREEK_ALPHABET.text", "ForceNamingMethod.GREEK_ALPHABET.toolTipText"); //endregion Enum Declarations //region Variable Declarations private final String name; private final String toolTipText; - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors ForceNamingMethod(final String name, final String toolTipText) { + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } @@ -49,10 +49,30 @@ public String getToolTipText() { } //endregion Getters + //region Boolean Comparison Methods + public boolean isCCB1943() { + return this == CCB_1943; + } + + public boolean isICAO1956() { + return this == ICAO_1956; + } + + public boolean isEnglishAlphabet() { + return this == ENGLISH_ALPHABET; + } + + public boolean isGreekAlphabet() { + return this == GREEK_ALPHABET; + } + //endregion Boolean Comparison Methods + public String getValue(final Alphabet alphabet) { switch (this) { case ICAO_1956: return alphabet.getICAO1956(); + case ENGLISH_ALPHABET: + return alphabet.getEnglish(); case GREEK_ALPHABET: return alphabet.getGreek(); case CCB_1943: diff --git a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java index 11e1d25eda..cc6e91f923 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java @@ -37,12 +37,11 @@ public enum MysteryBoxType { //region Variable Declarations private final String name; private final String toolTipText; - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors MysteryBoxType(final String name, final String toolTipText) { + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } @@ -54,6 +53,40 @@ public String getToolTipText() { } //endregion Getters + //region Boolean Comparison Methods + public boolean isThirdSuccessionWar() { + return this == THIRD_SUCCESSION_WAR; + } + + public boolean isStarLeagueRoyal() { + return this == STAR_LEAGUE_ROYAL; + } + + public boolean isStarLeagueRegular() { + return this == STAR_LEAGUE_REGULAR; + } + + public boolean isInnerSphereExperimental() { + return this == INNER_SPHERE_EXPERIMENTAL; + } + + public boolean isClanKeshik() { + return this == CLAN_KESHIK; + } + + public boolean isClanFrontLine() { + return this == CLAN_FRONT_LINE; + } + + public boolean isClanSecondLine() { + return this == CLAN_SECOND_LINE; + } + + public boolean isClanExperimental() { + return this == CLAN_EXPERIMENTAL; + } + //endregion Boolean Comparison Methods + /* public AbstractMysteryBox getMysteryBox() { switch (this) { diff --git a/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java index 1160eb5e2d..f789f82f85 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java @@ -40,12 +40,11 @@ public enum PartGenerationMethod { //region Variable Declarations private final String name; private final String toolTipText; - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations //region Constructors PartGenerationMethod(final String name, final String toolTipText) { + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } @@ -57,11 +56,31 @@ public String getToolTipText() { } //endregion Getters - //region Boolean Comparisons + //region Boolean Comparison Methods public boolean isDisabled() { return this == DISABLED; } - //endregion Boolean Comparisons + + public boolean isWindchild() { + return this == WINDCHILD; + } + + public boolean isMishra() { + return this == MISHRA; + } + + public boolean isSingle() { + return this == SINGLE; + } + + public boolean isDouble() { + return this == DOUBLE; + } + + public boolean isTriple() { + return this == TRIPLE; + } + //endregion Boolean Comparison Methods public AbstractPartGenerator getGenerator() { switch (this) { @@ -74,7 +93,7 @@ public AbstractPartGenerator getGenerator() { case TRIPLE: return new MultiplePartGenerator(this, 3); case DISABLED: - MekHQ.getLogger().error("Attempted to get generator for a disabled part generator. Returning Windchild"); + MekHQ.getLogger().error("Attempted to get a generator when the part generator is Disabled. Returning Windchild"); case WINDCHILD: default: return new WindchildPartGenerator(); From 4536097c83539b4cb5ed5f1d68f747c3078865ec Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Tue, 19 Oct 2021 19:00:44 -0400 Subject: [PATCH 038/115] Updating MekHQ Options changes, including a NPE fix --- MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties | 2 +- MekHQ/src/mekhq/MekHQOptions.java | 4 ++-- MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties index 0b6490a7e0..bbfafc991e 100644 --- a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties @@ -11,7 +11,7 @@ labelLongDisplayDateFormat.text=Long Display Date Format invalidDateFormat.error=Invalid Date Format optionHistoricalDailyLog.text=Temporarily Retain Daily Log History optionHistoricalDailyLog.toolTipText=Keeps a limited historical daily report in-memory during the gaming session. May result in increased memory usage. -optionCompanyGeneratorStartup.text=Company Generator Startup outside of AtB +optionCompanyGeneratorStartup.text=Company Generator Startup outside of AtB (Unimplemented) optionCompanyGeneratorStartup.toolTipText=Adds the ability to use the company generator on startup outside of AtB campaigns. optionShowCompanyGenerator.text=Show Company Generator optionShowCompanyGenerator.toolTipText=Add a company generator menu item under the Manage Campaign header on the menu bar to allow one to generate a company after startup. diff --git a/MekHQ/src/mekhq/MekHQOptions.java b/MekHQ/src/mekhq/MekHQOptions.java index 618102abc0..e60efed7a4 100644 --- a/MekHQ/src/mekhq/MekHQOptions.java +++ b/MekHQ/src/mekhq/MekHQOptions.java @@ -108,7 +108,7 @@ public void setCommandCenterMRMS(boolean value) { //region Personnel Tab Display Options public PersonnelFilterStyle getPersonnelFilterStyle() { return PersonnelFilterStyle.valueOf(userPreferences.node(MekHqConstants.DISPLAY_NODE) - .get(MekHqConstants.PERSONNEL_FILTER_STYLE, PersonnelFilterStyle.STANDARD.name())); + .get(MekHqConstants.PERSONNEL_FILTER_STYLE, "STANDARD")); } public void setPersonnelFilterStyle(PersonnelFilterStyle value) { @@ -568,7 +568,7 @@ public void setStartGameDelay(final int startGameDelay) { public CompanyGenerationMethod getDefaultCompanyGenerationMethod() { return CompanyGenerationMethod.valueOf(userPreferences.node(MekHqConstants.MISCELLANEOUS_NODE) - .get(MekHqConstants.DEFAULT_COMPANY_GENERATION_METHOD, CompanyGenerationMethod.AGAINST_THE_BOT.name())); + .get(MekHqConstants.DEFAULT_COMPANY_GENERATION_METHOD, CompanyGenerationMethod.WINDCHILD.name())); } public void setDefaultCompanyGenerationMethod(final CompanyGenerationMethod value) { diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index bfba632473..cf05696f82 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -684,7 +684,7 @@ public Component getListCellRendererComponent(final JList list, final Object final boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof CompanyGenerationMethod) { - list.setToolTipText(((CompanyGenerationMethod) list.getSelectedValue()).getToolTipText()); + list.setToolTipText(((CompanyGenerationMethod) value).getToolTipText()); } return this; } From 5129320f8f6c7de2a1b3b42df331c7fbc9e673ef Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Tue, 19 Oct 2021 19:09:56 -0400 Subject: [PATCH 039/115] Reverting a change --- MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index cf05696f82..efbf9ddc92 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -203,14 +203,17 @@ private JPanel createDisplayTab() { optionPersonnelFilterStyle = new JComboBox<>(PersonnelFilterStyle.values()); optionPersonnelFilterStyle.setRenderer(new DefaultListCellRenderer() { + private static final long serialVersionUID = -543354619818226314L; + @Override - public Component getListCellRendererComponent(final JList list, final Object value, - final int index, final boolean isSelected, - final boolean cellHasFocus) { + public Component getListCellRendererComponent(JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof PersonnelFilterStyle) { - list.setToolTipText(((PersonnelFilterStyle) list.getSelectedValue()).getToolTipText()); + if (isSelected && (index > -1)) { + list.setToolTipText((list.getSelectedValue() instanceof PersonnelFilterStyle) + ? ((PersonnelFilterStyle) list.getSelectedValue()).getToolTipText() : ""); } + return this; } }); From 6b06f6310e25cc67b3d2089d9eb242a3baee8955 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Thu, 21 Oct 2021 10:20:29 -0400 Subject: [PATCH 040/115] Further cleanup, focusing on part generator code --- .../mekhq/resources/Universe.properties | 1 - MekHQ/src/mekhq/campaign/CampaignOptions.java | 2 +- .../CompanyGenerationOptions.java | 15 ++++--- .../partGenerators/AbstractPartGenerator.java | 14 ++++--- .../partGenerators/MishraPartGenerator.java | 41 +++++++++++++++---- .../partGenerators/MultiplePartGenerator.java | 9 ++-- .../WindchildPartGenerator.java | 4 +- MekHQ/src/mekhq/gui/CampaignGUI.java | 2 +- .../gui/dialog/CampaignOptionsDialog.java | 5 +-- 9 files changed, 56 insertions(+), 37 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 2ee821dfa7..ee5dcb9377 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -129,7 +129,6 @@ CompanyGenerationPersonType.SUPPORT.toolTipText=They are one of the primary supp CompanyGenerationPersonType.ASSISTANT.text=Assistant CompanyGenerationPersonType.ASSISTANT.toolTipText=They assist one of the primary support personnel as a Medic or Astech. - # ForceNamingMethod Enum ForceNamingMethod.CCB_1943.text=CCB (1943) ForceNamingMethod.CCB_1943.toolTipText=This generates names using the Combined Communications Board's WW2 calling alphabet as settled upon in 1943.
Produces names like "Able Lance", "Charlie Company", and "Easy Company". diff --git a/MekHQ/src/mekhq/campaign/CampaignOptions.java b/MekHQ/src/mekhq/campaign/CampaignOptions.java index 6417c4607c..a9d44d75e4 100644 --- a/MekHQ/src/mekhq/campaign/CampaignOptions.java +++ b/MekHQ/src/mekhq/campaign/CampaignOptions.java @@ -3206,7 +3206,7 @@ public void setFixedMapChance(int fixedMapChance) { } //region Company Generation Options - public CompanyGenerationOptions getCompanyGenerationOptions() { + public @Nullable CompanyGenerationOptions getCompanyGenerationOptions() { return companyGenerationOptions; } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index c3319b372d..535b5eefbf 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -770,10 +770,9 @@ public void writeToFile(File file) { public void writeToXML(final PrintWriter pw, int indent, final @Nullable String version) { if (version == null) { - MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "companyGenerationOptions"); + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "companyGenerationOptions"); } else { - pw.println(String.format("%s", - MekHqXmlUtil.indentStr(indent++), version)); + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "companyGenerationOptions", "version", version); } // Base Information @@ -790,14 +789,14 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "starLeagueYear", getStarLeagueYear()); // Personnel - MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "supportPersonnel"); + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "supportPersonnel"); for (final Map.Entry entry : getSupportPersonnel().entrySet()) { - MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw, indent++, "supportRole"); + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "supportRole"); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "role", entry.getKey().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "number", entry.getValue()); - MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "supportRole"); + MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "supportRole"); } - MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "supportPersonnel"); + MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "supportPersonnel"); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "poolAssistants", isPoolAssistants()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateCaptains", isGenerateCaptains()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignCompanyCommanderFlag", isAssignCompanyCommanderFlag()); @@ -865,7 +864,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxes", isGenerateMysteryBoxes()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxTypes", getGenerateMysteryBoxTypes()); - MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw, --indent, "companyGenerationOptions"); + MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "companyGenerationOptions"); } public static CompanyGenerationOptions parseFromXML(final Campaign campaign, final File file) { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java index 77cc58b4de..fa884e6148 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java @@ -39,14 +39,16 @@ protected AbstractPartGenerator(final PartGenerationMethod method) { } //endregion Constructors - //region Getters/Setters + //region Getters public PartGenerationMethod getMethod() { return method; } - //endregion Getters/Setters + //endregion Getters /** - * This generates based on the parts from a list of units, optionally excluding armour and ammunition + * This generates based on the parts from a list of units, optionally excluding armour and + * ammunition. + * * @param units the list of units to generate parts based off of * @param includeArmour whether to include armour in the parts generated * @param includeAmmunition whether to include ammunition in the parts generated @@ -63,14 +65,14 @@ public List generate(final List units, final boolean includeArmour, } /** - * @param inputParts a list of parts, which are not guaranteed to be unique, sorted, nor unassigned. - * Implementors are required to clone the parts as required. + * @param inputParts a list of parts, which are not guaranteed to be unique, sorted, nor + * unassigned. Implementors are required to clone the parts as required. * @return the list of generated parts */ public abstract List generate(final List inputParts); /** - * This creates a clone of the input part, with it not being omni-podded if it was originally + * This creates a clone of the input part, with it not being omni-podded if it was originally. * @param inputPart the input part to clone * @return the cloned part */ diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java index dc67ff490d..690e75933f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java @@ -18,21 +18,35 @@ */ package mekhq.campaign.universe.generators.partGenerators; +import megamek.common.Dropship; +import megamek.common.Jumpship; +import mekhq.campaign.parts.EnginePart; import mekhq.campaign.parts.Part; +import mekhq.campaign.parts.SVEnginePart; +import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.enums.PartGenerationMethod; -import java.util.ArrayList; import java.util.List; /** * The Rules for this Generator: - * 1) Start with Triple, then cut it down. - * Remove all Engines. - * All Heat Sinks are capped at 30 per type. - * All Mech Heads [Sensors, Life Support] are capped at 2 per weight/type. - * All Gyros are capped at 1 per weight/type. - * MASC is capped at 1 per type - * Any other parts are capped at 6. + * 1) Remove all DropShips, JumpShips, WarShips, and Space Stations + * 2) Start with Triple Parts + * 3) Remove all Engines + * 3) All Heat Sinks are capped at 30 per type + * 4) All 'Mech Heads [Sensors, Life Support] are capped at 2 per weight/type + * 5) All Gyros are capped at 1 per weight/type + * 6) MASC is capped at 1 per type + * 7) Any other parts are capped at 6. + */ +/** + * The Rules for this Generator: + * 3) Remove all Engines - EnginePart, SVEnginePart + * 3) All Heat Sinks are capped at 30 per type - HeatSink, AeroHeatSink + * 4) All 'Mech Heads [Sensors, Life Support] are capped at 2 per weight/type - MekLifeSupport, AeroLifeSupport + * 5) All Gyros are capped at 1 per weight/type + * 6) MASC is capped at 1 per type + * 7) Any other parts are capped at 6. */ public class MishraPartGenerator extends MultiplePartGenerator { //region Constructors @@ -41,8 +55,17 @@ public MishraPartGenerator() { } //endregion Constructors + @Override + public List generate(final List units, final boolean includeArmour, + final boolean includeAmmunition) { + units.removeIf(unit -> (unit.getEntity() instanceof Jumpship) || (unit.getEntity() instanceof Dropship)); + return super.generate(units, includeArmour, includeAmmunition); + } + @Override public List generate(final List inputParts) { - return super.generate(inputParts); + final List outputParts = super.generate(inputParts); + outputParts.removeIf(part -> (part instanceof EnginePart) || (part instanceof SVEnginePart)); + return outputParts; } } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java index 029a784c6f..a3f9bb31fa 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java @@ -21,8 +21,8 @@ import mekhq.campaign.parts.Part; import mekhq.campaign.universe.enums.PartGenerationMethod; -import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class MultiplePartGenerator extends AbstractPartGenerator { //region Variable Declarations @@ -44,11 +44,8 @@ public int getMultiple() { @Override public List generate(final List inputParts) { - final List parts = new ArrayList<>(); - inputParts.stream().map(this::clonePart).forEach(part -> { - part.setQuantity(part.getQuantity() * getMultiple()); - parts.add(part); - }); + final List parts = inputParts.stream().map(this::clonePart).collect(Collectors.toList()); + parts.forEach(part -> part.setQuantity(part.getQuantity() * getMultiple())); return parts; } } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java index 1b2e879593..44168bc094 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java @@ -28,7 +28,7 @@ /** * 1 Part for every 3, rounded normally. - * This means you get 1 part for 2-4 in the input array, plus another for every interval above that + * This means you get 1 part for 2-4 in the input array, plus another for every interval above that. */ public class WindchildPartGenerator extends AbstractPartGenerator { //region Constructors @@ -41,7 +41,7 @@ public WindchildPartGenerator() { public List generate(final List inputParts) { final Warehouse warehouse = new Warehouse(); inputParts.forEach(part -> warehouse.addPart(clonePart(part), true)); - warehouse.forEachPart(part -> part.setQuantity((int) Math.round(part.getQuantity() / 3d))); + warehouse.forEachPart(part -> part.setQuantity((int) Math.round(part.getQuantity() / 3.0))); return warehouse.getParts().stream().filter(part -> part.getQuantity() > 0).collect(Collectors.toList()); } } diff --git a/MekHQ/src/mekhq/gui/CampaignGUI.java b/MekHQ/src/mekhq/gui/CampaignGUI.java index dd14ad8122..68ea8f1fa8 100644 --- a/MekHQ/src/mekhq/gui/CampaignGUI.java +++ b/MekHQ/src/mekhq/gui/CampaignGUI.java @@ -2441,7 +2441,7 @@ public void handlePersonUpdate(PersonEvent ev) { } @Subscribe - public void handle(MekHQOptionsChangedEvent evt) { + public void handle(final MekHQOptionsChangedEvent evt) { miCompanyGenerator.setVisible(MekHQ.getMekHQOptions().getShowCompanyGenerator()); } diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index 3d13da4094..447a028f59 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -489,8 +489,6 @@ public class CampaignOptionsDialog extends AbstractMHQButtonDialog { //region Company Generation Options private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; //endregion Company Generation Options - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.CampaignOptionsDialog", new EncodeControl()); //endregion Variable Declarations //region Constructors @@ -3288,7 +3286,8 @@ public Component getListCellRendererComponent(JList list, Object value, int i //region Company Generation Options if (MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()) { companyGenerationOptionsPanel = new CompanyGenerationOptionsPanel(getFrame(), campaign); - getOptionsPane().addTab(resourceMap.getString("companyGenerationOptionsPanel.title"), new JScrollPane(companyGenerationOptionsPanel)); + getOptionsPane().addTab(resourceMap.getString("companyGenerationOptionsPanel.title"), + new JScrollPane(companyGenerationOptionsPanel)); } //endregion Company Generation Options From d9818ba7ed04a894d5addaf88239800a202be0d6 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 22 Oct 2021 19:01:10 -0400 Subject: [PATCH 041/115] Removing options now a part of the campaign preset --- .../resources/mekhq/resources/GUI.properties | 7 +- .../AbstractCompanyGenerator.java | 60 ++-- .../AtBCompanyGenerator.java | 9 +- .../CompanyGenerationOptions.java | 59 +--- .../CompanyGenerationWizard.java | 2 - .../WindchildCompanyGenerator.java | 9 +- .../gui/dialog/CompanyGenerationDialog.java | 1 - .../panels/CompanyGenerationOptionsPanel.java | 273 +----------------- 8 files changed, 41 insertions(+), 379 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index bc334a82af..660b5f7e4b 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -647,11 +647,6 @@ btnEditPreset.toolTipText=Edit the selected preset, which allows you to make cha baseInformationPanel.title=Base Information lblCompanyGenerationMethod.text=Company Generation Method lblCompanyGenerationMethod.toolTipText=This is the method of company generator to use. These have hardcoded differences described in their tooltips. -lblFaction.toolTipText=\u0020 -chkSpecifyStartingSystem.text=Specify Starting Planet -chkSpecifyStartingSystem.toolTipText=This option lets you specify the planet the mercenary company starts at. -lblStartingPlanet.text=Starting Planet -lblStartingPlanet.toolTipText=This is the planet that the company starts at. This should normally be kept at the default value, but is customizable for RP reasons. chkGenerateMercenaryCompanyCommandLance.text=Generate Company Command Lance chkGenerateMercenaryCompanyCommandLance.toolTipText=This generates a lance containing the company commander to lead the mercenary company.
Otherwise, the company commander leads the first lance generate, either first company or the first independent lance. lblCompanyCount.text=Company Count @@ -711,7 +706,7 @@ chkSimulateRandomProcreation.toolTipText=This runs random procreation for the du ## Units Panel unitsPanel.title=Units chkGenerateUnitsAsAttached.text=Generate Units as Attached -chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MW when they retire
(provided the campaign options are enabled). +chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MechWarrior when they retire
(provided the campaign options are enabled). chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander chkAssignBestRollToUnitCommander.toolTipText=This assigns the best rolled unit to the unit commander.
The heaviest Star League weight class will be assigned to them if a Star League 'Mech is rolled, or otherwise they will be assigned the heaviest 'Mech. chkSortStarLeagueUnitsFirst.text=Sort Star League Units First diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index d48971a9b7..084a60ee01 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -162,13 +162,15 @@ public void setPersonnelGenerator(final AbstractPersonnelGenerator personnelGene * @param campaign the Campaign to generate using */ private void createPersonnelGenerator(final Campaign campaign) { - setPersonnelGenerator(campaign.getPersonnelGenerator(createFactionSelector(), createPlanetSelector())); + setPersonnelGenerator(campaign.getPersonnelGenerator(createFactionSelector(campaign), + createPlanetSelector())); } /** + * @param campaign the campaign to select a faction using * @return a newly created Faction Selector based on the provided options */ - private AbstractFactionSelector createFactionSelector() { + private AbstractFactionSelector createFactionSelector(final Campaign campaign) { // TODO : central planet/system final AbstractFactionSelector factionSelector; @@ -176,7 +178,7 @@ private AbstractFactionSelector createFactionSelector() { factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); } else { - factionSelector = new DefaultFactionSelector(getOptions().getFaction()); + factionSelector = new DefaultFactionSelector(campaign.getFaction()); } return factionSelector; } @@ -220,18 +222,6 @@ private int determineNumberOfCaptains() { } //endregion Determination Methods - //region Base Information - /** - * This sets the planet to the starting planet specified, if that option is enabled - * @param campaign the campaign to apply the location to - */ - private void moveToStartingPlanet(final Campaign campaign) { - if (getOptions().isSpecifyStartingPlanet()) { - campaign.setLocation(new CurrentLocation(getOptions().getStartingPlanet().getParentSystem(), 0)); - } - } - //endregion Base Information - //region Personnel /** * @param campaign the campaign to use to generate the personnel @@ -269,11 +259,11 @@ private List generateCombatPersonnel(final Campa } trackers.sort(personnelSorter); - generateCommandingOfficer(trackers.get(0), numMechWarriors); + generateCommandingOfficer(campaign, trackers.get(0), numMechWarriors); generateOfficers(trackers); - generateStandardMechWarriors(trackers); + generateStandardMechWarriors(campaign, trackers); return trackers; } @@ -285,10 +275,12 @@ private List generateCombatPersonnel(final Campa * 3) Gets two random officer skill increases * 4) Gets the highest rank possible assigned to them * + * @param campaign the campaign to use in generating the commanding officer * @param commandingOfficer the commanding officer's tracker * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ - private void generateCommandingOfficer(final CompanyGenerationPersonTracker commandingOfficer, + private void generateCommandingOfficer(final Campaign campaign, + final CompanyGenerationPersonTracker commandingOfficer, final int numMechWarriors) { commandingOfficer.setPersonType(CompanyGenerationPersonType.COMPANY_COMMANDER); commandingOfficer.getPerson().setCommander(getOptions().isAssignCompanyCommanderFlag()); @@ -297,15 +289,18 @@ private void generateCommandingOfficer(final CompanyGenerationPersonTracker comm assignRandomOfficerSkillIncrease(commandingOfficer.getPerson(), 2); if (getOptions().isAutomaticallyAssignRanks()) { - generateCommandingOfficerRank(commandingOfficer.getPerson(), numMechWarriors); + generateCommandingOfficerRank(campaign, commandingOfficer.getPerson(), numMechWarriors); } } /** + * @param campaign the campaign to use in generating the commanding officer's rank * @param commandingOfficer the commanding officer * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ - protected abstract void generateCommandingOfficerRank(final Person commandingOfficer, final int numMechWarriors); + protected abstract void generateCommandingOfficerRank(final Campaign campaign, + final Person commandingOfficer, + final int numMechWarriors); /** * This generates the initial officer list and assigns the type @@ -420,15 +415,17 @@ private void assignRandomOfficerSkillIncrease(final Person person, final int boo /** * Sets up standard MechWarriors from the provided trackers * + * @param campaign the campaign to generate the MechWarriors based on * @param trackers the list of all generated trackers */ - private void generateStandardMechWarriors(final List trackers) { + private void generateStandardMechWarriors(final Campaign campaign, + final List trackers) { for (final CompanyGenerationPersonTracker tracker : trackers) { if (!tracker.getPersonType().isMechWarrior()) { continue; } - generateStandardMechWarrior(tracker.getPerson()); + generateStandardMechWarrior(campaign, tracker.getPerson()); } } @@ -436,12 +433,13 @@ private void generateStandardMechWarriors(final List generateMothballedEntities(final Campaign campaign, final List mothballedEntities = new ArrayList<>(); // Create the Faction Selector - final AbstractFactionSelector factionSelector = createFactionSelector(); + final AbstractFactionSelector factionSelector = createFactionSelector(campaign); // Create the Mothballed Entities for (int i = 0; i < numberMothballedEntities; i++) { @@ -1531,16 +1529,6 @@ private void generateMysteryBoxes(final Campaign campaign) { //endregion Surprises //region Apply to Campaign - /** - * Phase Zero: Anything that is to be run BEFORE starting generation - * - * @param campaign the campaign to apply the generation to - */ - public void applyPhaseZeroToCampaign(final Campaign campaign) { - // Move to Starting Planet - moveToStartingPlanet(campaign); - } - /** * Phase One: Starting Planet and Finalizing Personnel, Unit, and Units * diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index 083fc62d1e..8d0c723b07 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -36,15 +36,18 @@ public AtBCompanyGenerator(final Campaign campaign, final CompanyGenerationOptio //region Personnel /** + * @param campaign the campaign to use in generating the commanding officer's rank * @param commandingOfficer the commanding officer * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ @Override - protected void generateCommandingOfficerRank(final Person commandingOfficer, final int numMechWarriors) { + protected void generateCommandingOfficerRank(final Campaign campaign, + final Person commandingOfficer, + final int numMechWarriors) { if (numMechWarriors >= 36) { - commandingOfficer.setRank(Rank.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); + commandingOfficer.setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 8)); } else if (numMechWarriors >= 12) { - commandingOfficer.setRank(Rank.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 5)); + commandingOfficer.setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 5)); } else if (numMechWarriors >= 4) { commandingOfficer.setRank(Rank.RWO_MAX + 4); } else { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index 535b5eefbf..1a8b7c9d28 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -24,8 +24,6 @@ import mekhq.MekHqXmlUtil; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.enums.PersonnelRole; -import mekhq.campaign.universe.Faction; -import mekhq.campaign.universe.Factions; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.Systems; import mekhq.campaign.universe.enums.CompanyGenerationMethod; @@ -36,15 +34,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.Serializable; +import java.io.*; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -56,9 +46,6 @@ public class CompanyGenerationOptions implements Serializable { // Base Information private CompanyGenerationMethod method; - private Faction faction; // Not fully understood/Implemented - private boolean specifyStartingPlanet; - private Planet startingPlanet; private boolean generateMercenaryCompanyCommandLance; private int companyCount; private int individualLanceCount; @@ -146,11 +133,6 @@ private CompanyGenerationOptions() { public CompanyGenerationOptions(final CompanyGenerationMethod method, final Campaign campaign) { // Base Information setMethod(method); - setFaction(campaign.getFaction()); - setSpecifyStartingPlanet(true); - setStartingPlanet(Systems.getInstance().getSystems().getOrDefault( - getFaction().getStartingPlanet(campaign.getLocalDate()), - campaign.getSystemByName("Terra")).getPrimaryPlanet()); setGenerateMercenaryCompanyCommandLance(false); setCompanyCount(1); setIndividualLanceCount(0); @@ -254,30 +236,6 @@ public void setMethod(final CompanyGenerationMethod method) { this.method = method; } - public Faction getFaction() { - return faction; - } - - public void setFaction(final Faction faction) { - this.faction = faction; - } - - public boolean isSpecifyStartingPlanet() { - return specifyStartingPlanet; - } - - public void setSpecifyStartingPlanet(final boolean specifyStartingPlanet) { - this.specifyStartingPlanet = specifyStartingPlanet; - } - - public Planet getStartingPlanet() { - return startingPlanet; - } - - public void setStartingPlanet(final Planet startingPlanet) { - this.startingPlanet = startingPlanet; - } - public boolean isGenerateMercenaryCompanyCommandLance() { return generateMercenaryCompanyCommandLance; } @@ -777,10 +735,6 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String // Base Information MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "method", getMethod().name()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "faction", getFaction().getShortName()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "specifyStartingPlanet", isSpecifyStartingPlanet()); - MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "startingPlanet", "systemId", - getStartingPlanet().getParentSystem().getId(), getStartingPlanet().getId()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMercenaryCompanyCommandLance", isGenerateMercenaryCompanyCommandLance()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "companyCount", getCompanyCount()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "individualLanceCount", getIndividualLanceCount()); @@ -913,17 +867,6 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, fin case "method": options.setMethod(CompanyGenerationMethod.valueOf(wn.getTextContent().trim())); break; - case "faction": - options.setFaction(Factions.getInstance().getFaction(wn.getTextContent().trim())); - break; - case "specifyStartingPlanet": - options.setSpecifyStartingPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "startingPlanet": - String startingPlanetSystemId = wn.getAttributes().getNamedItem("systemId").getTextContent().trim(); - String startingPlanetPlanetId = wn.getTextContent().trim(); - options.setStartingPlanet(Systems.getInstance().getSystemById(startingPlanetSystemId).getPlanetById(startingPlanetPlanetId)); - break; case "generateMercenaryCompanyCommandLance": options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn.getTextContent().trim())); break; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java index 2f6a2dbd19..351fa5026f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java @@ -52,8 +52,6 @@ public AbstractCompanyGenerator getGenerator() { //endregion Getters/Setters public void set() { - generator.applyPhaseZeroToCampaign(getCampaign()); - final List trackers = generator.generatePersonnel(getCampaign()); generator.generateUnitGenerationParameters(trackers); generator.generateEntities(getCampaign(), trackers); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index f69612ac74..570467c237 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -37,15 +37,18 @@ public WindchildCompanyGenerator(final Campaign campaign, final CompanyGeneratio //region Personnel /** * Set based on greater than instead of the greater than or equal to of AtB + * @param campaign the campaign to use in generating the commanding officer's rank * @param commandingOfficer the commanding officer * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ @Override - protected void generateCommandingOfficerRank(final Person commandingOfficer, final int numMechWarriors) { + protected void generateCommandingOfficerRank(final Campaign campaign, + final Person commandingOfficer, + final int numMechWarriors) { if (numMechWarriors > 36) { - commandingOfficer.setRank(Rank.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 8)); + commandingOfficer.setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 8)); } else if (numMechWarriors > 12) { - commandingOfficer.setRank(Rank.RWO_MAX + (getOptions().getFaction().isComStarOrWoB() ? 7 : 5)); + commandingOfficer.setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 5)); } else if (numMechWarriors > 4) { commandingOfficer.setRank(Rank.RWO_MAX + 4); } else { diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index dedab3dec9..01ba46c5d8 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -121,7 +121,6 @@ protected JPanel createButtonPanel() { protected void okAction() { final CompanyGenerationOptions options = getCompanyGenerationOptionsPanel().createOptionsFromPanel(); final AbstractCompanyGenerator generator = options.getMethod().getGenerator(getCampaign(), options); - generator.applyPhaseZeroToCampaign(getCampaign()); final List trackers = generator.generatePersonnel(getCampaign()); generator.generateUnitGenerationParameters(trackers); diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index ec23d2d52c..2bfc1507c3 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -23,7 +23,6 @@ import megamek.common.util.sorter.NaturalOrderComparator; import mekhq.MekHQ; import mekhq.campaign.Campaign; -import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.enums.PersonnelRole; import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.Factions; @@ -40,13 +39,8 @@ import javax.swing.*; import java.awt.*; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.ResourceBundle; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -57,11 +51,6 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Base Information private JComboBox comboCompanyGenerationMethod; - private JComboBox comboFaction; - private JCheckBox chkSpecifyStartingSystem; - private JCheckBox chkStartingSystemFactionSpecific; - private JComboBox comboStartingSystem; - private JComboBox comboStartingPlanet; private JCheckBox chkGenerateMercenaryCompanyCommandLance; private JSpinner spnCompanyCount; private JSpinner spnIndividualLanceCount; @@ -181,75 +170,6 @@ public void setComboCompanyGenerationMethod(final JComboBox getComboFaction() { - return comboFaction; - } - - public Faction getFaction() { - return ((FactionChoice) Objects.requireNonNull(getComboFaction().getSelectedItem())).getFaction(); - } - - public void setComboFaction(final JComboBox comboFaction) { - this.comboFaction = comboFaction; - } - - public JCheckBox getChkSpecifyStartingSystem() { - return chkSpecifyStartingSystem; - } - - public void setChkSpecifyStartingSystem(final JCheckBox chkSpecifyStartingSystem) { - this.chkSpecifyStartingSystem = chkSpecifyStartingSystem; - } - - public JCheckBox getChkStartingSystemFactionSpecific() { - return chkStartingSystemFactionSpecific; - } - - public void setChkStartingSystemFactionSpecific(final JCheckBox chkStartingSystemFactionSpecific) { - this.chkStartingSystemFactionSpecific = chkStartingSystemFactionSpecific; - } - - public JComboBox getComboStartingSystem() { - return comboStartingSystem; - } - - public @Nullable PlanetarySystem getStartingSystem() { - return (PlanetarySystem) getComboStartingSystem().getSelectedItem(); - } - - public void setComboStartingSystem(final JComboBox comboStartingSystem) { - this.comboStartingSystem = comboStartingSystem; - } - - private void restoreComboStartingSystem() { - getComboStartingSystem().removeAllItems(); - getComboStartingSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( - getChkStartingSystemFactionSpecific().isSelected() ? getFaction() : null))); - restoreComboStartingPlanet(); - } - - public JComboBox getComboStartingPlanet() { - return comboStartingPlanet; - } - - public @Nullable Planet getStartingPlanet() { - return (Planet) getComboStartingPlanet().getSelectedItem(); - } - - public void setComboStartingPlanet(final JComboBox comboStartingPlanet) { - this.comboStartingPlanet = comboStartingPlanet; - } - - private void restoreComboStartingPlanet() { - if (getStartingSystem() != null) { - getComboStartingPlanet().setModel(new DefaultComboBoxModel<>( - getStartingSystem().getPlanets().toArray(new Planet[]{}))); - getComboStartingPlanet().setSelectedItem(getStartingSystem().getPrimaryPlanet()); - } else { - getComboStartingPlanet().removeAllItems(); - } - } - public JCheckBox getChkGenerateMercenaryCompanyCommandLance() { return chkGenerateMercenaryCompanyCommandLance; } @@ -431,7 +351,7 @@ public void setComboCentralSystem(final JComboBox comboCentralS private void restoreComboCentralSystem() { getComboCentralSystem().removeAllItems(); getComboCentralSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( - getChkCentralSystemFactionSpecific().isSelected() ? getFaction() : null))); + getChkCentralSystemFactionSpecific().isSelected() ? getCampaign().getFaction() : null))); restoreComboCentralPlanet(); } @@ -845,9 +765,6 @@ private void initialize() { } private JPanel createBaseInformationPanel() { - // Initialize Labels Used in ActionListeners - final JLabel lblStartingPlanet = new JLabel(); - // Create Panel Components final JLabel lblCompanyGenerationMethod = new JLabel(resources.getString("lblCompanyGenerationMethod.text")); lblCompanyGenerationMethod.setToolTipText(resources.getString("lblCompanyGenerationMethod.toolTipText")); @@ -868,97 +785,6 @@ public Component getListCellRendererComponent(final JList list, final Object } }); - final JLabel lblFaction = new JLabel(resources.getString("Faction.text")); - lblFaction.setToolTipText(resources.getString("lblFaction.toolTipText")); - lblFaction.setName("lblFaction"); - - setComboFaction(new JComboBox<>(new DefaultComboBoxModel<>(getFactionChoices().toArray(new FactionChoice[]{})))); - getComboFaction().setToolTipText(resources.getString("lblFaction.toolTipText")); - getComboFaction().setName("comboFaction"); - getComboFaction().addActionListener(evt -> { - if (getChkStartingSystemFactionSpecific().isSelected()) { - if ((getStartingPlanet() != null) - && getStartingSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction())) { - final PlanetarySystem startingSystem = getFaction().getStartingPlanet(getCampaign(), getCampaign().getLocalDate()); - if (startingSystem != null) { - getComboStartingSystem().setSelectedItem(startingSystem); - getComboStartingPlanet().setSelectedItem(startingSystem.getPrimaryPlanet()); - } else { - restoreComboStartingSystem(); - } - } else { - restoreComboStartingSystem(); - } - } - - if (getChkCentralSystemFactionSpecific().isSelected()) { - restoreComboStartingSystem(); - } - }); - - setChkSpecifyStartingSystem(new JCheckBox(resources.getString("chkSpecifyStartingSystem.text"))); - getChkSpecifyStartingSystem().setToolTipText(resources.getString("chkSpecifyStartingSystem.toolTipText")); - getChkSpecifyStartingSystem().setName("chkSpecifyStartingSystem"); - getChkSpecifyStartingSystem().addActionListener(evt -> { - final boolean selected = getChkSpecifyStartingSystem().isSelected(); - getChkStartingSystemFactionSpecific().setEnabled(selected); - lblStartingPlanet.setEnabled(selected); - getComboStartingSystem().setEnabled(selected); - getComboStartingPlanet().setEnabled(selected); - }); - - setChkStartingSystemFactionSpecific(new JCheckBox(resources.getString("FactionSpecific.text"))); - getChkStartingSystemFactionSpecific().setToolTipText(resources.getString("chkStartingSystemFactionSpecific.toolTipText")); - getChkStartingSystemFactionSpecific().setName("chkStartingSystemFactionSpecific"); - getChkStartingSystemFactionSpecific().addActionListener(evt -> { - if ((getStartingSystem() == null) || ((getStartingSystem() != null) - && !getStartingSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction()))) { - restoreComboStartingSystem(); - } - }); - - lblStartingPlanet.setText(resources.getString("lblStartingPlanet.text")); - lblStartingPlanet.setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); - lblStartingPlanet.setName("lblStartingPlanet"); - - setComboStartingSystem(new JComboBox<>()); - getComboStartingSystem().setToolTipText(resources.getString("comboStartingSystem.toolTipText")); - getComboStartingSystem().setName("comboStartingSystem"); - getComboStartingSystem().setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(final JList list, final Object value, - final int index, final boolean isSelected, - final boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof PlanetarySystem) { - setText(((PlanetarySystem) value).getName(getCampaign().getLocalDate())); - } - return this; - } - }); - getComboStartingSystem().addActionListener(evt -> { - if ((getStartingSystem() == null) || ((getStartingSystem() != null) && (getStartingPlanet() != null) - && !getStartingPlanet().getParentSystem().equals(getStartingSystem()))) { - restoreComboStartingPlanet(); - } - }); - - setComboStartingPlanet(new JComboBox<>()); - getComboStartingPlanet().setToolTipText(resources.getString("lblStartingPlanet.toolTipText")); - getComboStartingPlanet().setName("comboStartingPlanet"); - getComboStartingPlanet().setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(final JList list, final Object value, - final int index, final boolean isSelected, - final boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof Planet) { - setText(((Planet) value).getName(getCampaign().getLocalDate())); - } - return this; - } - }); - setChkGenerateMercenaryCompanyCommandLance(new JCheckBox(resources.getString("chkGenerateMercenaryCompanyCommandLance.text"))); getChkGenerateMercenaryCompanyCommandLance().setToolTipText(resources.getString("chkGenerateMercenaryCompanyCommandLance.toolTipText")); getChkGenerateMercenaryCompanyCommandLance().setName("chkGenerateMercenaryCompanyCommandLance"); @@ -1006,18 +832,12 @@ public Component getListCellRendererComponent(final JList list, final Object // Programmatically Assign Accessibility Labels lblCompanyGenerationMethod.setLabelFor(getComboCompanyGenerationMethod()); - lblFaction.setLabelFor(getComboFaction()); - lblStartingPlanet.setLabelFor(getComboStartingPlanet()); lblCompanyCount.setLabelFor(getSpnCompanyCount()); lblIndividualLanceCount.setLabelFor(getSpnIndividualLanceCount()); lblLancesPerCompany.setLabelFor(getSpnLancesPerCompany()); lblLanceSize.setLabelFor(getSpnLanceSize()); lblStarLeagueYear.setLabelFor(getSpnStarLeagueYear()); - // Disable Panel Portions by Default - getChkSpecifyStartingSystem().setSelected(true); - getChkSpecifyStartingSystem().doClick(); - // Layout the UI final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("baseInformationPanel.title"))); @@ -1033,16 +853,6 @@ public Component getListCellRendererComponent(final JList list, final Object .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblCompanyGenerationMethod) .addComponent(getComboCompanyGenerationMethod(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(lblFaction) - .addComponent(getComboFaction(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(getChkSpecifyStartingSystem()) - .addComponent(getChkStartingSystemFactionSpecific(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(lblStartingPlanet) - .addComponent(getComboStartingSystem()) - .addComponent(getComboStartingPlanet(), GroupLayout.Alignment.LEADING)) .addComponent(getChkGenerateMercenaryCompanyCommandLance()) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblCompanyCount) @@ -1064,16 +874,6 @@ public Component getListCellRendererComponent(final JList list, final Object .addGroup(layout.createSequentialGroup() .addComponent(lblCompanyGenerationMethod) .addComponent(getComboCompanyGenerationMethod())) - .addGroup(layout.createSequentialGroup() - .addComponent(lblFaction) - .addComponent(getComboFaction())) - .addGroup(layout.createSequentialGroup() - .addComponent(getChkSpecifyStartingSystem()) - .addComponent(getChkStartingSystemFactionSpecific())) - .addGroup(layout.createSequentialGroup() - .addComponent(lblStartingPlanet) - .addComponent(getComboStartingSystem()) - .addComponent(getComboStartingPlanet())) .addComponent(getChkGenerateMercenaryCompanyCommandLance()) .addGroup(layout.createSequentialGroup() .addComponent(lblCompanyCount) @@ -1333,7 +1133,7 @@ private JPanel createPersonnelRandomizationPanel() { getChkCentralSystemFactionSpecific().setName("chkCentralSystemFactionSpecific"); getChkCentralSystemFactionSpecific().addActionListener(evt -> { if ((getCentralSystem() == null) || ((getCentralSystem() != null) - && !getCentralSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction()))) { + && !getCentralSystem().getFactionSet(getCampaign().getLocalDate()).contains(getCampaign().getFaction()))) { restoreComboCentralSystem(); } }); @@ -2049,21 +1849,6 @@ private void createMysteryBoxPanel(final JPanel panel) { } } - private List getFactionChoices() { - final List factionChoices = new ArrayList<>(); - - for (final Faction faction : Factions.getInstance().getFactions()) { - if (faction.validIn(getCampaign().getLocalDate())) { - factionChoices.add(new FactionChoice(faction, getCampaign().getLocalDate())); - } - } - - final NaturalOrderComparator noc = new NaturalOrderComparator(); - factionChoices.sort((a, b) -> noc.compare(a.toString(), b.toString())); - - return factionChoices; - } - private PlanetarySystem[] getPlanetarySystems(final @Nullable Faction faction) { return getCampaign().getSystems().stream() .filter(p -> (faction == null) || p.getFactionSet(getCampaign().getLocalDate()).contains(faction)) @@ -2085,21 +1870,6 @@ public void setOptions(final CompanyGenerationMethod method) { public void setOptions(final CompanyGenerationOptions options) { // Base Information getComboCompanyGenerationMethod().setSelectedItem(options.getMethod()); - getComboFaction().setSelectedIndex(0); // default to 0 - final List factionChoices = getFactionChoices(); - for (int i = 0; i < factionChoices.size(); i++) { - if (options.getFaction().equals(factionChoices.get(i).getFaction())) { - getComboFaction().setSelectedIndex(i); - break; - } - } - if (getChkSpecifyStartingSystem().isSelected() != options.isSpecifyStartingPlanet()) { - getChkSpecifyStartingSystem().doClick(); - } - getChkStartingSystemFactionSpecific().setSelected(false); - restoreComboStartingSystem(); - getComboStartingSystem().setSelectedItem(options.getStartingPlanet().getParentSystem()); - getComboStartingPlanet().setSelectedItem(options.getStartingPlanet()); getChkGenerateMercenaryCompanyCommandLance().setSelected(options.isGenerateMercenaryCompanyCommandLance()); getSpnCompanyCount().setValue(options.getCompanyCount()); getSpnIndividualLanceCount().setValue(options.getIndividualLanceCount()); @@ -2206,8 +1976,6 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Base Information options.setMethod(getCompanyGenerationMethod()); - options.setFaction(getFaction()); - options.setStartingPlanet(getStartingPlanet()); options.setGenerateMercenaryCompanyCommandLance(getChkGenerateMercenaryCompanyCommandLance().isSelected()); options.setCompanyCount((Integer) getSpnCompanyCount().getValue()); options.setIndividualLanceCount((Integer) getSpnIndividualLanceCount().getValue()); @@ -2302,15 +2070,6 @@ public boolean validateOptions() { return false; } - // Starting System/Planet Validation - if ((getStartingSystem() == null) || (getStartingPlanet() == null)) { - JOptionPane.showMessageDialog(getFrame(), - resources.getString("CompanyGenerationOptionsPanel.InvalidStartingPlanet.text"), - resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), - JOptionPane.ERROR_MESSAGE); - return false; - } - // Central System/Planet Validation if ((getCentralSystem() == null) || (getCentralPlanet() == null)) { JOptionPane.showMessageDialog(getFrame(), @@ -2361,32 +2120,6 @@ public void exportOptionsToXML() { //endregion File I/O //region Static Classes - private static class FactionChoice { - //region Variable Declarations - private final Faction faction; - private final String displayName; - //endregion Variable Declarations - - //region Constructors - public FactionChoice(final Faction faction, final LocalDate today) { - this.faction = faction; - this.displayName = String.format("%s [%s]", getFaction().getFullName(today.getYear()), - getFaction().getShortName()); - } - //endregion Constructors - - //region Getters/Setters - public Faction getFaction() { - return faction; - } - //endregion Getters/Setters - - @Override - public String toString() { - return displayName; - } - } - private static class RoleToSpinner { //region Variable Declarations private final PersonnelRole role; From 27fe33c328bc21bd20af8ed92971e751b1d0a46b Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 22 Oct 2021 19:06:06 -0400 Subject: [PATCH 042/115] Removing the old wizard --- .../CompanyGenerationWizard.java | 110 ------------------ 1 file changed, 110 deletions(-) delete mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java deleted file mode 100644 index 351fa5026f..0000000000 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationWizard.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.generators.companyGenerators; - -import megamek.common.Entity; -import mekhq.campaign.Campaign; -import mekhq.campaign.mission.Contract; -import mekhq.campaign.parts.AmmoStorage; -import mekhq.campaign.parts.Armor; -import mekhq.campaign.parts.Part; -import mekhq.campaign.unit.Unit; - -import java.util.List; - -public class CompanyGenerationWizard { - //region Variable Declarations - private final Campaign campaign; - private final AbstractCompanyGenerator generator; - //endregion Variable Declarations - - //region Constructors - public CompanyGenerationWizard(final Campaign campaign, final AbstractCompanyGenerator generator) { - this.campaign = campaign; - this.generator = generator; - } - //endregion Constructors - - //region Getters/Setters - public Campaign getCampaign() { - return campaign; - } - - public AbstractCompanyGenerator getGenerator() { - return generator; - } - //endregion Getters/Setters - - public void set() { - final List trackers = generator.generatePersonnel(getCampaign()); - generator.generateUnitGenerationParameters(trackers); - generator.generateEntities(getCampaign(), trackers); - final List units = generator.applyPhaseOneToCampaign(getCampaign(), trackers); - - final List mothballedEntities = generator.generateMothballedEntities(getCampaign(), trackers); - final List parts = generator.generateSpareParts(units); - final List armour = generator.generateArmour(units); - final List ammunition = generator.generateAmmunition(getCampaign(), units); - units.addAll(generator.applyPhaseTwoToCampaign(getCampaign(), mothballedEntities, parts, armour, ammunition)); - - final Contract contract = null; - generator.applyPhaseThreeToCampaign(getCampaign(), trackers, units, parts, armour, ammunition, contract); - } - - - - /* - public void generate() { - if ((getCompanyGenerator() != null) && (JOptionPane.showConfirmDialog(getFrame(), - resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.text"), - resources.getString("CompanyGenerationPanel.OverwriteGenerationWarning.title"), - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { - return; - } else if (!validateOptions()) { - return; - } - - setCompanyGenerator(getCompanyGenerationMethod().getGenerator(getCampaign(), createOptionsFromPanel())); - - setCombatPersonnel(getCompanyGenerator().generateCombatPersonnel(getCampaign())); - setSupportPersonnel(getCompanyGenerator().generateSupportPersonnel(getCampaign())); - setEntities(getCompanyGenerator().generateUnits(getCampaign(), getCombatPersonnel())); - } - - public void apply() { - if (getCompanyGenerator() == null) { - if (JOptionPane.showConfirmDialog(getFrame(), - resources.getString("CompanyGenerationPanel.ImmediateApplicationWarning.text"), - resources.getString("CompanyGenerationPanel.ImmediateApplicationWarning.title"), - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { - generate(); - // Catch statement for bad data - if (getCompanyGenerator() == null) { - return; - } - } else { - return; - } - } - - getCompanyGenerator().applyToCampaign(getCampaign(), getCombatPersonnel(), - getSupportPersonnel(), getEntities()); - } - */ -} From 322ee181f1918b1f0a258c601deeb91b3d80e145 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Fri, 22 Oct 2021 19:11:05 -0400 Subject: [PATCH 043/115] Cleaning up CompanyGenerationPersonTracker --- .../AbstractCompanyGenerator.java | 8 +++---- .../CompanyGenerationPersonTracker.java | 23 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 084a60ee01..b2010e9518 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -454,8 +454,8 @@ private List generateSupportPersonnel(final Camp for (final Map.Entry entry : getOptions().getSupportPersonnel().entrySet()) { for (int i = 0; i < entry.getValue(); i++) { - trackers.add(new CompanyGenerationPersonTracker( - generateSupportPerson(campaign, entry.getKey()), CompanyGenerationPersonType.SUPPORT)); + trackers.add(new CompanyGenerationPersonTracker(CompanyGenerationPersonType.SUPPORT, + generateSupportPerson(campaign, entry.getKey()))); } } return trackers; @@ -518,7 +518,7 @@ private void generateAssistants(final Campaign campaign, final List Date: Fri, 22 Oct 2021 19:16:27 -0400 Subject: [PATCH 044/115] A few more minor cleanups from personal review --- MekHQ/resources/mekhq/resources/Universe.properties | 2 +- MekHQ/src/mekhq/campaign/parts/Armor.java | 2 +- MekHQ/src/mekhq/campaign/personnel/Person.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index ee5dcb9377..a21910fc3b 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -3,7 +3,7 @@ ## General Universe Resources ## Enums -# Alphabet Enum +# Alphabet Enum - This is sorted by the grouping then letter, not in the same order as they are listed in the enum, because it is more readable this way. Alphabets.A.ccb1943.text=Able Alphabets.B.ccb1943.text=Baker Alphabets.C.ccb1943.text=Charlie diff --git a/MekHQ/src/mekhq/campaign/parts/Armor.java b/MekHQ/src/mekhq/campaign/parts/Armor.java index 117fcc7b8c..8ab1463cbe 100644 --- a/MekHQ/src/mekhq/campaign/parts/Armor.java +++ b/MekHQ/src/mekhq/campaign/parts/Armor.java @@ -189,7 +189,7 @@ public int getAmount() { return amount; } - public void addAmount(int amount) { + public void addAmount(final int amount) { this.amount += amount; } diff --git a/MekHQ/src/mekhq/campaign/personnel/Person.java b/MekHQ/src/mekhq/campaign/personnel/Person.java index 52f410ce8c..e3614fc4dc 100644 --- a/MekHQ/src/mekhq/campaign/personnel/Person.java +++ b/MekHQ/src/mekhq/campaign/personnel/Person.java @@ -2703,7 +2703,7 @@ public Skills getSkills() { return skills.getSkill(skillName); } - public int getSkillLevel(String skillName) { + public int getSkillLevel(final String skillName) { final Skill skill = getSkill(skillName); return (skill == null) ? 0 : skill.getExperienceLevel(); } From 106f52fa0522be117b243223c0fd83a0571a06c6 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sat, 23 Oct 2021 12:56:47 -0400 Subject: [PATCH 045/115] Cleaning up CompanyGenerationOptions and the options panel based on code changes done since this was last worked on --- .../CompanyGenerationOptions.java | 106 +++-- .../panels/CompanyGenerationOptionsPanel.java | 426 ++++++------------ 2 files changed, 211 insertions(+), 321 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index 1a8b7c9d28..bf84ce3dfc 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -119,7 +119,7 @@ public class CompanyGenerationOptions implements Serializable { // Surprises private boolean generateSurprises; // Not Implemented private boolean generateMysteryBoxes; // Not Implemented - private boolean[] generateMysteryBoxTypes; // Not Implemented + private Map generateMysteryBoxTypes; // Not Implemented //endregion Variable Declarations //region Constructors @@ -221,8 +221,8 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp // Surprises setGenerateSurprises(true); setGenerateMysteryBoxes(true); - setGenerateMysteryBoxTypes(new boolean[MysteryBoxType.values().length]); - getGenerateMysteryBoxTypes()[MysteryBoxType.STAR_LEAGUE_REGULAR.ordinal()] = true; + setGenerateMysteryBoxTypes(new HashMap<>()); + getGenerateMysteryBoxTypes().put(MysteryBoxType.STAR_LEAGUE_REGULAR, true); } //endregion Constructors @@ -694,18 +694,22 @@ public void setGenerateMysteryBoxes(final boolean generateMysteryBoxes) { this.generateMysteryBoxes = generateMysteryBoxes; } - public boolean[] getGenerateMysteryBoxTypes() { + public Map getGenerateMysteryBoxTypes() { return generateMysteryBoxTypes; } - public void setGenerateMysteryBoxTypes(final boolean... generateMysteryBoxTypes) { + public void setGenerateMysteryBoxTypes(final Map generateMysteryBoxTypes) { this.generateMysteryBoxTypes = generateMysteryBoxTypes; } //endregion Surprises //endregion Getters/Setters //region File IO - public void writeToFile(File file) { + /** + * Writes these options to an XML file + * @param file the file to write to, or null to not write to a file + */ + public void writeToFile(@Nullable File file) { if (file == null) { return; } @@ -726,6 +730,13 @@ public void writeToFile(File file) { } } + /** + * @param pw the print writer to write to + * @param indent the indent level to write at + * @param version the version these options were written to file in. This may be null, in which + * case they are being written to file as a part of a larger save than just these + * options (e.g. saved as part of Campaign or CampaignOptions) + */ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String version) { if (version == null) { MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "companyGenerationOptions"); @@ -745,10 +756,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String // Personnel MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "supportPersonnel"); for (final Map.Entry entry : getSupportPersonnel().entrySet()) { - MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "supportRole"); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "role", entry.getKey().name()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "number", entry.getValue()); - MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "supportRole"); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().name(), entry.getValue()); } MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "supportPersonnel"); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "poolAssistants", isPoolAssistants()); @@ -816,15 +824,26 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String // Surprises MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSurprises", isGenerateSurprises()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxes", isGenerateMysteryBoxes()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxTypes", getGenerateMysteryBoxTypes()); - + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "generateMysteryBoxTypes"); + for (final Map.Entry entry : getGenerateMysteryBoxTypes().entrySet()) { + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().name(), entry.getValue()); + } + MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "generateMysteryBoxTypes"); MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "companyGenerationOptions"); } - public static CompanyGenerationOptions parseFromXML(final Campaign campaign, final File file) { + /** + * @param campaign the campaign to parse the options based on + * @param file the XML file to parse the company generation options from. This should not be null, + * but null values are handled nicely. + * @return the parsed CompanyGenerationOptions, or the default Windchild options if there is an + * issue parsing the file. + */ + public static CompanyGenerationOptions parseFromXML(final Campaign campaign, + final @Nullable File file) { if (file == null) { - MekHQ.getLogger().error("Received a null file, returning the default AtB options"); - return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); + MekHQ.getLogger().error("Received a null file, returning the default Windchild options"); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); } final Element element; @@ -832,8 +851,8 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, fin try (InputStream is = new FileInputStream(file)) { element = MekHqXmlUtil.newSafeDocumentBuilder().parse(is).getDocumentElement(); } catch (Exception e) { - MekHQ.getLogger().error("Failed to open file, returning the default AtB options", e); - return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); + MekHQ.getLogger().error("Failed to open file, returning the default Windchild options", e); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); } element.normalize(); @@ -843,13 +862,13 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, fin final Node wn = nl.item(i); if ("companyGenerationOptions".equals(wn.getNodeName()) && wn.hasChildNodes()) { final CompanyGenerationOptions options = parseFromXML(wn.getChildNodes(), version); - return (options == null) - ? new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign) - : options; + if (options != null) { + return options; + } } } - MekHQ.getLogger().error("Failed to parse file, returning the default AtB options"); - return new CompanyGenerationOptions(CompanyGenerationMethod.AGAINST_THE_BOT, campaign); + MekHQ.getLogger().error("Failed to parse file, returning the default Windchild options"); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); } /** @@ -892,25 +911,13 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, fin options.setSupportPersonnel(new HashMap<>()); final NodeList nl2 = wn.getChildNodes(); for (int y = 0; y < nl2.getLength(); y++) { - final Node wn3 = nl2.item(y); - if ("supportRole".equals(wn3.getNodeName())) { - final NodeList nl3 = wn3.getChildNodes(); - PersonnelRole role = PersonnelRole.NONE; - int number = -1; - for (int z = 0; z < nl3.getLength(); z++) { - final Node wn4 = nl3.item(z); - switch (wn4.getNodeName()) { - case "role": - role = PersonnelRole.valueOf(wn4.getTextContent().trim()); - break; - case "number": - number = Integer.parseInt(wn4.getTextContent().trim()); - break; - } - } - if (!role.isNone() && (number != -1)) { - options.getSupportPersonnel().put(role, number); - } + final Node wn2 = nl2.item(y); + try { + options.getSupportPersonnel().put( + PersonnelRole.valueOf(wn2.getNodeName().trim()), + Integer.parseInt(wn2.getTextContent().trim())); + } catch (Exception ignored) { + } } break; @@ -1085,12 +1092,21 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, fin case "generateMysteryBoxes": options.setGenerateMysteryBoxes(Boolean.parseBoolean(wn.getTextContent().trim())); break; - case "generateMysteryBoxTypes": - final String[] values = wn.getTextContent().trim().split(","); - for (int i = 0; i < Math.min(values.length, options.getGenerateMysteryBoxTypes().length); i++) { - options.getGenerateMysteryBoxTypes()[i] = Boolean.parseBoolean(values[i]); + case "generateMysteryBoxTypes": { + options.setGenerateMysteryBoxTypes(new HashMap<>()); + final NodeList nl2 = wn.getChildNodes(); + for (int y = 0; y < nl2.getLength(); y++) { + final Node wn2 = nl2.item(y); + try { + options.getGenerateMysteryBoxTypes().put( + MysteryBoxType.valueOf(wn2.getNodeName().trim()), + Boolean.parseBoolean(wn2.getTextContent().trim())); + } catch (Exception ignored) { + + } } break; + } //endregion Surprises } } diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 2bfc1507c3..d447c16b16 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -18,14 +18,12 @@ */ package mekhq.gui.panels; -import megamek.common.annotations.Nullable; +import megamek.client.ui.baseComponents.MMComboBox; import megamek.common.util.EncodeControl; -import megamek.common.util.sorter.NaturalOrderComparator; import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.enums.PersonnelRole; import mekhq.campaign.universe.Faction; -import mekhq.campaign.universe.Factions; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.PlanetarySystem; import mekhq.campaign.universe.enums.CompanyGenerationMethod; @@ -34,23 +32,23 @@ import mekhq.campaign.universe.enums.PartGenerationMethod; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.gui.FileDialogs; +import mekhq.gui.baseComponents.AbstractMHQPanel; import mekhq.gui.baseComponents.JDisableablePanel; import javax.swing.*; import java.awt.*; -import java.time.LocalDate; -import java.util.List; -import java.util.*; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.ResourceBundle; import java.util.stream.Collectors; -import java.util.stream.Stream; -public class CompanyGenerationOptionsPanel extends JPanel { +public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { //region Variable Declarations - private final JFrame frame; private final Campaign campaign; // Base Information - private JComboBox comboCompanyGenerationMethod; + private MMComboBox comboCompanyGenerationMethod; private JCheckBox chkGenerateMercenaryCompanyCommandLance; private JSpinner spnCompanyCount; private JSpinner spnIndividualLanceCount; @@ -60,7 +58,7 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Personnel private JLabel lblTotalSupportPersonnel; - private RoleToSpinner[] spnSupportPersonnelNumbers; + private Map spnSupportPersonnelNumbers; private JCheckBox chkPoolAssistants; private JCheckBox chkGenerateCaptains; private JCheckBox chkAssignCompanyCommanderFlag; @@ -73,8 +71,8 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkRandomizeOrigin; private JCheckBox chkRandomizeAroundCentralPlanet; private JCheckBox chkCentralSystemFactionSpecific; - private JComboBox comboCentralSystem; - private JComboBox comboCentralPlanet; + private MMComboBox comboCentralSystem; + private MMComboBox comboCentralPlanet; private JSpinner spnOriginSearchRadius; private JCheckBox chkExtraRandomOrigin; private JSpinner spnOriginDistanceScale; @@ -95,13 +93,13 @@ public class CompanyGenerationOptionsPanel extends JPanel { private JCheckBox chkAssignTechsToUnits; // Unit - private JComboBox comboForceNamingMethod; + private MMComboBox comboForceNamingMethod; private JCheckBox chkGenerateForceIcons; // Spares private JCheckBox chkGenerateMothballedSpareUnits; private JSpinner spnSparesPercentOfActiveUnits; - private JComboBox comboPartGenerationMethod; + private MMComboBox comboPartGenerationMethod; private JSpinner spnStartingArmourWeight; private JCheckBox chkGenerateSpareAmmunition; private JSpinner spnNumberReloadsPerWeapon; @@ -127,15 +125,14 @@ public class CompanyGenerationOptionsPanel extends JPanel { // Surprises private JCheckBox chkGenerateSurprises; private JCheckBox chkGenerateMysteryBoxes; - private JCheckBox[] chkGenerateMysteryBoxTypes; + private Map chkGenerateMysteryBoxTypes; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations //region Constructors public CompanyGenerationOptionsPanel(final JFrame frame, final Campaign campaign) { - super(new GridBagLayout()); - this.frame = frame; + super(frame, "CompanyGenerationOptionsPanel", new GridBagLayout()); this.campaign = campaign; initialize(); @@ -149,24 +146,16 @@ public CompanyGenerationOptionsPanel(final JFrame frame, final Campaign campaign //endregion Constructors //region Getters/Setters - public JFrame getFrame() { - return frame; - } - public Campaign getCampaign() { return campaign; } //region Base Information - public JComboBox getComboCompanyGenerationMethod() { + public MMComboBox getComboCompanyGenerationMethod() { return comboCompanyGenerationMethod; } - public CompanyGenerationMethod getCompanyGenerationMethod() { - return (CompanyGenerationMethod) Objects.requireNonNull(getComboCompanyGenerationMethod().getSelectedItem()); - } - - public void setComboCompanyGenerationMethod(final JComboBox comboCompanyGenerationMethod) { + public void setComboCompanyGenerationMethod(final MMComboBox comboCompanyGenerationMethod) { this.comboCompanyGenerationMethod = comboCompanyGenerationMethod; } @@ -233,27 +222,14 @@ public void setLblTotalSupportPersonnel(final JLabel lblTotalSupportPersonnel) { this.lblTotalSupportPersonnel = lblTotalSupportPersonnel; } - public RoleToSpinner[] getSpnSupportPersonnelNumbers() { + public Map getSpnSupportPersonnelNumbers() { return spnSupportPersonnelNumbers; } - public Map getSupportPersonnelNumbers() { - final Map supportPersonnelNumbers = new HashMap<>(); - Stream.of(getSpnSupportPersonnelNumbers()).filter(rts -> rts.getValue() > 0) - .forEach(rts -> supportPersonnelNumbers.put(rts.getRole(), rts.getValue())); - return supportPersonnelNumbers; - } - - public void setSpnSupportPersonnelNumbers(final RoleToSpinner... spnSupportPersonnelNumbers) { + public void setSpnSupportPersonnelNumbers(final Map spnSupportPersonnelNumbers) { this.spnSupportPersonnelNumbers = spnSupportPersonnelNumbers; } - public void setSupportPersonnelNumbers(final Map supportPersonnelNumbers) { - for (final RoleToSpinner rts : getSpnSupportPersonnelNumbers()) { - rts.getSpinner().setValue(supportPersonnelNumbers.getOrDefault(rts.getRole(), 0)); - } - } - public JCheckBox getChkPoolAssistants() { return chkPoolAssistants; } @@ -336,42 +312,40 @@ public void setChkCentralSystemFactionSpecific(final JCheckBox chkCentralSystemF this.chkCentralSystemFactionSpecific = chkCentralSystemFactionSpecific; } - public JComboBox getComboCentralSystem() { + public MMComboBox getComboCentralSystem() { return comboCentralSystem; } - public @Nullable PlanetarySystem getCentralSystem() { - return (PlanetarySystem) getComboCentralSystem().getSelectedItem(); - } - - public void setComboCentralSystem(final JComboBox comboCentralSystem) { + public void setComboCentralSystem(final MMComboBox comboCentralSystem) { this.comboCentralSystem = comboCentralSystem; } private void restoreComboCentralSystem() { getComboCentralSystem().removeAllItems(); - getComboCentralSystem().setModel(new DefaultComboBoxModel<>(getPlanetarySystems( - getChkCentralSystemFactionSpecific().isSelected() ? getCampaign().getFaction() : null))); + final Faction faction = getChkCentralSystemFactionSpecific().isSelected() + ? getCampaign().getFaction() : null; + final PlanetarySystem[] planetarySystems = getCampaign().getSystems().stream() + .filter(p -> (faction == null) || p.getFactionSet(getCampaign().getLocalDate()).contains(faction)) + .sorted(Comparator.comparing(p -> p.getName(getCampaign().getLocalDate()))) + .collect(Collectors.toList()).toArray(new PlanetarySystem[]{}); + getComboCentralSystem().setModel(new DefaultComboBoxModel<>(planetarySystems)); restoreComboCentralPlanet(); } - public JComboBox getComboCentralPlanet() { + public MMComboBox getComboCentralPlanet() { return comboCentralPlanet; } - public @Nullable Planet getCentralPlanet() { - return (Planet) getComboCentralPlanet().getSelectedItem(); - } - - public void setComboCentralPlanet(final JComboBox comboCentralPlanet) { + public void setComboCentralPlanet(final MMComboBox comboCentralPlanet) { this.comboCentralPlanet = comboCentralPlanet; } private void restoreComboCentralPlanet() { - if (getCentralSystem() != null) { + final PlanetarySystem centralSystem = getComboCentralSystem().getSelectedItem(); + if (centralSystem != null) { getComboCentralPlanet().setModel(new DefaultComboBoxModel<>( - getCentralSystem().getPlanets().toArray(new Planet[]{}))); - getComboCentralPlanet().setSelectedItem(getCentralSystem().getPrimaryPlanet()); + centralSystem.getPlanets().toArray(new Planet[]{}))); + getComboCentralPlanet().setSelectedItem(centralSystem.getPrimaryPlanet()); } else { getComboCentralPlanet().removeAllItems(); } @@ -495,15 +469,11 @@ public void setChkAssignTechsToUnits(final JCheckBox chkAssignTechsToUnits) { //endregion Units //region Unit - public JComboBox getComboForceNamingMethod() { + public MMComboBox getComboForceNamingMethod() { return comboForceNamingMethod; } - public ForceNamingMethod getForceNamingMethod() { - return (ForceNamingMethod) Objects.requireNonNull(getComboForceNamingMethod().getSelectedItem()); - } - - public void setComboForceNamingMethod(final JComboBox comboForceNamingMethod) { + public void setComboForceNamingMethod(final MMComboBox comboForceNamingMethod) { this.comboForceNamingMethod = comboForceNamingMethod; } @@ -533,15 +503,11 @@ public void setSpnSparesPercentOfActiveUnits(final JSpinner spnSparesPercentOfAc this.spnSparesPercentOfActiveUnits = spnSparesPercentOfActiveUnits; } - public JComboBox getComboPartGenerationMethod() { + public MMComboBox getComboPartGenerationMethod() { return comboPartGenerationMethod; } - public PartGenerationMethod getPartGenerationMethod() { - return (PartGenerationMethod) Objects.requireNonNull(getComboPartGenerationMethod().getSelectedItem()); - } - - public void setComboPartGenerationMethod(final JComboBox comboPartGenerationMethod) { + public void setComboPartGenerationMethod(final MMComboBox comboPartGenerationMethod) { this.comboPartGenerationMethod = comboPartGenerationMethod; } @@ -703,11 +669,11 @@ public void setChkGenerateMysteryBoxes(final JCheckBox chkGenerateMysteryBoxes) this.chkGenerateMysteryBoxes = chkGenerateMysteryBoxes; } - public JCheckBox[] getChkGenerateMysteryBoxTypes() { + public Map getChkGenerateMysteryBoxTypes() { return chkGenerateMysteryBoxTypes; } - public void setChkGenerateMysteryBoxTypes(final JCheckBox... chkGenerateMysteryBoxTypes) { + public void setChkGenerateMysteryBoxTypes(final Map chkGenerateMysteryBoxTypes) { this.chkGenerateMysteryBoxTypes = chkGenerateMysteryBoxTypes; } //endregion Surprises @@ -722,9 +688,8 @@ public int determineMaximumSupportPersonnel() { //endregion Determination Methods //region Initialization - private void initialize() { - setName("companyGenerationOptionsPanel"); - + @Override + protected void initialize() { final GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; @@ -770,8 +735,7 @@ private JPanel createBaseInformationPanel() { lblCompanyGenerationMethod.setToolTipText(resources.getString("lblCompanyGenerationMethod.toolTipText")); lblCompanyGenerationMethod.setName("lblCompanyGenerationMethod"); - setComboCompanyGenerationMethod(new JComboBox<>(CompanyGenerationMethod.values())); - getComboCompanyGenerationMethod().setName("comboCompanyGenerationMethod"); + setComboCompanyGenerationMethod(new MMComboBox<>("comboCompanyGenerationMethod", CompanyGenerationMethod.values())); getComboCompanyGenerationMethod().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -970,125 +934,48 @@ private JPanel createPersonnelPanel() { } private JPanel createSupportPersonnelNumbersPanel() { - // This nasty array and panel must currently be created manually, for now at least - final RoleToSpinner[] rtsArray = new RoleToSpinner[9]; - final JLabel[] rtsLabelArray = new JLabel[9]; - - String roleName = PersonnelRole.MECH_TECH.getName(false); - String toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[0] = new JLabel(roleName); - rtsLabelArray[0].setToolTipText(toolTipText); - rtsLabelArray[0].setName("lbl" + roleName); - rtsArray[0] = new RoleToSpinner(PersonnelRole.MECH_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[0].getSpinner().setToolTipText(toolTipText); - rtsArray[0].getSpinner().setName("spn" + roleName); - rtsLabelArray[0].setLabelFor(rtsArray[0].getSpinner()); - - roleName = PersonnelRole.MECHANIC.getName(false); - toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[1] = new JLabel(roleName); - rtsLabelArray[1].setToolTipText(toolTipText); - rtsLabelArray[1].setName("lbl" + roleName); - rtsArray[1] = new RoleToSpinner(PersonnelRole.MECHANIC, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[1].getSpinner().setToolTipText(toolTipText); - rtsArray[1].getSpinner().setName("spn" + roleName); - rtsLabelArray[1].setLabelFor(rtsArray[1].getSpinner()); - - roleName = PersonnelRole.AERO_TECH.getName(false); - toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[2] = new JLabel(roleName); - rtsLabelArray[2].setToolTipText(toolTipText); - rtsLabelArray[2].setName("lbl" + roleName); - rtsArray[2] = new RoleToSpinner(PersonnelRole.AERO_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[2].getSpinner().setToolTipText(toolTipText); - rtsArray[2].getSpinner().setName("spn" + roleName); - rtsLabelArray[2].setLabelFor(rtsArray[2].getSpinner()); - - roleName = PersonnelRole.BA_TECH.getName(false); - toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[3] = new JLabel(roleName); - rtsLabelArray[3].setToolTipText(toolTipText); - rtsLabelArray[3].setName("lbl" + roleName); - rtsArray[3] = new RoleToSpinner(PersonnelRole.BA_TECH, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[3].getSpinner().setToolTipText(toolTipText); - rtsArray[3].getSpinner().setName("spn" + roleName); - rtsLabelArray[3].setLabelFor(rtsArray[3].getSpinner()); - - roleName = PersonnelRole.DOCTOR.getName(false); - toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[4] = new JLabel(roleName); - rtsLabelArray[4].setToolTipText(toolTipText); - rtsLabelArray[4].setName("lbl" + roleName); - rtsArray[4] = new RoleToSpinner(PersonnelRole.DOCTOR, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[4].getSpinner().setToolTipText(toolTipText); - rtsArray[4].getSpinner().setName("spn" + roleName); - rtsLabelArray[4].setLabelFor(rtsArray[4].getSpinner()); - - roleName = PersonnelRole.ADMINISTRATOR_COMMAND.getName(false); - toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[5] = new JLabel(roleName); - rtsLabelArray[5].setToolTipText(toolTipText); - rtsLabelArray[5].setName("lbl" + roleName); - rtsArray[5] = new RoleToSpinner(PersonnelRole.ADMINISTRATOR_COMMAND, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[5].getSpinner().setToolTipText(toolTipText); - rtsArray[5].getSpinner().setName("spn" + roleName); - rtsLabelArray[5].setLabelFor(rtsArray[5].getSpinner()); - - roleName = PersonnelRole.ADMINISTRATOR_LOGISTICS.getName(false); - toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[6] = new JLabel(roleName); - rtsLabelArray[6].setToolTipText(toolTipText); - rtsLabelArray[6].setName("lbl" + roleName); - rtsArray[6] = new RoleToSpinner(PersonnelRole.ADMINISTRATOR_LOGISTICS, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[6].getSpinner().setToolTipText(toolTipText); - rtsArray[6].getSpinner().setName("spn" + roleName); - rtsLabelArray[6].setLabelFor(rtsArray[6].getSpinner()); - - roleName = PersonnelRole.ADMINISTRATOR_TRANSPORT.getName(false); - toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[7] = new JLabel(roleName); - rtsLabelArray[7].setToolTipText(toolTipText); - rtsLabelArray[7].setName("lbl" + roleName); - rtsArray[7] = new RoleToSpinner(PersonnelRole.ADMINISTRATOR_TRANSPORT, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[7].getSpinner().setToolTipText(toolTipText); - rtsArray[7].getSpinner().setName("spn" + roleName); - rtsLabelArray[7].setLabelFor(rtsArray[7].getSpinner()); - - roleName = PersonnelRole.ADMINISTRATOR_HR.getName(false); - toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), roleName); - rtsLabelArray[8] = new JLabel(roleName); - rtsLabelArray[8].setToolTipText(toolTipText); - rtsLabelArray[8].setName("lbl" + roleName); - rtsArray[8] = new RoleToSpinner(PersonnelRole.ADMINISTRATOR_HR, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); - rtsArray[8].getSpinner().setToolTipText(toolTipText); - rtsArray[8].getSpinner().setName("spn" + roleName); - rtsLabelArray[8].setLabelFor(rtsArray[8].getSpinner()); - - setSpnSupportPersonnelNumbers(rtsArray); + final PersonnelRole[] personnelRoles = { + PersonnelRole.MECH_TECH, PersonnelRole.MECHANIC, PersonnelRole.AERO_TECH, + PersonnelRole.BA_TECH, PersonnelRole.DOCTOR, PersonnelRole.ADMINISTRATOR_COMMAND, + PersonnelRole.ADMINISTRATOR_LOGISTICS, PersonnelRole.ADMINISTRATOR_TRANSPORT, PersonnelRole.ADMINISTRATOR_HR + }; + + // Create Panel Components + setSpnSupportPersonnelNumbers(new HashMap<>()); + final Map labels = new HashMap<>(); + for (final PersonnelRole role : personnelRoles) { + final String name = role.getName(getCampaign().getFaction().isClan()); + final String toolTipText = String.format(resources.getString("supportPersonnelNumber.toolTipText"), name); + + labels.put(role, new JLabel(name)); + labels.get(role).setToolTipText(toolTipText); + labels.get(role).setName("lbl" + role.name()); + + getSpnSupportPersonnelNumbers().put(role, new JSpinner(new SpinnerNumberModel(0, 0, 100, 1))); + getSpnSupportPersonnelNumbers().get(role).setToolTipText(toolTipText); + getSpnSupportPersonnelNumbers().get(role).setName("spn" + role.name()); + + // Programmatically Assign Accessibility Labels + labels.get(role).setLabelFor(getSpnSupportPersonnelNumbers().get(role)); + } // Layout the UI - final JPanel panel = new JPanel(new GridLayout(6, 3)); + final JPanel panel = new JPanel(new GridLayout(0, 3)); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("supportPersonnelNumbersPanel.title"))); panel.setName("supportPersonnelNumbersPanel"); - for (int i = 0; i < 3; i++) { - panel.add(rtsLabelArray[i]); - } - for (int i = 0; i < 3; i++) { - panel.add(rtsArray[i].getSpinner()); - } - for (int i = 3; i < 6; i++) { - panel.add(rtsLabelArray[i]); - } - for (int i = 3; i < 6; i++) { - panel.add(rtsArray[i].getSpinner()); - } - for (int i = 6; i < rtsLabelArray.length; i++) { - panel.add(rtsLabelArray[i]); - } - for (int i = 6; i < rtsArray.length; i++) { - panel.add(rtsArray[i].getSpinner()); + // This puts the label above the spinner, separated into three columns. From the + // personnelRoles array declaration, the i tracks the line and the j tracks the + for (int i = 0; i < (personnelRoles.length / 3.0); i++) { + for (int j = 0; j < 3; j++) { + panel.add(labels.get(personnelRoles[j + (3 * i)])); + } + + for (int j = 0; j < 3; j++) { + panel.add(getSpnSupportPersonnelNumbers().get(personnelRoles[j + (3 * i)])); + } } + return panel; } @@ -1132,8 +1019,9 @@ private JPanel createPersonnelRandomizationPanel() { getChkCentralSystemFactionSpecific().setToolTipText(resources.getString("chkCentralSystemFactionSpecific.toolTipText")); getChkCentralSystemFactionSpecific().setName("chkCentralSystemFactionSpecific"); getChkCentralSystemFactionSpecific().addActionListener(evt -> { - if ((getCentralSystem() == null) || ((getCentralSystem() != null) - && !getCentralSystem().getFactionSet(getCampaign().getLocalDate()).contains(getCampaign().getFaction()))) { + final PlanetarySystem system = getComboCentralSystem().getSelectedItem(); + if ((system == null) + || !system.getFactionSet(getCampaign().getLocalDate()).contains(getCampaign().getFaction())) { restoreComboCentralSystem(); } }); @@ -1142,9 +1030,8 @@ private JPanel createPersonnelRandomizationPanel() { lblCentralPlanet.setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); lblCentralPlanet.setName("lblCentralPlanet"); - setComboCentralSystem(new JComboBox<>()); + setComboCentralSystem(new MMComboBox<>("comboCentralSystem")); getComboCentralSystem().setToolTipText(resources.getString("comboCentralSystem.toolTipText")); - getComboCentralSystem().setName("comboCentralSystem"); getComboCentralSystem().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -1158,15 +1045,15 @@ public Component getListCellRendererComponent(final JList list, final Object } }); getComboCentralSystem().addActionListener(evt -> { - if ((getCentralSystem() == null) || ((getCentralSystem() != null) && (getCentralPlanet() != null) - && !getCentralPlanet().getParentSystem().equals(getCentralSystem()))) { + final PlanetarySystem system = getComboCentralSystem().getSelectedItem(); + final Planet planet = getComboCentralPlanet().getSelectedItem(); + if ((system == null) || ((planet != null) && !planet.getParentSystem().equals(system))) { restoreComboCentralPlanet(); } }); - setComboCentralPlanet(new JComboBox<>()); + setComboCentralPlanet(new MMComboBox<>("comboCentralPlanet")); getComboCentralPlanet().setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); - getComboCentralPlanet().setName("comboCentralPlanet"); getComboCentralPlanet().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -1363,10 +1250,10 @@ private JPanel createUnitsPanel() { getChkAssignTechsToUnits().setName("chkAssignTechsToUnits"); // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitsPanel.title"))); panel.setName("unitsPanel"); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1393,17 +1280,17 @@ private JPanel createUnitsPanel() { .addComponent(getChkKeepOfficerRollsSeparate()) .addComponent(getChkAssignTechsToUnits()) ); + return panel; } private JPanel createUnitPanel() { // Create Panel Components - JLabel lblForceNamingMethod = new JLabel(resources.getString("lblForceNamingMethod.text")); + final JLabel lblForceNamingMethod = new JLabel(resources.getString("lblForceNamingMethod.text")); lblForceNamingMethod.setToolTipText(resources.getString("lblForceNamingMethod.toolTipText")); lblForceNamingMethod.setName("lblForceNamingMethod"); - setComboForceNamingMethod(new JComboBox<>(ForceNamingMethod.values())); - getComboForceNamingMethod().setName("comboForceNamingMethod"); + setComboForceNamingMethod(new MMComboBox<>("comboForceNamingMethod", ForceNamingMethod.values())); getComboForceNamingMethod().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -1425,10 +1312,10 @@ public Component getListCellRendererComponent(final JList list, final Object lblForceNamingMethod.setLabelFor(getComboForceNamingMethod()); // Layout the UI - JPanel panel = new JPanel(); + final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitPanel.title"))); panel.setName("unitPanel"); - GroupLayout layout = new GroupLayout(panel); + final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); @@ -1479,9 +1366,8 @@ private JPanel createSparesPanel() { lblPartGenerationMethod.setToolTipText(resources.getString("lblPartGenerationMethod.toolTipText")); lblPartGenerationMethod.setName("lblPartGenerationMethod"); - setComboPartGenerationMethod(new JComboBox<>(PartGenerationMethod.values())); + setComboPartGenerationMethod(new MMComboBox<>("comboPartGenerationMethod", PartGenerationMethod.values())); getComboPartGenerationMethod().setToolTipText(resources.getString("lblPartGenerationMethod.toolTipText")); - getComboPartGenerationMethod().setName("comboPartGenerationMethod"); getComboPartGenerationMethod().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -1839,34 +1725,29 @@ private void createMysteryBoxPanel(final JPanel panel) { panel.setLayout(new GridLayout(0, 1)); // Create Panel Components - final MysteryBoxType[] mysteryBoxTypes = MysteryBoxType.values(); - setChkGenerateMysteryBoxTypes(new JCheckBox[mysteryBoxTypes.length]); - for (int i = 0; i < mysteryBoxTypes.length; i++) { - getChkGenerateMysteryBoxTypes()[i] = new JCheckBox(mysteryBoxTypes[i].toString()); - getChkGenerateMysteryBoxTypes()[i].setToolTipText(mysteryBoxTypes[i].getToolTipText()); - getChkGenerateMysteryBoxTypes()[i].setName("chk" + mysteryBoxTypes[i].name()); - panel.add(getChkGenerateMysteryBoxTypes()[i]); + setChkGenerateMysteryBoxTypes(new HashMap<>()); + for (final MysteryBoxType type : MysteryBoxType.values()) { + getChkGenerateMysteryBoxTypes().put(type, new JCheckBox(type.toString())); + getChkGenerateMysteryBoxTypes().get(type).setToolTipText(type.getToolTipText()); + getChkGenerateMysteryBoxTypes().get(type).setName("chk" + type.name()); + panel.add(getChkGenerateMysteryBoxTypes().get(type)); } } - - private PlanetarySystem[] getPlanetarySystems(final @Nullable Faction faction) { - return getCampaign().getSystems().stream() - .filter(p -> (faction == null) || p.getFactionSet(getCampaign().getLocalDate()).contains(faction)) - .sorted(Comparator.comparing(p -> p.getName(getCampaign().getLocalDate()))) - .collect(Collectors.toList()).toArray(new PlanetarySystem[]{}); - } //endregion Initialization //region Options - public void setOptions() { - setOptions(getCompanyGenerationMethod()); - } - + /** + * Sets the options for this panel to the default for the provided CompanyGenerationMethod + * @param method the CompanyGenerationOptions to create the CompanyGenerationOptions from + */ public void setOptions(final CompanyGenerationMethod method) { - getComboCompanyGenerationMethod().setSelectedItem(method); setOptions(new CompanyGenerationOptions(method, getCampaign())); } + /** + * Sets the options for this panel based on the provided CompanyGenerationOptions + * @param options the CompanyGenerationOptions to use + */ public void setOptions(final CompanyGenerationOptions options) { // Base Information getComboCompanyGenerationMethod().setSelectedItem(options.getMethod()); @@ -1879,7 +1760,9 @@ public void setOptions(final CompanyGenerationOptions options) { // Personnel updateLblTotalSupportPersonnel(determineMaximumSupportPersonnel()); - setSupportPersonnelNumbers(options.getSupportPersonnel()); + for (final Map.Entry entry : getSpnSupportPersonnelNumbers().entrySet()) { + entry.getValue().setValue(options.getSupportPersonnel().getOrDefault(entry.getKey(), 0)); + } getChkPoolAssistants().setSelected(options.isPoolAssistants()); getChkGenerateCaptains().setSelected(options.isGenerateCaptains()); getChkAssignCompanyCommanderFlag().setSelected(options.isAssignCompanyCommanderFlag()); @@ -1892,6 +1775,7 @@ public void setOptions(final CompanyGenerationOptions options) { if (getChkRandomizeOrigin().isSelected() != options.isRandomizeOrigin()) { getChkRandomizeOrigin().doClick(); } + if (getChkRandomizeAroundCentralPlanet().isSelected() != options.isRandomizeAroundCentralPlanet()) { getChkRandomizeAroundCentralPlanet().doClick(); } @@ -1960,11 +1844,13 @@ public void setOptions(final CompanyGenerationOptions options) { if (getChkGenerateSurprises().isSelected() != options.isGenerateSurprises()) { getChkGenerateSurprises().doClick(); } + if (getChkGenerateMysteryBoxes().isSelected() != options.isGenerateMysteryBoxes()) { getChkGenerateMysteryBoxes().doClick(); } - for (int i = 0; i < getChkGenerateMysteryBoxTypes().length; i++) { - getChkGenerateMysteryBoxTypes()[i].setSelected(options.getGenerateMysteryBoxTypes()[i]); + + for (final Map.Entry entry : getChkGenerateMysteryBoxTypes().entrySet()) { + entry.getValue().setSelected(options.getGenerateMysteryBoxTypes().getOrDefault(entry.getKey(), false)); } } @@ -1972,10 +1858,10 @@ public void setOptions(final CompanyGenerationOptions options) { * @return the CompanyGenerationOptions created from the current panel */ public CompanyGenerationOptions createOptionsFromPanel() { - final CompanyGenerationOptions options = new CompanyGenerationOptions(getCompanyGenerationMethod(), getCampaign()); + final CompanyGenerationOptions options = new CompanyGenerationOptions( + getComboCompanyGenerationMethod().getSelectedItem(), getCampaign()); // Base Information - options.setMethod(getCompanyGenerationMethod()); options.setGenerateMercenaryCompanyCommandLance(getChkGenerateMercenaryCompanyCommandLance().isSelected()); options.setCompanyCount((Integer) getSpnCompanyCount().getValue()); options.setIndividualLanceCount((Integer) getSpnIndividualLanceCount().getValue()); @@ -1984,7 +1870,14 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setStarLeagueYear((Integer) getSpnStarLeagueYear().getValue()); // Personnel - options.setSupportPersonnel(getSupportPersonnelNumbers()); + options.setSupportPersonnel(new HashMap<>()); + for (final Map.Entry entry : getSpnSupportPersonnelNumbers().entrySet()) { + final int value = (int) entry.getValue().getValue(); + if (value <= 0) { + continue; + } + options.getSupportPersonnel().put(entry.getKey(), value); + } options.setPoolAssistants(getChkPoolAssistants().isSelected()); options.setGenerateCaptains(getChkGenerateCaptains().isSelected()); options.setAssignCompanyCommanderFlag(getChkAssignCompanyCommanderFlag().isSelected()); @@ -1996,7 +1889,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Personnel Randomization options.setRandomizeOrigin(getChkRandomizeOrigin().isSelected()); options.setRandomizeAroundCentralPlanet(getChkRandomizeAroundCentralPlanet().isSelected()); - options.setCentralPlanet(getCentralPlanet()); + options.setCentralPlanet(getComboCentralPlanet().getSelectedItem()); options.setOriginSearchRadius((Integer) getSpnOriginSearchRadius().getValue()); options.setExtraRandomOrigin(getChkExtraRandomOrigin().isSelected()); options.setOriginDistanceScale((Double) getSpnOriginDistanceScale().getValue()); @@ -2017,13 +1910,13 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setAssignTechsToUnits(getChkAssignTechsToUnits().isSelected()); // Unit - options.setForceNamingMethod(getForceNamingMethod()); + options.setForceNamingMethod(getComboForceNamingMethod().getSelectedItem()); options.setGenerateForceIcons(getChkGenerateForceIcons().isSelected()); // Spares options.setGenerateMothballedSpareUnits(getChkGenerateMothballedSpareUnits().isSelected()); options.setSparesPercentOfActiveUnits((Integer) getSpnSparesPercentOfActiveUnits().getValue()); - options.setPartGenerationMethod(getPartGenerationMethod()); + options.setPartGenerationMethod(getComboPartGenerationMethod().getSelectedItem()); options.setStartingArmourWeight((Integer) getSpnStartingArmourWeight().getValue()); options.setGenerateSpareAmmunition(getChkGenerateSpareAmmunition().isSelected()); options.setNumberReloadsPerWeapon((Integer) getSpnNumberReloadsPerWeapon().getValue()); @@ -2049,20 +1942,24 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Surprises options.setGenerateSurprises(getChkGenerateSurprises().isSelected()); options.setGenerateMysteryBoxes(getChkGenerateMysteryBoxes().isSelected()); - for (int i = 0; i < getChkGenerateMysteryBoxTypes().length; i++) { - options.getGenerateMysteryBoxTypes()[i] = true; - options.getGenerateMysteryBoxTypes()[i] = getChkGenerateMysteryBoxTypes()[i].isSelected(); + options.setGenerateMysteryBoxTypes(new HashMap<>()); + for (final Map.Entry entry : getChkGenerateMysteryBoxTypes().entrySet()) { + options.getGenerateMysteryBoxTypes().put(entry.getKey(), entry.getValue().isSelected()); } return options; } + /** + * Validates the data contained in this panel + * @return true if the data validates successfully, otherwise false + */ public boolean validateOptions() { //region Errors // Minimum Generation Size Validation // Minimum Generation Parameter of 1 Company or Lance, the Company Command Lance Doesn't Count - if (((Integer) getSpnCompanyCount().getValue() <= 0) - && ((Integer) getSpnIndividualLanceCount().getValue() <= 0)) { + if (((int) getSpnCompanyCount().getValue() <= 0) + && ((int) getSpnIndividualLanceCount().getValue() <= 0)) { JOptionPane.showMessageDialog(getFrame(), resources.getString("CompanyGenerationOptionsPanel.InvalidGenerationSize.text"), resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), @@ -2071,7 +1968,8 @@ public boolean validateOptions() { } // Central System/Planet Validation - if ((getCentralSystem() == null) || (getCentralPlanet() == null)) { + if ((getComboCentralSystem().getSelectedItem() == null) + || (getComboCentralPlanet().getSelectedItem() == null)) { JOptionPane.showMessageDialog(getFrame(), resources.getString("CompanyGenerationOptionsPanel.InvalidCentralPlanet.text"), resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), @@ -2085,15 +1983,15 @@ public boolean validateOptions() { // 1) Above Recommended Maximum Support Personnel Count // 2) Below Half of Recommended Maximum Support Personnel Count final int maximumSupportPersonnelCount = determineMaximumSupportPersonnel(); - final int currentSupportPersonnelCount = Stream.of(getSpnSupportPersonnelNumbers()) - .mapToInt(RoleToSpinner::getValue).sum(); + final int currentSupportPersonnelCount = getSpnSupportPersonnelNumbers().values().stream() + .mapToInt(spinner -> (int) spinner.getValue()).sum(); if ((maximumSupportPersonnelCount < currentSupportPersonnelCount) && (JOptionPane.showConfirmDialog(getFrame(), resources.getString("CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text"), resources.getString("CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.title"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { return false; - } else if ((currentSupportPersonnelCount < (maximumSupportPersonnelCount / 2)) + } else if ((currentSupportPersonnelCount < (maximumSupportPersonnelCount / 2.0)) && (JOptionPane.showConfirmDialog(getFrame(), resources.getString("CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.text"), resources.getString("CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.title"), @@ -2108,44 +2006,20 @@ public boolean validateOptions() { //endregion Options //region File I/O + /** + * Imports CompanyGenerationOptions from an XML file + */ public void importOptionsFromXML() { FileDialogs.openCompanyGenerationOptions(getFrame()) .ifPresent(file -> setOptions(CompanyGenerationOptions.parseFromXML(getCampaign(), file))); } + /** + * Exports the CompanyGenerationOptions displayed on this panel to an XML file. + */ public void exportOptionsToXML() { FileDialogs.saveCompanyGenerationOptions(getFrame()) .ifPresent(file -> createOptionsFromPanel().writeToFile(file)); } //endregion File I/O - - //region Static Classes - private static class RoleToSpinner { - //region Variable Declarations - private final PersonnelRole role; - private final JSpinner spinner; - //endregion Variable Declarations - - //region Constructors - public RoleToSpinner(final PersonnelRole role, final JSpinner spinner) { - this.role = role; - this.spinner = spinner; - } - //endregion Constructors - - //region Getters/Setters - public PersonnelRole getRole() { - return role; - } - - public JSpinner getSpinner() { - return spinner; - } - - public int getValue() { - return (Integer) getSpinner().getValue(); - } - //endregion Getters/Setters - } - //endregion Static Classes } From 49a2ddf7765da56019e86418f4316ffe3cfb750c Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sat, 23 Oct 2021 13:08:54 -0400 Subject: [PATCH 046/115] Missing removing now duplicated resources --- MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index d447c16b16..41ffd81518 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -19,7 +19,6 @@ package mekhq.gui.panels; import megamek.client.ui.baseComponents.MMComboBox; -import megamek.common.util.EncodeControl; import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.enums.PersonnelRole; @@ -40,7 +39,6 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Map; -import java.util.ResourceBundle; import java.util.stream.Collectors; public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { @@ -126,8 +124,6 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { private JCheckBox chkGenerateSurprises; private JCheckBox chkGenerateMysteryBoxes; private Map chkGenerateMysteryBoxTypes; - - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.GUI", new EncodeControl()); //endregion Variable Declarations //region Constructors From 5130af7d5ea390c55735c4a79d3335f9d6607094 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sat, 23 Oct 2021 18:12:09 -0400 Subject: [PATCH 047/115] Fixing code scanning method comparison find --- .../AbstractCompanyGenerator.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index b2010e9518..72a4f8aa1d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1103,18 +1103,18 @@ private int determineForceWeightClass(final Campaign campaign, final Force force } weight = weight * 4.0 / (getOptions().getLanceSize() * (isLance ? 1 : getOptions().getLancesPerCompany())); - if (weight < 40) { - return EntityWeightClass.WEIGHT_ULTRA_LIGHT; - } else if (weight > 130) { - return EntityWeightClass.WEIGHT_MEDIUM; - } else if (weight > 200) { - return EntityWeightClass.WEIGHT_HEAVY; + if (weight > 390) { + return EntityWeightClass.WEIGHT_SUPER_HEAVY; } else if (weight > 280) { return EntityWeightClass.WEIGHT_ASSAULT; - } else if (weight > 390) { - return EntityWeightClass.WEIGHT_SUPER_HEAVY; - } else { // 40 <= weight <= 130 + } else if (weight > 200) { + return EntityWeightClass.WEIGHT_HEAVY; + } else if (weight > 130) { + return EntityWeightClass.WEIGHT_MEDIUM; + } else if (weight >= 40) { return EntityWeightClass.WEIGHT_LIGHT; + } else { + return EntityWeightClass.WEIGHT_ULTRA_LIGHT; } } //endregion Unit From 5608a3d72c0c0802241be03b360b20b46aa074c8 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sat, 23 Oct 2021 18:23:59 -0400 Subject: [PATCH 048/115] Cleaning up and modernizing the temporary dialog, and disabling contracts --- .../resources/mekhq/resources/GUI.properties | 8 +- .../enums/CompanyGenerationPersonType.java | 2 +- .../CompanyGenerationPersonTracker.java | 9 +- .../gui/dialog/CompanyGenerationDialog.java | 76 ++++++++-------- .../panels/CompanyGenerationOptionsPanel.java | 87 ++++++++++++------- 5 files changed, 106 insertions(+), 76 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 660b5f7e4b..3136fa507f 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -309,6 +309,11 @@ CampaignPresetSelectionDialog.title=Select Campaign Preset ### CompanyGenerationDialog Class CompanyGenerationDialog.title=Company Generator +CompanyGenerationDialog.btnGenerate.toolTipText=Generates a company based on the provided options. Currently this immediately applies it to the campaign, making this functionally identical to Apply in the current implementation. +CompanyGenerationDialog.btnApply.toolTipText=Immediately complete all remaining generation and apply the changes to the campaign. +CompanyGenerationDialog.btnRestore.toolTipText=Restores the options on the current dialog to the default options for the currently selected company generation method. +CompanyGenerationDialog.btnImport.toolTipText=Import the current options from an XML file. +CompanyGenerationDialog.btnExport.toolTipText=Export the current options to an XML file. ### ContractMarketDialog Class ContractMarketDialog.title=Contract Market @@ -744,7 +749,7 @@ lblNumberReloadsPerWeapon.toolTipText=This is the number of reloads to generate chkGenerateFractionalMachineGunAmmunition.text=Generate Fractional Machine Gun Ammunition chkGenerateFractionalMachineGunAmmunition.toolTipText=Generate 50 rounds of machine gun ammunition per machine gun instead of the full ammunition bin of 200. ## Contracts Panel -contractsPanel.title=Contracts +contractsPanel.title=Contracts (Unimplemented) chkSelectStartingContract.text=Select Starting Contract chkSelectStartingContract.toolTipText=This enables a panel where the company's starting contract can be selected.
(This panel will only show when there is not an active contract and a contract market is enabled) chkStartCourseToContractPlanet.text=Start Course to Contract Planet @@ -785,7 +790,6 @@ chkGenerateMysteryBoxes.toolTipText=Allow the generation of enabled mystery box ## Option Validation Warnings CompanyGenerationOptionsPanel.InvalidOptions.title=Error: Invalid Option Selection CompanyGenerationOptionsPanel.InvalidGenerationSize.text=You must select at least one company or independent lance to generate -CompanyGenerationOptionsPanel.InvalidStartingPlanet.text=You must select a valid starting planet. CompanyGenerationOptionsPanel.InvalidCentralPlanet.text=You must select a valid central planet. CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.title=Over Maximum Support Personnel CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text=The specified number of support personnel to generate is over the recommended maximum number of support personnel. Select "Ok" to continue, or "Cancel" to make changes to these Company Generation Options. diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java index b028453931..15bed74750 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java @@ -39,7 +39,7 @@ public enum CompanyGenerationPersonType { //region Constructors CompanyGenerationPersonType(final String name, final String toolTipText) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Personnel", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java index 5d34654c47..4d0d934124 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java @@ -21,7 +21,6 @@ import megamek.common.Entity; import megamek.common.annotations.Nullable; import mekhq.campaign.personnel.Person; -import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.enums.CompanyGenerationPersonType; public class CompanyGenerationPersonTracker { @@ -34,13 +33,17 @@ public class CompanyGenerationPersonTracker { //region Constructors public CompanyGenerationPersonTracker(final Person person) { - this(CompanyGenerationPersonType.MECHWARRIOR, person); + var test = CompanyGenerationPersonType.MECHWARRIOR; + setPersonType(test); + setPerson(person); + setParameters(null); + setEntity(null); } public CompanyGenerationPersonTracker(final CompanyGenerationPersonType personType, final Person person) { - setPerson(person); setPersonType(personType); + setPerson(person); setParameters(null); setEntity(null); } diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 01ba46c5d8..af0aa510df 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -18,9 +18,12 @@ */ package mekhq.gui.dialog; +import megamek.client.ui.baseComponents.MMButton; +import megamek.client.ui.enums.ValidationState; import megamek.common.Entity; import mekhq.MekHQ; import mekhq.campaign.Campaign; +import mekhq.campaign.event.OrganizationChangedEvent; import mekhq.campaign.mission.Contract; import mekhq.campaign.parts.AmmoStorage; import mekhq.campaign.parts.Armor; @@ -29,14 +32,18 @@ import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationPersonTracker; -import mekhq.gui.baseComponents.AbstractMHQButtonDialog; +import mekhq.gui.baseComponents.AbstractMHQValidationButtonDialog; import mekhq.gui.panels.CompanyGenerationOptionsPanel; import javax.swing.*; import java.awt.*; import java.util.List; -public class CompanyGenerationDialog extends AbstractMHQButtonDialog { +/** + * This is currently just a temporary dialog over the CompanyGenerationOptionsPanel. + * Wave 5 will be when this gets redone to be far nicer and more customizable. + */ +public class CompanyGenerationDialog extends AbstractMHQValidationButtonDialog { //region Variable Declarations private Campaign campaign; private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; @@ -77,41 +84,29 @@ protected Container createCenterPane() { @Override protected JPanel createButtonPanel() { - JPanel panel = new JPanel(new GridLayout(2, 3)); - - JButton cancelButton = new JButton(resources.getString("Cancel.text")); - cancelButton.setName("cancelButton"); - cancelButton.addActionListener(this::cancelActionPerformed); - panel.add(cancelButton); - - JButton btnExport = new JButton(resources.getString("Export.text")); - btnExport.addActionListener(evt -> getCompanyGenerationOptionsPanel().exportOptionsToXML()); - panel.add(btnExport); - - JButton okButton = new JButton(resources.getString("Generate.text")); - okButton.setName("okButton"); - okButton.addActionListener(this::okButtonActionPerformed); - panel.add(okButton); - - JButton btnRestore = new JButton(resources.getString("RestoreDefaults.text")); - btnRestore.setName("btnRestore"); - btnRestore.addActionListener(evt -> getCompanyGenerationOptionsPanel().setOptions( - MekHQ.getMekHQOptions().getDefaultCompanyGenerationMethod())); - panel.add(btnRestore); - - JButton btnImport = new JButton(resources.getString("Import.text")); - btnImport.addActionListener(evt -> getCompanyGenerationOptionsPanel().importOptionsFromXML()); - panel.add(btnImport); - - JButton btnApply = new JButton(resources.getString("Apply.text")); - /* - btnApply.addActionListener(evt -> { - getCompanyGenerationOptionsPanel().apply(); - MekHQ.triggerEvent(new OrganizationChangedEvent(getCompanyGenerationOptionsPanel().getCampaign().getForces())); - setVisible(false); - }); - */ - panel.add(btnApply); + final JPanel panel = new JPanel(new GridLayout(2, 3)); + + setOkButton(new MMButton("btnGenerate", resources, "Generate.text", + "CompanyGenerationDialog.btnGenerate.toolTipText", this::okButtonActionPerformed)); + panel.add(getOkButton()); + + panel.add(new MMButton("btnApply", resources, "Apply.text", + "CompanyGenerationDialog.btnApply.toolTipText", this::okButtonActionPerformed)); + + panel.add(new MMButton("btnCancel", resources, "Cancel.text", + "Cancel.toolTipText", this::cancelActionPerformed)); + + panel.add(new MMButton("btnRestore", resources, "RestoreDefaults.text", + "CompanyGenerationDialog.btnRestore.toolTipText", evt -> + getCompanyGenerationOptionsPanel().setOptions())); + + panel.add(new MMButton("btnImport", resources, "Import.text", + "CompanyGenerationDialog.btnImport.toolTipText", + evt -> getCompanyGenerationOptionsPanel().importOptionsFromXML())); + + panel.add(new MMButton("btnExport", resources, "Export.text", + "CompanyGenerationDialog.btnExport.toolTipText", + evt -> getCompanyGenerationOptionsPanel().exportOptionsToXML())); return panel; } @@ -135,5 +130,12 @@ protected void okAction() { final Contract contract = null; generator.applyPhaseThreeToCampaign(getCampaign(), trackers, units, parts, armour, ammunition, contract); + + MekHQ.triggerEvent(new OrganizationChangedEvent(getCompanyGenerationOptionsPanel().getCampaign().getForces())); + } + + @Override + protected ValidationState validateAction(final boolean display) { + return getCompanyGenerationOptionsPanel().validateOptions(display); } } diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 41ffd81518..9bae5bfba9 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -19,6 +19,7 @@ package mekhq.gui.panels; import megamek.client.ui.baseComponents.MMComboBox; +import megamek.client.ui.enums.ValidationState; import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.enums.PersonnelRole; @@ -962,7 +963,7 @@ private JPanel createSupportPersonnelNumbersPanel() { // This puts the label above the spinner, separated into three columns. From the // personnelRoles array declaration, the i tracks the line and the j tracks the - for (int i = 0; i < (personnelRoles.length / 3.0); i++) { + for (int i = 0; i < (personnelRoles.length / 3); i++) { for (int j = 0; j < 3; j++) { panel.add(labels.get(personnelRoles[j + (3 * i)])); } @@ -1510,6 +1511,11 @@ private JPanel createContractsPanel() { .addComponent(getChkStartCourseToContractPlanet()) ); + // TODO : Wave 5 : Company Generation GUI + panel.setEnabled(false); + getChkSelectStartingContract().setEnabled(false); + getChkStartCourseToContractPlanet().setEnabled(false); + return panel; } @@ -1705,7 +1711,7 @@ private JPanel createSurprisesPanel() { .addComponent(mysteryBoxPanel) ); - // TODO : Remove me and implement Surprises + // TODO : Wave 7 : Surprises panel.setEnabled(false); getChkGenerateSurprises().setEnabled(false); getChkGenerateMysteryBoxes().setEnabled(false); @@ -1732,6 +1738,13 @@ private void createMysteryBoxPanel(final JPanel panel) { //endregion Initialization //region Options + /** + * Sets the options for this panel to the default for the selected CompanyGenerationMethod + */ + public void setOptions() { + setOptions(getComboCompanyGenerationMethod().getSelectedItem()); + } + /** * Sets the options for this panel to the default for the provided CompanyGenerationMethod * @param method the CompanyGenerationOptions to create the CompanyGenerationOptions from @@ -1947,57 +1960,65 @@ public CompanyGenerationOptions createOptionsFromPanel() { } /** - * Validates the data contained in this panel + * Validates the data contained in this panel, returning the current state of validation. + * @param display to display dialogs containing the messages or not * @return true if the data validates successfully, otherwise false */ - public boolean validateOptions() { + public ValidationState validateOptions(final boolean display) { //region Errors // Minimum Generation Size Validation // Minimum Generation Parameter of 1 Company or Lance, the Company Command Lance Doesn't Count if (((int) getSpnCompanyCount().getValue() <= 0) && ((int) getSpnIndividualLanceCount().getValue() <= 0)) { - JOptionPane.showMessageDialog(getFrame(), - resources.getString("CompanyGenerationOptionsPanel.InvalidGenerationSize.text"), - resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), - JOptionPane.ERROR_MESSAGE); - return false; + if (display) { + JOptionPane.showMessageDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.InvalidGenerationSize.text"), + resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), + JOptionPane.ERROR_MESSAGE); + } + return ValidationState.FAILURE; } // Central System/Planet Validation if ((getComboCentralSystem().getSelectedItem() == null) || (getComboCentralPlanet().getSelectedItem() == null)) { - JOptionPane.showMessageDialog(getFrame(), - resources.getString("CompanyGenerationOptionsPanel.InvalidCentralPlanet.text"), - resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), - JOptionPane.ERROR_MESSAGE); - return false; + if (display) { + JOptionPane.showMessageDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.InvalidCentralPlanet.text"), + resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), + JOptionPane.ERROR_MESSAGE); + } + return ValidationState.FAILURE; } //endregion Errors //region Warnings - // Support Personnel Count: - // 1) Above Recommended Maximum Support Personnel Count - // 2) Below Half of Recommended Maximum Support Personnel Count - final int maximumSupportPersonnelCount = determineMaximumSupportPersonnel(); - final int currentSupportPersonnelCount = getSpnSupportPersonnelNumbers().values().stream() - .mapToInt(spinner -> (int) spinner.getValue()).sum(); - if ((maximumSupportPersonnelCount < currentSupportPersonnelCount) - && (JOptionPane.showConfirmDialog(getFrame(), - resources.getString("CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text"), - resources.getString("CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.title"), - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { - return false; - } else if ((currentSupportPersonnelCount < (maximumSupportPersonnelCount / 2.0)) - && (JOptionPane.showConfirmDialog(getFrame(), - resources.getString("CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.text"), - resources.getString("CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.title"), - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { - return false; + // Only need to check these if they are to be displayed + if (display) { + // Support Personnel Count: + // 1) Above Recommended Maximum Support Personnel Count + // 2) Below Half of Recommended Maximum Support Personnel Count + final int maximumSupportPersonnelCount = determineMaximumSupportPersonnel(); + final int currentSupportPersonnelCount = getSpnSupportPersonnelNumbers().values().stream() + .mapToInt(spinner -> (int) spinner.getValue()).sum(); + if ((maximumSupportPersonnelCount < currentSupportPersonnelCount) + && (JOptionPane.showConfirmDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text"), + resources.getString("CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.title"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { + return ValidationState.WARNING; + } else if ((currentSupportPersonnelCount < (maximumSupportPersonnelCount / 2.0)) + && (JOptionPane.showConfirmDialog(getFrame(), + resources.getString("CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.text"), + resources.getString("CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.title"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.NO_OPTION)) { + return ValidationState.WARNING; + } } //endregion Warnings // The options specified are correct, and thus can be saved - return true; + return ValidationState.SUCCESS; } //endregion Options From 0c72cf2b85e01dfffd06ea82ffda4cb3e5a18faf Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sat, 23 Oct 2021 23:55:19 -0400 Subject: [PATCH 049/115] Moving to using warehouses as the default for generating parts --- .../AbstractCompanyGenerator.java | 44 +++++-------------- .../partGenerators/AbstractPartGenerator.java | 14 +++++- .../partGenerators/MishraPartGenerator.java | 27 +++++++----- .../partGenerators/MultiplePartGenerator.java | 11 +++-- .../WindchildPartGenerator.java | 5 +-- 5 files changed, 48 insertions(+), 53 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 72a4f8aa1d..59dd939be7 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -18,12 +18,7 @@ */ package mekhq.campaign.universe.generators.companyGenerators; -import megamek.common.AmmoType; -import megamek.common.Entity; -import megamek.common.EntityWeightClass; -import megamek.common.MechFileParser; -import megamek.common.MechSummary; -import megamek.common.UnitType; +import megamek.common.*; import megamek.common.annotations.Nullable; import megamek.common.options.OptionsConstants; import megamek.common.util.EncodeControl; @@ -31,9 +26,7 @@ import mekhq.MekHQ; import mekhq.Utilities; import mekhq.campaign.Campaign; -import mekhq.campaign.CurrentLocation; import mekhq.campaign.finances.Money; -import mekhq.campaign.finances.Transaction; import mekhq.campaign.finances.enums.TransactionType; import mekhq.campaign.force.Force; import mekhq.campaign.mission.Contract; @@ -48,13 +41,7 @@ import mekhq.campaign.personnel.generator.AbstractPersonnelGenerator; import mekhq.campaign.personnel.ranks.Rank; import mekhq.campaign.unit.Unit; -import mekhq.campaign.universe.AbstractFactionSelector; -import mekhq.campaign.universe.AbstractPlanetSelector; -import mekhq.campaign.universe.DefaultFactionSelector; -import mekhq.campaign.universe.DefaultPlanetSelector; -import mekhq.campaign.universe.Faction; -import mekhq.campaign.universe.RangedFactionSelector; -import mekhq.campaign.universe.RangedPlanetSelector; +import mekhq.campaign.universe.*; import mekhq.campaign.universe.enums.Alphabet; import mekhq.campaign.universe.enums.CompanyGenerationMethod; import mekhq.campaign.universe.enums.CompanyGenerationPersonType; @@ -62,16 +49,7 @@ import mekhq.gui.enums.LayeredForceIcon; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.ResourceBundle; -import java.util.UUID; -import java.util.Vector; +import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -105,13 +83,9 @@ * FIXME : * Backgrounds don't work * Weighted Type for force icons don't work - * Dialog x doesn't work - * Dialog Buttons look odd and need fixing - * Dialog Modify the buttons, and have them appear or disappear based on the current panel * Panel has odd whitespace usage * System, Planet text search * - * Phase Two: * TODO: * Implement Surprises * Implement Mystery Boxes @@ -1058,11 +1032,15 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, // Type // FIXME : I'm not working properly to determine the filename - final int weightClass = determineForceWeightClass(campaign, force, isLance); - final String weightClassName = EntityWeightClass.getClassName(weightClass); - String filename = String.format("BattleMech %s.png", weightClassName); + String filename = String.format("BattleMech %s.png", + EntityWeightClass.getClassName(determineForceWeightClass(campaign, force, isLance))); MekHQ.getLogger().warning(filename); - if (!MHQStaticDirectoryManager.getForceIcons().getItems().containsKey(filename)) { + try { + if (MHQStaticDirectoryManager.getForceIcons().getItem(LayeredForceIcon.TYPE.getLayerPath(), filename) == null) { + filename = "BattleMech.png"; + } + } catch (Exception e) { + MekHQ.getLogger().error(e); filename = "BattleMech.png"; } iconMap.put(LayeredForceIcon.TYPE.getLayerPath(), new Vector<>()); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java index fa884e6148..bd0c23494f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java @@ -18,6 +18,7 @@ */ package mekhq.campaign.universe.generators.partGenerators; +import mekhq.campaign.Warehouse; import mekhq.campaign.parts.Armor; import mekhq.campaign.parts.Part; import mekhq.campaign.parts.equipment.AmmoBin; @@ -27,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public abstract class AbstractPartGenerator { //region Variable Declarations @@ -69,7 +71,17 @@ public List generate(final List units, final boolean includeArmour, * unassigned. Implementors are required to clone the parts as required. * @return the list of generated parts */ - public abstract List generate(final List inputParts); + public List generate(final List inputParts) { + return generateWarehouse(inputParts).getParts().stream() + .filter(part -> part.getQuantity() > 0).collect(Collectors.toList()); + } + + /** + * @param inputParts a list of parts, which are not guaranteed to be unique, sorted, nor + * unassigned. Implementors are required to clone the parts as required. + * @return a warehouse containing the generated parts + */ + public abstract Warehouse generateWarehouse(final List inputParts); /** * This creates a clone of the input part, with it not being omni-podded if it was originally. diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java index 690e75933f..30b67db555 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java @@ -18,11 +18,10 @@ */ package mekhq.campaign.universe.generators.partGenerators; -import megamek.common.Dropship; -import megamek.common.Jumpship; +import megamek.common.Mech; +import mekhq.campaign.Warehouse; import mekhq.campaign.parts.EnginePart; import mekhq.campaign.parts.Part; -import mekhq.campaign.parts.SVEnginePart; import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.enums.PartGenerationMethod; @@ -30,7 +29,7 @@ /** * The Rules for this Generator: - * 1) Remove all DropShips, JumpShips, WarShips, and Space Stations + * 1) Remove all non-'Mech Units * 2) Start with Triple Parts * 3) Remove all Engines * 3) All Heat Sinks are capped at 30 per type @@ -41,9 +40,9 @@ */ /** * The Rules for this Generator: - * 3) Remove all Engines - EnginePart, SVEnginePart - * 3) All Heat Sinks are capped at 30 per type - HeatSink, AeroHeatSink - * 4) All 'Mech Heads [Sensors, Life Support] are capped at 2 per weight/type - MekLifeSupport, AeroLifeSupport + * 3) Remove all Engines - EnginePart + * 3) All Heat Sinks are capped at 30 per type - HeatSink + * 4) All 'Mech Heads [Sensors, Life Support] are capped at 2 per weight/type - ???, MekLifeSupport * 5) All Gyros are capped at 1 per weight/type * 6) MASC is capped at 1 per type * 7) Any other parts are capped at 6. @@ -58,14 +57,18 @@ public MishraPartGenerator() { @Override public List generate(final List units, final boolean includeArmour, final boolean includeAmmunition) { - units.removeIf(unit -> (unit.getEntity() instanceof Jumpship) || (unit.getEntity() instanceof Dropship)); + units.removeIf(unit -> !(unit.getEntity() instanceof Mech)); return super.generate(units, includeArmour, includeAmmunition); } @Override - public List generate(final List inputParts) { - final List outputParts = super.generate(inputParts); - outputParts.removeIf(part -> (part instanceof EnginePart) || (part instanceof SVEnginePart)); - return outputParts; + public Warehouse generateWarehouse(final List inputParts) { + final Warehouse warehouse = super.generateWarehouse(inputParts); + warehouse.forEachPart(part -> { + if (part instanceof EnginePart) { + warehouse.removePart(part); + } + }); + return warehouse; } } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java index a3f9bb31fa..b11acf6664 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java @@ -18,9 +18,11 @@ */ package mekhq.campaign.universe.generators.partGenerators; +import mekhq.campaign.Warehouse; import mekhq.campaign.parts.Part; import mekhq.campaign.universe.enums.PartGenerationMethod; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -43,9 +45,10 @@ public int getMultiple() { //endregion Getters @Override - public List generate(final List inputParts) { - final List parts = inputParts.stream().map(this::clonePart).collect(Collectors.toList()); - parts.forEach(part -> part.setQuantity(part.getQuantity() * getMultiple())); - return parts; + public Warehouse generateWarehouse(final List inputParts) { + final Warehouse warehouse = new Warehouse(); + inputParts.forEach(part -> warehouse.addPart(clonePart(part), true)); + warehouse.forEachPart(part -> part.setQuantity(part.getQuantity() * getMultiple())); + return warehouse; } } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java index 44168bc094..1db05dcecd 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java @@ -22,7 +22,6 @@ import mekhq.campaign.parts.Part; import mekhq.campaign.universe.enums.PartGenerationMethod; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -38,10 +37,10 @@ public WindchildPartGenerator() { //endregion Constructors @Override - public List generate(final List inputParts) { + public Warehouse generateWarehouse(final List inputParts) { final Warehouse warehouse = new Warehouse(); inputParts.forEach(part -> warehouse.addPart(clonePart(part), true)); warehouse.forEachPart(part -> part.setQuantity((int) Math.round(part.getQuantity() / 3.0))); - return warehouse.getParts().stream().filter(part -> part.getQuantity() > 0).collect(Collectors.toList()); + return warehouse; } } From e94f44c1cd4ddd5285c14a0e9924967d59b158db Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 24 Oct 2021 00:03:50 -0400 Subject: [PATCH 050/115] Using doClick instead of setter to ensure the actionlistener triggers for random dice starting value --- MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 9bae5bfba9..8b555c1f41 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -1838,7 +1838,9 @@ public void setOptions(final CompanyGenerationOptions options) { // Finances getSpnStartingCash().setValue(options.getStartingCash()); - getChkRandomizeStartingCash().setSelected(options.isRandomizeStartingCash()); + if (getChkRandomizeStartingCash().isSelected() != options.isRandomizeStartingCash()) { + getChkRandomizeStartingCash().doClick(); + } getSpnRandomStartingCashDiceCount().setValue(options.getRandomStartingCashDiceCount()); getSpnMinimumStartingFloat().setValue(options.getMinimumStartingFloat()); getChkPayForSetup().setSelected(options.isPayForSetup()); From 2369c6701086aa75a00a0140e72d5875cda02abe Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 24 Oct 2021 00:04:40 -0400 Subject: [PATCH 051/115] Removing debugging code from CompanyGenerationPersonTracker --- .../companyGenerators/CompanyGenerationPersonTracker.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java index 4d0d934124..aa1540a89d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java @@ -33,11 +33,7 @@ public class CompanyGenerationPersonTracker { //region Constructors public CompanyGenerationPersonTracker(final Person person) { - var test = CompanyGenerationPersonType.MECHWARRIOR; - setPersonType(test); - setPerson(person); - setParameters(null); - setEntity(null); + this(CompanyGenerationPersonType.MECHWARRIOR, person); } public CompanyGenerationPersonTracker(final CompanyGenerationPersonType personType, From 4b9dc6bf20de0461f8c6752f820fdfc8522fcb2f Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 24 Oct 2021 15:07:56 -0400 Subject: [PATCH 052/115] Finishing the Mishra part generator --- .../partGenerators/MishraPartGenerator.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java index 30b67db555..cc76974eb3 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java @@ -20,8 +20,9 @@ import megamek.common.Mech; import mekhq.campaign.Warehouse; -import mekhq.campaign.parts.EnginePart; -import mekhq.campaign.parts.Part; +import mekhq.campaign.parts.*; +import mekhq.campaign.parts.equipment.HeatSink; +import mekhq.campaign.parts.equipment.MASC; import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.enums.PartGenerationMethod; @@ -38,15 +39,6 @@ * 6) MASC is capped at 1 per type * 7) Any other parts are capped at 6. */ -/** - * The Rules for this Generator: - * 3) Remove all Engines - EnginePart - * 3) All Heat Sinks are capped at 30 per type - HeatSink - * 4) All 'Mech Heads [Sensors, Life Support] are capped at 2 per weight/type - ???, MekLifeSupport - * 5) All Gyros are capped at 1 per weight/type - * 6) MASC is capped at 1 per type - * 7) Any other parts are capped at 6. - */ public class MishraPartGenerator extends MultiplePartGenerator { //region Constructors public MishraPartGenerator() { @@ -64,9 +56,18 @@ public List generate(final List units, final boolean includeArmour, @Override public Warehouse generateWarehouse(final List inputParts) { final Warehouse warehouse = super.generateWarehouse(inputParts); + warehouse.getParts().removeIf(part -> part instanceof EnginePart); warehouse.forEachPart(part -> { - if (part instanceof EnginePart) { - warehouse.removePart(part); + if (part instanceof HeatSink) { + part.setQuantity(Math.min(part.getQuantity(), 30)); + } else if ((part instanceof MekCockpit) || (part instanceof MekLifeSupport) + || (part instanceof MekSensor) + || ((part instanceof MekLocation) && ((MekLocation) part).getLoc() == Mech.LOC_HEAD)) { + part.setQuantity(Math.min(part.getQuantity(), 2)); + } else if ((part instanceof MekGyro) || (part instanceof MASC)) { + part.setQuantity(Math.min(part.getQuantity(), 1)); + } else { + part.setQuantity(Math.min(part.getQuantity(), 6)); } }); return warehouse; From 2c1e113e1c61afc5685ee13389605596d69c0443 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Sun, 24 Oct 2021 15:44:27 -0400 Subject: [PATCH 053/115] Cleaning up the code for the Abstract Company Generator --- .../resources/mekhq/resources/GUI.properties | 2 +- .../AbstractCompanyGenerator.java | 130 +++++++++--------- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 3136fa507f..4fd12592a3 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -747,7 +747,7 @@ chkGenerateSpareAmmunition.toolTipText=This generates spare standard ammunition lblNumberReloadsPerWeapon.text=Reloads per Weapon lblNumberReloadsPerWeapon.toolTipText=This is the number of reloads to generate per weapon requiring the specified ammunition type. chkGenerateFractionalMachineGunAmmunition.text=Generate Fractional Machine Gun Ammunition -chkGenerateFractionalMachineGunAmmunition.toolTipText=Generate 50 rounds of machine gun ammunition per machine gun instead of the full ammunition bin of 200. +chkGenerateFractionalMachineGunAmmunition.toolTipText=Generate 50 rounds of machine gun ammunition per machine gun instead of the full ammunition bin, which has a default count of 100 (half ton) or 200 (full ton) rounds. ## Contracts Panel contractsPanel.title=Contracts (Unimplemented) chkSelectStartingContract.text=Select Starting Contract diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 59dd939be7..3f967fbbd6 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -82,7 +82,6 @@ * * FIXME : * Backgrounds don't work - * Weighted Type for force icons don't work * Panel has odd whitespace usage * System, Planet text search * @@ -314,7 +313,8 @@ private void generateOfficers(final List tracker */ private void generateOfficer(final Person officer, final CompanyGenerationPersonType type) { if (!type.isOfficer()) { - MekHQ.getLogger().error(officer.getFullTitle() + " is not a valid officer for the officer generation, cannot generate them as an officer."); + MekHQ.getLogger().error(officer.getFullTitle() + + " is not a valid officer for the officer generation, cannot generate them as an officer."); return; } @@ -412,8 +412,8 @@ private void generateStandardMechWarriors(final Campaign campaign, */ private void generateStandardMechWarrior(final Campaign campaign, final Person person) { if (getOptions().isAutomaticallyAssignRanks()) { - person.setRank((campaign.getFaction().isComStarOrWoB() - || campaign.getFaction().isClan()) ? 4 : 12); + person.setRank((campaign.getFaction().isComStarOrWoB() || campaign.getFaction().isClan()) + ? 4 : 12); } } //endregion Combat Personnel @@ -465,7 +465,8 @@ private Person generateSupportPerson(final Campaign campaign, final PersonnelRol * @param campaign the campaign to use in creating the assistants * @param trackers the trackers to add the newly created assistants to */ - private void generateAssistants(final Campaign campaign, final List trackers) { + private void generateAssistants(final Campaign campaign, + final List trackers) { // If you don't want to use pooled assistants, then this generates them as personnel instead if (getOptions().isPoolAssistants()) { return; @@ -513,7 +514,7 @@ private void generateAssistants(final Campaign campaign, final List trackers) { // Assign the founder flag if we need to if (getOptions().isAssignFounderFlag()) { - trackers.forEach(t -> t.getPerson().setFounder(true)); + trackers.forEach(tracker -> tracker.getPerson().setFounder(true)); } // Recruit all of the personnel, GM-style so that the initial hiring cost is calculated as @@ -532,8 +533,10 @@ private void finalizePersonnel(final Campaign campaign, final List trackers) { @@ -634,11 +636,14 @@ private List createUnitGenerationParameters( } /** - * Creates an individual set of parameters, rerolling the weight if Star League is rolled originally + * Creates an individual set of parameters, rerolling the weight if Star League is rolled + * originally. + * * @param tracker the tracker to generate the parameters based on * @return the created parameters */ - private AtBRandomMechParameters createUnitGenerationParameter(final CompanyGenerationPersonTracker tracker) { + private AtBRandomMechParameters createUnitGenerationParameter( + final CompanyGenerationPersonTracker tracker) { final AtBRandomMechParameters parameters = new AtBRandomMechParameters( rollBattleMechWeight(tracker, true), rollBattleMechQuality(tracker)); if (parameters.isStarLeague()) { @@ -671,7 +676,8 @@ private int getUnitGenerationParameterModifier(final CompanyGenerationPersonTrac * @param initialRoll if this isn't the initial roll, then we need to cap the value at 12 * @return the weight to use in generating the BattleMech */ - private int rollBattleMechWeight(final CompanyGenerationPersonTracker tracker, final boolean initialRoll) { + private int rollBattleMechWeight(final CompanyGenerationPersonTracker tracker, + final boolean initialRoll) { int roll = Utilities.dice(2, 6) + getUnitGenerationParameterModifier(tracker); if (!initialRoll) { roll = Math.min(roll, 12); @@ -701,6 +707,7 @@ private int rollBattleMechQuality(final CompanyGenerationPersonTracker tracker) * @return the generated IUnitRating magic int for Dragoon Quality */ protected abstract int determineBattleMechQuality(final int roll); + /** * @param trackers the trackers to sort into their lances * @return a new List containing the sorted personnel @@ -718,53 +725,50 @@ private List sortPersonnelIntoLances( tracker.getPersonType().isMechWarrior()).collect(Collectors.toList()); // Sort Command Lance - sortedTrackers.addAll(organizeTrackersIntoLance(trackers.get(0), standardMechWarriors)); + organizeTrackersIntoLance(sortedTrackers, trackers.get(0), standardMechWarriors); // If the command lance is part of a company, we sort the rest of that company immediately if (!getOptions().isGenerateMercenaryCompanyCommandLance() && (getOptions().getCompanyCount() > 0)) { for (int i = 1; i < getOptions().getLancesPerCompany(); i++) { - sortedTrackers.addAll(organizeTrackersIntoLance(lieutenants.remove(0), standardMechWarriors)); + organizeTrackersIntoLance(sortedTrackers, lieutenants.remove(0), standardMechWarriors); } } // Sort into Companies while (!captains.isEmpty()) { // Assign the Captain's Lance - sortedTrackers.addAll(organizeTrackersIntoLance(captains.remove(0), standardMechWarriors)); + organizeTrackersIntoLance(sortedTrackers, captains.remove(0), standardMechWarriors); // Then assign the other lances for (int y = 1; y < getOptions().getLancesPerCompany(); y++) { - sortedTrackers.addAll(organizeTrackersIntoLance(lieutenants.remove(0), standardMechWarriors)); + organizeTrackersIntoLance(sortedTrackers, lieutenants.remove(0), standardMechWarriors); } } // Sort any individual lances while (!lieutenants.isEmpty()) { - sortedTrackers.addAll(organizeTrackersIntoLance(lieutenants.remove(0), standardMechWarriors)); + organizeTrackersIntoLance(sortedTrackers, lieutenants.remove(0), standardMechWarriors); } return sortedTrackers; } /** - * - * @param officer - * @param standardMechWarriors - * @return + * @param sortedTrackers the list to add the now sorted lance to + * @param officer the officer to lead the lance + * @param standardMechWarriors the list of normal MechWarriors who can be assigned to this lance. */ - private List organizeTrackersIntoLance( - final CompanyGenerationPersonTracker officer, - final List standardMechWarriors) { - final List trackers = new ArrayList<>(); - trackers.add(officer); + private void organizeTrackersIntoLance(final List sortedTrackers, + final CompanyGenerationPersonTracker officer, + final List standardMechWarriors) { + sortedTrackers.add(officer); if (standardMechWarriors.size() <= getOptions().getLanceSize() - 1) { - trackers.addAll(standardMechWarriors); + sortedTrackers.addAll(standardMechWarriors); standardMechWarriors.clear(); } else { for (int i = 1; (i < getOptions().getLanceSize()) && !standardMechWarriors.isEmpty(); i++) { - trackers.add(standardMechWarriors.remove(0)); + sortedTrackers.add(standardMechWarriors.remove(0)); } } - return trackers; } //endregion Unit Generation Parameters @@ -835,7 +839,7 @@ protected abstract MechSummary generateMechSummary(final Campaign campaign, protected MechSummary generateMechSummary(final Campaign campaign, final AtBRandomMechParameters parameters, final String faction, int year) { - Predicate filter = ms -> + final Predicate filter = ms -> (!campaign.getCampaignOptions().limitByYear() || (year > ms.getYear())); return campaign.getUnitGenerator().generate(faction, UnitType.MEK, parameters.getWeight(), year, parameters.getQuality(), filter); @@ -869,7 +873,8 @@ private List createUnits(final Campaign campaign, * @param trackers the list of trackers including the support 'Mech techs * @param units the list of units to have techs assigned to (order does not matter) */ - private void assignTechsToUnits(final List trackers, final List units) { + private void assignTechsToUnits(final List trackers, + final List units) { if (!getOptions().isAssignTechsToUnits()) { return; } @@ -901,13 +906,14 @@ private void assignTechsToUnits(final List track * @param campaign the campaign to generate the unit within * @param trackers a CLONED list of trackers properly organized into lances */ - private void generateUnit(final Campaign campaign, final List trackers) { + private void generateUnit(final Campaign campaign, + final List trackers) { final Force originForce = campaign.getForce(0); final Alphabet[] alphabet = Alphabet.values(); String background = ""; if (getOptions().isGenerateForceIcons() && (MHQStaticDirectoryManager.getForceIcons() != null)) { - // FIXME: We need a new way to handle this form of search... just default to CSR for now + // FIXME : We need a new way to handle this form of search... just default to CSR for now background = "CSR.png"; /* if (MHQStaticDirectoryManager.getForceIcons().getItems().keySet().stream() @@ -1031,10 +1037,8 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, final LinkedHashMap> iconMap = new LinkedHashMap<>(); // Type - // FIXME : I'm not working properly to determine the filename String filename = String.format("BattleMech %s.png", EntityWeightClass.getClassName(determineForceWeightClass(campaign, force, isLance))); - MekHQ.getLogger().warning(filename); try { if (MHQStaticDirectoryManager.getForceIcons().getItem(LayeredForceIcon.TYPE.getLayerPath(), filename) == null) { filename = "BattleMech.png"; @@ -1072,14 +1076,9 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, */ private int determineForceWeightClass(final Campaign campaign, final Force force, final boolean isLance) { - double weight = 0.0; - for (final UUID unitId : force.getAllUnits(true)) { - final Unit unit = campaign.getUnit(unitId); - if ((unit != null) && (unit.getEntity() != null)) { - weight += unit.getEntity().getWeight(); - } - } - + double weight = force.getAllUnits(true).stream().map(campaign::getUnit) + .filter(unit -> (unit != null) && (unit.getEntity() != null)) + .mapToDouble(unit -> unit.getEntity().getWeight()).sum(); weight = weight * 4.0 / (getOptions().getLanceSize() * (isLance ? 1 : getOptions().getLancesPerCompany())); if (weight > 390) { return EntityWeightClass.WEIGHT_SUPER_HEAVY; @@ -1165,12 +1164,10 @@ public List generateMothballedEntities(final Campaign campaign, */ private List createMothballedSpareUnits(final Campaign campaign, final List mothballedEntities) { - final List mothballedUnits = new ArrayList<>(); - for (final Entity mothballedEntity : mothballedEntities) { - final Unit unit = campaign.addNewUnit(mothballedEntity, false, 0); - unit.completeMothball(); - mothballedUnits.add(unit); - } + final List mothballedUnits = mothballedEntities.stream() + .map(entity -> campaign.addNewUnit(entity, false, 0)) + .collect(Collectors.toList()); + mothballedUnits.forEach(Unit::completeMothball); return mothballedUnits; } @@ -1193,9 +1190,9 @@ public List generateArmour(final List units) { } final List unitAssignedArmour = units.stream() - .flatMap(u -> u.getParts().stream()) - .filter(p -> p instanceof Armor) - .map(p -> (Armor) p) + .flatMap(unit -> unit.getParts().stream()) + .filter(part -> part instanceof Armor) + .map(part -> (Armor) part) .collect(Collectors.toList()); final List armour = mergeIdenticalArmour(unitAssignedArmour); final double armourTonnageMultiplier = getOptions().getStartingArmourWeight() @@ -1211,20 +1208,21 @@ public List generateArmour(final List units) { */ private List mergeIdenticalArmour(final List unmergedArmour) { final List mergedArmour = new ArrayList<>(); - unmergedArmour.forEach(a -> { + unmergedArmour.forEach(armour -> { boolean unmerged = true; - for (final Armor armour : mergedArmour) { - if (areSameArmour(armour, a)) { - armour.addAmount(a.getAmount()); + for (final Armor a : mergedArmour) { + if (areSameArmour(a, armour)) { + a.addAmount(armour.getAmount()); unmerged = false; break; } } + if (unmerged) { - final Armor armour = a.clone(); - armour.setMode(WorkTime.NORMAL); - armour.setOmniPodded(false); - mergedArmour.add(armour); + final Armor a = armour.clone(); + a.setMode(WorkTime.NORMAL); + a.setOmniPodded(false); + mergedArmour.add(a); } }); return mergedArmour; @@ -1259,9 +1257,9 @@ public List generateAmmunition(final Campaign campaign, final List< } final List ammoBins = units.stream() - .flatMap(u -> u.getParts().stream()) - .filter(p -> p instanceof AmmoBin) - .map(p -> (AmmoBin) p) + .flatMap(unit -> unit.getParts().stream()) + .filter(part -> part instanceof AmmoBin) + .map(part -> (AmmoBin) part) .collect(Collectors.toList()); final List ammunition = new ArrayList<>(); @@ -1552,7 +1550,8 @@ public List applyPhaseOneToCampaign(final Campaign campaign, * @param ammunition the generated spare armour * @return a list of the generated mothballed spare units */ - public List applyPhaseTwoToCampaign(final Campaign campaign, final List mothballedEntities, + public List applyPhaseTwoToCampaign(final Campaign campaign, + final List mothballedEntities, final List parts, final List armour, final List ammunition) { final List mothballedUnits = createMothballedSpareUnits(campaign, mothballedEntities); @@ -1578,7 +1577,8 @@ public List applyPhaseTwoToCampaign(final Campaign campaign, final List trackers, final List units, final List parts, - final List armour, final List ammunition, + final List armour, + final List ammunition, final @Nullable Contract contract) { // Process Contract processContract(campaign, contract); From 02901b6c66d99ed14ce5464dc9003438479e89ab Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 30 Oct 2021 12:20:13 -0400 Subject: [PATCH 054/115] Tearing out the Company Generation Options save as part of one's campaign options --- .../CampaignOptionsDialog.properties | 4 - .../resources/MekHqOptionsDialog.properties | 18 ++-- MekHQ/src/mekhq/MekHQOptions.java | 12 +-- MekHQ/src/mekhq/MekHqConstants.java | 1 - MekHQ/src/mekhq/campaign/CampaignOptions.java | 77 ++++------------ .../gui/dialog/CampaignOptionsDialog.java | 28 ------ .../mekhq/gui/dialog/MekHqOptionsDialog.java | 87 +++++++++---------- 7 files changed, 66 insertions(+), 161 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties b/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties index 79dfd9bfd3..4a6c09fcd0 100644 --- a/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/CampaignOptionsDialog.properties @@ -519,7 +519,3 @@ chkAssignPortraitOnRoleChange.text=Automatically assign portrait on role change chkAssignPortraitOnRoleChange.toolTipText=With this enabled, a person without a portrait will automatically gain a random portrait when their primary role is switched to one of those selected below lblFixedMapChance.text=Fixed Map Chance lblFixedMapChance.toolTipText=The likelihood, in percent, that a fixed user-made map will be used in place of a generated map. - -## Company Generation Options Tab -companyGenerationOptionsPanel.title=Company Generation -#end Company Generation Options Tab diff --git a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties index bbfafc991e..a19ccd7adb 100644 --- a/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties +++ b/MekHQ/resources/mekhq/resources/MekHqOptionsDialog.properties @@ -11,10 +11,10 @@ labelLongDisplayDateFormat.text=Long Display Date Format invalidDateFormat.error=Invalid Date Format optionHistoricalDailyLog.text=Temporarily Retain Daily Log History optionHistoricalDailyLog.toolTipText=Keeps a limited historical daily report in-memory during the gaming session. May result in increased memory usage. -optionCompanyGeneratorStartup.text=Company Generator Startup outside of AtB (Unimplemented) -optionCompanyGeneratorStartup.toolTipText=Adds the ability to use the company generator on startup outside of AtB campaigns. -optionShowCompanyGenerator.text=Show Company Generator -optionShowCompanyGenerator.toolTipText=Add a company generator menu item under the Manage Campaign header on the menu bar to allow one to generate a company after startup. +chkCompanyGeneratorStartup.text=Company Generator Startup outside of AtB (Unimplemented) +chkCompanyGeneratorStartup.toolTipText=Adds the ability to use the company generator on startup outside of AtB campaigns. +chkShowCompanyGenerator.text=Show Company Generator +chkShowCompanyGenerator.toolTipText=Add a company generator menu item under the Manage Campaign header on the menu bar to allow one to generate a company after startup. labelCommandCenterDisplay.text=Command Center Display Options optionCommandCenterUseUnitMarket.text=Find Units Links to Unit Market (if enabled) @@ -86,8 +86,6 @@ optionPreferGzippedOutput.toolTipText=When selected MekHQ will save the campaign optionWriteCustomsToXML.text=Write Custom Units to Campaign XML optionSaveMothballState.text=Save Unit State Before Mothballing optionSaveMothballState.toolTipText=This option allows you to disable saving of the unit's crew and force before being mothballed for restoration post-mothball. -optionSaveCompanyGenerationOptions.text=Save Company Generation Options with Campaign Options -optionSaveCompanyGenerationOptions.toolTipText=Save your company generation options as part of the campaign options. # Nag Tab nagTab.title=Nag Options @@ -108,7 +106,7 @@ optionOutstandingScenariosNag.toolTipText=This allows you to ignore the daily wa #Miscellaneous Tab miscellaneousTab.title=Miscellaneous Options -labelStartGameDelay.text=Delay Timer -optionStartGameDelay.toolTipText=Number of milliseconds to wait before sending another unit.
If the application tends to hang when starting a game in MegaMek or does not transfer all units or settings, try increasing this value. -labelDefaultCompanyGenerationMethod.text=Default Company Generation Method -labelDefaultCompanyGenerationMethod.toolTipText=This is the default company generation method to be used on load. +lblStartGameDelay.text=Delay Timer +lblStartGameDelay.toolTipText=Number of milliseconds to wait before sending another unit.
If the application tends to hang when starting a game in MegaMek or does not transfer all units or settings, try increasing this value. +lblDefaultCompanyGenerationMethod.text=Default Company Generation Method +lblDefaultCompanyGenerationMethod.toolTipText=This is the default company generation method to be used on load. diff --git a/MekHQ/src/mekhq/MekHQOptions.java b/MekHQ/src/mekhq/MekHQOptions.java index 251aac2273..832883f405 100644 --- a/MekHQ/src/mekhq/MekHQOptions.java +++ b/MekHQ/src/mekhq/MekHQOptions.java @@ -86,7 +86,6 @@ public void setShowCompanyGenerator(final boolean value) { userPreferences.node(MekHqConstants.DISPLAY_NODE).putBoolean(MekHqConstants.SHOW_COMPANY_GENERATOR, value); } - //region Expanded MekHQ Display Options //region Command Center Display public boolean getCommandCenterUseUnitMarket() { return userPreferences.node(MekHqConstants.DISPLAY_NODE).getBoolean(MekHqConstants.COMMAND_CENTER_USE_UNIT_MARKET, true); @@ -123,7 +122,7 @@ public void setPersonnelFilterOnPrimaryRole(boolean value) { userPreferences.node(MekHqConstants.DISPLAY_NODE).putBoolean(MekHqConstants.PERSONNEL_FILTER_ON_PRIMARY_ROLE, value); } //endregion Personnel Tab Display Options - //endregion Expanded MekHQ Display Options + //endregion Display //region Colours public Color getDeployedForeground() { @@ -372,7 +371,6 @@ public void setPaidRetirementBackground(Color value) { userPreferences.node(MekHqConstants.DISPLAY_NODE).putInt(MekHqConstants.PAID_RETIREMENT_BACKGROUND, value.getRGB()); } //endregion Colours - //endregion Display //region Autosave public boolean getNoAutosaveValue() { @@ -493,14 +491,6 @@ public boolean getSaveMothballState() { public void setSaveMothballState(boolean value) { userPreferences.node(MekHqConstants.XML_SAVES_NODE).putBoolean(MekHqConstants.SAVE_MOTHBALL_STATE, value); } - - public boolean getSaveCompanyGenerationOptions() { - return userPreferences.node(MekHqConstants.XML_SAVES_NODE).getBoolean(MekHqConstants.SAVE_COMPANY_GENERATION_OPTIONS, false); - } - - public void setSaveCompanyGenerationOptions(final boolean value) { - userPreferences.node(MekHqConstants.XML_SAVES_NODE).putBoolean(MekHqConstants.SAVE_COMPANY_GENERATION_OPTIONS, value); - } //endregion Campaign XML Save Options //region File Paths diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index 19bb484f6e..acf48201c0 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -110,7 +110,6 @@ public final class MekHqConstants extends SuiteConstants { public static final String PREFER_GZIPPED_CAMPAIGN_FILE = "preferGzippedCampaignFile"; public static final String WRITE_CUSTOMS_TO_XML = "writeCustomsToXML"; public static final String SAVE_MOTHBALL_STATE = "saveMothballState"; - public static final String SAVE_COMPANY_GENERATION_OPTIONS = "saveCompanyGenerationOptions"; //endregion Campaign XML Save Options //region File Paths diff --git a/MekHQ/src/mekhq/campaign/CampaignOptions.java b/MekHQ/src/mekhq/campaign/CampaignOptions.java index a9d44d75e4..1ea5eca592 100644 --- a/MekHQ/src/mekhq/campaign/CampaignOptions.java +++ b/MekHQ/src/mekhq/campaign/CampaignOptions.java @@ -19,43 +19,33 @@ */ package mekhq.campaign; -import java.io.PrintWriter; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import megamek.common.annotations.Nullable; import megamek.Version; -import mekhq.campaign.mission.enums.AtBLanceRole; +import megamek.common.EquipmentType; +import megamek.common.TechConstants; +import mekhq.MekHQ; +import mekhq.MekHqXmlUtil; +import mekhq.Utilities; import mekhq.campaign.enums.PlanetaryAcquisitionFactionLimit; +import mekhq.campaign.finances.Money; +import mekhq.campaign.finances.enums.FinancialYearDuration; +import mekhq.campaign.market.PersonnelMarket; import mekhq.campaign.market.enums.ContractMarketMethod; import mekhq.campaign.market.enums.UnitMarketMethod; +import mekhq.campaign.mission.enums.AtBLanceRole; import mekhq.campaign.parts.enums.PartRepairType; -import mekhq.campaign.personnel.enums.FamilialRelationshipDisplayLevel; -import mekhq.campaign.personnel.enums.PersonnelRole; -import mekhq.campaign.personnel.enums.Phenotype; -import mekhq.campaign.personnel.enums.PrisonerCaptureStyle; -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.campaign.personnel.SkillType; +import mekhq.campaign.personnel.enums.*; +import mekhq.campaign.rating.UnitRatingMethod; import mekhq.service.MassRepairOption; import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import megamek.common.EquipmentType; -import megamek.common.TechConstants; -import mekhq.MekHQ; -import mekhq.MekHqXmlUtil; -import mekhq.Utilities; -import mekhq.campaign.market.PersonnelMarket; -import mekhq.campaign.personnel.SkillType; -import mekhq.campaign.personnel.enums.PrisonerStatus; -import mekhq.campaign.personnel.enums.BabySurnameStyle; -import mekhq.campaign.personnel.enums.TimeInDisplayFormat; -import mekhq.campaign.personnel.enums.Marriage; -import mekhq.campaign.rating.UnitRatingMethod; -import mekhq.campaign.finances.Money; -import mekhq.campaign.finances.enums.FinancialYearDuration; +import java.io.PrintWriter; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * @author natit @@ -421,10 +411,6 @@ public class CampaignOptions implements Serializable { private boolean usePlanetaryConditions; private int fixedMapChance; //endregion Against the Bot Tab - - //region Company Generation Options - private CompanyGenerationOptions companyGenerationOptions; - //endregion Company Generation Options //endregion Variable Declarations //region Constructors @@ -847,10 +833,6 @@ public CampaignOptions() { useLightConditions = true; usePlanetaryConditions = false; //endregion Against the Bot Tab - - //region Company Generation Options - setCompanyGenerationOptions(null); - //endregion Company Generation Options } //endregion Constructors @@ -3205,16 +3187,6 @@ public void setFixedMapChance(int fixedMapChance) { this.fixedMapChance = fixedMapChance; } - //region Company Generation Options - public @Nullable CompanyGenerationOptions getCompanyGenerationOptions() { - return companyGenerationOptions; - } - - public void setCompanyGenerationOptions(final @Nullable CompanyGenerationOptions companyGenerationOptions) { - this.companyGenerationOptions = companyGenerationOptions; - } - //endregion Company Generation Options - public void writeToXml(PrintWriter pw1, int indent) { pw1.println(MekHqXmlUtil.indentStr(indent) + ""); //region General Tab @@ -3560,13 +3532,6 @@ public void writeToXml(PrintWriter pw1, int indent) { pw1.println(MekHqXmlUtil.indentStr(indent) + ""); } //endregion AtB Options - - //region Company Generation Options - if ((getCompanyGenerationOptions() != null) - && MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()) { - getCompanyGenerationOptions().writeToXML(pw1, indent, null); - } - //endregion Company Generation Options MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw1, --indent, "campaignOptions"); } @@ -4204,14 +4169,6 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve } else if (wn2.getNodeName().equalsIgnoreCase("massRepairOptions")) { retVal.setMassRepairOptions(MassRepairOption.parseListFromXML(wn2, version)); - //region Company Generation - } else if (wn2.getNodeName().equals("companyGenerationOptions")) { - if (!wn2.hasChildNodes()) { - continue; - } - retVal.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn2.getChildNodes(), version)); - //endregion Company Generation - //region Legacy // Removed in 0.49.* } else if (wn2.getNodeName().equalsIgnoreCase("clanPriceModifier")) { // Legacy - 0.49.3 Removal diff --git a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java index ba90abbc59..e1c768da77 100644 --- a/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java @@ -63,10 +63,7 @@ import mekhq.gui.FileDialogs; import mekhq.gui.SpecialAbilityPanel; import mekhq.gui.baseComponents.AbstractMHQButtonDialog; -import mekhq.gui.baseComponents.SortedComboBoxModel; import mekhq.gui.displayWrappers.FactionDisplay; -import mekhq.gui.model.RankTableModel; -import mekhq.gui.panels.CompanyGenerationOptionsPanel; import mekhq.gui.panes.RankSystemsPane; import mekhq.module.PersonnelMarketServiceManager; import mekhq.module.api.PersonnelMarketMethod; @@ -485,10 +482,6 @@ public class CampaignOptionsDialog extends AbstractMHQButtonDialog { private JCheckBox chkUseLightConditions; private JCheckBox chkUsePlanetaryConditions; //endregion Against the Bot Tab - - //region Company Generation Options - private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; - //endregion Company Generation Options //endregion Variable Declarations //region Constructors @@ -3283,14 +3276,6 @@ public Component getListCellRendererComponent(JList list, Object value, int i }); //endregion Against the Bot Tab - //region Company Generation Options - if (MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()) { - companyGenerationOptionsPanel = new CompanyGenerationOptionsPanel(getFrame(), campaign); - getOptionsPane().addTab(resourceMap.getString("companyGenerationOptionsPanel.title"), - new JScrollPane(companyGenerationOptionsPanel)); - } - //endregion Company Generation Options - return getOptionsPane(); } @@ -5500,13 +5485,6 @@ public void setOptions(@Nullable CampaignOptions options, chkUseLightConditions.setSelected(options.getUseLightConditions()); chkUsePlanetaryConditions.setSelected(options.getUsePlanetaryConditions()); //endregion Against the Bot Tab - - //region Company Generation Options - // Only trigger this if there are saved options and the panel has been initialized - if ((companyGenerationOptionsPanel != null) && (options.getCompanyGenerationOptions() != null)) { - companyGenerationOptionsPanel.setOptions(options.getCompanyGenerationOptions()); - } - //endregion Company Generation Options } public static String[][] getSkillCostsArray(Hashtable skillHash) { @@ -5891,12 +5869,6 @@ private void updateOptions() { options.setAeroRecruitsHaveUnits(chkAeroRecruitsHaveUnits.isSelected()); // End Against the Bot - //region Company Generation Options - if (companyGenerationOptionsPanel != null) { - options.setCompanyGenerationOptions(companyGenerationOptionsPanel.createOptionsFromPanel()); - } - //endregion Company Generation Options - campaign.setCampaignOptions(options); MekHQ.triggerEvent(new OptionsChangedEvent(campaign, options)); diff --git a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java index cdfa250ee5..3cb140217b 100644 --- a/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/MekHqOptionsDialog.java @@ -18,6 +18,7 @@ */ package mekhq.gui.dialog; +import megamek.client.ui.baseComponents.MMComboBox; import megamek.client.ui.swing.ColourSelectorButton; import megamek.common.util.EncodeControl; import mekhq.MekHQ; @@ -41,8 +42,8 @@ public class MekHqOptionsDialog extends AbstractMHQButtonDialog { private JTextField optionDisplayDateFormat; private JTextField optionLongDisplayDateFormat; private JCheckBox optionHistoricalDailyLog; - private JCheckBox optionCompanyGeneratorStartup; - private JCheckBox optionShowCompanyGenerator; + private JCheckBox chkCompanyGeneratorStartup; + private JCheckBox chkShowCompanyGenerator; //region Command Center Display private JCheckBox optionCommandCenterUseUnitMarket; @@ -108,7 +109,6 @@ public class MekHqOptionsDialog extends AbstractMHQButtonDialog { private JCheckBox optionPreferGzippedOutput; private JCheckBox optionWriteCustomsToXML; private JCheckBox optionSaveMothballState; - private JCheckBox optionSaveCompanyGenerationOptions; //endregion Campaign XML Save //region Nag Tab @@ -122,8 +122,8 @@ public class MekHqOptionsDialog extends AbstractMHQButtonDialog { //endregion Nag Tab //region Miscellaneous - private JSpinner optionStartGameDelay; - private JComboBox optionDefaultCompanyGenerationMethod; + private JSpinner spnStartGameDelay; + private MMComboBox comboDefaultCompanyGenerationMethod; //endregion Miscellaneous //endregion Variable Declarations @@ -177,13 +177,13 @@ private JPanel createDisplayTab() { optionHistoricalDailyLog = new JCheckBox(resources.getString("optionHistoricalDailyLog.text")); optionHistoricalDailyLog.setToolTipText(resources.getString("optionHistoricalDailyLog.toolTipText")); - optionCompanyGeneratorStartup = new JCheckBox(resources.getString("optionCompanyGeneratorStartup.text")); - optionCompanyGeneratorStartup.setToolTipText(resources.getString("optionCompanyGeneratorStartup.toolTipText")); - optionCompanyGeneratorStartup.setName("optionCompanyGeneratorStartup"); + chkCompanyGeneratorStartup = new JCheckBox(resources.getString("chkCompanyGeneratorStartup.text")); + chkCompanyGeneratorStartup.setToolTipText(resources.getString("chkCompanyGeneratorStartup.toolTipText")); + chkCompanyGeneratorStartup.setName("chkCompanyGeneratorStartup"); - optionShowCompanyGenerator = new JCheckBox(resources.getString("optionShowCompanyGenerator.text")); - optionShowCompanyGenerator.setToolTipText(resources.getString("optionShowCompanyGenerator.toolTipText")); - optionShowCompanyGenerator.setName("optionShowCompanyGenerator"); + chkShowCompanyGenerator = new JCheckBox(resources.getString("chkShowCompanyGenerator.text")); + chkShowCompanyGenerator.setToolTipText(resources.getString("chkShowCompanyGenerator.toolTipText")); + chkShowCompanyGenerator.setName("chkShowCompanyGenerator"); //region Command Center Display JLabel labelCommandCenterDisplay = new JLabel(resources.getString("labelCommandCenterDisplay.text")); @@ -239,8 +239,8 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(optionLongDisplayDateFormat) .addComponent(labelLongDisplayDateFormatExample, GroupLayout.Alignment.TRAILING)) .addComponent(optionHistoricalDailyLog) - .addComponent(optionCompanyGeneratorStartup) - .addComponent(optionShowCompanyGenerator) + .addComponent(chkCompanyGeneratorStartup) + .addComponent(chkShowCompanyGenerator) .addComponent(labelCommandCenterDisplay) .addComponent(optionCommandCenterUseUnitMarket) .addComponent(optionCommandCenterMRMS) @@ -263,8 +263,8 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(optionLongDisplayDateFormat) .addComponent(labelLongDisplayDateFormatExample)) .addComponent(optionHistoricalDailyLog) - .addComponent(optionCompanyGeneratorStartup) - .addComponent(optionShowCompanyGenerator) + .addComponent(chkCompanyGeneratorStartup) + .addComponent(chkShowCompanyGenerator) .addComponent(labelCommandCenterDisplay) .addComponent(optionCommandCenterUseUnitMarket) .addComponent(optionCommandCenterMRMS) @@ -573,10 +573,6 @@ private JPanel createCampaignXMLSaveTab() { optionSaveMothballState.setToolTipText(resources.getString("optionSaveMothballState.toolTipText")); optionSaveMothballState.setMnemonic(KeyEvent.VK_U); - optionSaveCompanyGenerationOptions = new JCheckBox(resources.getString("optionSaveCompanyGenerationOptions.text")); - optionSaveCompanyGenerationOptions.setToolTipText(resources.getString("optionSaveCompanyGenerationOptions.toolTipText")); - optionSaveCompanyGenerationOptions.setName("optionSaveCompanyGenerationOptions"); - // Layout the UI JPanel body = new JPanel(); GroupLayout layout = new GroupLayout(body); @@ -590,7 +586,6 @@ private JPanel createCampaignXMLSaveTab() { .addComponent(optionPreferGzippedOutput) .addComponent(optionWriteCustomsToXML) .addComponent(optionSaveMothballState) - .addComponent(optionSaveCompanyGenerationOptions) ); layout.setHorizontalGroup( @@ -598,7 +593,6 @@ private JPanel createCampaignXMLSaveTab() { .addComponent(optionPreferGzippedOutput) .addComponent(optionWriteCustomsToXML) .addComponent(optionSaveMothballState) - .addComponent(optionSaveCompanyGenerationOptions) ); return body; @@ -669,17 +663,18 @@ private JPanel createNagTab() { private JPanel createMiscellaneousTab() { // Create Panel Components - JLabel labelStartGameDelay = new JLabel(resources.getString("labelStartGameDelay.text")); - labelStartGameDelay.setToolTipText(resources.getString("optionStartGameDelay.toolTipText")); + final JLabel lblStartGameDelay = new JLabel(resources.getString("lblStartGameDelay.text")); + lblStartGameDelay.setToolTipText(resources.getString("lblStartGameDelay.toolTipText")); - optionStartGameDelay = new JSpinner(new SpinnerNumberModel(0, 0, 2500, 25)); - optionStartGameDelay.setToolTipText(resources.getString("optionStartGameDelay.toolTipText")); + spnStartGameDelay = new JSpinner(new SpinnerNumberModel(0, 0, 2500, 25)); + spnStartGameDelay.setToolTipText(resources.getString("lblStartGameDelay.toolTipText")); - JLabel labelDefaultCompanyGenerationMethod = new JLabel(resources.getString("labelDefaultCompanyGenerationMethod.text")); - labelDefaultCompanyGenerationMethod.setToolTipText(resources.getString("labelDefaultCompanyGenerationMethod.toolTipText")); + final JLabel lblDefaultCompanyGenerationMethod = new JLabel(resources.getString("lblDefaultCompanyGenerationMethod.text")); + lblDefaultCompanyGenerationMethod.setToolTipText(resources.getString("lblDefaultCompanyGenerationMethod.toolTipText")); - optionDefaultCompanyGenerationMethod = new JComboBox<>(CompanyGenerationMethod.values()); - optionDefaultCompanyGenerationMethod.setRenderer(new DefaultListCellRenderer() { + comboDefaultCompanyGenerationMethod = new MMComboBox<>("comboDefaultCompanyGenerationMethod", CompanyGenerationMethod.values()); + comboDefaultCompanyGenerationMethod.setToolTipText(resources.getString("lblDefaultCompanyGenerationMethod.toolTipText")); + comboDefaultCompanyGenerationMethod.setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, @@ -703,22 +698,22 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(labelStartGameDelay) - .addComponent(optionStartGameDelay, GroupLayout.DEFAULT_SIZE, + .addComponent(lblStartGameDelay) + .addComponent(spnStartGameDelay, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, 40)) .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) - .addComponent(labelDefaultCompanyGenerationMethod) - .addComponent(optionDefaultCompanyGenerationMethod)) + .addComponent(lblDefaultCompanyGenerationMethod) + .addComponent(comboDefaultCompanyGenerationMethod)) ); layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addComponent(labelStartGameDelay) - .addComponent(optionStartGameDelay)) + .addComponent(lblStartGameDelay) + .addComponent(spnStartGameDelay)) .addGroup(layout.createSequentialGroup() - .addComponent(labelDefaultCompanyGenerationMethod) - .addComponent(optionDefaultCompanyGenerationMethod)) + .addComponent(lblDefaultCompanyGenerationMethod) + .addComponent(comboDefaultCompanyGenerationMethod)) ); return body; @@ -734,8 +729,8 @@ protected void okAction() { MekHQ.getMekHQOptions().setLongDisplayDateFormat(optionLongDisplayDateFormat.getText()); } MekHQ.getMekHQOptions().setHistoricalDailyLog(optionHistoricalDailyLog.isSelected()); - MekHQ.getMekHQOptions().setCompanyGeneratorStartup(optionCompanyGeneratorStartup.isSelected()); - MekHQ.getMekHQOptions().setShowCompanyGenerator(optionShowCompanyGenerator.isSelected()); + MekHQ.getMekHQOptions().setCompanyGeneratorStartup(chkCompanyGeneratorStartup.isSelected()); + MekHQ.getMekHQOptions().setShowCompanyGenerator(chkShowCompanyGenerator.isSelected()); MekHQ.getMekHQOptions().setCommandCenterUseUnitMarket(optionCommandCenterUseUnitMarket.isSelected()); MekHQ.getMekHQOptions().setCommandCenterMRMS(optionCommandCenterMRMS.isSelected()); MekHQ.getMekHQOptions().setPersonnelFilterStyle((PersonnelFilterStyle) Objects.requireNonNull(optionPersonnelFilterStyle.getSelectedItem())); @@ -787,7 +782,6 @@ protected void okAction() { MekHQ.getMekHQOptions().setPreferGzippedOutput(optionPreferGzippedOutput.isSelected()); MekHQ.getMekHQOptions().setWriteCustomsToXML(optionWriteCustomsToXML.isSelected()); MekHQ.getMekHQOptions().setSaveMothballState(optionSaveMothballState.isSelected()); - MekHQ.getMekHQOptions().setSaveCompanyGenerationOptions(optionSaveCompanyGenerationOptions.isSelected()); MekHQ.getMekHQOptions().setNagDialogIgnore(MekHqConstants.NAG_UNMAINTAINED_UNITS, optionUnmaintainedUnitsNag.isSelected()); MekHQ.getMekHQOptions().setNagDialogIgnore(MekHqConstants.NAG_INSUFFICIENT_ASTECHS, optionInsufficientAstechsNag.isSelected()); @@ -797,8 +791,8 @@ protected void okAction() { MekHQ.getMekHQOptions().setNagDialogIgnore(MekHqConstants.NAG_UNRESOLVED_STRATCON_CONTACTS, optionUnresolvedStratConContactsNag.isSelected()); MekHQ.getMekHQOptions().setNagDialogIgnore(MekHqConstants.NAG_OUTSTANDING_SCENARIOS, optionOutstandingScenariosNag.isSelected()); - MekHQ.getMekHQOptions().setStartGameDelay((Integer) optionStartGameDelay.getValue()); - MekHQ.getMekHQOptions().setDefaultCompanyGenerationMethod((CompanyGenerationMethod) Objects.requireNonNull(optionDefaultCompanyGenerationMethod.getSelectedItem())); + MekHQ.getMekHQOptions().setStartGameDelay((Integer) spnStartGameDelay.getValue()); + MekHQ.getMekHQOptions().setDefaultCompanyGenerationMethod(Objects.requireNonNull(comboDefaultCompanyGenerationMethod.getSelectedItem())); MekHQ.triggerEvent(new MekHQOptionsChangedEvent()); } @@ -807,8 +801,8 @@ private void setInitialState() { optionDisplayDateFormat.setText(MekHQ.getMekHQOptions().getDisplayDateFormat()); optionLongDisplayDateFormat.setText(MekHQ.getMekHQOptions().getLongDisplayDateFormat()); optionHistoricalDailyLog.setSelected(MekHQ.getMekHQOptions().getHistoricalDailyLog()); - optionCompanyGeneratorStartup.setSelected(MekHQ.getMekHQOptions().getCompanyGeneratorStartup()); - optionShowCompanyGenerator.setSelected(MekHQ.getMekHQOptions().getShowCompanyGenerator()); + chkCompanyGeneratorStartup.setSelected(MekHQ.getMekHQOptions().getCompanyGeneratorStartup()); + chkShowCompanyGenerator.setSelected(MekHQ.getMekHQOptions().getShowCompanyGenerator()); optionCommandCenterUseUnitMarket.setSelected(MekHQ.getMekHQOptions().getCommandCenterUseUnitMarket()); optionCommandCenterMRMS.setSelected(MekHQ.getMekHQOptions().getCommandCenterMRMS()); optionPersonnelFilterStyle.setSelectedItem(MekHQ.getMekHQOptions().getPersonnelFilterStyle()); @@ -860,7 +854,6 @@ private void setInitialState() { optionPreferGzippedOutput.setSelected(MekHQ.getMekHQOptions().getPreferGzippedOutput()); optionWriteCustomsToXML.setSelected(MekHQ.getMekHQOptions().getWriteCustomsToXML()); optionSaveMothballState.setSelected(MekHQ.getMekHQOptions().getSaveMothballState()); - optionSaveCompanyGenerationOptions.setSelected(MekHQ.getMekHQOptions().getSaveCompanyGenerationOptions()); optionUnmaintainedUnitsNag.setSelected(MekHQ.getMekHQOptions().getNagDialogIgnore(MekHqConstants.NAG_UNMAINTAINED_UNITS)); optionInsufficientAstechsNag.setSelected(MekHQ.getMekHQOptions().getNagDialogIgnore(MekHqConstants.NAG_INSUFFICIENT_ASTECHS)); @@ -870,8 +863,8 @@ private void setInitialState() { optionUnresolvedStratConContactsNag.setSelected(MekHQ.getMekHQOptions().getNagDialogIgnore(MekHqConstants.NAG_UNRESOLVED_STRATCON_CONTACTS)); optionOutstandingScenariosNag.setSelected(MekHQ.getMekHQOptions().getNagDialogIgnore(MekHqConstants.NAG_OUTSTANDING_SCENARIOS)); - optionStartGameDelay.setValue(MekHQ.getMekHQOptions().getStartGameDelay()); - optionDefaultCompanyGenerationMethod.setSelectedItem(MekHQ.getMekHQOptions().getDefaultCompanyGenerationMethod()); + spnStartGameDelay.setValue(MekHQ.getMekHQOptions().getStartGameDelay()); + comboDefaultCompanyGenerationMethod.setSelectedItem(MekHQ.getMekHQOptions().getDefaultCompanyGenerationMethod()); } //region Data Validation From 974dbd88f4f8ffea8851606a43dcc93c2e8617e6 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 30 Oct 2021 13:06:19 -0400 Subject: [PATCH 055/115] Adding Company Generation Options to the Campaign Preset, and creating the Company Generation Options Dialog --- .../resources/mekhq/resources/GUI.properties | 7 + MekHQ/src/mekhq/campaign/CampaignPreset.java | 25 +++- .../gui/dialog/CompanyGenerationDialog.java | 14 +- .../CompanyGenerationOptionsDialog.java | 86 ++++++++++++ .../dialog/CreateCampaignPresetDialog.java | 124 +++++++++++------- .../panels/CompanyGenerationOptionsPanel.java | 8 +- 6 files changed, 213 insertions(+), 51 deletions(-) create mode 100644 MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 4fd12592a3..f31ac9c3b4 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -315,6 +315,9 @@ CompanyGenerationDialog.btnRestore.toolTipText=Restores the options on the curre CompanyGenerationDialog.btnImport.toolTipText=Import the current options from an XML file. CompanyGenerationDialog.btnExport.toolTipText=Export the current options to an XML file. +### CompanyGenerationOptionsDialog Class +CompanyGenerationOptionsDialog.title=Company Generation Options + ### ContractMarketDialog Class ContractMarketDialog.title=Contract Market @@ -342,6 +345,10 @@ chkSpecifyRankSystem.toolTipText=This allows you to specify the starting rank sy comboRankSystem.toolTipText=This is the rank system the campaign will start with. lblContractCount.text=Starting Contract Count lblContractCount.toolTipText=Specify the number of contracts generated by the contract market at the start of a campaign. The default starting contract count is 2 (AtB Contract Market). +chkSpecifyCompanyGenerationOptions.text=Specify Company Generation Options +chkSpecifyCompanyGenerationOptions.toolTipText=This allows you to specify the default company generation options to use when starting a new campaign. (Unimplemented on Load) +btnCompanyGenerationOptions.text=View Company Generation Options +btnCompanyGenerationOptions.toolTipText=This lets you view and edit the current company generation options. ## Continuous Panel continuousCampaignPresetPanel.title=Continuous Options continuousCampaignPresetPanel.toolTipText=These are options that are applied when starting a new campaign and can be applied to a pre-existing campaign. diff --git a/MekHQ/src/mekhq/campaign/CampaignPreset.java b/MekHQ/src/mekhq/campaign/CampaignPreset.java index 55c213c7a8..53a42ee9be 100644 --- a/MekHQ/src/mekhq/campaign/CampaignPreset.java +++ b/MekHQ/src/mekhq/campaign/CampaignPreset.java @@ -37,6 +37,7 @@ import mekhq.campaign.universe.Factions; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.Systems; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -75,6 +76,7 @@ public class CampaignPreset implements Serializable { private Planet planet; private RankSystem rankSystem; private int contractCount; + private CompanyGenerationOptions companyGenerationOptions; // Continuous private GameOptions gameOptions; @@ -91,14 +93,14 @@ public CampaignPreset() { public CampaignPreset(final boolean userData) { this("Title", "", userData, null, null, null, null, - 2, null, null, null, + 2, null, null, null, null, new Hashtable<>(), new Hashtable<>()); } public CampaignPreset(final Campaign campaign) { this(campaign.getName(), "", true, campaign.getLocalDate(), campaign.getFaction(), campaign.getCurrentSystem().getPrimaryPlanet(), campaign.getRankSystem(), 2, - campaign.getGameOptions(), campaign.getCampaignOptions(), + null, campaign.getGameOptions(), campaign.getCampaignOptions(), campaign.getRandomSkillPreferences(), SkillType.getSkillHash(), SpecialAbility.getAllSpecialAbilities()); } @@ -106,7 +108,9 @@ public CampaignPreset(final Campaign campaign) { public CampaignPreset(final String title, final String description, final boolean userData, final @Nullable LocalDate date, final @Nullable Faction faction, final @Nullable Planet planet, final @Nullable RankSystem rankSystem, - final int contractCount, final @Nullable GameOptions gameOptions, + final int contractCount, + final @Nullable CompanyGenerationOptions companyGenerationOptions, + final @Nullable GameOptions gameOptions, final @Nullable CampaignOptions campaignOptions, final @Nullable RandomSkillPreferences randomSkillPreferences, final Hashtable skills, @@ -122,6 +126,7 @@ public CampaignPreset(final String title, final String description, final boolea setPlanet(planet); setRankSystem(rankSystem); setContractCount(contractCount); + setCompanyGenerationOptions(companyGenerationOptions); // Continuous setGameOptions(gameOptions); @@ -189,6 +194,14 @@ public int getContractCount() { public void setContractCount(final int contractCount) { this.contractCount = contractCount; } + + public CompanyGenerationOptions getCompanyGenerationOptions() { + return companyGenerationOptions; + } + + public void setCompanyGenerationOptions(final @Nullable CompanyGenerationOptions companyGenerationOptions) { + this.companyGenerationOptions = companyGenerationOptions; + } //endregion Startup //region Continuous @@ -322,6 +335,9 @@ public void writeToXML(final PrintWriter pw, int indent) { getRankSystem().writeToXML(pw, indent, false); } MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "contractCount", getContractCount()); + if (getCompanyGenerationOptions() != null) { + getCompanyGenerationOptions().writeToXML(pw, indent, null); + } //endregion Startup //region Continuous @@ -433,6 +449,9 @@ public static List loadCampaignPresetsFromDirectory(final @Nulla case "contractCount": preset.setContractCount(Integer.parseInt(wn.getTextContent().trim())); break; + case "companyGenerationOptions": + preset.setCompanyGenerationOptions(CompanyGenerationOptions.parseFromXML(wn.getChildNodes(), version)); + break; //endregion Startup //region Continuous diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index af0aa510df..cb6663bef5 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -21,6 +21,7 @@ import megamek.client.ui.baseComponents.MMButton; import megamek.client.ui.enums.ValidationState; import megamek.common.Entity; +import megamek.common.annotations.Nullable; import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.event.OrganizationChangedEvent; @@ -46,6 +47,7 @@ public class CompanyGenerationDialog extends AbstractMHQValidationButtonDialog { //region Variable Declarations private Campaign campaign; + private CompanyGenerationOptions companyGenerationOptions; private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; //endregion Variable Declarations @@ -53,6 +55,7 @@ public class CompanyGenerationDialog extends AbstractMHQValidationButtonDialog { public CompanyGenerationDialog(final JFrame frame, final Campaign campaign) { super(frame, "CompanyGenerationDialog", "CompanyGenerationDialog.title"); setCampaign(campaign); + setCompanyGenerationOptions(null); initialize(); } //endregion Constructors @@ -66,6 +69,14 @@ public void setCampaign(final Campaign campaign) { this.campaign = campaign; } + public @Nullable CompanyGenerationOptions getCompanyGenerationOptions() { + return companyGenerationOptions; + } + + public void setCompanyGenerationOptions(final @Nullable CompanyGenerationOptions companyGenerationOptions) { + this.companyGenerationOptions = companyGenerationOptions; + } + public CompanyGenerationOptionsPanel getCompanyGenerationOptionsPanel() { return companyGenerationOptionsPanel; } @@ -78,7 +89,8 @@ public void setCompanyGenerationOptionsPanel(final CompanyGenerationOptionsPanel //region Initialization @Override protected Container createCenterPane() { - setCompanyGenerationOptionsPanel(new CompanyGenerationOptionsPanel(getFrame(), getCampaign())); + setCompanyGenerationOptionsPanel(new CompanyGenerationOptionsPanel(getFrame(), getCampaign(), + getCompanyGenerationOptions())); return new JScrollPane(getCompanyGenerationOptionsPanel()); } diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java new file mode 100644 index 0000000000..b399d4b719 --- /dev/null +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.gui.dialog; + +import megamek.client.ui.enums.ValidationState; +import megamek.common.annotations.Nullable; +import mekhq.campaign.Campaign; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.gui.baseComponents.AbstractMHQValidationButtonDialog; +import mekhq.gui.panels.CompanyGenerationOptionsPanel; + +import javax.swing.*; +import java.awt.*; + +public class CompanyGenerationOptionsDialog extends AbstractMHQValidationButtonDialog { + //region Variable Declarations + private final Campaign campaign; + private final CompanyGenerationOptions companyGenerationOptions; + private CompanyGenerationOptionsPanel companyGenerationOptionsPanel; + //endregion Variable Declarations + + //region Constructors + public CompanyGenerationOptionsDialog(final JFrame frame, final Campaign campaign, + final @Nullable CompanyGenerationOptions companyGenerationOptions) { + super(frame, "CompanyGenerationOptionsDialog", "CompanyGenerationOptionsDialog.title"); + this.campaign = campaign; + this.companyGenerationOptions = companyGenerationOptions; + initialize(); + } + //endregion Constructors + + //region Getters/Setters + public Campaign getCampaign() { + return campaign; + } + + public @Nullable CompanyGenerationOptions getCompanyGenerationOptions() { + return companyGenerationOptions; + } + + public CompanyGenerationOptionsPanel getCompanyGenerationOptionsPanel() { + return companyGenerationOptionsPanel; + } + + public void setCompanyGenerationOptionsPanel(final CompanyGenerationOptionsPanel companyGenerationOptionsPanel) { + this.companyGenerationOptionsPanel = companyGenerationOptionsPanel; + } + //endregion Getters/Setters + + //region Initialization + @Override + protected Container createCenterPane() { + setCompanyGenerationOptionsPanel(new CompanyGenerationOptionsPanel(getFrame(), getCampaign(), + getCompanyGenerationOptions())); + return getCompanyGenerationOptionsPanel(); + } + //endregion Initialization + + //region Button Actions + @Override + protected ValidationState validateAction(final boolean display) { + return getCompanyGenerationOptionsPanel().validateOptions(display); + } + //endregion Button Actions + + public @Nullable CompanyGenerationOptions getSelectedItem() { + return getResult().isConfirmed() ? getCompanyGenerationOptionsPanel().createOptionsFromPanel() + : getCompanyGenerationOptions(); + } +} diff --git a/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java b/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java index 099a38a460..527091deaa 100644 --- a/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java @@ -41,6 +41,7 @@ import mekhq.campaign.universe.Factions; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.PlanetarySystem; +import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; import mekhq.gui.baseComponents.AbstractMHQValidationButtonDialog; import mekhq.gui.baseComponents.SortedComboBoxModel; import mekhq.gui.displayWrappers.FactionDisplay; @@ -75,6 +76,8 @@ public class CreateCampaignPresetDialog extends AbstractMHQValidationButtonDialo private JCheckBox chkSpecifyRankSystem; private MMComboBox comboRankSystem; private JSpinner spnContractCount; + private JCheckBox chkSpecifyCompanyGenerationOptions; + private CompanyGenerationOptions companyGenerationOptions; //endregion Startup //region Continuous @@ -95,6 +98,7 @@ public CreateCampaignPresetDialog(final JFrame frame, final Campaign campaign, this.campaign = campaign; setPreset(preset); setDate(campaign.getLocalDate()); + setCompanyGenerationOptions(null); this.gameOptions = ((preset == null) || (preset.getGameOptions() == null)) ? campaign.getGameOptions() : preset.getGameOptions(); this.campaignOptions = ((preset == null) || (preset.getCampaignOptions() == null)) @@ -244,6 +248,22 @@ public JSpinner getSpnContractCount() { public void setSpnContractCount(final JSpinner spnContractCount) { this.spnContractCount = spnContractCount; } + + public JCheckBox getChkSpecifyCompanyGenerationOptions() { + return chkSpecifyCompanyGenerationOptions; + } + + public void setChkSpecifyCompanyGenerationOptions(final JCheckBox chkSpecifyCompanyGenerationOptions) { + this.chkSpecifyCompanyGenerationOptions = chkSpecifyCompanyGenerationOptions; + } + + public @Nullable CompanyGenerationOptions getCompanyGenerationOptions() { + return companyGenerationOptions; + } + + public void setCompanyGenerationOptions(final @Nullable CompanyGenerationOptions companyGenerationOptions) { + this.companyGenerationOptions = companyGenerationOptions; + } //endregion Startup //region Continuous @@ -469,6 +489,16 @@ public Component getListCellRendererComponent(final JList list, final Object getSpnContractCount().setToolTipText(resources.getString("lblContractCount.toolTipText")); getSpnContractCount().setName("spnContractCount"); + setChkSpecifyCompanyGenerationOptions(new JCheckBox(resources.getString("chkSpecifyCompanyGenerationOptions.text"))); + getChkSpecifyCompanyGenerationOptions().setToolTipText(resources.getString("chkSpecifyCompanyGenerationOptions.toolTipText")); + getChkSpecifyCompanyGenerationOptions().setName("chkSpecifyCompanyGenerationOptions"); + + final JButton btnCompanyGenerationOptions = new MMButton("btnCompanyGenerationOptions", + resources, "btnCompanyGenerationOptions.text", + "btnCompanyGenerationOptions.toolTipText", evt -> setCompanyGenerationOptions( + new CompanyGenerationOptionsDialog(getFrame(), getCampaign(), + getCompanyGenerationOptions()).getSelectedItem())); + // Disable Panel Portions by Default getChkSpecifyDate().setSelected(true); getChkSpecifyDate().doClick(); @@ -478,6 +508,8 @@ public Component getListCellRendererComponent(final JList list, final Object getChkSpecifyPlanet().doClick(); getChkSpecifyRankSystem().setSelected(true); getChkSpecifyRankSystem().doClick(); + getChkSpecifyCompanyGenerationOptions().setSelected(true); + getChkSpecifyCompanyGenerationOptions().doClick(); // Layout the UI final JPanel panel = new JPanel(); @@ -510,6 +542,9 @@ public Component getListCellRendererComponent(final JList list, final Object .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblContractCount) .addComponent(getSpnContractCount(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getChkSpecifyCompanyGenerationOptions()) + .addComponent(btnCompanyGenerationOptions, GroupLayout.Alignment.LEADING)) ); layout.setHorizontalGroup( @@ -532,6 +567,9 @@ public Component getListCellRendererComponent(final JList list, final Object .addGroup(layout.createSequentialGroup() .addComponent(lblContractCount) .addComponent(getSpnContractCount())) + .addGroup(layout.createSequentialGroup() + .addComponent(getChkSpecifyCompanyGenerationOptions()) + .addComponent(btnCompanyGenerationOptions)) ); return panel; @@ -542,7 +580,6 @@ private JPanel createContinuousPanel() { setChkSpecifyGameOptions(new JCheckBox(resources.getString("chkSpecifyGameOptions.text"))); getChkSpecifyGameOptions().setToolTipText(resources.getString("chkSpecifyGameOptions.toolTipText")); getChkSpecifyGameOptions().setName("chkSpecifyGameOptions"); - getChkSpecifyRankSystem().addActionListener(evt -> getComboRankSystem().setEnabled(getChkSpecifyRankSystem().isSelected())); final JButton btnGameOptions = new MMButton("btnGameOptions", resources, "btnGameOptions.text", "btnGameOptions.toolTipText", evt -> { @@ -614,6 +651,7 @@ protected void setCustomPreferences(final PreferencesNode preferences) { preferences.manage(new JToggleButtonPreference(getChkSpecifyPlanet())); preferences.manage(new JToggleButtonPreference(getChkSpecifyRankSystem())); preferences.manage(new JIntNumberSpinnerPreference(getSpnContractCount())); + preferences.manage(new JToggleButtonPreference(getChkSpecifyCompanyGenerationOptions())); preferences.manage(new JToggleButtonPreference(getChkSpecifyGameOptions())); preferences.manage(new JToggleButtonPreference(getChkSpecifyCampaignOptions())); } @@ -622,7 +660,47 @@ protected void setCustomPreferences(final PreferencesNode preferences) { //region Button Actions @Override protected void okAction() { - updatePreset(); + if (!getState().isSuccess()) { + validateButtonActionPerformed(null); + } + + if (getState().isSuccess() || getState().isWarning()) { + setPreset(new CampaignPreset()); + + getPreset().setTitle(getTxtPresetName().getText().trim()); + getPreset().setDescription(getTxtPresetDescription().getText().trim()); + if (getChkSpecifyDate().isSelected()) { + getPreset().setDate(getDate()); + } + + if (getChkSpecifyFaction().isSelected()) { + final FactionDisplay factionDisplay = getComboFaction().getSelectedItem(); + getPreset().setFaction((factionDisplay == null) ? null : factionDisplay.getFaction()); + } + + if (getChkSpecifyPlanet().isSelected()) { + getPreset().setPlanet(getComboStartingPlanet().getSelectedItem()); + } + + if (getChkSpecifyRankSystem().isSelected()) { + getPreset().setRankSystem(getComboRankSystem().getSelectedItem()); + } + getPreset().setContractCount((int) getSpnContractCount().getValue()); + if (getChkSpecifyCompanyGenerationOptions().isSelected()) { + getPreset().setCompanyGenerationOptions(getCompanyGenerationOptions()); + } + + if (getChkSpecifyGameOptions().isSelected()) { + getPreset().setGameOptions(getGameOptions()); + } + + if (getChkSpecifyCampaignOptions().isSelected()) { + getPreset().setCampaignOptions(getCampaignOptions()); + getPreset().setRandomSkillPreferences(getRandomSkillPreferences()); + getPreset().setSkills(getSkills()); + getPreset().setSpecialAbilities(getSpecialAbilities()); + } + } } @Override @@ -688,46 +766,4 @@ private PlanetarySystem[] getPlanetarySystems(final @Nullable FactionDisplay fac .sorted(Comparator.comparing(p -> p.getName(getCampaign().getLocalDate()))) .collect(Collectors.toList()).toArray(new PlanetarySystem[]{}); } - - public void updatePreset() { - if (!getState().isSuccess()) { - validateButtonActionPerformed(null); - } - - if (getState().isSuccess() || getState().isWarning()) { - if (getPreset() == null) { - setPreset(new CampaignPreset()); - } - - getPreset().setTitle(getTxtPresetName().getText().trim()); - getPreset().setDescription(getTxtPresetDescription().getText().trim()); - if (getChkSpecifyDate().isSelected()) { - getPreset().setDate(getDate()); - } - - if (getChkSpecifyFaction().isSelected()) { - final FactionDisplay factionDisplay = getComboFaction().getSelectedItem(); - getPreset().setFaction((factionDisplay == null) ? null : factionDisplay.getFaction()); - } - - if (getChkSpecifyPlanet().isSelected()) { - getPreset().setPlanet(getComboStartingPlanet().getSelectedItem()); - } - - if (getChkSpecifyRankSystem().isSelected()) { - getPreset().setRankSystem(getComboRankSystem().getSelectedItem()); - } - getPreset().setContractCount((int) getSpnContractCount().getValue()); - if (getChkSpecifyGameOptions().isSelected()) { - getPreset().setGameOptions(getGameOptions()); - } - - if (getChkSpecifyCampaignOptions().isSelected()) { - getPreset().setCampaignOptions(getCampaignOptions()); - getPreset().setRandomSkillPreferences(getRandomSkillPreferences()); - getPreset().setSkills(getSkills()); - getPreset().setSpecialAbilities(getSpecialAbilities()); - } - } - } } diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 8b555c1f41..91e841e8a5 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -20,6 +20,7 @@ import megamek.client.ui.baseComponents.MMComboBox; import megamek.client.ui.enums.ValidationState; +import megamek.common.annotations.Nullable; import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.enums.PersonnelRole; @@ -128,16 +129,17 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { //endregion Variable Declarations //region Constructors - public CompanyGenerationOptionsPanel(final JFrame frame, final Campaign campaign) { + public CompanyGenerationOptionsPanel(final JFrame frame, final Campaign campaign, + final @Nullable CompanyGenerationOptions companyGenerationOptions) { super(frame, "CompanyGenerationOptionsPanel", new GridBagLayout()); this.campaign = campaign; initialize(); - if (campaign.getCampaignOptions().getCompanyGenerationOptions() == null) { + if (companyGenerationOptions == null) { setOptions(MekHQ.getMekHQOptions().getDefaultCompanyGenerationMethod()); } else { - setOptions(campaign.getCampaignOptions().getCompanyGenerationOptions()); + setOptions(companyGenerationOptions); } } //endregion Constructors From d63194ae3c8551d46282ad8f328711da58e75a22 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 30 Oct 2021 13:13:45 -0400 Subject: [PATCH 056/115] Applying changes from personal review --- MekHQ/src/mekhq/MekHqConstants.java | 6 +++--- MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index acf48201c0..6365956590 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -47,10 +47,11 @@ public final class MekHqConstants extends SuiteConstants { public static final String COMMAND_CENTER_MRMS = "commandCenterMRMS"; //endregion Command Center - //region Personnel Tab Display Options + //region Personnel Tab public static final String PERSONNEL_FILTER_STYLE = "personnelFilterStyle"; public static final String PERSONNEL_FILTER_ON_PRIMARY_ROLE = "personnelFilterOnPrimaryRole"; - //endregion Personnel Tab Display Options + //endregion Personnel Tab + //endregion Display //region Colours public static final String DEPLOYED_FOREGROUND = "deployedForeground"; @@ -84,7 +85,6 @@ public final class MekHqConstants extends SuiteConstants { public static final String PAID_RETIREMENT_FOREGROUND = "paidRetirementForeground"; public static final String PAID_RETIREMENT_BACKGROUND = "paidRetirementBackground"; //endregion Colours - //endregion Display //region Autosave public static final String AUTOSAVE_NODE = "mekhq/prefs/autosave"; diff --git a/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java b/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java index 527091deaa..4b67b25f68 100644 --- a/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java @@ -508,8 +508,6 @@ public Component getListCellRendererComponent(final JList list, final Object getChkSpecifyPlanet().doClick(); getChkSpecifyRankSystem().setSelected(true); getChkSpecifyRankSystem().doClick(); - getChkSpecifyCompanyGenerationOptions().setSelected(true); - getChkSpecifyCompanyGenerationOptions().doClick(); // Layout the UI final JPanel panel = new JPanel(); From 05bca89fd33babd069e8eee834cc5b49e4fe6368 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 1 Nov 2021 17:21:37 -0400 Subject: [PATCH 057/115] Adding Light, Heavy, and Assault weight variants --- .../mekhq/resources/Universe.properties | 8 ++- .../enums/CompanyGenerationMethod.java | 32 ++++++++-- .../CompanyGenerationOptions.java | 38 ++++++------ .../WindchildAssaultCompanyGenerator.java | 62 +++++++++++++++++++ .../WindchildCompanyGenerator.java | 10 ++- .../WindchildHeavyCompanyGenerator.java | 62 +++++++++++++++++++ .../WindchildLightCompanyGenerator.java | 62 +++++++++++++++++++ 7 files changed, 247 insertions(+), 27 deletions(-) create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index a21910fc3b..33f0427f41 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -113,7 +113,13 @@ Alphabets.Z.greek.text=Dio CompanyGenerationMethod.AGAINST_THE_BOT.text=AtB CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the AtB rules to generate a mercenary company. CompanyGenerationMethod.WINDCHILD.text=Windchild -CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that ensures all personnel have units, creates a heavier force, and .
The 'Mech weight class and quality rolls are also modified, with +CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that ensures all personnel have units, creates a force weighted closer to the average Inner Sphere 'Mech weights in 3039, and assigns the commanding officer a rank better fitting the force size.
The 'Mech weight class and quality rolls are also modified, with the ability to generate any quality level when it comes to Clan 'Mechs and the rare ability to generate from the Star League Royal tables.
Generates: 28% Light, 44% Medium, 20% Heavy, 8% Assault. +CompanyGenerationMethod.WINDCHILD_LIGHT.text=Windchild (Light Force) +CompanyGenerationMethod.WINDCHILD_LIGHT.toolTipText=This is a variant of the Windchild Method that creates a lighter force, weighted around light and medium 'Mechs.
Generates: 50% Light, 30% Medium, 14% Heavy, 6% Assault. +CompanyGenerationMethod.WINDCHILD_HEAVY.text=Windchild (Heavy Force) +CompanyGenerationMethod.WINDCHILD_HEAVY.toolTipText=This is a variant of the Windchild Method that creates a heavier force, weighted around medium and heavy 'Mechs.
Generates: 17% Light, 30% Medium, 33% Heavy, 20% Assault. +CompanyGenerationMethod.WINDCHILD_ASSAULT.text=Windchild (Assault Force) +CompanyGenerationMethod.WINDCHILD_ASSAULT.toolTipText=This is a variant of the Windchild Method that creates a significantly heavier force, weighted around heavy and assault 'Mechs.
Generates: 8% Light, 20% Medium, 33% Heavy, 39% Assault. # CompanyGenerationPersonType Enum CompanyGenerationPersonType.COMPANY_COMMANDER.text=Company Commander diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java index 9399fdd89d..fefd7982dc 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java @@ -20,17 +20,17 @@ import megamek.common.util.EncodeControl; import mekhq.campaign.Campaign; -import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; -import mekhq.campaign.universe.generators.companyGenerators.AtBCompanyGenerator; -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; -import mekhq.campaign.universe.generators.companyGenerators.WindchildCompanyGenerator; +import mekhq.campaign.universe.generators.companyGenerators.*; import java.util.ResourceBundle; public enum CompanyGenerationMethod { //region Enum Declarations AGAINST_THE_BOT("CompanyGenerationMethod.AGAINST_THE_BOT.text", "CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText"), - WINDCHILD("CompanyGenerationMethod.WINDCHILD.text", "CompanyGenerationMethod.WINDCHILD.toolTipText"); + WINDCHILD("CompanyGenerationMethod.WINDCHILD.text", "CompanyGenerationMethod.WINDCHILD.toolTipText"), + WINDCHILD_LIGHT("CompanyGenerationMethod.WINDCHILD_LIGHT.text", "CompanyGenerationMethod.WINDCHILD_LIGHT.toolTipText"), + WINDCHILD_HEAVY("CompanyGenerationMethod.WINDCHILD_HEAVY.text", "CompanyGenerationMethod.WINDCHILD_HEAVY.toolTipText"), + WINDCHILD_ASSAULT("CompanyGenerationMethod.WINDCHILD_ASSAULT.text", "CompanyGenerationMethod.WINDCHILD_ASSAULT.toolTipText"); //endregion Enum Declarations //region Variable Declarations @@ -60,6 +60,22 @@ public boolean isAtB() { public boolean isWindchild() { return this == WINDCHILD; } + + public boolean isWindchildLight() { + return this == WINDCHILD_LIGHT; + } + + public boolean isWindchildHeavy() { + return this == WINDCHILD_HEAVY; + } + + public boolean isWindchildAssault() { + return this == WINDCHILD_ASSAULT; + } + + public boolean isWindchildGrouping() { + return isWindchild() || isWindchildLight() || isWindchildHeavy() || isWindchildAssault(); + } //endregion Boolean Comparison Methods public AbstractCompanyGenerator getGenerator(final Campaign campaign, @@ -67,6 +83,12 @@ public AbstractCompanyGenerator getGenerator(final Campaign campaign, switch (this) { case AGAINST_THE_BOT: return new AtBCompanyGenerator(campaign, options); + case WINDCHILD_LIGHT: + return new WindchildLightCompanyGenerator(campaign, options); + case WINDCHILD_HEAVY: + return new WindchildHeavyCompanyGenerator(campaign, options); + case WINDCHILD_ASSAULT: + return new WindchildAssaultCompanyGenerator(campaign, options); case WINDCHILD: default: return new WindchildCompanyGenerator(campaign, options); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java index bf84ce3dfc..1388b7a8eb 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java @@ -142,7 +142,7 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp // Personnel final Map supportPersonnel = new HashMap<>(); - if (getMethod().isWindchild()) { + if (method.isWindchildGrouping()) { supportPersonnel.put(PersonnelRole.MECH_TECH, 5); supportPersonnel.put(PersonnelRole.MECHANIC, 1); supportPersonnel.put(PersonnelRole.AERO_TECH, 1); @@ -158,10 +158,10 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp } setSupportPersonnel(supportPersonnel); setPoolAssistants(true); - setGenerateCaptains(method.isWindchild()); + setGenerateCaptains(method.isWindchildGrouping()); setAssignCompanyCommanderFlag(true); - setApplyOfficerStatBonusToWorstSkill(method.isWindchild()); - setAssignBestOfficers(method.isWindchild()); + setApplyOfficerStatBonusToWorstSkill(method.isWindchildGrouping()); + setAssignBestOfficers(method.isWindchildGrouping()); setAutomaticallyAssignRanks(true); setAssignFounderFlag(true); @@ -174,17 +174,17 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp setOriginDistanceScale(0.2); // Starting Simulation - setRunStartingSimulation(method.isWindchild()); + setRunStartingSimulation(method.isWindchildGrouping()); setSimulationDuration(5); - setSimulateRandomMarriages(method.isWindchild()); - setSimulateRandomProcreation(method.isWindchild()); + setSimulateRandomMarriages(method.isWindchildGrouping()); + setSimulateRandomProcreation(method.isWindchildGrouping()); // Units setGenerateUnitsAsAttached(method.isAtB()); - setAssignBestRollToUnitCommander(method.isWindchild()); + setAssignBestRollToUnitCommander(method.isWindchildGrouping()); setSortStarLeagueUnitsFirst(true); setGroupByWeight(true); - setGroupByQuality(method.isWindchild()); + setGroupByQuality(method.isWindchildGrouping()); setKeepOfficerRollsSeparate(method.isAtB()); setAssignTechsToUnits(true); @@ -197,7 +197,7 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp setSparesPercentOfActiveUnits(10); setPartGenerationMethod(PartGenerationMethod.WINDCHILD); setStartingArmourWeight(60); - setGenerateSpareAmmunition(method.isWindchild()); + setGenerateSpareAmmunition(method.isWindchildGrouping()); setNumberReloadsPerWeapon(4); setGenerateFractionalMachineGunAmmunition(true); @@ -207,16 +207,16 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp // Finances setStartingCash(0); - setRandomizeStartingCash(method.isWindchild()); + setRandomizeStartingCash(method.isWindchildGrouping()); setRandomStartingCashDiceCount(8); - setMinimumStartingFloat(method.isWindchild() ? 3500000 : 0); - setPayForSetup(method.isWindchild()); - setStartingLoan(method.isWindchild()); - setPayForPersonnel(method.isWindchild()); - setPayForUnits(method.isWindchild()); - setPayForParts(method.isWindchild()); - setPayForArmour(method.isWindchild()); - setPayForAmmunition(method.isWindchild()); + setMinimumStartingFloat(method.isWindchildGrouping() ? 3500000 : 0); + setPayForSetup(method.isWindchildGrouping()); + setStartingLoan(method.isWindchildGrouping()); + setPayForPersonnel(method.isWindchildGrouping()); + setPayForUnits(method.isWindchildGrouping()); + setPayForParts(method.isWindchildGrouping()); + setPayForArmour(method.isWindchildGrouping()); + setPayForAmmunition(method.isWindchildGrouping()); // Surprises setGenerateSurprises(true); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java new file mode 100644 index 0000000000..ee68e1637f --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.Campaign; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; + +public class WindchildAssaultCompanyGenerator extends WindchildCompanyGenerator { + //region Constructors + public WindchildAssaultCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { + super(CompanyGenerationMethod.WINDCHILD_ASSAULT, campaign, options); + } + //endregion Constructors + + /** + * This guarantees a BattleMech, and rolls a heavy/assault weighted lance + * + * @param roll the modified roll to use + * @return the generated EntityWeightClass + * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, + * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables + */ + @Override + protected int determineBattleMechWeight(final int roll) { + switch (roll) { + case 3: + return EntityWeightClass.WEIGHT_LIGHT; + case 4: + case 5: + return EntityWeightClass.WEIGHT_MEDIUM; + case 2: + case 6: + case 7: + return EntityWeightClass.WEIGHT_HEAVY; + case 8: + case 9: + case 10: + case 11: + case 12: + return EntityWeightClass.WEIGHT_ASSAULT; + default: + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 570467c237..4f460e4916 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -32,6 +32,12 @@ public class WindchildCompanyGenerator extends AbstractCompanyGenerator { public WindchildCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { super(CompanyGenerationMethod.WINDCHILD, campaign, options); } + + protected WindchildCompanyGenerator(final CompanyGenerationMethod method, + final Campaign campaign, + final CompanyGenerationOptions options) { + super(method, campaign, options); + } //endregion Constructors //region Personnel @@ -72,12 +78,12 @@ protected int determineBattleMechWeight(final int roll) { case 2: case 3: case 4: - return EntityWeightClass.WEIGHT_LIGHT; case 5: + return EntityWeightClass.WEIGHT_LIGHT; case 6: case 7: - return EntityWeightClass.WEIGHT_MEDIUM; case 8: + return EntityWeightClass.WEIGHT_MEDIUM; case 9: case 10: return EntityWeightClass.WEIGHT_HEAVY; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java new file mode 100644 index 0000000000..96fa585eee --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.Campaign; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; + +public class WindchildHeavyCompanyGenerator extends WindchildCompanyGenerator { + //region Constructors + public WindchildHeavyCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { + super(CompanyGenerationMethod.WINDCHILD_HEAVY, campaign, options); + } + //endregion Constructors + + /** + * This guarantees a BattleMech, and rolls a heavier lance + * + * @param roll the modified roll to use + * @return the generated EntityWeightClass + * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, + * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables + */ + @Override + protected int determineBattleMechWeight(final int roll) { + switch (roll) { + case 2: + case 3: + case 4: + return EntityWeightClass.WEIGHT_LIGHT; + case 6: + case 7: + return EntityWeightClass.WEIGHT_MEDIUM; + case 8: + case 9: + case 10: + return EntityWeightClass.WEIGHT_HEAVY; + case 5: + case 11: + case 12: + return EntityWeightClass.WEIGHT_ASSAULT; + default: + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java new file mode 100644 index 0000000000..34ca751f5e --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.companyGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.Campaign; +import mekhq.campaign.universe.enums.CompanyGenerationMethod; + +public class WindchildLightCompanyGenerator extends WindchildCompanyGenerator { + //region Constructors + public WindchildLightCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { + super(CompanyGenerationMethod.WINDCHILD_LIGHT, campaign, options); + } + //endregion Constructors + + /** + * This guarantees a BattleMech, and rolls a light/medium weighted lance + * + * @param roll the modified roll to use + * @return the generated EntityWeightClass + * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, + * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables + */ + @Override + protected int determineBattleMechWeight(final int roll) { + switch (roll) { + case 4: + case 5: + case 6: + case 7: + return EntityWeightClass.WEIGHT_LIGHT; + case 3: + case 8: + case 9: + return EntityWeightClass.WEIGHT_MEDIUM; + case 10: + case 11: + return EntityWeightClass.WEIGHT_HEAVY; + case 2: + case 12: + return EntityWeightClass.WEIGHT_ASSAULT; + default: + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } + } +} From 69c9f5a1c3d8c21aa2f32ec211f945e4ab990a03 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 7 Nov 2021 14:59:58 -0500 Subject: [PATCH 058/115] Fixing mission regioning --- .../companyGenerators/WindchildAssaultCompanyGenerator.java | 2 ++ .../companyGenerators/WindchildHeavyCompanyGenerator.java | 2 ++ .../companyGenerators/WindchildLightCompanyGenerator.java | 2 ++ 3 files changed, 6 insertions(+) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java index ee68e1637f..fc0c209833 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java @@ -29,6 +29,7 @@ public WindchildAssaultCompanyGenerator(final Campaign campaign, final CompanyGe } //endregion Constructors + //region Units /** * This guarantees a BattleMech, and rolls a heavy/assault weighted lance * @@ -59,4 +60,5 @@ protected int determineBattleMechWeight(final int roll) { return EntityWeightClass.WEIGHT_SUPER_HEAVY; } } + //endregion Units } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java index 96fa585eee..d4ced55a6b 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java @@ -29,6 +29,7 @@ public WindchildHeavyCompanyGenerator(final Campaign campaign, final CompanyGene } //endregion Constructors + //region Units /** * This guarantees a BattleMech, and rolls a heavier lance * @@ -59,4 +60,5 @@ protected int determineBattleMechWeight(final int roll) { return EntityWeightClass.WEIGHT_SUPER_HEAVY; } } + //endregion Units } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java index 34ca751f5e..9a3428d3a3 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java @@ -29,6 +29,7 @@ public WindchildLightCompanyGenerator(final Campaign campaign, final CompanyGene } //endregion Constructors + //region Units /** * This guarantees a BattleMech, and rolls a light/medium weighted lance * @@ -59,4 +60,5 @@ protected int determineBattleMechWeight(final int roll) { return EntityWeightClass.WEIGHT_SUPER_HEAVY; } } + //endregion Units } From 1473e1917f8aeda14322bd4de192dd1aa93d6d46 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 12 Nov 2021 22:40:26 -0500 Subject: [PATCH 059/115] Starting to swap to part and quality generators instead of inlining them --- .../resources/mekhq/resources/GUI.properties | 10 +- .../mekhq/resources/Universe.properties | 39 +- MekHQ/src/mekhq/campaign/CampaignPreset.java | 2 +- .../AtBRandomMechParameters.java | 134 +- .../CompanyGenerationOptions.java | 2273 +++++++++-------- .../CompanyGenerationPersonTracker.java | 162 +- .../BattleMechQualityGenerationMethod.java | 77 + ...BattleMechWeightClassGenerationMethod.java | 103 + .../enums/CompanyGenerationMethod.java | 28 +- .../AbstractBattleMechQualityGenerator.java | 49 + .../AtBBattleMechQualityGenerator.java | 54 + .../WindchildBattleMechQualityGenerator.java | 54 + ...bstractBattleMechWeightClassGenerator.java | 49 + .../AtBBattleMechWeightClassGenerator.java} | 32 +- ...ssaultBattleMechWeightClassGenerator.java} | 33 +- ...dchildBattleMechWeightClassGenerator.java} | 31 +- ...ldHeavyBattleMechWeightClassGenerator.java | 53 + ...ldLightBattleMechWeightClassGenerator.java | 53 + ...dMediumBattleMechWeightClassGenerator.java | 53 + .../AbstractCompanyGenerator.java | 136 +- .../AtBCompanyGenerator.java | 63 +- .../WindchildCompanyGenerator.java | 71 +- .../partGenerators/MultiplePartGenerator.java | 2 - .../WindchildPartGenerator.java | 1 - .../gui/dialog/CompanyGenerationDialog.java | 4 +- .../CompanyGenerationOptionsDialog.java | 2 +- .../dialog/CreateCampaignPresetDialog.java | 2 +- .../panels/CompanyGenerationOptionsPanel.java | 87 +- 28 files changed, 2070 insertions(+), 1587 deletions(-) rename MekHQ/src/mekhq/campaign/universe/{generators/companyGenerators => companyGeneration}/AtBRandomMechParameters.java (93%) rename MekHQ/src/mekhq/campaign/universe/{generators/companyGenerators => companyGeneration}/CompanyGenerationOptions.java (93%) rename MekHQ/src/mekhq/campaign/universe/{generators/companyGenerators => companyGeneration}/CompanyGenerationPersonTracker.java (94%) create mode 100644 MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java create mode 100644 MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AbstractBattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AtBBattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/WindchildBattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java rename MekHQ/src/mekhq/campaign/universe/generators/{companyGenerators/WindchildHeavyCompanyGenerator.java => battleMechWeightClassGenerators/AtBBattleMechWeightClassGenerator.java} (63%) rename MekHQ/src/mekhq/campaign/universe/generators/{companyGenerators/WindchildLightCompanyGenerator.java => battleMechWeightClassGenerators/WindchildAssaultBattleMechWeightClassGenerator.java} (63%) rename MekHQ/src/mekhq/campaign/universe/generators/{companyGenerators/WindchildAssaultCompanyGenerator.java => battleMechWeightClassGenerators/WindchildBattleMechWeightClassGenerator.java} (63%) create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildHeavyBattleMechWeightClassGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildLightBattleMechWeightClassGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildMediumBattleMechWeightClassGenerator.java diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 9cf562dad1..f2bbbb9c2f 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -349,7 +349,7 @@ chkSpecifyRankSystem.text=Specify Rank System chkSpecifyRankSystem.toolTipText=This allows you to specify the starting rank system for a campaign. The default starting rank system is the Second Star League Defense Force. comboRankSystem.toolTipText=This is the rank system the campaign will start with. lblContractCount.text=Starting Contract Count -lblContractCount.toolTipText=Specify the number of contracts generated by the contract market at the start of a campaign. The default starting contract count is 2 (AtB Contract Market). +lblContractCount.toolTipText=Specify the number of contracts generated by the contract market at the start of a campaign. The default starting contract count is 2 (Against the Bot Contract Market). chkSpecifyCompanyGenerationOptions.text=Specify Company Generation Options chkSpecifyCompanyGenerationOptions.toolTipText=This allows you to specify the default company generation options to use when starting a new campaign. (Unimplemented on Load) btnCompanyGenerationOptions.text=View Company Generation Options @@ -727,8 +727,12 @@ chkSimulateRandomProcreation.text=Simulate Random Procreation chkSimulateRandomProcreation.toolTipText=This runs random procreation for the duration of the simulation. ## Units Panel unitsPanel.title=Units +lblBattleMechWeightClassGenerationMethod.text=BattleMech Weight Class Generation Method +lblBattleMechWeightClassGenerationMethod.toolTipText= +lblBattleMechQualityGenerationMethod.text=BattleMech Quality Generation Method +lblBattleMechQualityGenerationMethod.toolTipText= chkGenerateUnitsAsAttached.text=Generate Units as Attached -chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the AtB rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MechWarrior when they retire
(provided the campaign options are enabled). +chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the Against the Bot rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MechWarrior when they retire
(provided the campaign options are enabled). chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander chkAssignBestRollToUnitCommander.toolTipText=This assigns the best rolled unit to the unit commander.
The heaviest Star League weight class will be assigned to them if a Star League 'Mech is rolled, or otherwise they will be assigned the heaviest 'Mech. chkSortStarLeagueUnitsFirst.text=Sort Star League Units First @@ -738,7 +742,7 @@ chkGroupByWeight.toolTipText=This groups the rolls so that the 'Mechs are chkGroupByQuality.text=Group Units by Quality chkGroupByQuality.toolTipText=This groups the rolls so that the highest quality will go to lances higher in the order of assignment. chkKeepOfficerRollsSeparate.text=Keep Officer Rolls Separate -chkKeepOfficerRollsSeparate.toolTipText=This separates out the officer rolls from combat personnel rolls when using any of the above sorts.
This follows the spirit of the AtB rules, but means that officers will in general have heavier 'Mechs than their lance. +chkKeepOfficerRollsSeparate.toolTipText=This separates out the officer rolls from combat personnel rolls when using any of the above sorts.
This follows the spirit of the Against the Bot rules, but means that officers will in general have heavier 'Mechs than their lance. lblStarLeagueYear.text=Star League Year lblStarLeagueYear.toolTipText=This is the year to use when rolling for Star League 'Mechs. Valid years are 2571 to 2780, with 2765 being the default. chkAssignTechsToUnits.text=Assign Techs to Units diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 33f0427f41..35118190c1 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -109,17 +109,31 @@ Alphabets.X.greek.text=Omega Alphabets.Y.greek.text=Ena Alphabets.Z.greek.text=Dio +# BattleMechQualityGenerationMethod Enum +BattleMechQualityGenerationMethod.AGAINST_THE_BOT.text=AtB +BattleMechQualityGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the AtB rules for base quality generation.
Generates (before modifiers): 28% F, 44% D, 19% C, 6% B, 3% A. +BattleMechQualityGenerationMethod.WINDCHILD.text=Windchild +BattleMechQualityGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB method that generates a higher base quality.
Generates (before modifiers): 17% F, 25% D, 31% C, 19% B, 8% A. + +# BattleMechWeightClassGenerationMethod Enum +BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.text=AtB +BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the core AtB rules to generate a mercenary company.
Generates (before modifiers): 8% Nothing, 33% Light, 42% Medium, 14% Heavy, 3% Assault. +BattleMechWeightClassGenerationMethod.WINDCHILD.text=Windchild +BattleMechWeightClassGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that guarantees generating a valid BattleMech. As part of doing so, it creates a force weighted closer to the average Inner Sphere 'Mech weights in 3039.
Generates (before modifiers): 28% Light, 44% Medium, 19% Heavy, 8% Assault (rounded properly). +BattleMechWeightClassGenerationMethod.WINDCHILD_LIGHT.text=Windchild (Light Force) +BattleMechWeightClassGenerationMethod.WINDCHILD_LIGHT.toolTipText=This is a variant of the Windchild Method that creates a light force, weighted around light and medium 'Mechs.
Generates (before modifiers): 50% Light, 31% Medium, 14% Heavy, 6% Assault (rounded normally). +BattleMechWeightClassGenerationMethod.WINDCHILD_MEDIUM.text=Windchild (Medium Force) +BattleMechWeightClassGenerationMethod.WINDCHILD_MEDIUM.toolTipText=This is a variant of the Windchild Method that creates a medium force, weighted around medium 'Mechs.
Generates (before modifiers): 25% Light, 50% Medium, 19% Heavy, 6% Assault. +BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY.text=Windchild (Heavy Force) +BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY.toolTipText=This is a variant of the Windchild Method that creates a heavy force, weighted around medium and heavy 'Mechs.
Generates (before modifiers): 17% Light, 31% Medium, 33% Heavy, 19% Assault. +BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.text=Windchild (Assault Force) +BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.toolTipText=This is a variant of the Windchild Method that creates an assault force, weighted around heavy and assault 'Mechs.
Generates (before modifiers): 8% Light, 19% Medium, 33% Heavy, 39% Assault (rounded normally). + # CompanyGenerationMethod Enum CompanyGenerationMethod.AGAINST_THE_BOT.text=AtB -CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the AtB rules to generate a mercenary company. +CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the core AtB rules to generate a mercenary company. CompanyGenerationMethod.WINDCHILD.text=Windchild -CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that ensures all personnel have units, creates a force weighted closer to the average Inner Sphere 'Mech weights in 3039, and assigns the commanding officer a rank better fitting the force size.
The 'Mech weight class and quality rolls are also modified, with the ability to generate any quality level when it comes to Clan 'Mechs and the rare ability to generate from the Star League Royal tables.
Generates: 28% Light, 44% Medium, 20% Heavy, 8% Assault. -CompanyGenerationMethod.WINDCHILD_LIGHT.text=Windchild (Light Force) -CompanyGenerationMethod.WINDCHILD_LIGHT.toolTipText=This is a variant of the Windchild Method that creates a lighter force, weighted around light and medium 'Mechs.
Generates: 50% Light, 30% Medium, 14% Heavy, 6% Assault. -CompanyGenerationMethod.WINDCHILD_HEAVY.text=Windchild (Heavy Force) -CompanyGenerationMethod.WINDCHILD_HEAVY.toolTipText=This is a variant of the Windchild Method that creates a heavier force, weighted around medium and heavy 'Mechs.
Generates: 17% Light, 30% Medium, 33% Heavy, 20% Assault. -CompanyGenerationMethod.WINDCHILD_ASSAULT.text=Windchild (Assault Force) -CompanyGenerationMethod.WINDCHILD_ASSAULT.toolTipText=This is a variant of the Windchild Method that creates a significantly heavier force, weighted around heavy and assault 'Mechs.
Generates: 8% Light, 20% Medium, 33% Heavy, 39% Assault. +CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that assigns the commanding officer a rank better fitting the force size.
The handling for BattleMech weight class and quality rolls are also modified, with Inner Sphere 'Mechs having the rare possibility of generating from the Star League Royal Tables, while Clan 'Mechs can generate from any quality. # CompanyGenerationPersonType Enum CompanyGenerationPersonType.COMPANY_COMMANDER.text=Company Commander @@ -169,17 +183,16 @@ PartGenerationMethod.DISABLED.toolTipText=Part Generation is disabled. PartGenerationMethod.WINDCHILD.text=Windchild PartGenerationMethod.WINDCHILD.toolTipText=Windchild's method generates one part for every three in the input, rounded normally.
This means you get a single part if you have two to four parts, and another part for each interval above that. PartGenerationMethod.MISHRA.text=Mishra -PartGenerationMethod.MISHRA.toolTipText=Mishra's method generates (Unimplemented)\u0020 +PartGenerationMethod.MISHRA.toolTipText=Mishra's method only applies to 'Mech units and isolates based on 'Mech parts. It starts with three parts for every one in the input, then removes all engines before capping the remaining parts based on the following rules.
1) All Heat Sinks are capped at 30 per type.
2) All 'Mech Heads [Sensors, Life Support] are capped at 2 per weight/type.
3) All Gyros are capped at 1 per weight/type.
4) MASC is capped at 1 per type.
5) Any other parts are capped at 6. PartGenerationMethod.SINGLE.text=Single Copy -PartGenerationMethod.SINGLE.toolTipText=This returns a part for every part in the input, which may be a list of parts or the parts from the provided units. +PartGenerationMethod.SINGLE.toolTipText=This returns a part for every part in the input. PartGenerationMethod.DOUBLE.text=Double Copy -PartGenerationMethod.DOUBLE.toolTipText=This returns two parts for every one in the input, which may be a list of parts or the parts from the provided units. +PartGenerationMethod.DOUBLE.toolTipText=This returns two parts for every one in the input. PartGenerationMethod.TRIPLE.text=Triple Copy -PartGenerationMethod.TRIPLE.toolTipText=This returns three parts for every one in the input, which may be a list of parts or the parts from the provided units. +PartGenerationMethod.TRIPLE.toolTipText=This returns three parts for every one in the input. ## Generators # AbstractCompanyGenerator AbstractCompanyGenerator.commandLance.text=\u0020Command Lance AbstractCompanyGenerator.company.text=\u0020Company AbstractCompanyGenerator.lance.text=\u0020Lance -AbstractCompanyGenerator.StartingFunds.report=\u0020 diff --git a/MekHQ/src/mekhq/campaign/CampaignPreset.java b/MekHQ/src/mekhq/campaign/CampaignPreset.java index 53a42ee9be..ebffd69d12 100644 --- a/MekHQ/src/mekhq/campaign/CampaignPreset.java +++ b/MekHQ/src/mekhq/campaign/CampaignPreset.java @@ -37,7 +37,7 @@ import mekhq.campaign.universe.Factions; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.Systems; -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBRandomMechParameters.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java similarity index 93% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBRandomMechParameters.java rename to MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java index 56699fd3cc..c3318b6da2 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBRandomMechParameters.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java @@ -1,67 +1,67 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.generators.companyGenerators; - -import megamek.common.EntityWeightClass; - -/** - * This class contains the parameters used to generate a random mech, and allows sorting and - * swapping the order of rolled parameters while keeping them connected. - */ -public class AtBRandomMechParameters { - //region Variable Declarations - private int weight; - private int quality; - private boolean starLeague; - //endregion Variable Declarations - - //region Constructors - public AtBRandomMechParameters(final int weight, final int quality) { - setWeight(weight); - setQuality(quality); - setStarLeague(weight == EntityWeightClass.WEIGHT_SUPER_HEAVY); - } - //endregion Constructors - - //region Getters/Setters - public int getWeight() { - return weight; - } - - public void setWeight(final int weight) { - this.weight = weight; - } - - public int getQuality() { - return quality; - } - - public void setQuality(final int quality) { - this.quality = quality; - } - - public boolean isStarLeague() { - return starLeague; - } - - public void setStarLeague(final boolean starLeague) { - this.starLeague = starLeague; - } - //endregion Getters/Setters -} +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.companyGeneration; + +import megamek.common.EntityWeightClass; + +/** + * This class contains the parameters used to generate a random mech, and allows sorting and + * swapping the order of rolled parameters while keeping them connected. + */ +public class AtBRandomMechParameters { + //region Variable Declarations + private int weight; + private int quality; + private boolean starLeague; + //endregion Variable Declarations + + //region Constructors + public AtBRandomMechParameters(final int weight, final int quality) { + setWeight(weight); + setQuality(quality); + setStarLeague(weight == EntityWeightClass.WEIGHT_SUPER_HEAVY); + } + //endregion Constructors + + //region Getters/Setters + public int getWeight() { + return weight; + } + + public void setWeight(final int weight) { + this.weight = weight; + } + + public int getQuality() { + return quality; + } + + public void setQuality(final int quality) { + this.quality = quality; + } + + public boolean isStarLeague() { + return starLeague; + } + + public void setStarLeague(final boolean starLeague) { + this.starLeague = starLeague; + } + //endregion Getters/Setters +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java similarity index 93% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java rename to MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 1388b7a8eb..0dbafef812 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -1,1121 +1,1152 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.generators.companyGenerators; - -import megamek.Version; -import megamek.common.annotations.Nullable; -import mekhq.MekHQ; -import mekhq.MekHqXmlUtil; -import mekhq.campaign.Campaign; -import mekhq.campaign.personnel.enums.PersonnelRole; -import mekhq.campaign.universe.Planet; -import mekhq.campaign.universe.Systems; -import mekhq.campaign.universe.enums.CompanyGenerationMethod; -import mekhq.campaign.universe.enums.ForceNamingMethod; -import mekhq.campaign.universe.enums.MysteryBoxType; -import mekhq.campaign.universe.enums.PartGenerationMethod; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import java.util.ResourceBundle; - -public class CompanyGenerationOptions implements Serializable { - //region Variable Declarations - private static final long serialVersionUID = 3034123423672457769L; - - // Base Information - private CompanyGenerationMethod method; - private boolean generateMercenaryCompanyCommandLance; - private int companyCount; - private int individualLanceCount; - private int lancesPerCompany; - private int lanceSize; - private int starLeagueYear; - - // Personnel - private Map supportPersonnel; - private boolean poolAssistants; - private boolean generateCaptains; - private boolean assignCompanyCommanderFlag; - private boolean applyOfficerStatBonusToWorstSkill; - private boolean assignBestOfficers; - private boolean automaticallyAssignRanks; - private boolean assignFounderFlag; - - // Personnel Randomization - private boolean randomizeOrigin; - private boolean randomizeAroundCentralPlanet; - private Planet centralPlanet; // Not Implemented - private int originSearchRadius; - private boolean extraRandomOrigin; - private double originDistanceScale; - - // Starting Simulation - private boolean runStartingSimulation; - private int simulationDuration; - private boolean simulateRandomMarriages; - private boolean simulateRandomProcreation; - - // Units - private boolean generateUnitsAsAttached; - private boolean assignBestRollToUnitCommander; - private boolean sortStarLeagueUnitsFirst; - private boolean groupByWeight; - private boolean groupByQuality; - private boolean keepOfficerRollsSeparate; - private boolean assignTechsToUnits; - - // Unit - private ForceNamingMethod forceNamingMethod; - private boolean generateForceIcons; // Very Buggy - - // Spares - private boolean generateMothballedSpareUnits; - private int sparesPercentOfActiveUnits; - private PartGenerationMethod partGenerationMethod; - private int startingArmourWeight; - private boolean generateSpareAmmunition; - private int numberReloadsPerWeapon; - private boolean generateFractionalMachineGunAmmunition; - - // Contracts - private boolean selectStartingContract; // Not Implemented - private boolean startCourseToContractPlanet; - - // Finances - private int startingCash; // Not Implemented - private boolean randomizeStartingCash; - private int randomStartingCashDiceCount; - private int minimumStartingFloat; // Not Implemented - private boolean payForSetup; // Not Implemented - private boolean startingLoan; // Not Implemented - private boolean payForPersonnel; - private boolean payForUnits; - private boolean payForParts; - private boolean payForArmour; - private boolean payForAmmunition; - - // Surprises - private boolean generateSurprises; // Not Implemented - private boolean generateMysteryBoxes; // Not Implemented - private Map generateMysteryBoxTypes; // Not Implemented - //endregion Variable Declarations - - //region Constructors - /** - * This is only to be used when reading from XML - */ - private CompanyGenerationOptions() { - - } - - public CompanyGenerationOptions(final CompanyGenerationMethod method, final Campaign campaign) { - // Base Information - setMethod(method); - setGenerateMercenaryCompanyCommandLance(false); - setCompanyCount(1); - setIndividualLanceCount(0); - setLancesPerCompany(3); - setLanceSize(4); - setStarLeagueYear(2765); - - // Personnel - final Map supportPersonnel = new HashMap<>(); - if (method.isWindchildGrouping()) { - supportPersonnel.put(PersonnelRole.MECH_TECH, 5); - supportPersonnel.put(PersonnelRole.MECHANIC, 1); - supportPersonnel.put(PersonnelRole.AERO_TECH, 1); - supportPersonnel.put(PersonnelRole.DOCTOR, 1); - supportPersonnel.put(PersonnelRole.ADMINISTRATOR_COMMAND, 1); - supportPersonnel.put(PersonnelRole.ADMINISTRATOR_LOGISTICS, 1); - supportPersonnel.put(PersonnelRole.ADMINISTRATOR_TRANSPORT, 1); - supportPersonnel.put(PersonnelRole.ADMINISTRATOR_HR, 1); - } else { // Defaults to AtB - supportPersonnel.put(PersonnelRole.MECH_TECH, 10); - supportPersonnel.put(PersonnelRole.DOCTOR, 1); - supportPersonnel.put(PersonnelRole.ADMINISTRATOR_LOGISTICS, 1); - } - setSupportPersonnel(supportPersonnel); - setPoolAssistants(true); - setGenerateCaptains(method.isWindchildGrouping()); - setAssignCompanyCommanderFlag(true); - setApplyOfficerStatBonusToWorstSkill(method.isWindchildGrouping()); - setAssignBestOfficers(method.isWindchildGrouping()); - setAutomaticallyAssignRanks(true); - setAssignFounderFlag(true); - - // Personnel Randomization - setRandomizeOrigin(true); - setRandomizeAroundCentralPlanet(true); - setCentralPlanet(campaign.getSystemByName("Terra").getPrimaryPlanet()); - setOriginSearchRadius(1000); - setExtraRandomOrigin(false); - setOriginDistanceScale(0.2); - - // Starting Simulation - setRunStartingSimulation(method.isWindchildGrouping()); - setSimulationDuration(5); - setSimulateRandomMarriages(method.isWindchildGrouping()); - setSimulateRandomProcreation(method.isWindchildGrouping()); - - // Units - setGenerateUnitsAsAttached(method.isAtB()); - setAssignBestRollToUnitCommander(method.isWindchildGrouping()); - setSortStarLeagueUnitsFirst(true); - setGroupByWeight(true); - setGroupByQuality(method.isWindchildGrouping()); - setKeepOfficerRollsSeparate(method.isAtB()); - setAssignTechsToUnits(true); - - // Unit - setForceNamingMethod(ForceNamingMethod.CCB_1943); - setGenerateForceIcons(true); - - // Spares - setGenerateMothballedSpareUnits(false); - setSparesPercentOfActiveUnits(10); - setPartGenerationMethod(PartGenerationMethod.WINDCHILD); - setStartingArmourWeight(60); - setGenerateSpareAmmunition(method.isWindchildGrouping()); - setNumberReloadsPerWeapon(4); - setGenerateFractionalMachineGunAmmunition(true); - - // Contracts - setSelectStartingContract(true); - setStartCourseToContractPlanet(true); - - // Finances - setStartingCash(0); - setRandomizeStartingCash(method.isWindchildGrouping()); - setRandomStartingCashDiceCount(8); - setMinimumStartingFloat(method.isWindchildGrouping() ? 3500000 : 0); - setPayForSetup(method.isWindchildGrouping()); - setStartingLoan(method.isWindchildGrouping()); - setPayForPersonnel(method.isWindchildGrouping()); - setPayForUnits(method.isWindchildGrouping()); - setPayForParts(method.isWindchildGrouping()); - setPayForArmour(method.isWindchildGrouping()); - setPayForAmmunition(method.isWindchildGrouping()); - - // Surprises - setGenerateSurprises(true); - setGenerateMysteryBoxes(true); - setGenerateMysteryBoxTypes(new HashMap<>()); - getGenerateMysteryBoxTypes().put(MysteryBoxType.STAR_LEAGUE_REGULAR, true); - } - //endregion Constructors - - //region Getters/Setters - //region Base Information - public CompanyGenerationMethod getMethod() { - return method; - } - - public void setMethod(final CompanyGenerationMethod method) { - this.method = method; - } - - public boolean isGenerateMercenaryCompanyCommandLance() { - return generateMercenaryCompanyCommandLance; - } - - public void setGenerateMercenaryCompanyCommandLance(final boolean generateMercenaryCompanyCommandLance) { - this.generateMercenaryCompanyCommandLance = generateMercenaryCompanyCommandLance; - } - - public int getCompanyCount() { - return companyCount; - } - - public void setCompanyCount(final int companyCount) { - this.companyCount = companyCount; - } - - public int getIndividualLanceCount() { - return individualLanceCount; - } - - public void setIndividualLanceCount(final int individualLanceCount) { - this.individualLanceCount = individualLanceCount; - } - - public int getLancesPerCompany() { - return lancesPerCompany; - } - - public void setLancesPerCompany(final int lancesPerCompany) { - this.lancesPerCompany = lancesPerCompany; - } - - public int getLanceSize() { - return lanceSize; - } - - public void setLanceSize(final int lanceSize) { - this.lanceSize = lanceSize; - } - - public int getStarLeagueYear() { - return starLeagueYear; - } - - public void setStarLeagueYear(final int starLeagueYear) { - this.starLeagueYear = starLeagueYear; - } - //endregion Base Information - - //region Personnel - public Map getSupportPersonnel() { - return supportPersonnel; - } - - public void setSupportPersonnel(final Map supportPersonnel) { - this.supportPersonnel = supportPersonnel; - } - - public boolean isPoolAssistants() { - return poolAssistants; - } - - public void setPoolAssistants(final boolean poolAssistants) { - this.poolAssistants = poolAssistants; - } - - public boolean isGenerateCaptains() { - return generateCaptains; - } - - public void setGenerateCaptains(final boolean generateCaptains) { - this.generateCaptains = generateCaptains; - } - - public boolean isAssignCompanyCommanderFlag() { - return assignCompanyCommanderFlag; - } - - public void setAssignCompanyCommanderFlag(final boolean assignCompanyCommanderFlag) { - this.assignCompanyCommanderFlag = assignCompanyCommanderFlag; - } - - public boolean isApplyOfficerStatBonusToWorstSkill() { - return applyOfficerStatBonusToWorstSkill; - } - - public void setApplyOfficerStatBonusToWorstSkill(final boolean applyOfficerStatBonusToWorstSkill) { - this.applyOfficerStatBonusToWorstSkill = applyOfficerStatBonusToWorstSkill; - } - - public boolean isAssignBestOfficers() { - return assignBestOfficers; - } - - public void setAssignBestOfficers(final boolean assignBestOfficers) { - this.assignBestOfficers = assignBestOfficers; - } - - public boolean isAutomaticallyAssignRanks() { - return automaticallyAssignRanks; - } - - public void setAutomaticallyAssignRanks(final boolean automaticallyAssignRanks) { - this.automaticallyAssignRanks = automaticallyAssignRanks; - } - - public boolean isAssignFounderFlag() { - return assignFounderFlag; - } - - public void setAssignFounderFlag(final boolean assignFounderFlag) { - this.assignFounderFlag = assignFounderFlag; - } - //endregion Personnel - - //region Personnel Randomization - public boolean isRandomizeOrigin() { - return randomizeOrigin; - } - - public void setRandomizeOrigin(final boolean randomizeOrigin) { - this.randomizeOrigin = randomizeOrigin; - } - - public boolean isRandomizeAroundCentralPlanet() { - return randomizeAroundCentralPlanet; - } - - public void setRandomizeAroundCentralPlanet(final boolean randomizeAroundCentralPlanet) { - this.randomizeAroundCentralPlanet = randomizeAroundCentralPlanet; - } - - public Planet getCentralPlanet() { - return centralPlanet; - } - - public void setCentralPlanet(final Planet centralPlanet) { - this.centralPlanet = centralPlanet; - } - - public int getOriginSearchRadius() { - return originSearchRadius; - } - - public void setOriginSearchRadius(final int originSearchRadius) { - this.originSearchRadius = originSearchRadius; - } - - public boolean isExtraRandomOrigin() { - return extraRandomOrigin; - } - - public void setExtraRandomOrigin(final boolean extraRandomOrigin) { - this.extraRandomOrigin = extraRandomOrigin; - } - - public double getOriginDistanceScale() { - return originDistanceScale; - } - - public void setOriginDistanceScale(final double originDistanceScale) { - this.originDistanceScale = originDistanceScale; - } - //endregion Personnel Randomization - - //region Starting Simulation - public boolean isRunStartingSimulation() { - return runStartingSimulation; - } - - public void setRunStartingSimulation(final boolean runStartingSimulation) { - this.runStartingSimulation = runStartingSimulation; - } - - public int getSimulationDuration() { - return simulationDuration; - } - - public void setSimulationDuration(final int simulationDuration) { - this.simulationDuration = simulationDuration; - } - - public boolean isSimulateRandomMarriages() { - return simulateRandomMarriages; - } - - public void setSimulateRandomMarriages(final boolean simulateRandomMarriages) { - this.simulateRandomMarriages = simulateRandomMarriages; - } - - public boolean isSimulateRandomProcreation() { - return simulateRandomProcreation; - } - - public void setSimulateRandomProcreation(final boolean simulateRandomProcreation) { - this.simulateRandomProcreation = simulateRandomProcreation; - } - //endregion Starting Simulation - - //region Units - public boolean isGenerateUnitsAsAttached() { - return generateUnitsAsAttached; - } - - public void setGenerateUnitsAsAttached(final boolean generateUnitsAsAttached) { - this.generateUnitsAsAttached = generateUnitsAsAttached; - } - - public boolean isAssignBestRollToUnitCommander() { - return assignBestRollToUnitCommander; - } - - public void setAssignBestRollToUnitCommander(final boolean assignBestRollToUnitCommander) { - this.assignBestRollToUnitCommander = assignBestRollToUnitCommander; - } - - public boolean isSortStarLeagueUnitsFirst() { - return sortStarLeagueUnitsFirst; - } - - public void setSortStarLeagueUnitsFirst(final boolean sortStarLeagueUnitsFirst) { - this.sortStarLeagueUnitsFirst = sortStarLeagueUnitsFirst; - } - - public boolean isGroupByWeight() { - return groupByWeight; - } - - public void setGroupByWeight(final boolean groupByWeight) { - this.groupByWeight = groupByWeight; - } - - public boolean isGroupByQuality() { - return groupByQuality; - } - - public void setGroupByQuality(final boolean groupByQuality) { - this.groupByQuality = groupByQuality; - } - - public boolean isKeepOfficerRollsSeparate() { - return keepOfficerRollsSeparate; - } - - public void setKeepOfficerRollsSeparate(final boolean keepOfficerRollsSeparate) { - this.keepOfficerRollsSeparate = keepOfficerRollsSeparate; - } - - public boolean isAssignTechsToUnits() { - return assignTechsToUnits; - } - - public void setAssignTechsToUnits(final boolean assignTechsToUnits) { - this.assignTechsToUnits = assignTechsToUnits; - } - //endregion Units - - //region Unit - public ForceNamingMethod getForceNamingMethod() { - return forceNamingMethod; - } - - public void setForceNamingMethod(final ForceNamingMethod forceNamingMethod) { - this.forceNamingMethod = forceNamingMethod; - } - - public boolean isGenerateForceIcons() { - return generateForceIcons; - } - - public void setGenerateForceIcons(final boolean generateForceIcons) { - this.generateForceIcons = generateForceIcons; - } - //endregion Unit - - //region Spares - public boolean isGenerateMothballedSpareUnits() { - return generateMothballedSpareUnits; - } - - public void setGenerateMothballedSpareUnits(final boolean generateMothballedSpareUnits) { - this.generateMothballedSpareUnits = generateMothballedSpareUnits; - } - - public int getSparesPercentOfActiveUnits() { - return sparesPercentOfActiveUnits; - } - - public void setSparesPercentOfActiveUnits(final int sparesPercentOfActiveUnits) { - this.sparesPercentOfActiveUnits = sparesPercentOfActiveUnits; - } - - public PartGenerationMethod getPartGenerationMethod() { - return partGenerationMethod; - } - - public void setPartGenerationMethod(final PartGenerationMethod partGenerationMethod) { - this.partGenerationMethod = partGenerationMethod; - } - - public int getStartingArmourWeight() { - return startingArmourWeight; - } - - public void setStartingArmourWeight(final int startingArmourWeight) { - this.startingArmourWeight = startingArmourWeight; - } - - public boolean isGenerateSpareAmmunition() { - return generateSpareAmmunition; - } - - public void setGenerateSpareAmmunition(final boolean generateSpareAmmunition) { - this.generateSpareAmmunition = generateSpareAmmunition; - } - - public int getNumberReloadsPerWeapon() { - return numberReloadsPerWeapon; - } - - public void setNumberReloadsPerWeapon(final int numberReloadsPerWeapon) { - this.numberReloadsPerWeapon = numberReloadsPerWeapon; - } - - public boolean isGenerateFractionalMachineGunAmmunition() { - return generateFractionalMachineGunAmmunition; - } - - public void setGenerateFractionalMachineGunAmmunition(final boolean generateFractionalMachineGunAmmunition) { - this.generateFractionalMachineGunAmmunition = generateFractionalMachineGunAmmunition; - } - //endregion Spares - - //region Contracts - public boolean isSelectStartingContract() { - return selectStartingContract; - } - - public void setSelectStartingContract(final boolean selectStartingContract) { - this.selectStartingContract = selectStartingContract; - } - - public boolean isStartCourseToContractPlanet() { - return startCourseToContractPlanet; - } - - public void setStartCourseToContractPlanet(final boolean startCourseToContractPlanet) { - this.startCourseToContractPlanet = startCourseToContractPlanet; - } - //endregion Contracts - - //region Finances - public int getStartingCash() { - return startingCash; - } - - public void setStartingCash(final int startingCash) { - this.startingCash = startingCash; - } - - public boolean isRandomizeStartingCash() { - return randomizeStartingCash; - } - - public void setRandomizeStartingCash(final boolean randomizeStartingCash) { - this.randomizeStartingCash = randomizeStartingCash; - } - - public int getRandomStartingCashDiceCount() { - return randomStartingCashDiceCount; - } - - public void setRandomStartingCashDiceCount(final int randomStartingCashDiceCount) { - this.randomStartingCashDiceCount = randomStartingCashDiceCount; - } - - public int getMinimumStartingFloat() { - return minimumStartingFloat; - } - - public void setMinimumStartingFloat(final int minimumStartingFloat) { - this.minimumStartingFloat = minimumStartingFloat; - } - - public boolean isPayForSetup() { - return payForSetup; - } - - public void setPayForSetup(final boolean payForSetup) { - this.payForSetup = payForSetup; - } - - public boolean isStartingLoan() { - return startingLoan; - } - - public void setStartingLoan(final boolean startingLoan) { - this.startingLoan = startingLoan; - } - - public boolean isPayForPersonnel() { - return payForPersonnel; - } - - public void setPayForPersonnel(final boolean payForPersonnel) { - this.payForPersonnel = payForPersonnel; - } - - public boolean isPayForUnits() { - return payForUnits; - } - - public void setPayForUnits(final boolean payForUnits) { - this.payForUnits = payForUnits; - } - - public boolean isPayForParts() { - return payForParts; - } - - public void setPayForParts(final boolean payForParts) { - this.payForParts = payForParts; - } - - public boolean isPayForArmour() { - return payForArmour; - } - - public void setPayForArmour(final boolean payForArmour) { - this.payForArmour = payForArmour; - } - - public boolean isPayForAmmunition() { - return payForAmmunition; - } - - public void setPayForAmmunition(final boolean payForAmmunition) { - this.payForAmmunition = payForAmmunition; - } - //endregion Finances - - //region Surprises - public boolean isGenerateSurprises() { - return generateSurprises; - } - - public void setGenerateSurprises(final boolean generateSurprises) { - this.generateSurprises = generateSurprises; - } - - public boolean isGenerateMysteryBoxes() { - return generateMysteryBoxes; - } - - public void setGenerateMysteryBoxes(final boolean generateMysteryBoxes) { - this.generateMysteryBoxes = generateMysteryBoxes; - } - - public Map getGenerateMysteryBoxTypes() { - return generateMysteryBoxTypes; - } - - public void setGenerateMysteryBoxTypes(final Map generateMysteryBoxTypes) { - this.generateMysteryBoxTypes = generateMysteryBoxTypes; - } - //endregion Surprises - //endregion Getters/Setters - - //region File IO - /** - * Writes these options to an XML file - * @param file the file to write to, or null to not write to a file - */ - public void writeToFile(@Nullable File file) { - if (file == null) { - return; - } - String path = file.getPath(); - if (!path.endsWith(".xml")) { - path += ".xml"; - file = new File(path); - } - try (OutputStream fos = new FileOutputStream(file); - OutputStream bos = new BufferedOutputStream(fos); - OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8); - PrintWriter pw = new PrintWriter(osw)) { - // Then save it out to that file. - pw.println(""); - writeToXML(pw, 0, ResourceBundle.getBundle("mekhq.resources.MekHQ").getString("Application.version")); - } catch (Exception e) { - MekHQ.getLogger().error(e); - } - } - - /** - * @param pw the print writer to write to - * @param indent the indent level to write at - * @param version the version these options were written to file in. This may be null, in which - * case they are being written to file as a part of a larger save than just these - * options (e.g. saved as part of Campaign or CampaignOptions) - */ - public void writeToXML(final PrintWriter pw, int indent, final @Nullable String version) { - if (version == null) { - MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "companyGenerationOptions"); - } else { - MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "companyGenerationOptions", "version", version); - } - - // Base Information - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "method", getMethod().name()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMercenaryCompanyCommandLance", isGenerateMercenaryCompanyCommandLance()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "companyCount", getCompanyCount()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "individualLanceCount", getIndividualLanceCount()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lancesPerCompany", getLancesPerCompany()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lanceSize", getLanceSize()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "starLeagueYear", getStarLeagueYear()); - - // Personnel - MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "supportPersonnel"); - for (final Map.Entry entry : getSupportPersonnel().entrySet()) { - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().name(), entry.getValue()); - } - MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "supportPersonnel"); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "poolAssistants", isPoolAssistants()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateCaptains", isGenerateCaptains()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignCompanyCommanderFlag", isAssignCompanyCommanderFlag()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "applyOfficerStatBonusToWorstSkill", isApplyOfficerStatBonusToWorstSkill()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestOfficers", isAssignBestOfficers()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "automaticallyAssignRanks", isAutomaticallyAssignRanks()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignFounderFlag", isAssignFounderFlag()); - - // Personnel Randomization - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeOrigin", isRandomizeOrigin()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeAroundCentralPlanet", isRandomizeAroundCentralPlanet()); - MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "centralPlanet", "systemId", - getCentralPlanet().getParentSystem().getId(), getCentralPlanet().getId()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originSearchRadius", getOriginSearchRadius()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "extraRandomOrigin", isExtraRandomOrigin()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originDistanceScale", getOriginDistanceScale()); - - // Starting Simulation - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "runStartingSimulation", isRunStartingSimulation()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulationDuration", getSimulationDuration()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomMarriages", isSimulateRandomMarriages()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomProcreation", isSimulateRandomProcreation()); - - // Units - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToUnitCommander", isAssignBestRollToUnitCommander()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sortStarLeagueUnitsFirst", isSortStarLeagueUnitsFirst()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByWeight", isGroupByWeight()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByQuality", isGroupByQuality()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "keepOfficerRollsSeparate", isKeepOfficerRollsSeparate()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignTechsToUnits", isAssignTechsToUnits()); - - // Unit - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "forceNamingMethod", getForceNamingMethod().name()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateForceIcons", isGenerateForceIcons()); - - // Spares - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMothballedSpareUnits", isGenerateMothballedSpareUnits()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sparesPercentOfActiveUnits", getSparesPercentOfActiveUnits()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "partGenerationMethod", getPartGenerationMethod().name()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingArmourWeight", getStartingArmourWeight()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSpareAmmunition", isGenerateSpareAmmunition()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "numberReloadsPerWeapon", getNumberReloadsPerWeapon()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateFractionalMachineGunAmmunition", isGenerateFractionalMachineGunAmmunition()); - - // Contracts - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "selectStartingContract", isSelectStartingContract()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startCourseToContractPlanet", isStartCourseToContractPlanet()); - - // Finances - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingCash", getStartingCash()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeStartingCash", isRandomizeStartingCash()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomStartingCashDiceCount", getRandomStartingCashDiceCount()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "minimumStartingFloat", getMinimumStartingFloat()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForSetup", isPayForSetup()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingLoan", isStartingLoan()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForPersonnel", isPayForPersonnel()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForUnits", isPayForUnits()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForParts", isPayForParts()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForArmour", isPayForArmour()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForAmmunition", isPayForAmmunition()); - - // Surprises - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSurprises", isGenerateSurprises()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxes", isGenerateMysteryBoxes()); - MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "generateMysteryBoxTypes"); - for (final Map.Entry entry : getGenerateMysteryBoxTypes().entrySet()) { - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().name(), entry.getValue()); - } - MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "generateMysteryBoxTypes"); - MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "companyGenerationOptions"); - } - - /** - * @param campaign the campaign to parse the options based on - * @param file the XML file to parse the company generation options from. This should not be null, - * but null values are handled nicely. - * @return the parsed CompanyGenerationOptions, or the default Windchild options if there is an - * issue parsing the file. - */ - public static CompanyGenerationOptions parseFromXML(final Campaign campaign, - final @Nullable File file) { - if (file == null) { - MekHQ.getLogger().error("Received a null file, returning the default Windchild options"); - return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); - } - final Element element; - - // Open up the file. - try (InputStream is = new FileInputStream(file)) { - element = MekHqXmlUtil.newSafeDocumentBuilder().parse(is).getDocumentElement(); - } catch (Exception e) { - MekHQ.getLogger().error("Failed to open file, returning the default Windchild options", e); - return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); - } - element.normalize(); - - final Version version = new Version(element.getAttribute("version")); - final NodeList nl = element.getChildNodes(); - for (int i = 0; i < nl.getLength(); i++) { - final Node wn = nl.item(i); - if ("companyGenerationOptions".equals(wn.getNodeName()) && wn.hasChildNodes()) { - final CompanyGenerationOptions options = parseFromXML(wn.getChildNodes(), version); - if (options != null) { - return options; - } - } - } - MekHQ.getLogger().error("Failed to parse file, returning the default Windchild options"); - return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); - } - - /** - * @param nl the node list to parse the options from - * @param version the Version of the XML to parse from. This is included for future-proofing - * @return the parsed company generation options, or null if the parsing fails - */ - public static @Nullable CompanyGenerationOptions parseFromXML(final NodeList nl, final Version version) { - final CompanyGenerationOptions options = new CompanyGenerationOptions(); - try { - for (int x = 0; x < nl.getLength(); x++) { - final Node wn = nl.item(x); - switch (wn.getNodeName()) { - //region Base Information - case "method": - options.setMethod(CompanyGenerationMethod.valueOf(wn.getTextContent().trim())); - break; - case "generateMercenaryCompanyCommandLance": - options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "companyCount": - options.setCompanyCount(Integer.parseInt(wn.getTextContent().trim())); - break; - case "individualLanceCount": - options.setIndividualLanceCount(Integer.parseInt(wn.getTextContent().trim())); - break; - case "lancesPerCompany": - options.setLancesPerCompany(Integer.parseInt(wn.getTextContent().trim())); - break; - case "lanceSize": - options.setLanceSize(Integer.parseInt(wn.getTextContent().trim())); - break; - case "starLeagueYear": - options.setStarLeagueYear(Integer.parseInt(wn.getTextContent().trim())); - break; - //endregion Base Information - - //region Personnel - case "supportPersonnel": { - options.setSupportPersonnel(new HashMap<>()); - final NodeList nl2 = wn.getChildNodes(); - for (int y = 0; y < nl2.getLength(); y++) { - final Node wn2 = nl2.item(y); - try { - options.getSupportPersonnel().put( - PersonnelRole.valueOf(wn2.getNodeName().trim()), - Integer.parseInt(wn2.getTextContent().trim())); - } catch (Exception ignored) { - - } - } - break; - } - case "poolAssistants": - options.setPoolAssistants(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "generateCaptains": - options.setGenerateCaptains(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "assignCompanyCommanderFlag": - options.setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "applyOfficerStatBonusToWorstSkill": - options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "assignBestOfficers": - options.setAssignBestOfficers(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "automaticallyAssignRanks": - options.setAutomaticallyAssignRanks(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "assignFounderFlag": - options.setAssignFounderFlag(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - //endregion Personnel - - //region Personnel Randomization - case "randomizeOrigin": - options.setRandomizeOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "randomizeAroundCentralPlanet": - options.setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "centralPlanet": - String centralPlanetSystemId = wn.getAttributes().getNamedItem("systemId").getTextContent().trim(); - String centralPlanetPlanetId = wn.getTextContent().trim(); - options.setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); - break; - case "originSearchRadius": - options.setOriginSearchRadius(Integer.parseInt(wn.getTextContent().trim())); - break; - case "extraRandomOrigin": - options.setExtraRandomOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "originDistanceScale": - options.setOriginDistanceScale(Double.parseDouble(wn.getTextContent().trim())); - break; - //endregion Personnel Randomization - - //region Starting Simulation - case "runStartingSimulation": - options.setRunStartingSimulation(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "simulationDuration": - options.setSimulationDuration(Integer.parseInt(wn.getTextContent().trim())); - break; - case "simulateRandomMarriages": - options.setSimulateRandomMarriages(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "simulateRandomProcreation": - options.setSimulateRandomProcreation(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - //endregion Starting Simulation - - //region Units - case "generateUnitsAsAttached": - options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "assignBestRollToUnitCommander": - options.setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "sortStarLeagueUnitsFirst": - options.setSortStarLeagueUnitsFirst(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "groupByWeight": - options.setGroupByWeight(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "groupByQuality": - options.setGroupByQuality(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "keepOfficerRollsSeparate": - options.setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "assignTechsToUnits": - options.setAssignTechsToUnits(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - //endregion Units - - //region Unit - case "forceNamingMethod": - options.setForceNamingMethod(ForceNamingMethod.valueOf(wn.getTextContent().trim())); - break; - case "generateForceIcons": - options.setGenerateForceIcons(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - //endregion Units - - //region Spares - case "generateMothballedSpareUnits": - options.setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "sparesPercentOfActiveUnits": - options.setSparesPercentOfActiveUnits(Integer.parseInt(wn.getTextContent().trim())); - break; - case "partGenerationMethod": - options.setPartGenerationMethod(PartGenerationMethod.valueOf(wn.getTextContent().trim())); - break; - case "startingArmourWeight": - options.setStartingArmourWeight(Integer.parseInt(wn.getTextContent().trim())); - break; - case "generateSpareAmmunition": - options.setGenerateSpareAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "numberReloadsPerWeapon": - options.setNumberReloadsPerWeapon(Integer.parseInt(wn.getTextContent().trim())); - break; - case "generateFractionalMachineGunAmmunition": - options.setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - //endregion Spares - - //region Contracts - case "selectStartingContract": - options.setSelectStartingContract(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "startCourseToContractPlanet": - options.setStartCourseToContractPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - //endregion Contracts - - //region Finances - case "startingCash": - options.setStartingCash(Integer.parseInt(wn.getTextContent().trim())); - break; - case "randomizeStartingCash": - options.setRandomizeStartingCash(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "randomStartingCashDiceCount": - options.setRandomStartingCashDiceCount(Integer.parseInt(wn.getTextContent().trim())); - break; - case "minimumStartingFloat": - options.setMinimumStartingFloat(Integer.parseInt(wn.getTextContent().trim())); - break; - case "payForSetup": - options.setPayForSetup(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "startingLoan": - options.setStartingLoan(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "payForPersonnel": - options.setPayForPersonnel(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "payForUnits": - options.setPayForUnits(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "payForParts": - options.setPayForParts(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "payForArmour": - options.setPayForArmour(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "payForAmmunition": - options.setPayForAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - //endregion Finances - - //region Surprises - case "generateSurprises": - options.setGenerateSurprises(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "generateMysteryBoxes": - options.setGenerateMysteryBoxes(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "generateMysteryBoxTypes": { - options.setGenerateMysteryBoxTypes(new HashMap<>()); - final NodeList nl2 = wn.getChildNodes(); - for (int y = 0; y < nl2.getLength(); y++) { - final Node wn2 = nl2.item(y); - try { - options.getGenerateMysteryBoxTypes().put( - MysteryBoxType.valueOf(wn2.getNodeName().trim()), - Boolean.parseBoolean(wn2.getTextContent().trim())); - } catch (Exception ignored) { - - } - } - break; - } - //endregion Surprises - } - } - } catch (Exception e) { - MekHQ.getLogger().error(e); - return null; - } - - return options; - } - //endregion File IO -} +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.companyGeneration; + +import megamek.Version; +import megamek.common.annotations.Nullable; +import mekhq.MekHQ; +import mekhq.MekHqXmlUtil; +import mekhq.campaign.Campaign; +import mekhq.campaign.personnel.enums.PersonnelRole; +import mekhq.campaign.universe.Planet; +import mekhq.campaign.universe.Systems; +import mekhq.campaign.universe.enums.*; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.ResourceBundle; + +public class CompanyGenerationOptions implements Serializable { + //region Variable Declarations + private static final long serialVersionUID = 3034123423672457769L; + + // Base Information + private CompanyGenerationMethod method; + private boolean generateMercenaryCompanyCommandLance; + private int companyCount; + private int individualLanceCount; + private int lancesPerCompany; + private int lanceSize; + private int starLeagueYear; + + // Personnel + private Map supportPersonnel; + private boolean poolAssistants; + private boolean generateCaptains; + private boolean assignCompanyCommanderFlag; + private boolean applyOfficerStatBonusToWorstSkill; + private boolean assignBestOfficers; + private boolean automaticallyAssignRanks; + private boolean assignFounderFlag; + + // Personnel Randomization + private boolean randomizeOrigin; + private boolean randomizeAroundCentralPlanet; + private Planet centralPlanet; // Not Implemented + private int originSearchRadius; + private boolean extraRandomOrigin; + private double originDistanceScale; + + // Starting Simulation + private boolean runStartingSimulation; + private int simulationDuration; + private boolean simulateRandomMarriages; + private boolean simulateRandomProcreation; + + // Units + private BattleMechWeightClassGenerationMethod battleMechWeightClassGenerationMethod; + private BattleMechQualityGenerationMethod battleMechQualityGenerationMethod; + private boolean generateUnitsAsAttached; + private boolean assignBestRollToUnitCommander; + private boolean sortStarLeagueUnitsFirst; + private boolean groupByWeight; + private boolean groupByQuality; + private boolean keepOfficerRollsSeparate; + private boolean assignTechsToUnits; + + // Unit + private ForceNamingMethod forceNamingMethod; + private boolean generateForceIcons; // Very Buggy + + // Spares + private boolean generateMothballedSpareUnits; + private int sparesPercentOfActiveUnits; + private PartGenerationMethod partGenerationMethod; + private int startingArmourWeight; + private boolean generateSpareAmmunition; + private int numberReloadsPerWeapon; + private boolean generateFractionalMachineGunAmmunition; + + // Contracts + private boolean selectStartingContract; // Not Implemented + private boolean startCourseToContractPlanet; + + // Finances + private int startingCash; // Not Implemented + private boolean randomizeStartingCash; + private int randomStartingCashDiceCount; + private int minimumStartingFloat; // Not Implemented + private boolean payForSetup; // Not Implemented + private boolean startingLoan; // Not Implemented + private boolean payForPersonnel; + private boolean payForUnits; + private boolean payForParts; + private boolean payForArmour; + private boolean payForAmmunition; + + // Surprises + private boolean generateSurprises; // Not Implemented + private boolean generateMysteryBoxes; // Not Implemented + private Map generateMysteryBoxTypes; // Not Implemented + //endregion Variable Declarations + + //region Constructors + /** + * This is only to be used when reading from XML + */ + private CompanyGenerationOptions() { + + } + + public CompanyGenerationOptions(final CompanyGenerationMethod method, final Campaign campaign) { + // Base Information + setMethod(method); + setGenerateMercenaryCompanyCommandLance(false); + setCompanyCount(1); + setIndividualLanceCount(0); + setLancesPerCompany(3); + setLanceSize(4); + setStarLeagueYear(2765); + + // Personnel + final Map supportPersonnel = new HashMap<>(); + if (method.isWindchild()) { + supportPersonnel.put(PersonnelRole.MECH_TECH, 5); + supportPersonnel.put(PersonnelRole.MECHANIC, 1); + supportPersonnel.put(PersonnelRole.AERO_TECH, 1); + supportPersonnel.put(PersonnelRole.DOCTOR, 1); + supportPersonnel.put(PersonnelRole.ADMINISTRATOR_COMMAND, 1); + supportPersonnel.put(PersonnelRole.ADMINISTRATOR_LOGISTICS, 1); + supportPersonnel.put(PersonnelRole.ADMINISTRATOR_TRANSPORT, 1); + supportPersonnel.put(PersonnelRole.ADMINISTRATOR_HR, 1); + } else { // Defaults to AtB + supportPersonnel.put(PersonnelRole.MECH_TECH, 10); + supportPersonnel.put(PersonnelRole.DOCTOR, 1); + supportPersonnel.put(PersonnelRole.ADMINISTRATOR_LOGISTICS, 1); + } + setSupportPersonnel(supportPersonnel); + setPoolAssistants(true); + setGenerateCaptains(method.isWindchild()); + setAssignCompanyCommanderFlag(true); + setApplyOfficerStatBonusToWorstSkill(method.isWindchild()); + setAssignBestOfficers(method.isWindchild()); + setAutomaticallyAssignRanks(true); + setAssignFounderFlag(true); + + // Personnel Randomization + setRandomizeOrigin(true); + setRandomizeAroundCentralPlanet(true); + setCentralPlanet(campaign.getSystemByName("Terra").getPrimaryPlanet()); + setOriginSearchRadius(1000); + setExtraRandomOrigin(false); + setOriginDistanceScale(0.2); + + // Starting Simulation + setRunStartingSimulation(method.isWindchild()); + setSimulationDuration(5); + setSimulateRandomMarriages(method.isWindchild()); + setSimulateRandomProcreation(method.isWindchild()); + + // Units + setBattleMechWeightClassGenerationMethod(method.isAtB() + ? BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT + : BattleMechWeightClassGenerationMethod.WINDCHILD); + setBattleMechQualityGenerationMethod(method.isAtB() + ? BattleMechQualityGenerationMethod.AGAINST_THE_BOT + : BattleMechQualityGenerationMethod.WINDCHILD); + setGenerateUnitsAsAttached(method.isAtB()); + setAssignBestRollToUnitCommander(method.isWindchild()); + setSortStarLeagueUnitsFirst(true); + setGroupByWeight(true); + setGroupByQuality(method.isWindchild()); + setKeepOfficerRollsSeparate(method.isAtB()); + setAssignTechsToUnits(true); + + // Unit + setForceNamingMethod(ForceNamingMethod.CCB_1943); + setGenerateForceIcons(true); + + // Spares + setGenerateMothballedSpareUnits(false); + setSparesPercentOfActiveUnits(10); + setPartGenerationMethod(PartGenerationMethod.WINDCHILD); + setStartingArmourWeight(60); + setGenerateSpareAmmunition(method.isWindchild()); + setNumberReloadsPerWeapon(4); + setGenerateFractionalMachineGunAmmunition(true); + + // Contracts + setSelectStartingContract(true); + setStartCourseToContractPlanet(true); + + // Finances + setStartingCash(0); + setRandomizeStartingCash(method.isWindchild()); + setRandomStartingCashDiceCount(8); + setMinimumStartingFloat(method.isWindchild() ? 3500000 : 0); + setPayForSetup(method.isWindchild()); + setStartingLoan(method.isWindchild()); + setPayForPersonnel(method.isWindchild()); + setPayForUnits(method.isWindchild()); + setPayForParts(method.isWindchild()); + setPayForArmour(method.isWindchild()); + setPayForAmmunition(method.isWindchild()); + + // Surprises + setGenerateSurprises(true); + setGenerateMysteryBoxes(true); + setGenerateMysteryBoxTypes(new HashMap<>()); + getGenerateMysteryBoxTypes().put(MysteryBoxType.STAR_LEAGUE_REGULAR, true); + } + //endregion Constructors + + //region Getters/Setters + //region Base Information + public CompanyGenerationMethod getMethod() { + return method; + } + + public void setMethod(final CompanyGenerationMethod method) { + this.method = method; + } + + public boolean isGenerateMercenaryCompanyCommandLance() { + return generateMercenaryCompanyCommandLance; + } + + public void setGenerateMercenaryCompanyCommandLance(final boolean generateMercenaryCompanyCommandLance) { + this.generateMercenaryCompanyCommandLance = generateMercenaryCompanyCommandLance; + } + + public int getCompanyCount() { + return companyCount; + } + + public void setCompanyCount(final int companyCount) { + this.companyCount = companyCount; + } + + public int getIndividualLanceCount() { + return individualLanceCount; + } + + public void setIndividualLanceCount(final int individualLanceCount) { + this.individualLanceCount = individualLanceCount; + } + + public int getLancesPerCompany() { + return lancesPerCompany; + } + + public void setLancesPerCompany(final int lancesPerCompany) { + this.lancesPerCompany = lancesPerCompany; + } + + public int getLanceSize() { + return lanceSize; + } + + public void setLanceSize(final int lanceSize) { + this.lanceSize = lanceSize; + } + + public int getStarLeagueYear() { + return starLeagueYear; + } + + public void setStarLeagueYear(final int starLeagueYear) { + this.starLeagueYear = starLeagueYear; + } + //endregion Base Information + + //region Personnel + public Map getSupportPersonnel() { + return supportPersonnel; + } + + public void setSupportPersonnel(final Map supportPersonnel) { + this.supportPersonnel = supportPersonnel; + } + + public boolean isPoolAssistants() { + return poolAssistants; + } + + public void setPoolAssistants(final boolean poolAssistants) { + this.poolAssistants = poolAssistants; + } + + public boolean isGenerateCaptains() { + return generateCaptains; + } + + public void setGenerateCaptains(final boolean generateCaptains) { + this.generateCaptains = generateCaptains; + } + + public boolean isAssignCompanyCommanderFlag() { + return assignCompanyCommanderFlag; + } + + public void setAssignCompanyCommanderFlag(final boolean assignCompanyCommanderFlag) { + this.assignCompanyCommanderFlag = assignCompanyCommanderFlag; + } + + public boolean isApplyOfficerStatBonusToWorstSkill() { + return applyOfficerStatBonusToWorstSkill; + } + + public void setApplyOfficerStatBonusToWorstSkill(final boolean applyOfficerStatBonusToWorstSkill) { + this.applyOfficerStatBonusToWorstSkill = applyOfficerStatBonusToWorstSkill; + } + + public boolean isAssignBestOfficers() { + return assignBestOfficers; + } + + public void setAssignBestOfficers(final boolean assignBestOfficers) { + this.assignBestOfficers = assignBestOfficers; + } + + public boolean isAutomaticallyAssignRanks() { + return automaticallyAssignRanks; + } + + public void setAutomaticallyAssignRanks(final boolean automaticallyAssignRanks) { + this.automaticallyAssignRanks = automaticallyAssignRanks; + } + + public boolean isAssignFounderFlag() { + return assignFounderFlag; + } + + public void setAssignFounderFlag(final boolean assignFounderFlag) { + this.assignFounderFlag = assignFounderFlag; + } + //endregion Personnel + + //region Personnel Randomization + public boolean isRandomizeOrigin() { + return randomizeOrigin; + } + + public void setRandomizeOrigin(final boolean randomizeOrigin) { + this.randomizeOrigin = randomizeOrigin; + } + + public boolean isRandomizeAroundCentralPlanet() { + return randomizeAroundCentralPlanet; + } + + public void setRandomizeAroundCentralPlanet(final boolean randomizeAroundCentralPlanet) { + this.randomizeAroundCentralPlanet = randomizeAroundCentralPlanet; + } + + public Planet getCentralPlanet() { + return centralPlanet; + } + + public void setCentralPlanet(final Planet centralPlanet) { + this.centralPlanet = centralPlanet; + } + + public int getOriginSearchRadius() { + return originSearchRadius; + } + + public void setOriginSearchRadius(final int originSearchRadius) { + this.originSearchRadius = originSearchRadius; + } + + public boolean isExtraRandomOrigin() { + return extraRandomOrigin; + } + + public void setExtraRandomOrigin(final boolean extraRandomOrigin) { + this.extraRandomOrigin = extraRandomOrigin; + } + + public double getOriginDistanceScale() { + return originDistanceScale; + } + + public void setOriginDistanceScale(final double originDistanceScale) { + this.originDistanceScale = originDistanceScale; + } + //endregion Personnel Randomization + + //region Starting Simulation + public boolean isRunStartingSimulation() { + return runStartingSimulation; + } + + public void setRunStartingSimulation(final boolean runStartingSimulation) { + this.runStartingSimulation = runStartingSimulation; + } + + public int getSimulationDuration() { + return simulationDuration; + } + + public void setSimulationDuration(final int simulationDuration) { + this.simulationDuration = simulationDuration; + } + + public boolean isSimulateRandomMarriages() { + return simulateRandomMarriages; + } + + public void setSimulateRandomMarriages(final boolean simulateRandomMarriages) { + this.simulateRandomMarriages = simulateRandomMarriages; + } + + public boolean isSimulateRandomProcreation() { + return simulateRandomProcreation; + } + + public void setSimulateRandomProcreation(final boolean simulateRandomProcreation) { + this.simulateRandomProcreation = simulateRandomProcreation; + } + //endregion Starting Simulation + + //region Units + public BattleMechWeightClassGenerationMethod getBattleMechWeightClassGenerationMethod() { + return battleMechWeightClassGenerationMethod; + } + + public void setBattleMechWeightClassGenerationMethod( + final BattleMechWeightClassGenerationMethod battleMechWeightClassGenerationMethod) { + this.battleMechWeightClassGenerationMethod = battleMechWeightClassGenerationMethod; + } + + public BattleMechQualityGenerationMethod getBattleMechQualityGenerationMethod() { + return battleMechQualityGenerationMethod; + } + + public void setBattleMechQualityGenerationMethod( + final BattleMechQualityGenerationMethod battleMechQualityGenerationMethod) { + this.battleMechQualityGenerationMethod = battleMechQualityGenerationMethod; + } + + public boolean isGenerateUnitsAsAttached() { + return generateUnitsAsAttached; + } + + public void setGenerateUnitsAsAttached(final boolean generateUnitsAsAttached) { + this.generateUnitsAsAttached = generateUnitsAsAttached; + } + + public boolean isAssignBestRollToUnitCommander() { + return assignBestRollToUnitCommander; + } + + public void setAssignBestRollToUnitCommander(final boolean assignBestRollToUnitCommander) { + this.assignBestRollToUnitCommander = assignBestRollToUnitCommander; + } + + public boolean isSortStarLeagueUnitsFirst() { + return sortStarLeagueUnitsFirst; + } + + public void setSortStarLeagueUnitsFirst(final boolean sortStarLeagueUnitsFirst) { + this.sortStarLeagueUnitsFirst = sortStarLeagueUnitsFirst; + } + + public boolean isGroupByWeight() { + return groupByWeight; + } + + public void setGroupByWeight(final boolean groupByWeight) { + this.groupByWeight = groupByWeight; + } + + public boolean isGroupByQuality() { + return groupByQuality; + } + + public void setGroupByQuality(final boolean groupByQuality) { + this.groupByQuality = groupByQuality; + } + + public boolean isKeepOfficerRollsSeparate() { + return keepOfficerRollsSeparate; + } + + public void setKeepOfficerRollsSeparate(final boolean keepOfficerRollsSeparate) { + this.keepOfficerRollsSeparate = keepOfficerRollsSeparate; + } + + public boolean isAssignTechsToUnits() { + return assignTechsToUnits; + } + + public void setAssignTechsToUnits(final boolean assignTechsToUnits) { + this.assignTechsToUnits = assignTechsToUnits; + } + //endregion Units + + //region Unit + public ForceNamingMethod getForceNamingMethod() { + return forceNamingMethod; + } + + public void setForceNamingMethod(final ForceNamingMethod forceNamingMethod) { + this.forceNamingMethod = forceNamingMethod; + } + + public boolean isGenerateForceIcons() { + return generateForceIcons; + } + + public void setGenerateForceIcons(final boolean generateForceIcons) { + this.generateForceIcons = generateForceIcons; + } + //endregion Unit + + //region Spares + public boolean isGenerateMothballedSpareUnits() { + return generateMothballedSpareUnits; + } + + public void setGenerateMothballedSpareUnits(final boolean generateMothballedSpareUnits) { + this.generateMothballedSpareUnits = generateMothballedSpareUnits; + } + + public int getSparesPercentOfActiveUnits() { + return sparesPercentOfActiveUnits; + } + + public void setSparesPercentOfActiveUnits(final int sparesPercentOfActiveUnits) { + this.sparesPercentOfActiveUnits = sparesPercentOfActiveUnits; + } + + public PartGenerationMethod getPartGenerationMethod() { + return partGenerationMethod; + } + + public void setPartGenerationMethod(final PartGenerationMethod partGenerationMethod) { + this.partGenerationMethod = partGenerationMethod; + } + + public int getStartingArmourWeight() { + return startingArmourWeight; + } + + public void setStartingArmourWeight(final int startingArmourWeight) { + this.startingArmourWeight = startingArmourWeight; + } + + public boolean isGenerateSpareAmmunition() { + return generateSpareAmmunition; + } + + public void setGenerateSpareAmmunition(final boolean generateSpareAmmunition) { + this.generateSpareAmmunition = generateSpareAmmunition; + } + + public int getNumberReloadsPerWeapon() { + return numberReloadsPerWeapon; + } + + public void setNumberReloadsPerWeapon(final int numberReloadsPerWeapon) { + this.numberReloadsPerWeapon = numberReloadsPerWeapon; + } + + public boolean isGenerateFractionalMachineGunAmmunition() { + return generateFractionalMachineGunAmmunition; + } + + public void setGenerateFractionalMachineGunAmmunition(final boolean generateFractionalMachineGunAmmunition) { + this.generateFractionalMachineGunAmmunition = generateFractionalMachineGunAmmunition; + } + //endregion Spares + + //region Contracts + public boolean isSelectStartingContract() { + return selectStartingContract; + } + + public void setSelectStartingContract(final boolean selectStartingContract) { + this.selectStartingContract = selectStartingContract; + } + + public boolean isStartCourseToContractPlanet() { + return startCourseToContractPlanet; + } + + public void setStartCourseToContractPlanet(final boolean startCourseToContractPlanet) { + this.startCourseToContractPlanet = startCourseToContractPlanet; + } + //endregion Contracts + + //region Finances + public int getStartingCash() { + return startingCash; + } + + public void setStartingCash(final int startingCash) { + this.startingCash = startingCash; + } + + public boolean isRandomizeStartingCash() { + return randomizeStartingCash; + } + + public void setRandomizeStartingCash(final boolean randomizeStartingCash) { + this.randomizeStartingCash = randomizeStartingCash; + } + + public int getRandomStartingCashDiceCount() { + return randomStartingCashDiceCount; + } + + public void setRandomStartingCashDiceCount(final int randomStartingCashDiceCount) { + this.randomStartingCashDiceCount = randomStartingCashDiceCount; + } + + public int getMinimumStartingFloat() { + return minimumStartingFloat; + } + + public void setMinimumStartingFloat(final int minimumStartingFloat) { + this.minimumStartingFloat = minimumStartingFloat; + } + + public boolean isPayForSetup() { + return payForSetup; + } + + public void setPayForSetup(final boolean payForSetup) { + this.payForSetup = payForSetup; + } + + public boolean isStartingLoan() { + return startingLoan; + } + + public void setStartingLoan(final boolean startingLoan) { + this.startingLoan = startingLoan; + } + + public boolean isPayForPersonnel() { + return payForPersonnel; + } + + public void setPayForPersonnel(final boolean payForPersonnel) { + this.payForPersonnel = payForPersonnel; + } + + public boolean isPayForUnits() { + return payForUnits; + } + + public void setPayForUnits(final boolean payForUnits) { + this.payForUnits = payForUnits; + } + + public boolean isPayForParts() { + return payForParts; + } + + public void setPayForParts(final boolean payForParts) { + this.payForParts = payForParts; + } + + public boolean isPayForArmour() { + return payForArmour; + } + + public void setPayForArmour(final boolean payForArmour) { + this.payForArmour = payForArmour; + } + + public boolean isPayForAmmunition() { + return payForAmmunition; + } + + public void setPayForAmmunition(final boolean payForAmmunition) { + this.payForAmmunition = payForAmmunition; + } + //endregion Finances + + //region Surprises + public boolean isGenerateSurprises() { + return generateSurprises; + } + + public void setGenerateSurprises(final boolean generateSurprises) { + this.generateSurprises = generateSurprises; + } + + public boolean isGenerateMysteryBoxes() { + return generateMysteryBoxes; + } + + public void setGenerateMysteryBoxes(final boolean generateMysteryBoxes) { + this.generateMysteryBoxes = generateMysteryBoxes; + } + + public Map getGenerateMysteryBoxTypes() { + return generateMysteryBoxTypes; + } + + public void setGenerateMysteryBoxTypes(final Map generateMysteryBoxTypes) { + this.generateMysteryBoxTypes = generateMysteryBoxTypes; + } + //endregion Surprises + //endregion Getters/Setters + + //region File IO + /** + * Writes these options to an XML file + * @param file the file to write to, or null to not write to a file + */ + public void writeToFile(@Nullable File file) { + if (file == null) { + return; + } + String path = file.getPath(); + if (!path.endsWith(".xml")) { + path += ".xml"; + file = new File(path); + } + try (OutputStream fos = new FileOutputStream(file); + OutputStream bos = new BufferedOutputStream(fos); + OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8); + PrintWriter pw = new PrintWriter(osw)) { + // Then save it out to that file. + pw.println(""); + writeToXML(pw, 0, ResourceBundle.getBundle("mekhq.resources.MekHQ").getString("Application.version")); + } catch (Exception e) { + MekHQ.getLogger().error(e); + } + } + + /** + * @param pw the print writer to write to + * @param indent the indent level to write at + * @param version the version these options were written to file in. This may be null, in which + * case they are being written to file as a part of a larger save than just these + * options (e.g. saved as part of Campaign or CampaignOptions) + */ + public void writeToXML(final PrintWriter pw, int indent, final @Nullable String version) { + if (version == null) { + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "companyGenerationOptions"); + } else { + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "companyGenerationOptions", "version", version); + } + + // Base Information + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "method", getMethod().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMercenaryCompanyCommandLance", isGenerateMercenaryCompanyCommandLance()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "companyCount", getCompanyCount()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "individualLanceCount", getIndividualLanceCount()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lancesPerCompany", getLancesPerCompany()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "lanceSize", getLanceSize()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "starLeagueYear", getStarLeagueYear()); + + // Personnel + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "supportPersonnel"); + for (final Map.Entry entry : getSupportPersonnel().entrySet()) { + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().name(), entry.getValue()); + } + MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "supportPersonnel"); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "poolAssistants", isPoolAssistants()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateCaptains", isGenerateCaptains()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignCompanyCommanderFlag", isAssignCompanyCommanderFlag()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "applyOfficerStatBonusToWorstSkill", isApplyOfficerStatBonusToWorstSkill()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestOfficers", isAssignBestOfficers()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "automaticallyAssignRanks", isAutomaticallyAssignRanks()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignFounderFlag", isAssignFounderFlag()); + + // Personnel Randomization + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeOrigin", isRandomizeOrigin()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeAroundCentralPlanet", isRandomizeAroundCentralPlanet()); + MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "centralPlanet", "systemId", + getCentralPlanet().getParentSystem().getId(), getCentralPlanet().getId()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originSearchRadius", getOriginSearchRadius()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "extraRandomOrigin", isExtraRandomOrigin()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originDistanceScale", getOriginDistanceScale()); + + // Starting Simulation + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "runStartingSimulation", isRunStartingSimulation()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulationDuration", getSimulationDuration()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomMarriages", isSimulateRandomMarriages()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "simulateRandomProcreation", isSimulateRandomProcreation()); + + // Units + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "battleMechWeightClassGenerationMethod", getBattleMechWeightClassGenerationMethod().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "battleMechQualityGenerationMethod", getBattleMechQualityGenerationMethod().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToUnitCommander", isAssignBestRollToUnitCommander()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sortStarLeagueUnitsFirst", isSortStarLeagueUnitsFirst()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByWeight", isGroupByWeight()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByQuality", isGroupByQuality()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "keepOfficerRollsSeparate", isKeepOfficerRollsSeparate()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignTechsToUnits", isAssignTechsToUnits()); + + // Unit + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "forceNamingMethod", getForceNamingMethod().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateForceIcons", isGenerateForceIcons()); + + // Spares + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMothballedSpareUnits", isGenerateMothballedSpareUnits()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sparesPercentOfActiveUnits", getSparesPercentOfActiveUnits()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "partGenerationMethod", getPartGenerationMethod().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingArmourWeight", getStartingArmourWeight()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSpareAmmunition", isGenerateSpareAmmunition()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "numberReloadsPerWeapon", getNumberReloadsPerWeapon()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateFractionalMachineGunAmmunition", isGenerateFractionalMachineGunAmmunition()); + + // Contracts + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "selectStartingContract", isSelectStartingContract()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startCourseToContractPlanet", isStartCourseToContractPlanet()); + + // Finances + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingCash", getStartingCash()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeStartingCash", isRandomizeStartingCash()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomStartingCashDiceCount", getRandomStartingCashDiceCount()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "minimumStartingFloat", getMinimumStartingFloat()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForSetup", isPayForSetup()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingLoan", isStartingLoan()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForPersonnel", isPayForPersonnel()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForUnits", isPayForUnits()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForParts", isPayForParts()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForArmour", isPayForArmour()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForAmmunition", isPayForAmmunition()); + + // Surprises + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSurprises", isGenerateSurprises()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxes", isGenerateMysteryBoxes()); + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "generateMysteryBoxTypes"); + for (final Map.Entry entry : getGenerateMysteryBoxTypes().entrySet()) { + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().name(), entry.getValue()); + } + MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "generateMysteryBoxTypes"); + MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "companyGenerationOptions"); + } + + /** + * @param campaign the campaign to parse the options based on + * @param file the XML file to parse the company generation options from. This should not be null, + * but null values are handled nicely. + * @return the parsed CompanyGenerationOptions, or the default Windchild options if there is an + * issue parsing the file. + */ + public static CompanyGenerationOptions parseFromXML(final Campaign campaign, + final @Nullable File file) { + if (file == null) { + MekHQ.getLogger().error("Received a null file, returning the default Windchild options"); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); + } + final Element element; + + // Open up the file. + try (InputStream is = new FileInputStream(file)) { + element = MekHqXmlUtil.newSafeDocumentBuilder().parse(is).getDocumentElement(); + } catch (Exception e) { + MekHQ.getLogger().error("Failed to open file, returning the default Windchild options", e); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); + } + element.normalize(); + + final Version version = new Version(element.getAttribute("version")); + final NodeList nl = element.getChildNodes(); + for (int i = 0; i < nl.getLength(); i++) { + final Node wn = nl.item(i); + if ("companyGenerationOptions".equals(wn.getNodeName()) && wn.hasChildNodes()) { + final CompanyGenerationOptions options = parseFromXML(wn.getChildNodes(), version); + if (options != null) { + return options; + } + } + } + MekHQ.getLogger().error("Failed to parse file, returning the default Windchild options"); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); + } + + /** + * @param nl the node list to parse the options from + * @param version the Version of the XML to parse from. This is included for future-proofing + * @return the parsed company generation options, or null if the parsing fails + */ + public static @Nullable CompanyGenerationOptions parseFromXML(final NodeList nl, final Version version) { + final CompanyGenerationOptions options = new CompanyGenerationOptions(); + try { + for (int x = 0; x < nl.getLength(); x++) { + final Node wn = nl.item(x); + switch (wn.getNodeName()) { + //region Base Information + case "method": + options.setMethod(CompanyGenerationMethod.valueOf(wn.getTextContent().trim())); + break; + case "generateMercenaryCompanyCommandLance": + options.setGenerateMercenaryCompanyCommandLance(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "companyCount": + options.setCompanyCount(Integer.parseInt(wn.getTextContent().trim())); + break; + case "individualLanceCount": + options.setIndividualLanceCount(Integer.parseInt(wn.getTextContent().trim())); + break; + case "lancesPerCompany": + options.setLancesPerCompany(Integer.parseInt(wn.getTextContent().trim())); + break; + case "lanceSize": + options.setLanceSize(Integer.parseInt(wn.getTextContent().trim())); + break; + case "starLeagueYear": + options.setStarLeagueYear(Integer.parseInt(wn.getTextContent().trim())); + break; + //endregion Base Information + + //region Personnel + case "supportPersonnel": { + options.setSupportPersonnel(new HashMap<>()); + final NodeList nl2 = wn.getChildNodes(); + for (int y = 0; y < nl2.getLength(); y++) { + final Node wn2 = nl2.item(y); + try { + options.getSupportPersonnel().put( + PersonnelRole.valueOf(wn2.getNodeName().trim()), + Integer.parseInt(wn2.getTextContent().trim())); + } catch (Exception ignored) { + + } + } + break; + } + case "poolAssistants": + options.setPoolAssistants(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "generateCaptains": + options.setGenerateCaptains(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "assignCompanyCommanderFlag": + options.setAssignCompanyCommanderFlag(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "applyOfficerStatBonusToWorstSkill": + options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "assignBestOfficers": + options.setAssignBestOfficers(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "automaticallyAssignRanks": + options.setAutomaticallyAssignRanks(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "assignFounderFlag": + options.setAssignFounderFlag(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + //endregion Personnel + + //region Personnel Randomization + case "randomizeOrigin": + options.setRandomizeOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "randomizeAroundCentralPlanet": + options.setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "centralPlanet": + String centralPlanetSystemId = wn.getAttributes().getNamedItem("systemId").getTextContent().trim(); + String centralPlanetPlanetId = wn.getTextContent().trim(); + options.setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); + break; + case "originSearchRadius": + options.setOriginSearchRadius(Integer.parseInt(wn.getTextContent().trim())); + break; + case "extraRandomOrigin": + options.setExtraRandomOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "originDistanceScale": + options.setOriginDistanceScale(Double.parseDouble(wn.getTextContent().trim())); + break; + //endregion Personnel Randomization + + //region Starting Simulation + case "runStartingSimulation": + options.setRunStartingSimulation(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "simulationDuration": + options.setSimulationDuration(Integer.parseInt(wn.getTextContent().trim())); + break; + case "simulateRandomMarriages": + options.setSimulateRandomMarriages(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "simulateRandomProcreation": + options.setSimulateRandomProcreation(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + //endregion Starting Simulation + + //region Units + case "battleMechWeightClassGenerationMethod": + options.setBattleMechWeightClassGenerationMethod(BattleMechWeightClassGenerationMethod.valueOf(wn.getTextContent().trim())); + break; + case "battleMechQualityGenerationMethod": + options.setBattleMechQualityGenerationMethod(BattleMechQualityGenerationMethod.valueOf(wn.getTextContent().trim())); + break; + case "generateUnitsAsAttached": + options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "assignBestRollToUnitCommander": + options.setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "sortStarLeagueUnitsFirst": + options.setSortStarLeagueUnitsFirst(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "groupByWeight": + options.setGroupByWeight(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "groupByQuality": + options.setGroupByQuality(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "keepOfficerRollsSeparate": + options.setKeepOfficerRollsSeparate(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "assignTechsToUnits": + options.setAssignTechsToUnits(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + //endregion Units + + //region Unit + case "forceNamingMethod": + options.setForceNamingMethod(ForceNamingMethod.valueOf(wn.getTextContent().trim())); + break; + case "generateForceIcons": + options.setGenerateForceIcons(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + //endregion Units + + //region Spares + case "generateMothballedSpareUnits": + options.setGenerateMothballedSpareUnits(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "sparesPercentOfActiveUnits": + options.setSparesPercentOfActiveUnits(Integer.parseInt(wn.getTextContent().trim())); + break; + case "partGenerationMethod": + options.setPartGenerationMethod(PartGenerationMethod.valueOf(wn.getTextContent().trim())); + break; + case "startingArmourWeight": + options.setStartingArmourWeight(Integer.parseInt(wn.getTextContent().trim())); + break; + case "generateSpareAmmunition": + options.setGenerateSpareAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "numberReloadsPerWeapon": + options.setNumberReloadsPerWeapon(Integer.parseInt(wn.getTextContent().trim())); + break; + case "generateFractionalMachineGunAmmunition": + options.setGenerateFractionalMachineGunAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + //endregion Spares + + //region Contracts + case "selectStartingContract": + options.setSelectStartingContract(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "startCourseToContractPlanet": + options.setStartCourseToContractPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + //endregion Contracts + + //region Finances + case "startingCash": + options.setStartingCash(Integer.parseInt(wn.getTextContent().trim())); + break; + case "randomizeStartingCash": + options.setRandomizeStartingCash(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "randomStartingCashDiceCount": + options.setRandomStartingCashDiceCount(Integer.parseInt(wn.getTextContent().trim())); + break; + case "minimumStartingFloat": + options.setMinimumStartingFloat(Integer.parseInt(wn.getTextContent().trim())); + break; + case "payForSetup": + options.setPayForSetup(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "startingLoan": + options.setStartingLoan(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "payForPersonnel": + options.setPayForPersonnel(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "payForUnits": + options.setPayForUnits(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "payForParts": + options.setPayForParts(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "payForArmour": + options.setPayForArmour(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "payForAmmunition": + options.setPayForAmmunition(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + //endregion Finances + + //region Surprises + case "generateSurprises": + options.setGenerateSurprises(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "generateMysteryBoxes": + options.setGenerateMysteryBoxes(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "generateMysteryBoxTypes": { + options.setGenerateMysteryBoxTypes(new HashMap<>()); + final NodeList nl2 = wn.getChildNodes(); + for (int y = 0; y < nl2.getLength(); y++) { + final Node wn2 = nl2.item(y); + try { + options.getGenerateMysteryBoxTypes().put( + MysteryBoxType.valueOf(wn2.getNodeName().trim()), + Boolean.parseBoolean(wn2.getTextContent().trim())); + } catch (Exception ignored) { + + } + } + break; + } + //endregion Surprises + } + } + } catch (Exception e) { + MekHQ.getLogger().error(e); + return null; + } + + return options; + } + //endregion File IO +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java similarity index 94% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java rename to MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java index aa1540a89d..f31415f036 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/CompanyGenerationPersonTracker.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java @@ -1,81 +1,81 @@ -/* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. - * - * This file is part of MekHQ. - * - * MekHQ is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * MekHQ is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with MekHQ. If not, see . - */ -package mekhq.campaign.universe.generators.companyGenerators; - -import megamek.common.Entity; -import megamek.common.annotations.Nullable; -import mekhq.campaign.personnel.Person; -import mekhq.campaign.universe.enums.CompanyGenerationPersonType; - -public class CompanyGenerationPersonTracker { - //region Variable Declarations - private CompanyGenerationPersonType personType; - private Person person; - private AtBRandomMechParameters parameters; - private Entity entity; - //endregion Variable Declarations - - //region Constructors - public CompanyGenerationPersonTracker(final Person person) { - this(CompanyGenerationPersonType.MECHWARRIOR, person); - } - - public CompanyGenerationPersonTracker(final CompanyGenerationPersonType personType, - final Person person) { - setPersonType(personType); - setPerson(person); - setParameters(null); - setEntity(null); - } - //endregion Constructors - - //region Getters/Setters - public CompanyGenerationPersonType getPersonType() { - return personType; - } - - public void setPersonType(final CompanyGenerationPersonType personType) { - this.personType = personType; - } - - public Person getPerson() { - return person; - } - - public void setPerson(final Person person) { - this.person = person; - } - - public @Nullable AtBRandomMechParameters getParameters() { - return parameters; - } - - public void setParameters(final @Nullable AtBRandomMechParameters parameters) { - this.parameters = parameters; - } - - public @Nullable Entity getEntity() { - return entity; - } - - public void setEntity(final @Nullable Entity entity) { - this.entity = entity; - } - //endregion Getters/Setters -} +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.companyGeneration; + +import megamek.common.Entity; +import megamek.common.annotations.Nullable; +import mekhq.campaign.personnel.Person; +import mekhq.campaign.universe.enums.CompanyGenerationPersonType; + +public class CompanyGenerationPersonTracker { + //region Variable Declarations + private CompanyGenerationPersonType personType; + private Person person; + private AtBRandomMechParameters parameters; + private Entity entity; + //endregion Variable Declarations + + //region Constructors + public CompanyGenerationPersonTracker(final Person person) { + this(CompanyGenerationPersonType.MECHWARRIOR, person); + } + + public CompanyGenerationPersonTracker(final CompanyGenerationPersonType personType, + final Person person) { + setPersonType(personType); + setPerson(person); + setParameters(null); + setEntity(null); + } + //endregion Constructors + + //region Getters/Setters + public CompanyGenerationPersonType getPersonType() { + return personType; + } + + public void setPersonType(final CompanyGenerationPersonType personType) { + this.personType = personType; + } + + public Person getPerson() { + return person; + } + + public void setPerson(final Person person) { + this.person = person; + } + + public @Nullable AtBRandomMechParameters getParameters() { + return parameters; + } + + public void setParameters(final @Nullable AtBRandomMechParameters parameters) { + this.parameters = parameters; + } + + public @Nullable Entity getEntity() { + return entity; + } + + public void setEntity(final @Nullable Entity entity) { + this.entity = entity; + } + //endregion Getters/Setters +} diff --git a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java new file mode 100644 index 0000000000..5acb3cdb25 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.enums; + +import megamek.common.util.EncodeControl; +import mekhq.campaign.universe.generators.battleMechQualityGenerators.AbstractBattleMechQualityGenerator; +import mekhq.campaign.universe.generators.battleMechQualityGenerators.AtBBattleMechQualityGenerator; +import mekhq.campaign.universe.generators.battleMechQualityGenerators.WindchildBattleMechQualityGenerator; + +import java.util.ResourceBundle; + +public enum BattleMechQualityGenerationMethod { + //region Enum Declarations + AGAINST_THE_BOT("BattleMechQualityGenerationMethod.AGAINST_THE_BOT.text", "BattleMechQualityGenerationMethod.AGAINST_THE_BOT.toolTipText"), + WINDCHILD("BattleMechQualityGenerationMethod.WINDCHILD.text", "BattleMechQualityGenerationMethod.WINDCHILD.toolTipText"); + //endregion Enum Declarations + + //region Variable Declarations + private final String name; + private final String toolTipText; + //endregion Variable Declarations + + //region Constructors + BattleMechQualityGenerationMethod(final String name, final String toolTipText) { + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + this.name = resources.getString(name); + this.toolTipText = resources.getString(toolTipText); + } + //endregion Constructors + + //region Getters + public String getToolTipText() { + return toolTipText; + } + //endregion Getters + + //region Boolean Comparison Methods + public boolean isAgainstTheBot() { + return this == AGAINST_THE_BOT; + } + + public boolean isWindchild() { + return this == WINDCHILD; + } + //endregion Boolean Comparison Methods + + public AbstractBattleMechQualityGenerator getGenerator() { + switch (this) { + case AGAINST_THE_BOT: + return new AtBBattleMechQualityGenerator(); + case WINDCHILD: + default: + return new WindchildBattleMechQualityGenerator(); + } + } + + @Override + public String toString() { + return name; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java new file mode 100644 index 0000000000..7e7ab586f2 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.enums; + +import megamek.common.util.EncodeControl; +import mekhq.campaign.universe.generators.battleMechWeightClassGenerators.*; + +import java.util.ResourceBundle; + +public enum BattleMechWeightClassGenerationMethod { + //region Enum Declarations + AGAINST_THE_BOT("BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.text", "BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.toolTipText"), + WINDCHILD("BattleMechWeightClassGenerationMethod.WINDCHILD.text", "BattleMechWeightClassGenerationMethod.WINDCHILD.toolTipText"), + WINDCHILD_LIGHT("BattleMechWeightClassGenerationMethod.WINDCHILD_LIGHT.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_LIGHT.toolTipText"), + WINDCHILD_MEDIUM("BattleMechWeightClassGenerationMethod.WINDCHILD_MEDIUM.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_MEDIUM.toolTipText"), + WINDCHILD_HEAVY("BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY.toolTipText"), + WINDCHILD_ASSAULT("BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.toolTipText"); + //endregion Enum Declarations + + //region Variable Declarations + private final String name; + private final String toolTipText; + //endregion Variable Declarations + + //region Constructors + BattleMechWeightClassGenerationMethod(final String name, final String toolTipText) { + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + this.name = resources.getString(name); + this.toolTipText = resources.getString(toolTipText); + } + //endregion Constructors + + //region Getters + public String getToolTipText() { + return toolTipText; + } + //endregion Getters + + //region Boolean Comparison Methods + public boolean isAgainstTheBot() { + return this == AGAINST_THE_BOT; + } + + public boolean isWindchild() { + return this == WINDCHILD; + } + + public boolean isWindchildLight() { + return this == WINDCHILD_LIGHT; + } + + public boolean isWindchildMedium() { + return this == WINDCHILD_MEDIUM; + } + + public boolean isWindchildHeavy() { + return this == WINDCHILD_HEAVY; + } + + public boolean isWindchildAssault() { + return this == WINDCHILD_ASSAULT; + } + //endregion Boolean Comparison Methods + + public AbstractBattleMechWeightClassGenerator getGenerator() { + switch (this) { + case AGAINST_THE_BOT: + return new AtBBattleMechWeightClassGenerator(); + case WINDCHILD_LIGHT: + return new WindchildLightBattleMechWeightClassGenerator(); + case WINDCHILD_MEDIUM: + return new WindchildMediumBattleMechWeightClassGenerator(); + case WINDCHILD_HEAVY: + return new WindchildHeavyBattleMechWeightClassGenerator(); + case WINDCHILD_ASSAULT: + return new WindchildAssaultBattleMechWeightClassGenerator(); + case WINDCHILD: + default: + return new WindchildBattleMechWeightClassGenerator(); + } + } + + @Override + public String toString() { + return name; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java index fefd7982dc..fac1755dbe 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java @@ -20,6 +20,7 @@ import megamek.common.util.EncodeControl; import mekhq.campaign.Campaign; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.campaign.universe.generators.companyGenerators.*; import java.util.ResourceBundle; @@ -27,10 +28,7 @@ public enum CompanyGenerationMethod { //region Enum Declarations AGAINST_THE_BOT("CompanyGenerationMethod.AGAINST_THE_BOT.text", "CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText"), - WINDCHILD("CompanyGenerationMethod.WINDCHILD.text", "CompanyGenerationMethod.WINDCHILD.toolTipText"), - WINDCHILD_LIGHT("CompanyGenerationMethod.WINDCHILD_LIGHT.text", "CompanyGenerationMethod.WINDCHILD_LIGHT.toolTipText"), - WINDCHILD_HEAVY("CompanyGenerationMethod.WINDCHILD_HEAVY.text", "CompanyGenerationMethod.WINDCHILD_HEAVY.toolTipText"), - WINDCHILD_ASSAULT("CompanyGenerationMethod.WINDCHILD_ASSAULT.text", "CompanyGenerationMethod.WINDCHILD_ASSAULT.toolTipText"); + WINDCHILD("CompanyGenerationMethod.WINDCHILD.text", "CompanyGenerationMethod.WINDCHILD.toolTipText"); //endregion Enum Declarations //region Variable Declarations @@ -60,22 +58,6 @@ public boolean isAtB() { public boolean isWindchild() { return this == WINDCHILD; } - - public boolean isWindchildLight() { - return this == WINDCHILD_LIGHT; - } - - public boolean isWindchildHeavy() { - return this == WINDCHILD_HEAVY; - } - - public boolean isWindchildAssault() { - return this == WINDCHILD_ASSAULT; - } - - public boolean isWindchildGrouping() { - return isWindchild() || isWindchildLight() || isWindchildHeavy() || isWindchildAssault(); - } //endregion Boolean Comparison Methods public AbstractCompanyGenerator getGenerator(final Campaign campaign, @@ -83,12 +65,6 @@ public AbstractCompanyGenerator getGenerator(final Campaign campaign, switch (this) { case AGAINST_THE_BOT: return new AtBCompanyGenerator(campaign, options); - case WINDCHILD_LIGHT: - return new WindchildLightCompanyGenerator(campaign, options); - case WINDCHILD_HEAVY: - return new WindchildHeavyCompanyGenerator(campaign, options); - case WINDCHILD_ASSAULT: - return new WindchildAssaultCompanyGenerator(campaign, options); case WINDCHILD: default: return new WindchildCompanyGenerator(campaign, options); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AbstractBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AbstractBattleMechQualityGenerator.java new file mode 100644 index 0000000000..d098ce1d52 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AbstractBattleMechQualityGenerator.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +/** + * This was designed to provide options for the method of quality generation for Company Generators, + * and any use outside of them should take this specific design into consideration. + */ +public abstract class AbstractBattleMechQualityGenerator { + //region Variable Declarations + private final BattleMechQualityGenerationMethod method; + //endregion Variable Declarations + + //region Constructors + protected AbstractBattleMechQualityGenerator(final BattleMechQualityGenerationMethod method) { + this.method = method; + } + //endregion Constructors + + //region Getters + public BattleMechQualityGenerationMethod getMethod() { + return method; + } + //endregion Getters + + /** + * @param roll the modified roll to use + * @return the generated IUnitRating magic int for Dragoon Quality + */ + public abstract int generate(final int roll); +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AtBBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AtBBattleMechQualityGenerator.java new file mode 100644 index 0000000000..6ca997d200 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AtBBattleMechQualityGenerator.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +public class AtBBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { + //region Constructors + public AtBBattleMechQualityGenerator() { + super(BattleMechQualityGenerationMethod.AGAINST_THE_BOT); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + switch (roll) { + case 2: + case 3: + case 4: + case 5: + return IUnitRating.DRAGOON_F; + case 6: + case 7: + case 8: + return IUnitRating.DRAGOON_D; + case 9: + case 10: + return IUnitRating.DRAGOON_C; + case 11: + return IUnitRating.DRAGOON_B; + case 12: + return IUnitRating.DRAGOON_A; + default: + return IUnitRating.DRAGOON_ASTAR; + } + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/WindchildBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/WindchildBattleMechQualityGenerator.java new file mode 100644 index 0000000000..e47c5820bd --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/WindchildBattleMechQualityGenerator.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +public class WindchildBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { + //region Constructors + public WindchildBattleMechQualityGenerator() { + super(BattleMechQualityGenerationMethod.WINDCHILD); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + switch (roll) { + case 2: + case 3: + case 4: + return IUnitRating.DRAGOON_F; + case 5: + case 6: + return IUnitRating.DRAGOON_D; + case 7: + case 8: + return IUnitRating.DRAGOON_C; + case 9: + case 10: + return IUnitRating.DRAGOON_B; + case 11: + case 12: + return IUnitRating.DRAGOON_A; + default: + return IUnitRating.DRAGOON_ASTAR; + } + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java new file mode 100644 index 0000000000..edf6325a3b --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; + +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; + +/** + * This was designed to provide options for the method of weight generation for Company Generators, + * and any use outside of them should take this specific design into consideration. + */ +public abstract class AbstractBattleMechWeightClassGenerator { + //region Variable Declarations + private final BattleMechWeightClassGenerationMethod method; + //endregion Variable Declarations + + //region Constructors + protected AbstractBattleMechWeightClassGenerator(final BattleMechWeightClassGenerationMethod method) { + this.method = method; + } + //endregion Constructors + + //region Getters + public BattleMechWeightClassGenerationMethod getMethod() { + return method; + } + //endregion Getters + + /** + * @param roll the modified roll to use + * @return the generated EntityWeightClass + */ + public abstract int generate(final int roll); +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AtBBattleMechWeightClassGenerator.java similarity index 63% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java rename to MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AtBBattleMechWeightClassGenerator.java index d4ced55a6b..305779dc66 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildHeavyCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AtBBattleMechWeightClassGenerator.java @@ -16,49 +16,39 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.campaign.universe.generators.companyGenerators; +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; import megamek.common.EntityWeightClass; -import mekhq.campaign.Campaign; -import mekhq.campaign.universe.enums.CompanyGenerationMethod; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; -public class WindchildHeavyCompanyGenerator extends WindchildCompanyGenerator { +public class AtBBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors - public WindchildHeavyCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { - super(CompanyGenerationMethod.WINDCHILD_HEAVY, campaign, options); + public AtBBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT); } //endregion Constructors - //region Units - /** - * This guarantees a BattleMech, and rolls a heavier lance - * - * @param roll the modified roll to use - * @return the generated EntityWeightClass - * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, - * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables - */ @Override - protected int determineBattleMechWeight(final int roll) { + public int generate(final int roll) { switch (roll) { case 2: case 3: + return EntityWeightClass.WEIGHT_ULTRA_LIGHT; case 4: - return EntityWeightClass.WEIGHT_LIGHT; + case 5: case 6: + return EntityWeightClass.WEIGHT_LIGHT; case 7: - return EntityWeightClass.WEIGHT_MEDIUM; case 8: case 9: + return EntityWeightClass.WEIGHT_MEDIUM; case 10: - return EntityWeightClass.WEIGHT_HEAVY; - case 5: case 11: + return EntityWeightClass.WEIGHT_HEAVY; case 12: return EntityWeightClass.WEIGHT_ASSAULT; default: return EntityWeightClass.WEIGHT_SUPER_HEAVY; } } - //endregion Units } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildAssaultBattleMechWeightClassGenerator.java similarity index 63% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java rename to MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildAssaultBattleMechWeightClassGenerator.java index 9a3428d3a3..c1b46ce36d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildLightCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildAssaultBattleMechWeightClassGenerator.java @@ -16,49 +16,38 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.campaign.universe.generators.companyGenerators; +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; import megamek.common.EntityWeightClass; -import mekhq.campaign.Campaign; -import mekhq.campaign.universe.enums.CompanyGenerationMethod; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; -public class WindchildLightCompanyGenerator extends WindchildCompanyGenerator { +public class WindchildAssaultBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors - public WindchildLightCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { - super(CompanyGenerationMethod.WINDCHILD_LIGHT, campaign, options); + public WindchildAssaultBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT); } //endregion Constructors - //region Units - /** - * This guarantees a BattleMech, and rolls a light/medium weighted lance - * - * @param roll the modified roll to use - * @return the generated EntityWeightClass - * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, - * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables - */ @Override - protected int determineBattleMechWeight(final int roll) { + public int generate(final int roll) { switch (roll) { + case 3: + return EntityWeightClass.WEIGHT_LIGHT; case 4: case 5: + return EntityWeightClass.WEIGHT_MEDIUM; + case 2: case 6: case 7: - return EntityWeightClass.WEIGHT_LIGHT; - case 3: + return EntityWeightClass.WEIGHT_HEAVY; case 8: case 9: - return EntityWeightClass.WEIGHT_MEDIUM; case 10: case 11: - return EntityWeightClass.WEIGHT_HEAVY; - case 2: case 12: return EntityWeightClass.WEIGHT_ASSAULT; default: return EntityWeightClass.WEIGHT_SUPER_HEAVY; } } - //endregion Units } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildBattleMechWeightClassGenerator.java similarity index 63% rename from MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java rename to MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildBattleMechWeightClassGenerator.java index fc0c209833..113de8826d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildAssaultCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildBattleMechWeightClassGenerator.java @@ -16,43 +16,33 @@ * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see . */ -package mekhq.campaign.universe.generators.companyGenerators; +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; import megamek.common.EntityWeightClass; -import mekhq.campaign.Campaign; -import mekhq.campaign.universe.enums.CompanyGenerationMethod; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; -public class WindchildAssaultCompanyGenerator extends WindchildCompanyGenerator { +public class WindchildBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors - public WindchildAssaultCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { - super(CompanyGenerationMethod.WINDCHILD_ASSAULT, campaign, options); + public WindchildBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.WINDCHILD); } //endregion Constructors - //region Units - /** - * This guarantees a BattleMech, and rolls a heavy/assault weighted lance - * - * @param roll the modified roll to use - * @return the generated EntityWeightClass - * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, - * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables - */ @Override - protected int determineBattleMechWeight(final int roll) { + public int generate(final int roll) { switch (roll) { + case 2: case 3: - return EntityWeightClass.WEIGHT_LIGHT; case 4: case 5: - return EntityWeightClass.WEIGHT_MEDIUM; - case 2: + return EntityWeightClass.WEIGHT_LIGHT; case 6: case 7: - return EntityWeightClass.WEIGHT_HEAVY; case 8: + return EntityWeightClass.WEIGHT_MEDIUM; case 9: case 10: + return EntityWeightClass.WEIGHT_HEAVY; case 11: case 12: return EntityWeightClass.WEIGHT_ASSAULT; @@ -60,5 +50,4 @@ protected int determineBattleMechWeight(final int roll) { return EntityWeightClass.WEIGHT_SUPER_HEAVY; } } - //endregion Units } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildHeavyBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildHeavyBattleMechWeightClassGenerator.java new file mode 100644 index 0000000000..65b120b594 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildHeavyBattleMechWeightClassGenerator.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; + +public class WindchildHeavyBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { + //region Constructors + public WindchildHeavyBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + switch (roll) { + case 2: + case 3: + case 4: + return EntityWeightClass.WEIGHT_LIGHT; + case 6: + case 7: + return EntityWeightClass.WEIGHT_MEDIUM; + case 8: + case 9: + case 10: + return EntityWeightClass.WEIGHT_HEAVY; + case 5: + case 11: + case 12: + return EntityWeightClass.WEIGHT_ASSAULT; + default: + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildLightBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildLightBattleMechWeightClassGenerator.java new file mode 100644 index 0000000000..ebe9e204c1 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildLightBattleMechWeightClassGenerator.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; + +public class WindchildLightBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { + //region Constructors + public WindchildLightBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.WINDCHILD_LIGHT); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + switch (roll) { + case 4: + case 5: + case 6: + case 7: + return EntityWeightClass.WEIGHT_LIGHT; + case 3: + case 8: + case 9: + return EntityWeightClass.WEIGHT_MEDIUM; + case 10: + case 11: + return EntityWeightClass.WEIGHT_HEAVY; + case 2: + case 12: + return EntityWeightClass.WEIGHT_ASSAULT; + default: + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildMediumBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildMediumBattleMechWeightClassGenerator.java new file mode 100644 index 0000000000..b4ef682731 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildMediumBattleMechWeightClassGenerator.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; + +public class WindchildMediumBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { + //region Constructors + public WindchildMediumBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.WINDCHILD_MEDIUM); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + switch (roll) { + case 8: + case 9: + return EntityWeightClass.WEIGHT_LIGHT; + case 4: + case 5: + case 6: + case 7: + return EntityWeightClass.WEIGHT_MEDIUM; + case 3: + case 10: + case 11: + return EntityWeightClass.WEIGHT_HEAVY; + case 2: + case 12: + return EntityWeightClass.WEIGHT_ASSAULT; + default: + return EntityWeightClass.WEIGHT_SUPER_HEAVY; + } + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index db5877fab7..cb6a68ddee 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -42,9 +42,14 @@ import mekhq.campaign.personnel.ranks.Rank; import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.*; +import mekhq.campaign.universe.companyGeneration.AtBRandomMechParameters; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationPersonTracker; import mekhq.campaign.universe.enums.Alphabet; import mekhq.campaign.universe.enums.CompanyGenerationMethod; import mekhq.campaign.universe.enums.CompanyGenerationPersonType; +import mekhq.campaign.universe.generators.battleMechQualityGenerators.AbstractBattleMechQualityGenerator; +import mekhq.campaign.universe.generators.battleMechWeightClassGenerators.AbstractBattleMechWeightClassGenerator; import mekhq.campaign.work.WorkTime; import mekhq.gui.enums.LayeredForceIcon; @@ -72,30 +77,39 @@ * * Button that lets you pop out the options panel with everything disabled * - * TODO : - * Mercenaries may customize their 'Mechs, with clantech if enabled only post-3055 - * Finish the personnel randomization overrides - * Implement: - * centerPlanet - * selectStartingContract - * Finish Finances - * - * FIXME : + * TODO - Wave 2: + * Marriage Module : Open : MHQ 2851 + * Random Origin Options : Open : MHQ 2856 + * Force Icon Rework : Open : MHQ + * Finish Finances * Backgrounds don't work * Panel has odd whitespace usage - * System, Planet text search - * - * TODO: + * System, Planet text search (if possible and feasible - might also be a bugfix, or require a new component) + * TODO - Wave 3: + * Contract Market Pane + * Campaign Options Pane, Campaign Options Dialog Base Validation + * Date Pane + * TODO - Wave 4: + * Startup GUI Rework + * TODO - Wave 5: + * Company Generator GUI + * Implement Contracts + * TODO - Wave 6: + * Suite Options loading during startup, during the first load of a newer version (use a SuiteOption to track) + * Add MegaMek Options as a panel during the startup + * TODO - Wave 7: + * Implement Era-based Part Generators * Implement Surprises * Implement Mystery Boxes - * Add MekHQ Options as a panel during the startup, but only for the first load (use a MekHQ Option to track it) - * Add MegaMek Options as a panel during the startup + * Optional: Mercenaries may customize their 'Mechs, with clantech if enabled only post-3055 */ public abstract class AbstractCompanyGenerator { //region Variable Declarations private final CompanyGenerationMethod method; - private CompanyGenerationOptions options; - private AbstractPersonnelGenerator personnelGenerator; + private final CompanyGenerationOptions options; + private final AbstractPersonnelGenerator personnelGenerator; + private final AbstractBattleMechWeightClassGenerator battleMechWeightClassGenerator; + private final AbstractBattleMechQualityGenerator battleMechQualityGenerator; private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); //endregion Variable Declarations @@ -104,8 +118,10 @@ public abstract class AbstractCompanyGenerator { protected AbstractCompanyGenerator(final CompanyGenerationMethod method, final Campaign campaign, final CompanyGenerationOptions options) { this.method = method; - setOptions(options); - createPersonnelGenerator(campaign); + this.options = options; + this.personnelGenerator = campaign.getPersonnelGenerator(createFactionSelector(campaign), createPlanetSelector()); + this.battleMechWeightClassGenerator = getOptions().getBattleMechWeightClassGenerationMethod().getGenerator(); + this.battleMechQualityGenerator = getOptions().getBattleMechQualityGenerationMethod().getGenerator(); } //endregion Constructors @@ -118,27 +134,10 @@ public CompanyGenerationOptions getOptions() { return options; } - public void setOptions(final CompanyGenerationOptions options) { - this.options = options; - } - public AbstractPersonnelGenerator getPersonnelGenerator() { return personnelGenerator; } - public void setPersonnelGenerator(final AbstractPersonnelGenerator personnelGenerator) { - this.personnelGenerator = personnelGenerator; - } - - /** - * This creates the personnel generator to use with the generator's options - * @param campaign the Campaign to generate using - */ - private void createPersonnelGenerator(final Campaign campaign) { - setPersonnelGenerator(campaign.getPersonnelGenerator(createFactionSelector(campaign), - createPlanetSelector())); - } - /** * @param campaign the campaign to select a faction using * @return a newly created Faction Selector based on the provided options @@ -172,6 +171,14 @@ private AbstractPlanetSelector createPlanetSelector() { } return planetSelector; } + + public AbstractBattleMechWeightClassGenerator getBattleMechWeightClassGenerator() { + return battleMechWeightClassGenerator; + } + + public AbstractBattleMechQualityGenerator getBattleMechQualityGenerator() { + return battleMechQualityGenerator; + } //endregion Getters/Setters //region Determination Methods @@ -646,25 +653,6 @@ private AtBRandomMechParameters createUnitGenerationParameter( return parameters; } - /** - * @param tracker the tracker to get the unit generation parameter modifier for - * @return the modifier value - */ - private int getUnitGenerationParameterModifier(final CompanyGenerationPersonTracker tracker) { - switch (tracker.getPersonType()) { - case COMPANY_COMMANDER: - return 2; - case CAPTAIN: - case LIEUTENANT: - return 1; - case MECHWARRIOR: - return 0; - default: - // Shouldn't be hit, but a safety for attempting non-combat generation - return -20; - } - } - /** * @param tracker the tracker to roll based on * @param initialRoll if this isn't the initial roll, then we need to cap the value at 12 @@ -676,31 +664,37 @@ private int rollBattleMechWeight(final CompanyGenerationPersonTracker tracker, if (!initialRoll) { roll = Math.min(roll, 12); } - return determineBattleMechWeight(roll); + return getBattleMechWeightClassGenerator().generate(roll); } - /** - * @param roll the modified roll to use - * @return the generated EntityWeightClass magic int - * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, - * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables - */ - protected abstract int determineBattleMechWeight(final int roll); - /** * @param tracker the tracker to roll based on * @return the quality to use in generating the BattleMech */ private int rollBattleMechQuality(final CompanyGenerationPersonTracker tracker) { - return determineBattleMechQuality(Utilities.dice(2, 6) - + getUnitGenerationParameterModifier(tracker)); + return getBattleMechQualityGenerator().generate( + Utilities.dice(2, 6) + getUnitGenerationParameterModifier(tracker)); } /** - * @param roll the modified roll to use - * @return the generated IUnitRating magic int for Dragoon Quality + * @param tracker the tracker to get the unit generation parameter modifier for + * @return the modifier value */ - protected abstract int determineBattleMechQuality(final int roll); + private int getUnitGenerationParameterModifier(final CompanyGenerationPersonTracker tracker) { + switch (tracker.getPersonType()) { + case COMPANY_COMMANDER: + return 2; + case CAPTAIN: + case LIEUTENANT: + return 1; + case MECHWARRIOR: + return 0; + default: + // Shouldn't be hit, but a safety for attempting non-combat generation + MekHQ.getLogger().error("Attempting to generate a unit for a " + tracker.getPersonType() + ", returning a -20 modifier"); + return -20; + } + } /** * @param trackers the trackers to sort into their lances @@ -1133,13 +1127,13 @@ public List generateMothballedEntities(final Campaign campaign, // Create the parameters to generate the 'Mech from final AtBRandomMechParameters parameters = new AtBRandomMechParameters( - determineBattleMechWeight(Utilities.dice(2, 6)), - determineBattleMechQuality(Utilities.dice(2, 6)) + getBattleMechWeightClassGenerator().generate(Utilities.dice(2, 6)), + getBattleMechQualityGenerator().generate(Utilities.dice(2, 6)) ); // We want to ensure we get a 'Mech generated while (parameters.getWeight() == EntityWeightClass.WEIGHT_ULTRA_LIGHT) { - parameters.setWeight(determineBattleMechWeight(Utilities.dice(2, 6))); + parameters.setWeight(getBattleMechWeightClassGenerator().generate(Utilities.dice(2, 6))); } // Generate the 'Mech, and add it to the mothballed entities list diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index 8d0c723b07..15c140d728 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -18,13 +18,14 @@ */ package mekhq.campaign.universe.generators.companyGenerators; -import megamek.common.EntityWeightClass; import megamek.common.MechSummary; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.ranks.Rank; import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.Faction; +import mekhq.campaign.universe.companyGeneration.AtBRandomMechParameters; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.campaign.universe.enums.CompanyGenerationMethod; public class AtBCompanyGenerator extends AbstractCompanyGenerator { @@ -57,64 +58,6 @@ protected void generateCommandingOfficerRank(final Campaign campaign, //endregion Personnel //region Units - /** - * @param roll the modified roll to use - * @return the generated EntityWeightClass - * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, - * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables - */ - @Override - protected int determineBattleMechWeight(final int roll) { - switch (roll) { - case 2: - case 3: - return EntityWeightClass.WEIGHT_ULTRA_LIGHT; - case 4: - case 5: - case 6: - return EntityWeightClass.WEIGHT_LIGHT; - case 7: - case 8: - case 9: - return EntityWeightClass.WEIGHT_MEDIUM; - case 10: - case 11: - return EntityWeightClass.WEIGHT_HEAVY; - case 12: - return EntityWeightClass.WEIGHT_ASSAULT; - default: - return EntityWeightClass.WEIGHT_SUPER_HEAVY; - } - } - - /** - * @param roll the modified roll to use - * @return the generated IUnitRating magic int for Dragoon Quality - */ - @Override - protected int determineBattleMechQuality(final int roll) { - switch (roll) { - case 2: - case 3: - case 4: - case 5: - return IUnitRating.DRAGOON_F; - case 6: - case 7: - case 8: - return IUnitRating.DRAGOON_D; - case 9: - case 10: - return IUnitRating.DRAGOON_C; - case 11: - return IUnitRating.DRAGOON_B; - case 12: - return IUnitRating.DRAGOON_A; - default: - return IUnitRating.DRAGOON_ASTAR; - } - } - /** * @param campaign the campaign to generate for * @param parameters the parameters to use in generation @@ -132,7 +75,7 @@ protected MechSummary generateMechSummary(final Campaign campaign, return generateMechSummary(campaign, parameters, faction.getShortName(), campaign.getGameYear()); } else { // Roll on the Star League Royal table if you get a SL mech with A* Rating - final String factionCode = ((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"); + final String factionCode = (parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"; return generateMechSummary(campaign, parameters, factionCode, getOptions().getStarLeagueYear()); } } else { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 4f460e4916..0a3fe82cf5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -18,13 +18,14 @@ */ package mekhq.campaign.universe.generators.companyGenerators; -import megamek.common.EntityWeightClass; import megamek.common.MechSummary; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.ranks.Rank; import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.Faction; +import mekhq.campaign.universe.companyGeneration.AtBRandomMechParameters; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.campaign.universe.enums.CompanyGenerationMethod; public class WindchildCompanyGenerator extends AbstractCompanyGenerator { @@ -32,12 +33,6 @@ public class WindchildCompanyGenerator extends AbstractCompanyGenerator { public WindchildCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { super(CompanyGenerationMethod.WINDCHILD, campaign, options); } - - protected WindchildCompanyGenerator(final CompanyGenerationMethod method, - final Campaign campaign, - final CompanyGenerationOptions options) { - super(method, campaign, options); - } //endregion Constructors //region Personnel @@ -64,66 +59,6 @@ protected void generateCommandingOfficerRank(final Campaign campaign, //endregion Personnel //region Units - /** - * This guarantees a BattleMech, and rolls an overall heavier lance - * - * @param roll the modified roll to use - * @return the generated EntityWeightClass - * EntityWeightClass.WEIGHT_ULTRA_LIGHT for none, - * EntityWeightClass.WEIGHT_SUPER_HEAVY for SL tables - */ - @Override - protected int determineBattleMechWeight(final int roll) { - switch (roll) { - case 2: - case 3: - case 4: - case 5: - return EntityWeightClass.WEIGHT_LIGHT; - case 6: - case 7: - case 8: - return EntityWeightClass.WEIGHT_MEDIUM; - case 9: - case 10: - return EntityWeightClass.WEIGHT_HEAVY; - case 11: - case 12: - return EntityWeightClass.WEIGHT_ASSAULT; - default: - return EntityWeightClass.WEIGHT_SUPER_HEAVY; - } - } - - /** - * This generates a slightly higher average quality rating - * @param roll the modified roll to use - * @return the generated IUnitRating magic int for Dragoon Quality - */ - @Override - protected int determineBattleMechQuality(final int roll) { - switch (roll) { - case 2: - case 3: - case 4: - return IUnitRating.DRAGOON_F; - case 5: - case 6: - return IUnitRating.DRAGOON_D; - case 7: - case 8: - return IUnitRating.DRAGOON_C; - case 9: - case 10: - return IUnitRating.DRAGOON_B; - case 11: - case 12: - return IUnitRating.DRAGOON_A; - default: - return IUnitRating.DRAGOON_ASTAR; - } - } - /** * This generates clan mech differently, so you can get any of the quality ratings for clanners * @@ -145,7 +80,7 @@ protected MechSummary generateMechSummary(final Campaign campaign, return generateMechSummary(campaign, parameters, faction.getShortName(), campaign.getGameYear()); } else { // Roll on the Star League Royal table if you get a SL mech with A* Rating - final String factionCode = ((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"); + final String factionCode = (parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) ? "SL.R" : "SL"; return generateMechSummary(campaign, parameters, factionCode, getOptions().getStarLeagueYear()); } } else { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java index b11acf6664..b08644023b 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java @@ -22,9 +22,7 @@ import mekhq.campaign.parts.Part; import mekhq.campaign.universe.enums.PartGenerationMethod; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; public class MultiplePartGenerator extends AbstractPartGenerator { //region Variable Declarations diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java index 1db05dcecd..dccefc4e99 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java @@ -23,7 +23,6 @@ import mekhq.campaign.universe.enums.PartGenerationMethod; import java.util.List; -import java.util.stream.Collectors; /** * 1 Part for every 3, rounded normally. diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index cb6663bef5..43d3d5afb9 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -31,8 +31,8 @@ import mekhq.campaign.parts.Part; import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationPersonTracker; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationPersonTracker; import mekhq.gui.baseComponents.AbstractMHQValidationButtonDialog; import mekhq.gui.panels.CompanyGenerationOptionsPanel; diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java index b399d4b719..28b1096695 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java @@ -21,7 +21,7 @@ import megamek.client.ui.enums.ValidationState; import megamek.common.annotations.Nullable; import mekhq.campaign.Campaign; -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.gui.baseComponents.AbstractMHQValidationButtonDialog; import mekhq.gui.panels.CompanyGenerationOptionsPanel; diff --git a/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java b/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java index 4b67b25f68..736a8f6763 100644 --- a/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java @@ -41,7 +41,7 @@ import mekhq.campaign.universe.Factions; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.PlanetarySystem; -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.gui.baseComponents.AbstractMHQValidationButtonDialog; import mekhq.gui.baseComponents.SortedComboBoxModel; import mekhq.gui.displayWrappers.FactionDisplay; diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 91e841e8a5..1e22c4eba5 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -27,11 +27,8 @@ import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.Planet; import mekhq.campaign.universe.PlanetarySystem; -import mekhq.campaign.universe.enums.CompanyGenerationMethod; -import mekhq.campaign.universe.enums.ForceNamingMethod; -import mekhq.campaign.universe.enums.MysteryBoxType; -import mekhq.campaign.universe.enums.PartGenerationMethod; -import mekhq.campaign.universe.generators.companyGenerators.CompanyGenerationOptions; +import mekhq.campaign.universe.enums.*; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.gui.FileDialogs; import mekhq.gui.baseComponents.AbstractMHQPanel; import mekhq.gui.baseComponents.JDisableablePanel; @@ -84,6 +81,8 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { private JCheckBox chkSimulateRandomProcreation; // Units + private MMComboBox comboBattleMechWeightClassGenerationMethod; + private MMComboBox comboBattleMechQualityGenerationMethod; private JCheckBox chkGenerateUnitsAsAttached; private JCheckBox chkAssignBestRollToUnitCommander; private JCheckBox chkSortStarLeagueUnitsFirst; @@ -410,6 +409,24 @@ public void setChkSimulateRandomProcreation(final JCheckBox chkSimulateRandomPro //endregion Starting Simulation //region Units + public MMComboBox getComboBattleMechWeightClassGenerationMethod() { + return comboBattleMechWeightClassGenerationMethod; + } + + public void setComboBattleMechWeightClassGenerationMethod( + final MMComboBox comboBattleMechWeightClassGenerationMethod) { + this.comboBattleMechWeightClassGenerationMethod = comboBattleMechWeightClassGenerationMethod; + } + + public MMComboBox getComboBattleMechQualityGenerationMethod() { + return comboBattleMechQualityGenerationMethod; + } + + public void setComboBattleMechQualityGenerationMethod( + final MMComboBox comboBattleMechQualityGenerationMethod) { + this.comboBattleMechQualityGenerationMethod = comboBattleMechQualityGenerationMethod; + } + public JCheckBox getChkGenerateUnitsAsAttached() { return chkGenerateUnitsAsAttached; } @@ -735,6 +752,7 @@ private JPanel createBaseInformationPanel() { lblCompanyGenerationMethod.setName("lblCompanyGenerationMethod"); setComboCompanyGenerationMethod(new MMComboBox<>("comboCompanyGenerationMethod", CompanyGenerationMethod.values())); + getComboCompanyGenerationMethod().setToolTipText(resources.getString("lblCompanyGenerationMethod.toolTipText")); getComboCompanyGenerationMethod().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -1220,6 +1238,44 @@ private JPanel createStartingSimulationPanel() { private JPanel createUnitsPanel() { // Create Panel Components + final JLabel lblBattleMechWeightClassGenerationMethod = new JLabel(resources.getString("lblBattleMechWeightClassGenerationMethod.text")); + lblBattleMechWeightClassGenerationMethod.setToolTipText(resources.getString("lblBattleMechWeightClassGenerationMethod.toolTipText")); + lblBattleMechWeightClassGenerationMethod.setName("lblBattleMechWeightClassGenerationMethod"); + + setComboBattleMechWeightClassGenerationMethod(new MMComboBox<>("comboBattleMechWeightClassGenerationMethod", BattleMechWeightClassGenerationMethod.values())); + getComboBattleMechWeightClassGenerationMethod().setToolTipText(resources.getString("lblBattleMechWeightClassGenerationMethod.toolTipText")); + getComboBattleMechWeightClassGenerationMethod().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof BattleMechWeightClassGenerationMethod) { + list.setToolTipText(((BattleMechWeightClassGenerationMethod) value).getToolTipText()); + } + return this; + } + }); + + final JLabel lblBattleMechQualityGenerationMethod = new JLabel(resources.getString("lblBattleMechQualityGenerationMethod.text")); + lblBattleMechQualityGenerationMethod.setToolTipText(resources.getString("lblBattleMechQualityGenerationMethod.toolTipText")); + lblBattleMechQualityGenerationMethod.setName("lblBattleMechQualityGenerationMethod"); + + setComboBattleMechQualityGenerationMethod(new MMComboBox<>("comboBattleMechQualityGenerationMethod", BattleMechQualityGenerationMethod.values())); + getComboBattleMechQualityGenerationMethod().setToolTipText(resources.getString("lblBattleMechQualityGenerationMethod.toolTipText")); + getComboBattleMechQualityGenerationMethod().setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(final JList list, final Object value, + final int index, final boolean isSelected, + final boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof BattleMechQualityGenerationMethod) { + list.setToolTipText(((BattleMechQualityGenerationMethod) value).getToolTipText()); + } + return this; + } + }); + setChkGenerateUnitsAsAttached(new JCheckBox(resources.getString("chkGenerateUnitsAsAttached.text"))); getChkGenerateUnitsAsAttached().setToolTipText(resources.getString("chkGenerateUnitsAsAttached.toolTipText")); getChkGenerateUnitsAsAttached().setName("chkGenerateUnitsAsAttached"); @@ -1248,6 +1304,10 @@ private JPanel createUnitsPanel() { getChkAssignTechsToUnits().setToolTipText(resources.getString("chkAssignTechsToUnits.toolTipText")); getChkAssignTechsToUnits().setName("chkAssignTechsToUnits"); + // Programmatically Assign Accessibility Labels + lblBattleMechWeightClassGenerationMethod.setLabelFor(getComboBattleMechWeightClassGenerationMethod()); + lblBattleMechQualityGenerationMethod.setLabelFor(getComboBattleMechQualityGenerationMethod()); + // Layout the UI final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("unitsPanel.title"))); @@ -1260,6 +1320,12 @@ private JPanel createUnitsPanel() { layout.setVerticalGroup( layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblBattleMechWeightClassGenerationMethod) + .addComponent(getComboBattleMechWeightClassGenerationMethod(), GroupLayout.Alignment.LEADING)) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(lblBattleMechQualityGenerationMethod) + .addComponent(getComboBattleMechQualityGenerationMethod(), GroupLayout.Alignment.LEADING)) .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) .addComponent(getChkSortStarLeagueUnitsFirst()) @@ -1271,6 +1337,12 @@ private JPanel createUnitsPanel() { layout.setHorizontalGroup( layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(lblBattleMechWeightClassGenerationMethod) + .addComponent(getComboBattleMechWeightClassGenerationMethod())) + .addGroup(layout.createSequentialGroup() + .addComponent(lblBattleMechQualityGenerationMethod) + .addComponent(getComboBattleMechQualityGenerationMethod())) .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) .addComponent(getChkSortStarLeagueUnitsFirst()) @@ -1290,6 +1362,7 @@ private JPanel createUnitPanel() { lblForceNamingMethod.setName("lblForceNamingMethod"); setComboForceNamingMethod(new MMComboBox<>("comboForceNamingMethod", ForceNamingMethod.values())); + getComboForceNamingMethod().setToolTipText(resources.getString("lblForceNamingMethod.toolTipText")); getComboForceNamingMethod().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -1807,6 +1880,8 @@ public void setOptions(final CompanyGenerationOptions options) { getChkSimulateRandomProcreation().setSelected(options.isSimulateRandomProcreation()); // Units + getComboBattleMechWeightClassGenerationMethod().setSelectedItem(options.getBattleMechWeightClassGenerationMethod()); + getComboBattleMechQualityGenerationMethod().setSelectedItem(options.getBattleMechQualityGenerationMethod()); getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); getChkAssignBestRollToUnitCommander().setSelected(options.isAssignBestRollToUnitCommander()); getChkSortStarLeagueUnitsFirst().setSelected(options.isSortStarLeagueUnitsFirst()); @@ -1914,6 +1989,8 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setSimulateRandomProcreation(getChkSimulateRandomProcreation().isSelected()); // Units + options.setBattleMechWeightClassGenerationMethod(getComboBattleMechWeightClassGenerationMethod().getSelectedItem()); + options.setBattleMechQualityGenerationMethod(getComboBattleMechQualityGenerationMethod().getSelectedItem()); options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); options.setAssignBestRollToUnitCommander(getChkAssignBestRollToUnitCommander().isSelected()); options.setSortStarLeagueUnitsFirst(getChkSortStarLeagueUnitsFirst().isSelected()); From 4304abcfa19a3cbd3d69d86a5b84d5f0d8382b7f Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 13 Nov 2021 12:48:29 -0500 Subject: [PATCH 060/115] Cleaning up the Windchild generator given the changes for weight class and quality generation --- MekHQ/resources/mekhq/resources/Universe.properties | 2 +- .../generators/companyGenerators/WindchildCompanyGenerator.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 35118190c1..f8bc1bfb0b 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -133,7 +133,7 @@ BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.toolTipText=This i CompanyGenerationMethod.AGAINST_THE_BOT.text=AtB CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the core AtB rules to generate a mercenary company. CompanyGenerationMethod.WINDCHILD.text=Windchild -CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that assigns the commanding officer a rank better fitting the force size.
The handling for BattleMech weight class and quality rolls are also modified, with Inner Sphere 'Mechs having the rare possibility of generating from the Star League Royal Tables, while Clan 'Mechs can generate from any quality. +CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that assigns the commanding officer a rank better fitting the force size, and handles BattleMech quality differently so that Clan 'Mechs can generate from any quality. # CompanyGenerationPersonType Enum CompanyGenerationPersonType.COMPANY_COMMANDER.text=Company Commander diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 0a3fe82cf5..1e4f0c799d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -60,7 +60,7 @@ protected void generateCommandingOfficerRank(final Campaign campaign, //region Units /** - * This generates clan mech differently, so you can get any of the quality ratings for clanners + * This generates Clan 'Mechs differently, so you can get any of the quality ratings for clanners. * * @param campaign the campaign to generate for * @param parameters the parameters to use in generation From cf843b558f5266273e0d8077d3d1f21b322aa9ed Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 13 Nov 2021 12:51:58 -0500 Subject: [PATCH 061/115] Adding PR number for the force icons --- .../generators/companyGenerators/AbstractCompanyGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index cb6a68ddee..5663d6f526 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -80,7 +80,7 @@ * TODO - Wave 2: * Marriage Module : Open : MHQ 2851 * Random Origin Options : Open : MHQ 2856 - * Force Icon Rework : Open : MHQ + * Force Icon Rework : Open : MHQ 2946 * Finish Finances * Backgrounds don't work * Panel has odd whitespace usage From 70f21815a86d0444a2e714de9169b027f90c1cf2 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 18 Dec 2021 12:25:17 -0500 Subject: [PATCH 062/115] Fixing weight generation --- .../companyGenerators/AbstractCompanyGenerator.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 61972efa7c..44b5ffaaba 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -590,17 +590,19 @@ public void generateUnitGenerationParameters(List parametersComparator = (p1, p2) -> 0; if (getOptions().isSortStarLeagueUnitsFirst()) { - parametersComparator = parametersComparator.thenComparing(AtBRandomMechParameters::isStarLeague).reversed(); + parametersComparator = parametersComparator.thenComparing(AtBRandomMechParameters::isStarLeague); } if (getOptions().isGroupByWeight()) { - parametersComparator = parametersComparator.thenComparingInt(AtBRandomMechParameters::getWeight).reversed(); + parametersComparator = parametersComparator.thenComparingInt(AtBRandomMechParameters::getWeight); } if (getOptions().isGroupByQuality()) { - parametersComparator = parametersComparator.thenComparingInt(AtBRandomMechParameters::getQuality).reversed(); + parametersComparator = parametersComparator.thenComparingInt(AtBRandomMechParameters::getQuality); } + parametersComparator = parametersComparator.reversed(); + if (getOptions().isKeepOfficerRollsSeparate()) { final int firstNonOfficer = determineNumberOfLances(); parameters.subList(getOptions().isAssignBestRollToUnitCommander() ? 1 : 0, firstNonOfficer).sort(parametersComparator); @@ -943,7 +945,7 @@ private void generateUnit(final Campaign campaign, // Generate the Mercenary Company Command Lance if (getOptions().isGenerateMercenaryCompanyCommandLance()) { - Force commandLance = createLance(campaign, originForce, trackers, campaign.getName() + final Force commandLance = createLance(campaign, originForce, trackers, campaign.getName() + resources.getString("AbstractCompanyGenerator.commandLance.text"), background); commandLance.getIconMap().put(LayeredForceIcon.SPECIAL_MODIFIER.getLayerPath(), new Vector<>()); commandLance.getIconMap().get(LayeredForceIcon.SPECIAL_MODIFIER.getLayerPath()).add("HQ indicator.png"); @@ -997,7 +999,7 @@ private void createLance(final Campaign campaign, final Force head, private Force createLance(final Campaign campaign, final Force head, final List trackers, final String name, final String background) { - Force lance = new Force(name); + final Force lance = new Force(name); campaign.addForce(lance, head); for (int i = 0; (i < getOptions().getLanceSize()) && !trackers.isEmpty(); i++) { campaign.addUnitToForce(trackers.remove(0).getPerson().getUnit(), lance); From 655058396b5ea5995de679e81f1747b3533e05c6 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 18 Dec 2021 13:04:10 -0500 Subject: [PATCH 063/115] Prioritize officer skills over skill level --- MekHQ/resources/mekhq/resources/GUI.properties | 2 +- .../companyGenerators/AbstractCompanyGenerator.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index f2bbbb9c2f..3a5a53292d 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -694,7 +694,7 @@ chkAssignCompanyCommanderFlag.toolTipText=This assigns the Commander flag to the chkApplyOfficerStatBonusToWorstSkill.text=Apply Officer Stat Bonus to Weaker Skill chkApplyOfficerStatBonusToWorstSkill.toolTipText=This applies the single officer stat bonus to the weaker of their primary skills, normally piloting. chkAssignBestOfficers.text=Assign Best Officers -chkAssignBestOfficers.toolTipText=Tactical Genius is always sorted first, but this continues the sort so that it is then sorted by experience level and finally by their total officer skill level. +chkAssignBestOfficers.toolTipText=Tactical Genius is always sorted first, but this continues the sort so that it is then sorted by their total officer skill level followed by their experience level. chkAutomaticallyAssignRanks.text=Automatically Assign Ranks chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command
while MechWarriors are assigned Sergeant ranks and support personnel are assigned Corporal ranks. chkAssignFounderFlag.text=Assign Founder Flag diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 44b5ffaaba..cc082e476d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -231,12 +231,12 @@ private List generateCombatPersonnel(final Campa Comparator personnelSorter = Comparator.comparing( t -> t.getPerson().getOptions().booleanOption(OptionsConstants.MISC_TACTICAL_GENIUS)); if (getOptions().isAssignBestOfficers()) { - personnelSorter = personnelSorter.thenComparingInt(t -> t.getPerson().getExperienceLevel(false)) - .reversed() + personnelSorter = personnelSorter .thenComparingInt(t -> Stream.of(SkillType.S_LEADER, SkillType.S_STRATEGY, SkillType.S_TACTICS) .mapToInt(s -> t.getPerson().getSkillLevel(s)).sum()) - .reversed(); + .thenComparingInt(t -> t.getPerson().getExperienceLevel(false)); } + personnelSorter = personnelSorter.reversed(); trackers.sort(personnelSorter); generateCommandingOfficer(campaign, trackers.get(0), numMechWarriors); From 96e2d26b197fcc3e675128b404dfff2e29c47ae5 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 18 Dec 2021 13:27:58 -0500 Subject: [PATCH 064/115] Doing a bit more work on finances --- .../AbstractCompanyGenerator.java | 69 +++++++++---------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index cc082e476d..ec1f57f683 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1309,46 +1309,43 @@ private void processFinances(final Campaign campaign, Money startingCash = generateStartingCash(); Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); if (getOptions().isPayForSetup()) { - final Money initialContractPayment = (contract == null) ? Money.zero() : contract.getTotalAdvanceAmount(); - startingCash = startingCash.plus(initialContractPayment); - minimumStartingFloat = minimumStartingFloat.plus(initialContractPayment); + final Money costs = calculateHiringCosts(trackers) + .plus(calculateUnitCosts(units)) + .plus(calculatePartCosts(parts)) + .plus(calculateArmourCosts(armour)) + .plus(calculateAmmunitionCosts(ammunition)); - Money maximumPreLoanCost = startingCash.minus(minimumStartingFloat); + final Money maximumPreLoanCosts = startingCash.minus(minimumStartingFloat); Money loan = Money.zero(); - - final Money hiringCosts = calculateHiringCosts(trackers); - if (maximumPreLoanCost.isGreaterOrEqualThan(hiringCosts)) { - maximumPreLoanCost = maximumPreLoanCost.minus(hiringCosts); - } else if (getOptions().isStartingLoan()) { - loan = loan.plus(hiringCosts); + if (maximumPreLoanCosts.isGreaterOrEqualThan(costs)) { + startingCash = startingCash.minus(costs); + } else { + startingCash = minimumStartingFloat; + if (getOptions().isStartingLoan()) { + loan = costs.minus(maximumPreLoanCosts); + } } - final Money unitCosts = calculateUnitCosts(units); - if (maximumPreLoanCost.isGreaterOrEqualThan(unitCosts)) { - maximumPreLoanCost = maximumPreLoanCost.minus(unitCosts); - } else if (getOptions().isStartingLoan()) { - loan = loan.plus(unitCosts); - } + if (startingCash.isPositive()) { + campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, + resources.getString("")); + if (loan.isZero()) { + campaign.addReport(""); + } else { - final Money partCosts = calculatePartCosts(parts); - if (maximumPreLoanCost.isGreaterOrEqualThan(partCosts)) { - maximumPreLoanCost = maximumPreLoanCost.minus(partCosts); - } else if (getOptions().isStartingLoan()) { - loan = loan.plus(partCosts); - } + } + } else if (startingCash.isZero()) { + if (loan.isZero()) { + campaign.addReport(""); + } else { - final Money armourCosts = calculateArmourCosts(armour); - if (maximumPreLoanCost.isGreaterOrEqualThan(armourCosts)) { - maximumPreLoanCost = maximumPreLoanCost.minus(armourCosts); - } else if (getOptions().isStartingLoan()) { - loan = loan.plus(armourCosts); - } + } + } else { + if (loan.isZero()) { + + } else { - final Money ammunitionCosts = calculateAmmunitionCosts(ammunition); - if (maximumPreLoanCost.isGreaterOrEqualThan(ammunitionCosts)) { - maximumPreLoanCost = maximumPreLoanCost.minus(ammunitionCosts); - } else if (getOptions().isStartingLoan()) { - loan = loan.plus(ammunitionCosts); + } } } else { campaign.addReport(""); @@ -1499,16 +1496,16 @@ private void generateMysteryBoxes(final Campaign campaign) { * Phase One: Starting Planet and Finalizing Personnel, Unit, and Units * * @param campaign the campaign to apply the generation to - * @param trackers the trackers containing all of the data required for Phase One + * @param trackers the trackers containing all the data required for Phase One * @return a list of the newly created units to add to the campaign */ public List applyPhaseOneToCampaign(final Campaign campaign, final List trackers) { // Process Personnel - // If we aren't using the pool, generate all of the Astechs and Medics required + // If we aren't using the pool, generate all the Astechs and Medics required generateAssistants(campaign, trackers); - // This does all of the final personnel processing, including recruitment and running random + // This does all the final personnel processing, including recruitment and running random // marriages finalizePersonnel(campaign, trackers); From 07c6d0d78bad14fdbbaf849506ff2be0a5fab6ee Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 18 Dec 2021 14:52:38 -0500 Subject: [PATCH 065/115] Adding some additional force icon generation options --- .../resources/mekhq/resources/GUI.properties | 6 +- .../CompanyGenerationOptions.java | 51 ++++++++++++ .../AbstractCompanyGenerator.java | 77 ++++++++----------- .../panels/CompanyGenerationOptionsPanel.java | 70 +++++++++++++++++ 4 files changed, 158 insertions(+), 46 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 3a5a53292d..304a356dc3 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -752,7 +752,11 @@ unitPanel.title=Unit lblForceNamingMethod.text=Force Naming Method lblForceNamingMethod.toolTipText=This is the method used for generating lance and company names, producing names like "Baker Company", "Bravo Company", and "Beta Company". chkGenerateForceIcons.text=Generate Force Icons -chkGenerateForceIcons.toolTipText=This will automatically create force icons for generated lances and companies, displaying the weight class, type, formation, and
using the selected faction for background if possible. +chkGenerateForceIcons.toolTipText=This will automatically create force icons for generated lances and companies, displaying the weight class, type, formation, and faction background (if possible, otherwise using Mercenary). +chkGenerateOriginNodeForceIcon.text=Generate Origin Node Force Icon +chkGenerateOriginNodeForceIcon.toolTipText=This will automatically generate a force icon for the origin force node. +forceWeightLimitsPanel.title=Force Weight Limits +forceWeightLimitsPanel.toolTipText=These are the weight levels used for determining the force icon weight level. All limits are the maximum tonnage for their weight class, with anything above the value for Assault being considered as Super Heavy. ## Spares Panel sparesPanel.title=Spares chkGenerateMothballedSpareUnits.text=Generate Mothballed Spare Units diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 8a2fbaa2b3..9073ffc787 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -19,6 +19,7 @@ package mekhq.campaign.universe.companyGeneration; import megamek.Version; +import megamek.common.EntityWeightClass; import megamek.common.annotations.Nullable; import mekhq.MekHqXmlUtil; import mekhq.campaign.Campaign; @@ -36,6 +37,7 @@ import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; +import java.util.TreeMap; public class CompanyGenerationOptions implements Serializable { //region Variable Declarations @@ -88,6 +90,8 @@ public class CompanyGenerationOptions implements Serializable { // Unit private ForceNamingMethod forceNamingMethod; private boolean generateForceIcons; // Very Buggy + private boolean generateOriginNodeForceIcon; + private TreeMap forceWeightLimits; // Spares private boolean generateMothballedSpareUnits; @@ -196,6 +200,13 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp // Unit setForceNamingMethod(ForceNamingMethod.CCB_1943); setGenerateForceIcons(true); + setGenerateOriginNodeForceIcon(true); + setForceWeightLimits(new TreeMap<>()); + getForceWeightLimits().put(390, EntityWeightClass.WEIGHT_ASSAULT); + getForceWeightLimits().put(280, EntityWeightClass.WEIGHT_HEAVY); + getForceWeightLimits().put(200, EntityWeightClass.WEIGHT_MEDIUM); + getForceWeightLimits().put(130, EntityWeightClass.WEIGHT_LIGHT); + getForceWeightLimits().put(60, EntityWeightClass.WEIGHT_ULTRA_LIGHT); // Spares setGenerateMothballedSpareUnits(false); @@ -532,6 +543,22 @@ public boolean isGenerateForceIcons() { public void setGenerateForceIcons(final boolean generateForceIcons) { this.generateForceIcons = generateForceIcons; } + + public boolean isGenerateOriginNodeForceIcon() { + return generateOriginNodeForceIcon; + } + + public void setGenerateOriginNodeForceIcon(final boolean generateOriginNodeForceIcon) { + this.generateOriginNodeForceIcon = generateOriginNodeForceIcon; + } + + public TreeMap getForceWeightLimits() { + return forceWeightLimits; + } + + public void setForceWeightLimits(final TreeMap forceWeightLimits) { + this.forceWeightLimits = forceWeightLimits; + } //endregion Unit //region Spares @@ -819,6 +846,12 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String // Unit MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "forceNamingMethod", getForceNamingMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateForceIcons", isGenerateForceIcons()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateOriginNodeForceIcon", isGenerateOriginNodeForceIcon()); + MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "forceWeightLimits"); + for (final Map.Entry entry : getForceWeightLimits().entrySet()) { + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().toString(), entry.getValue()); + } + MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "forceWeightLimits"); // Spares MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMothballedSpareUnits", isGenerateMothballedSpareUnits()); @@ -1045,6 +1078,24 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, case "generateForceIcons": options.setGenerateForceIcons(Boolean.parseBoolean(wn.getTextContent().trim())); break; + case "generateOriginNodeForceIcon": + options.setGenerateOriginNodeForceIcon(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "forceWeightLimits": { + options.setForceWeightLimits(new TreeMap<>()); + final NodeList nl2 = wn.getChildNodes(); + for (int y = 0; y < nl2.getLength(); y++) { + final Node wn2 = nl2.item(y); + try { + options.getForceWeightLimits().put( + Integer.parseInt(wn2.getNodeName().trim()), + Integer.parseInt(wn2.getTextContent().trim())); + } catch (Exception ignored) { + + } + } + break; + } //endregion Units //region Spares diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index ec1f57f683..47f759bde0 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -902,45 +902,43 @@ private void generateUnit(final Campaign campaign, final Alphabet[] alphabet = Alphabet.values(); String background = ""; - if (getOptions().isGenerateForceIcons() && (MHQStaticDirectoryManager.getForceIcons() != null)) { - // FIXME : We need a new way to handle this form of search... just default to CSR for now - background = "CSR.png"; - /* - if (MHQStaticDirectoryManager.getForceIcons().getItems().keySet().stream() - .anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getFullName(campaign.getGameYear())))) { - background = getOptions().getFaction().getFullName(campaign.getGameYear()); - } + if (getOptions().isGenerateForceIcons()) { + if (MHQStaticDirectoryManager.getForceIcons() != null) { + // FIXME : We need a new way to handle this form of search... just default to CSR for now + background = "CSR.png"; + /* + if (MHQStaticDirectoryManager.getForceIcons().getItems().keySet().stream() + .anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getFullName(campaign.getGameYear())))) { + background = getOptions().getFaction().getFullName(campaign.getGameYear()); + } - if (background.isBlank() && (MHQStaticDirectoryManager.getForceIcons().getItems().keySet() - .stream().anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getShortName())))) { - background = getOptions().getFaction().getShortName(); + if (background.isBlank() && (MHQStaticDirectoryManager.getForceIcons().getItems().keySet() + .stream().anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getShortName())))) { + background = getOptions().getFaction().getShortName(); + } + */ } - */ - } - // Create the Origin Force Icon, if we are generating force icons and the origin icon has - // not been set - if (getOptions().isGenerateForceIcons() - && Force.ROOT_LAYERED.equals(originForce.getIconCategory()) - && (originForce.getIconMap().entrySet().size() == 1) - && (originForce.getIconMap().containsKey(LayeredForceIcon.FRAME.getLayerPath()))) { - final LinkedHashMap> iconMap = new LinkedHashMap<>(); + // Create the Origin Force Icon + if (getOptions().isGenerateOriginNodeForceIcon()) { + final LinkedHashMap> iconMap = new LinkedHashMap<>(); - // Type - iconMap.put(LayeredForceIcon.TYPE.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.TYPE.getLayerPath()).add("BattleMech.png"); + // Type + iconMap.put(LayeredForceIcon.TYPE.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.TYPE.getLayerPath()).add("BattleMech.png"); - // Background - if (!background.isBlank()) { - iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); - } + // Background + if (!background.isBlank()) { + iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); + } - // Frame - iconMap.put(LayeredForceIcon.FRAME.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.FRAME.getLayerPath()).add("Frame.png"); + // Frame + iconMap.put(LayeredForceIcon.FRAME.getLayerPath(), new Vector<>()); + iconMap.get(LayeredForceIcon.FRAME.getLayerPath()).add("Frame.png"); - originForce.setIconMap(iconMap); + originForce.setIconMap(iconMap); + } } // Generate the Mercenary Company Command Lance @@ -1070,19 +1068,8 @@ private int determineForceWeightClass(final Campaign campaign, final Force force .filter(unit -> (unit != null) && (unit.getEntity() != null)) .mapToDouble(unit -> unit.getEntity().getWeight()).sum(); weight = weight * 4.0 / (getOptions().getLanceSize() * (isLance ? 1 : getOptions().getLancesPerCompany())); - if (weight > 390) { - return EntityWeightClass.WEIGHT_SUPER_HEAVY; - } else if (weight > 280) { - return EntityWeightClass.WEIGHT_ASSAULT; - } else if (weight > 200) { - return EntityWeightClass.WEIGHT_HEAVY; - } else if (weight > 130) { - return EntityWeightClass.WEIGHT_MEDIUM; - } else if (weight >= 40) { - return EntityWeightClass.WEIGHT_LIGHT; - } else { - return EntityWeightClass.WEIGHT_ULTRA_LIGHT; - } + final Map.Entry entry = getOptions().getForceWeightLimits().ceilingEntry((int) Math.round(weight)); + return (entry == null) ? EntityWeightClass.WEIGHT_SUPER_HEAVY : entry.getValue(); } //endregion Unit diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 1e22c4eba5..e48fa089e2 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -20,6 +20,7 @@ import megamek.client.ui.baseComponents.MMComboBox; import megamek.client.ui.enums.ValidationState; +import megamek.common.EntityWeightClass; import megamek.common.annotations.Nullable; import mekhq.MekHQ; import mekhq.campaign.Campaign; @@ -38,6 +39,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Map; +import java.util.TreeMap; import java.util.stream.Collectors; public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { @@ -94,6 +96,8 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { // Unit private MMComboBox comboForceNamingMethod; private JCheckBox chkGenerateForceIcons; + private JCheckBox chkGenerateOriginNodeForceIcon; + private Map spnForceWeightLimits; // Spares private JCheckBox chkGenerateMothballedSpareUnits; @@ -500,6 +504,22 @@ public JCheckBox getChkGenerateForceIcons() { public void setChkGenerateForceIcons(final JCheckBox chkGenerateForceIcons) { this.chkGenerateForceIcons = chkGenerateForceIcons; } + + public JCheckBox getChkGenerateOriginNodeForceIcon() { + return chkGenerateOriginNodeForceIcon; + } + + public void setChkGenerateOriginNodeForceIcon(final JCheckBox chkGenerateOriginNodeForceIcon) { + this.chkGenerateOriginNodeForceIcon = chkGenerateOriginNodeForceIcon; + } + + public Map getSpnForceWeightLimits() { + return spnForceWeightLimits; + } + + public void setSpnForceWeightLimits(final Map spnForceWeightLimits) { + this.spnForceWeightLimits = spnForceWeightLimits; + } //endregion Unit //region Spares @@ -1356,6 +1376,9 @@ public Component getListCellRendererComponent(final JList list, final Object } private JPanel createUnitPanel() { + // Initialize Components Used in ActionListeners + final JPanel forceWeightLimitsPanel = new JDisableablePanel("forceWeightLimitsPanel"); + // Create Panel Components final JLabel lblForceNamingMethod = new JLabel(resources.getString("lblForceNamingMethod.text")); lblForceNamingMethod.setToolTipText(resources.getString("lblForceNamingMethod.toolTipText")); @@ -1379,6 +1402,17 @@ public Component getListCellRendererComponent(final JList list, final Object setChkGenerateForceIcons(new JCheckBox(resources.getString("chkGenerateForceIcons.text"))); getChkGenerateForceIcons().setToolTipText(resources.getString("chkGenerateForceIcons.toolTipText")); getChkGenerateForceIcons().setName("chkGenerateForceIcons"); + getChkGenerateForceIcons().addActionListener(evt -> { + final boolean selected = getChkGenerateForceIcons().isSelected(); + getChkGenerateOriginNodeForceIcon().setEnabled(selected); + forceWeightLimitsPanel.setEnabled(selected); + }); + + setChkGenerateOriginNodeForceIcon(new JCheckBox(resources.getString("chkGenerateOriginNodeForceIcon.text"))); + getChkGenerateOriginNodeForceIcon().setToolTipText(resources.getString("chkGenerateOriginNodeForceIcon.toolTipText")); + getChkGenerateOriginNodeForceIcon().setName("chkGenerateOriginNodeForceIcon"); + + createForceWeightLimitsPanel(forceWeightLimitsPanel); // Programmatically Assign Accessibility Labels lblForceNamingMethod.setLabelFor(getComboForceNamingMethod()); @@ -1399,6 +1433,8 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(lblForceNamingMethod) .addComponent(getComboForceNamingMethod(), GroupLayout.Alignment.LEADING)) .addComponent(getChkGenerateForceIcons()) + .addComponent(getChkGenerateOriginNodeForceIcon()) + .addComponent(forceWeightLimitsPanel) ); layout.setHorizontalGroup( @@ -1407,10 +1443,35 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(lblForceNamingMethod) .addComponent(getComboForceNamingMethod())) .addComponent(getChkGenerateForceIcons()) + .addComponent(getChkGenerateOriginNodeForceIcon()) + .addComponent(forceWeightLimitsPanel) ); return panel; } + private void createForceWeightLimitsPanel(final JPanel panel) { + // Create Panel + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("forceWeightLimitsPanel.title"))); + panel.setToolTipText(resources.getString("forceWeightLimitsPanel.toolTipText")); + panel.setLayout(new GridLayout(0, 2)); + + // Create Panel Components + setSpnForceWeightLimits(new HashMap<>()); + for (int i = EntityWeightClass.WEIGHT_ULTRA_LIGHT; i <= EntityWeightClass.WEIGHT_ASSAULT; i++) { + final String weightClass = EntityWeightClass.getClassName(i); + + final JLabel label = new JLabel(weightClass); + label.setToolTipText(resources.getString("forceWeightLimitsPanel.toolTipText")); + label.setName("lbl" + weightClass); + panel.add(label); + + getSpnForceWeightLimits().put(i, new JSpinner(new SpinnerNumberModel(0, 0, 10000, 10))); + getSpnForceWeightLimits().get(i).setToolTipText(resources.getString("forceWeightLimitsPanel.toolTipText")); + getSpnForceWeightLimits().get(i).setName("spn" + weightClass); + panel.add(getSpnForceWeightLimits().get(i)); + } + } + private JPanel createSparesPanel() { // Initialize Labels Used in ActionListeners final JLabel lblSparesPercentOfActiveUnits = new JLabel(); @@ -1893,6 +1954,10 @@ public void setOptions(final CompanyGenerationOptions options) { // Unit getComboForceNamingMethod().setSelectedItem(options.getForceNamingMethod()); getChkGenerateForceIcons().setSelected(options.isGenerateForceIcons()); + getChkGenerateOriginNodeForceIcon().setSelected(options.isGenerateOriginNodeForceIcon()); + for (final Map.Entry entry : options.getForceWeightLimits().entrySet()) { + getSpnForceWeightLimits().get(entry.getValue()).setValue(entry.getKey()); + } // Spares if (getChkGenerateMothballedSpareUnits().isSelected() != options.isGenerateMothballedSpareUnits()) { @@ -2002,6 +2067,11 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Unit options.setForceNamingMethod(getComboForceNamingMethod().getSelectedItem()); options.setGenerateForceIcons(getChkGenerateForceIcons().isSelected()); + options.setGenerateOriginNodeForceIcon(getChkGenerateOriginNodeForceIcon().isSelected()); + options.setForceWeightLimits(new TreeMap<>()); + for (final Map.Entry entry : getSpnForceWeightLimits().entrySet()) { + options.getForceWeightLimits().put((int) entry.getValue().getValue(), entry.getKey()); + } // Spares options.setGenerateMothballedSpareUnits(getChkGenerateMothballedSpareUnits().isSelected()); From 4dfe79fe9300de4524b06a93c535f411cfedb23f Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 18 Dec 2021 14:57:27 -0500 Subject: [PATCH 066/115] Doing the base finances code --- .../mekhq/resources/Universe.properties | 1 + .../AbstractCompanyGenerator.java | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index f8bc1bfb0b..d57d5ee966 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -196,3 +196,4 @@ PartGenerationMethod.TRIPLE.toolTipText=This returns three parts for every one i AbstractCompanyGenerator.commandLance.text=\u0020Command Lance AbstractCompanyGenerator.company.text=\u0020Company AbstractCompanyGenerator.lance.text=\u0020Lance +AbstractCompanyGenerator.CompanyStartupFunding.text=Remaining Company Startup Funding diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 47f759bde0..06dff97472 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1314,8 +1314,9 @@ private void processFinances(final Campaign campaign, } if (startingCash.isPositive()) { - campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, - resources.getString("")); + campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, + campaign.getLocalDate(), startingCash, + resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.text")); if (loan.isZero()) { campaign.addReport(""); } else { @@ -1335,12 +1336,15 @@ private void processFinances(final Campaign campaign, } } } else { - campaign.addReport(""); startingCash = startingCash.isGreaterOrEqualThan(minimumStartingFloat) ? startingCash : minimumStartingFloat; - if (!startingCash.isZero()) { - campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, - resources.getString("")); + if (startingCash.isPositive()) { + campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, + campaign.getLocalDate(), startingCash, + resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.text")); + //campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.report")); + } else { + //campaign.addReport(resources.getString("")); } } } From f736d2b10c7cf603986ca979cb052f3febfee781 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 18 Dec 2021 15:31:59 -0500 Subject: [PATCH 067/115] Fixing initial setter to properly changes the state within action listeners --- MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index e48fa089e2..a131f1feb0 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -1953,7 +1953,9 @@ public void setOptions(final CompanyGenerationOptions options) { // Unit getComboForceNamingMethod().setSelectedItem(options.getForceNamingMethod()); - getChkGenerateForceIcons().setSelected(options.isGenerateForceIcons()); + if (getChkGenerateForceIcons().isSelected() != options.isGenerateForceIcons()) { + getChkGenerateForceIcons().doClick(); + } getChkGenerateOriginNodeForceIcon().setSelected(options.isGenerateOriginNodeForceIcon()); for (final Map.Entry entry : options.getForceWeightLimits().entrySet()) { getSpnForceWeightLimits().get(entry.getValue()).setValue(entry.getKey()); From 94340a00ccaf5fe1567a2b24d8888c2aeb7aff1a Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 18 Dec 2021 18:23:28 -0500 Subject: [PATCH 068/115] Defaulting the Manage Campaign Show Company Generator to true --- MekHQ/src/mekhq/MekHQOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/MekHQOptions.java b/MekHQ/src/mekhq/MekHQOptions.java index 832883f405..1c4542cf6b 100644 --- a/MekHQ/src/mekhq/MekHQOptions.java +++ b/MekHQ/src/mekhq/MekHQOptions.java @@ -79,7 +79,7 @@ public void setCompanyGeneratorStartup(final boolean value) { } public boolean getShowCompanyGenerator() { - return userPreferences.node(MekHqConstants.DISPLAY_NODE).getBoolean(MekHqConstants.SHOW_COMPANY_GENERATOR, false); + return userPreferences.node(MekHqConstants.DISPLAY_NODE).getBoolean(MekHqConstants.SHOW_COMPANY_GENERATOR, true); } public void setShowCompanyGenerator(final boolean value) { From 55a5871c442dde3029bdf0c140a1f53310148df2 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 22 Dec 2021 12:21:52 -0500 Subject: [PATCH 069/115] Adding constant weight class and quality generators --- .../mekhq/resources/Universe.properties | 20 ++++++++ .../BattleMechQualityGenerationMethod.java | 48 +++++++++++++++++-- ...BattleMechWeightClassGenerationMethod.java | 30 +++++++++++- .../ABattleMechQualityGenerator.java | 35 ++++++++++++++ .../AStarBattleMechQualityGenerator.java | 35 ++++++++++++++ .../BBattleMechQualityGenerator.java | 35 ++++++++++++++ .../CBattleMechQualityGenerator.java | 35 ++++++++++++++ .../DBattleMechQualityGenerator.java | 35 ++++++++++++++ .../FBattleMechQualityGenerator.java | 35 ++++++++++++++ ...bstractBattleMechWeightClassGenerator.java | 4 +- ...AssaultBattleMechWeightClassGenerator.java | 35 ++++++++++++++ .../HeavyBattleMechWeightClassGenerator.java | 35 ++++++++++++++ .../LightBattleMechWeightClassGenerator.java | 35 ++++++++++++++ .../MediumBattleMechWeightClassGenerator.java | 35 ++++++++++++++ .../AbstractCompanyGenerator.java | 19 ++++---- 15 files changed, 456 insertions(+), 15 deletions(-) create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/ABattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AStarBattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/BBattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/CBattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/DBattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/FBattleMechQualityGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AssaultBattleMechWeightClassGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/HeavyBattleMechWeightClassGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/LightBattleMechWeightClassGenerator.java create mode 100644 MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/MediumBattleMechWeightClassGenerator.java diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index d57d5ee966..d36ac836c2 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -114,6 +114,18 @@ BattleMechQualityGenerationMethod.AGAINST_THE_BOT.text=AtB BattleMechQualityGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the AtB rules for base quality generation.
Generates (before modifiers): 28% F, 44% D, 19% C, 6% B, 3% A. BattleMechQualityGenerationMethod.WINDCHILD.text=Windchild BattleMechQualityGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB method that generates a higher base quality.
Generates (before modifiers): 17% F, 25% D, 31% C, 19% B, 8% A. +BattleMechQualityGenerationMethod.F.text=F +BattleMechQualityGenerationMethod.F.toolTipText=This generates a force solely containing units of F quality. +BattleMechQualityGenerationMethod.D.text=D +BattleMechQualityGenerationMethod.D.toolTipText=This generates a force solely containing units of D quality. +BattleMechQualityGenerationMethod.C.text=C +BattleMechQualityGenerationMethod.C.toolTipText=This generates a force solely containing units of C quality. +BattleMechQualityGenerationMethod.B.text=B +BattleMechQualityGenerationMethod.B.toolTipText=This generates a force solely containing units of B quality. +BattleMechQualityGenerationMethod.A.text=A +BattleMechQualityGenerationMethod.A.toolTipText=This generates a force solely containing units of A quality. +BattleMechQualityGenerationMethod.A_STAR.text=A* +BattleMechQualityGenerationMethod.A_STAR.toolTipText=This generates a force solely containing units of A* quality. # BattleMechWeightClassGenerationMethod Enum BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.text=AtB @@ -128,6 +140,14 @@ BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY.text=Windchild (Heavy Forc BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY.toolTipText=This is a variant of the Windchild Method that creates a heavy force, weighted around medium and heavy 'Mechs.
Generates (before modifiers): 17% Light, 31% Medium, 33% Heavy, 19% Assault. BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.text=Windchild (Assault Force) BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.toolTipText=This is a variant of the Windchild Method that creates an assault force, weighted around heavy and assault 'Mechs.
Generates (before modifiers): 8% Light, 19% Medium, 33% Heavy, 39% Assault (rounded normally). +BattleMechWeightClassGenerationMethod.LIGHT.text=Light +BattleMechWeightClassGenerationMethod.LIGHT.toolTipText=This generates a force containing just light 'Mechs. +BattleMechWeightClassGenerationMethod.MEDIUM.text=Medium +BattleMechWeightClassGenerationMethod.MEDIUM.toolTipText=This generates a force containing just medium 'Mechs. +BattleMechWeightClassGenerationMethod.HEAVY.text=Heavy +BattleMechWeightClassGenerationMethod.HEAVY.toolTipText=This generates a force containing just heavy 'Mechs. +BattleMechWeightClassGenerationMethod.ASSAULT.text=Assault +BattleMechWeightClassGenerationMethod.ASSAULT.toolTipText=This generates a force containing just assault 'Mechs. # CompanyGenerationMethod Enum CompanyGenerationMethod.AGAINST_THE_BOT.text=AtB diff --git a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java index 5acb3cdb25..7373f9c81f 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java @@ -19,16 +19,20 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; -import mekhq.campaign.universe.generators.battleMechQualityGenerators.AbstractBattleMechQualityGenerator; -import mekhq.campaign.universe.generators.battleMechQualityGenerators.AtBBattleMechQualityGenerator; -import mekhq.campaign.universe.generators.battleMechQualityGenerators.WindchildBattleMechQualityGenerator; +import mekhq.campaign.universe.generators.battleMechQualityGenerators.*; import java.util.ResourceBundle; public enum BattleMechQualityGenerationMethod { //region Enum Declarations AGAINST_THE_BOT("BattleMechQualityGenerationMethod.AGAINST_THE_BOT.text", "BattleMechQualityGenerationMethod.AGAINST_THE_BOT.toolTipText"), - WINDCHILD("BattleMechQualityGenerationMethod.WINDCHILD.text", "BattleMechQualityGenerationMethod.WINDCHILD.toolTipText"); + WINDCHILD("BattleMechQualityGenerationMethod.WINDCHILD.text", "BattleMechQualityGenerationMethod.WINDCHILD.toolTipText"), + F("BattleMechQualityGenerationMethod.F.text", "BattleMechQualityGenerationMethod.F.toolTipText"), + D("BattleMechQualityGenerationMethod.D.text", "BattleMechQualityGenerationMethod.D.toolTipText"), + C("BattleMechQualityGenerationMethod.C.text", "BattleMechQualityGenerationMethod.C.toolTipText"), + B("BattleMechQualityGenerationMethod.B.text", "BattleMechQualityGenerationMethod.B.toolTipText"), + A("BattleMechQualityGenerationMethod.A.text", "BattleMechQualityGenerationMethod.A.toolTipText"), + A_STAR("BattleMechQualityGenerationMethod.A_STAR.text", "BattleMechQualityGenerationMethod.A_STAR.toolTipText"); //endregion Enum Declarations //region Variable Declarations @@ -58,12 +62,48 @@ public boolean isAgainstTheBot() { public boolean isWindchild() { return this == WINDCHILD; } + + public boolean isF() { + return this == F; + } + + public boolean isD() { + return this == D; + } + + public boolean isC() { + return this == C; + } + + public boolean isB() { + return this == B; + } + + public boolean isA() { + return this == A; + } + + public boolean isAStar() { + return this == A_STAR; + } //endregion Boolean Comparison Methods public AbstractBattleMechQualityGenerator getGenerator() { switch (this) { case AGAINST_THE_BOT: return new AtBBattleMechQualityGenerator(); + case F: + return new FBattleMechQualityGenerator(); + case D: + return new DBattleMechQualityGenerator(); + case C: + return new CBattleMechQualityGenerator(); + case B: + return new BBattleMechQualityGenerator(); + case A: + return new ABattleMechQualityGenerator(); + case A_STAR: + return new AStarBattleMechQualityGenerator(); case WINDCHILD: default: return new WindchildBattleMechQualityGenerator(); diff --git a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java index 7e7ab586f2..b473506430 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java @@ -30,7 +30,11 @@ public enum BattleMechWeightClassGenerationMethod { WINDCHILD_LIGHT("BattleMechWeightClassGenerationMethod.WINDCHILD_LIGHT.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_LIGHT.toolTipText"), WINDCHILD_MEDIUM("BattleMechWeightClassGenerationMethod.WINDCHILD_MEDIUM.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_MEDIUM.toolTipText"), WINDCHILD_HEAVY("BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_HEAVY.toolTipText"), - WINDCHILD_ASSAULT("BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.toolTipText"); + WINDCHILD_ASSAULT("BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.text", "BattleMechWeightClassGenerationMethod.WINDCHILD_ASSAULT.toolTipText"), + LIGHT("BattleMechWeightClassGenerationMethod.LIGHT.text", "BattleMechWeightClassGenerationMethod.LIGHT.toolTipText"), + MEDIUM("BattleMechWeightClassGenerationMethod.MEDIUM.text", "BattleMechWeightClassGenerationMethod.MEDIUM.toolTipText"), + HEAVY("BattleMechWeightClassGenerationMethod.HEAVY.text", "BattleMechWeightClassGenerationMethod.HEAVY.toolTipText"), + ASSAULT("BattleMechWeightClassGenerationMethod.ASSAULT.text", "BattleMechWeightClassGenerationMethod.ASSAULT.toolTipText"); //endregion Enum Declarations //region Variable Declarations @@ -76,6 +80,22 @@ public boolean isWindchildHeavy() { public boolean isWindchildAssault() { return this == WINDCHILD_ASSAULT; } + + public boolean isLight() { + return this == LIGHT; + } + + public boolean isMedium() { + return this == MEDIUM; + } + + public boolean isHeavy() { + return this == HEAVY; + } + + public boolean isAssault() { + return this == ASSAULT; + } //endregion Boolean Comparison Methods public AbstractBattleMechWeightClassGenerator getGenerator() { @@ -90,6 +110,14 @@ public AbstractBattleMechWeightClassGenerator getGenerator() { return new WindchildHeavyBattleMechWeightClassGenerator(); case WINDCHILD_ASSAULT: return new WindchildAssaultBattleMechWeightClassGenerator(); + case LIGHT: + return new LightBattleMechWeightClassGenerator(); + case MEDIUM: + return new MediumBattleMechWeightClassGenerator(); + case HEAVY: + return new HeavyBattleMechWeightClassGenerator(); + case ASSAULT: + return new AssaultBattleMechWeightClassGenerator(); case WINDCHILD: default: return new WindchildBattleMechWeightClassGenerator(); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/ABattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/ABattleMechQualityGenerator.java new file mode 100644 index 0000000000..df54156799 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/ABattleMechQualityGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +public class ABattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { + //region Constructors + public ABattleMechQualityGenerator() { + super(BattleMechQualityGenerationMethod.A); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return IUnitRating.DRAGOON_A; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AStarBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AStarBattleMechQualityGenerator.java new file mode 100644 index 0000000000..2aa9fc0ac8 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AStarBattleMechQualityGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +public class AStarBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { + //region Constructors + public AStarBattleMechQualityGenerator() { + super(BattleMechQualityGenerationMethod.A_STAR); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return IUnitRating.DRAGOON_ASTAR; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/BBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/BBattleMechQualityGenerator.java new file mode 100644 index 0000000000..44421c4c89 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/BBattleMechQualityGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +public class BBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { + //region Constructors + public BBattleMechQualityGenerator() { + super(BattleMechQualityGenerationMethod.B); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return IUnitRating.DRAGOON_B; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/CBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/CBattleMechQualityGenerator.java new file mode 100644 index 0000000000..f7fb4a1f61 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/CBattleMechQualityGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +public class CBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { + //region Constructors + public CBattleMechQualityGenerator() { + super(BattleMechQualityGenerationMethod.C); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return IUnitRating.DRAGOON_C; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/DBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/DBattleMechQualityGenerator.java new file mode 100644 index 0000000000..72a235e00a --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/DBattleMechQualityGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +public class DBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { + //region Constructors + public DBattleMechQualityGenerator() { + super(BattleMechQualityGenerationMethod.D); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return IUnitRating.DRAGOON_D; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/FBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/FBattleMechQualityGenerator.java new file mode 100644 index 0000000000..8161a9b647 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/FBattleMechQualityGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechQualityGenerators; + +import mekhq.campaign.rating.IUnitRating; +import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; + +public class FBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { + //region Constructors + public FBattleMechQualityGenerator() { + super(BattleMechQualityGenerationMethod.F); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return IUnitRating.DRAGOON_F; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java index edf6325a3b..70ecec3968 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java @@ -43,7 +43,9 @@ public BattleMechWeightClassGenerationMethod getMethod() { /** * @param roll the modified roll to use - * @return the generated EntityWeightClass + * @return the generated EntityWeightClass, returning EntityWeightClass.WEIGHT_ULTRA_LIGHT to + * signify no generation and EntityWeightClass.WEIGHT_SUPER_HEAVY to signify Star League-era + * generation. */ public abstract int generate(final int roll); } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AssaultBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AssaultBattleMechWeightClassGenerator.java new file mode 100644 index 0000000000..e4b54f7bf1 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AssaultBattleMechWeightClassGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; + +public class AssaultBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { + //region Constructors + public AssaultBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.ASSAULT); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return EntityWeightClass.WEIGHT_ASSAULT; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/HeavyBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/HeavyBattleMechWeightClassGenerator.java new file mode 100644 index 0000000000..ca8ef951ce --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/HeavyBattleMechWeightClassGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; + +public class HeavyBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { + //region Constructors + public HeavyBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.HEAVY); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return EntityWeightClass.WEIGHT_HEAVY; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/LightBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/LightBattleMechWeightClassGenerator.java new file mode 100644 index 0000000000..083a35e7a3 --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/LightBattleMechWeightClassGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; + +public class LightBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { + //region Constructors + public LightBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.LIGHT); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return EntityWeightClass.WEIGHT_LIGHT; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/MediumBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/MediumBattleMechWeightClassGenerator.java new file mode 100644 index 0000000000..25eae0578e --- /dev/null +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/MediumBattleMechWeightClassGenerator.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ +package mekhq.campaign.universe.generators.battleMechWeightClassGenerators; + +import megamek.common.EntityWeightClass; +import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; + +public class MediumBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { + //region Constructors + public MediumBattleMechWeightClassGenerator() { + super(BattleMechWeightClassGenerationMethod.MEDIUM); + } + //endregion Constructors + + @Override + public int generate(final int roll) { + return EntityWeightClass.WEIGHT_MEDIUM; + } +} diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 06dff97472..e3a0ca467a 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -639,8 +639,8 @@ private List createUnitGenerationParameters( } /** - * Creates an individual set of parameters, rerolling the weight if Star League is rolled - * originally. + * Creates an individual set of parameters, rerolling the weight if Star League + * (EntityWeightClass.WEIGHT_SUPER_HEAVY) is rolled originally. * * @param tracker the tracker to generate the parameters based on * @return the created parameters @@ -657,16 +657,17 @@ private AtBRandomMechParameters createUnitGenerationParameter( /** * @param tracker the tracker to roll based on - * @param initialRoll if this isn't the initial roll, then we need to cap the value at 12 - * @return the weight to use in generating the BattleMech + * @param initialRoll if this isn't the initial roll, then we need to cap the Entity Weight + * Class at EntityWeightClass.WEIGHT_ASSAULT + * @return the weight to use in generating the BattleMech, which may be + * EntityWeightClass.WEIGHT_NONE to not generate a BattleMech or + * EntityWeightClass.WEIGHT_SUPER_HEAVY to generate a Star League BattleMech */ private int rollBattleMechWeight(final CompanyGenerationPersonTracker tracker, final boolean initialRoll) { - int roll = Utilities.dice(2, 6) + getUnitGenerationParameterModifier(tracker); - if (!initialRoll) { - roll = Math.min(roll, 12); - } - return getBattleMechWeightClassGenerator().generate(roll); + final int roll = Utilities.dice(2, 6) + getUnitGenerationParameterModifier(tracker); + final int entityWeightClass = getBattleMechWeightClassGenerator().generate(roll); + return initialRoll ? entityWeightClass : Math.min(entityWeightClass, EntityWeightClass.WEIGHT_ASSAULT); } /** From 80accdad7fb2b766a784fd1d347655ef3a036aed Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 22 Dec 2021 12:24:22 -0500 Subject: [PATCH 070/115] Fixing marriage build failure --- .../generators/companyGenerators/AbstractCompanyGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index e3a0ca467a..9f0d6e0146 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -537,7 +537,7 @@ private void finalizePersonnel(final Campaign campaign, final List Date: Wed, 22 Dec 2021 12:34:01 -0500 Subject: [PATCH 071/115] Fixing spacing mistake --- .../companyGenerators/AbstractCompanyGenerator.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 9f0d6e0146..f0d497b29b 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -78,26 +78,25 @@ * Button that lets you pop out the options panel with everything disabled * * TODO - Wave 2: - * Marriage Module : Open : MHQ 2851 * Random Origin Options : Open : MHQ 2856 * Force Icon Rework : Open : MHQ 2946 * Finish Finances * Backgrounds don't work * Panel has odd whitespace usage * System, Planet text search (if possible and feasible - might also be a bugfix, or require a new component) - * TODO - Wave 3: + * TODO - Wave 3: * Contract Market Pane * Campaign Options Pane, Campaign Options Dialog Base Validation * Date Pane - * TODO - Wave 4: + * TODO - Wave 4: * Startup GUI Rework - * TODO - Wave 5: + * TODO - Wave 5: * Company Generator GUI * Implement Contracts - * TODO - Wave 6: + * TODO - Wave 6: * Suite Options loading during startup, during the first load of a newer version (use a SuiteOption to track) * Add MegaMek Options as a panel during the startup - * TODO - Wave 7: + * TODO - Wave 7: * Implement Era-based Part Generators * Implement Surprises * Implement Mystery Boxes From 9b2db751c70d185315c491e5305dba6018966bf3 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 22 Dec 2021 12:41:22 -0500 Subject: [PATCH 072/115] Fixing a few things for unit quality generation --- MekHQ/resources/mekhq/resources/Universe.properties | 12 ++++++------ .../companyGenerators/WindchildCompanyGenerator.java | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index d36ac836c2..85e373905d 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -115,17 +115,17 @@ BattleMechQualityGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows BattleMechQualityGenerationMethod.WINDCHILD.text=Windchild BattleMechQualityGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB method that generates a higher base quality.
Generates (before modifiers): 17% F, 25% D, 31% C, 19% B, 8% A. BattleMechQualityGenerationMethod.F.text=F -BattleMechQualityGenerationMethod.F.toolTipText=This generates a force solely containing units of F quality. +BattleMechQualityGenerationMethod.F.toolTipText=This generates a force solely containing units of F quality.

BattleMechQualityGenerationMethod.D.text=D -BattleMechQualityGenerationMethod.D.toolTipText=This generates a force solely containing units of D quality. +BattleMechQualityGenerationMethod.D.toolTipText=This generates a force solely containing units of D quality.

BattleMechQualityGenerationMethod.C.text=C -BattleMechQualityGenerationMethod.C.toolTipText=This generates a force solely containing units of C quality. +BattleMechQualityGenerationMethod.C.toolTipText=This generates a force solely containing units of C quality.

BattleMechQualityGenerationMethod.B.text=B -BattleMechQualityGenerationMethod.B.toolTipText=This generates a force solely containing units of B quality. +BattleMechQualityGenerationMethod.B.toolTipText=This generates a force solely containing units of B quality.

BattleMechQualityGenerationMethod.A.text=A -BattleMechQualityGenerationMethod.A.toolTipText=This generates a force solely containing units of A quality. +BattleMechQualityGenerationMethod.A.toolTipText=This generates a force solely containing units of A quality.

BattleMechQualityGenerationMethod.A_STAR.text=A* -BattleMechQualityGenerationMethod.A_STAR.toolTipText=This generates a force solely containing units of A* quality. +BattleMechQualityGenerationMethod.A_STAR.toolTipText=This generates a force solely containing units of A* quality.

# BattleMechWeightClassGenerationMethod Enum BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.text=AtB diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 1e4f0c799d..8aa5572b70 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -75,8 +75,8 @@ protected MechSummary generateMechSummary(final Campaign campaign, if (faction.isClan()) { // Clanners generate using the Keshik Table if they roll A*, otherwise they roll on // the Front Line tables - parameters.setQuality((parameters.getQuality() < IUnitRating.DRAGOON_ASTAR) - ? IUnitRating.DRAGOON_B : parameters.getQuality()); + parameters.setQuality((parameters.getQuality() == IUnitRating.DRAGOON_ASTAR) + ? IUnitRating.DRAGOON_ASTAR : IUnitRating.DRAGOON_B); return generateMechSummary(campaign, parameters, faction.getShortName(), campaign.getGameYear()); } else { // Roll on the Star League Royal table if you get a SL mech with A* Rating From 2e3ee64201a1266b27dd7a9f1b49f76d0cb0fd3c Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 22 Dec 2021 15:28:27 -0500 Subject: [PATCH 073/115] Creating additional options for generation - Industrial Mech, Star League, and OmniMech options --- .../resources/mekhq/resources/GUI.properties | 6 ++ .../CompanyGenerationOptions.java | 42 ++++++++++++++ .../AbstractCompanyGenerator.java | 12 +++- .../panels/CompanyGenerationOptionsPanel.java | 55 +++++++++++++++++++ 4 files changed, 113 insertions(+), 2 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 87c028b8ed..1787a111ce 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -797,6 +797,12 @@ lblBattleMechWeightClassGenerationMethod.text=BattleMech Weight Class Generation lblBattleMechWeightClassGenerationMethod.toolTipText= lblBattleMechQualityGenerationMethod.text=BattleMech Quality Generation Method lblBattleMechQualityGenerationMethod.toolTipText= +chkOnlyGenerateStarLeagueMechs.text=Only Generate Star League 'Mechs +chkOnlyGenerateStarLeagueMechs.toolTipText= +chkOnlyGenerateIndustrialMechs.text=Only Generate IndustrialMechs +chkOnlyGenerateIndustrialMechs.toolTipText= +chkOnlyGenerateOmniMechs.text=Only Generate OmniMechs +chkOnlyGenerateOmniMechs.toolTipText= chkGenerateUnitsAsAttached.text=Generate Units as Attached chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the Against the Bot rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MechWarrior when they retire
(provided the campaign options are enabled). chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 9073ffc787..600c4de09d 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -79,6 +79,9 @@ public class CompanyGenerationOptions implements Serializable { // Units private BattleMechWeightClassGenerationMethod battleMechWeightClassGenerationMethod; private BattleMechQualityGenerationMethod battleMechQualityGenerationMethod; + private boolean onlyGenerateStarLeagueMechs; + private boolean onlyGenerateIndustrialMechs; + private boolean onlyGenerateOmniMechs; private boolean generateUnitsAsAttached; private boolean assignBestRollToUnitCommander; private boolean sortStarLeagueUnitsFirst; @@ -189,6 +192,9 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp setBattleMechQualityGenerationMethod(method.isAtB() ? BattleMechQualityGenerationMethod.AGAINST_THE_BOT : BattleMechQualityGenerationMethod.WINDCHILD); + setOnlyGenerateStarLeagueMechs(false); + setOnlyGenerateIndustrialMechs(false); + setOnlyGenerateOmniMechs(false); setGenerateUnitsAsAttached(method.isAtB()); setAssignBestRollToUnitCommander(method.isWindchild()); setSortStarLeagueUnitsFirst(true); @@ -470,6 +476,30 @@ public void setBattleMechQualityGenerationMethod( this.battleMechQualityGenerationMethod = battleMechQualityGenerationMethod; } + public boolean isOnlyGenerateStarLeagueMechs() { + return onlyGenerateStarLeagueMechs; + } + + public void setOnlyGenerateStarLeagueMechs(final boolean onlyGenerateStarLeagueMechs) { + this.onlyGenerateStarLeagueMechs = onlyGenerateStarLeagueMechs; + } + + public boolean isOnlyGenerateIndustrialMechs() { + return onlyGenerateIndustrialMechs; + } + + public void setOnlyGenerateIndustrialMechs(final boolean onlyGenerateIndustrialMechs) { + this.onlyGenerateIndustrialMechs = onlyGenerateIndustrialMechs; + } + + public boolean isOnlyGenerateOmniMechs() { + return onlyGenerateOmniMechs; + } + + public void setOnlyGenerateOmniMechs(final boolean onlyGenerateOmniMechs) { + this.onlyGenerateOmniMechs = onlyGenerateOmniMechs; + } + public boolean isGenerateUnitsAsAttached() { return generateUnitsAsAttached; } @@ -835,6 +865,9 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String // Units MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "battleMechWeightClassGenerationMethod", getBattleMechWeightClassGenerationMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "battleMechQualityGenerationMethod", getBattleMechQualityGenerationMethod().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateStarLeagueMechs", isOnlyGenerateStarLeagueMechs()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateIndustrialMechs", isOnlyGenerateIndustrialMechs()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateOmniMechs", isOnlyGenerateOmniMechs()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToUnitCommander", isAssignBestRollToUnitCommander()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sortStarLeagueUnitsFirst", isSortStarLeagueUnitsFirst()); @@ -1048,6 +1081,15 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, case "battleMechQualityGenerationMethod": options.setBattleMechQualityGenerationMethod(BattleMechQualityGenerationMethod.valueOf(wn.getTextContent().trim())); break; + case "onlyGenerateStarLeagueMechs": + options.setOnlyGenerateStarLeagueMechs(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "onlyGenerateIndustrialMechs": + options.setOnlyGenerateIndustrialMechs(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "onlyGenerateOmniMechs": + options.setOnlyGenerateOmniMechs(Boolean.parseBoolean(wn.getTextContent().trim())); + break; case "generateUnitsAsAttached": options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn.getTextContent().trim())); break; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index f0d497b29b..47e6c7d097 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -647,7 +647,9 @@ private List createUnitGenerationParameters( private AtBRandomMechParameters createUnitGenerationParameter( final CompanyGenerationPersonTracker tracker) { final AtBRandomMechParameters parameters = new AtBRandomMechParameters( - rollBattleMechWeight(tracker, true), rollBattleMechQuality(tracker)); + getOptions().isOnlyGenerateStarLeagueMechs() ? EntityWeightClass.WEIGHT_SUPER_HEAVY + : rollBattleMechWeight(tracker, true), + rollBattleMechQuality(tracker)); if (parameters.isStarLeague()) { parameters.setWeight(rollBattleMechWeight(tracker, false)); } @@ -829,8 +831,14 @@ protected abstract MechSummary generateMechSummary(final Campaign campaign, protected MechSummary generateMechSummary(final Campaign campaign, final AtBRandomMechParameters parameters, final String faction, int year) { - final Predicate filter = ms -> + Predicate filter = ms -> (!campaign.getCampaignOptions().limitByYear() || (year > ms.getYear())); + if (getOptions().isOnlyGenerateIndustrialMechs()) { + filter = filter.and(ms -> "Industrial".equalsIgnoreCase(ms.getUnitSubType())); + } else if (getOptions().isOnlyGenerateOmniMechs()) { + filter = filter.and(ms -> "Omni".equalsIgnoreCase(ms.getUnitSubType())); + } + return campaign.getUnitGenerator().generate(faction, UnitType.MEK, parameters.getWeight(), year, parameters.getQuality(), filter); } diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index a131f1feb0..4e4e3d329a 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -85,6 +85,9 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { // Units private MMComboBox comboBattleMechWeightClassGenerationMethod; private MMComboBox comboBattleMechQualityGenerationMethod; + private JCheckBox chkOnlyGenerateStarLeagueMechs; + private JCheckBox chkOnlyGenerateIndustrialMechs; + private JCheckBox chkOnlyGenerateOmniMechs; private JCheckBox chkGenerateUnitsAsAttached; private JCheckBox chkAssignBestRollToUnitCommander; private JCheckBox chkSortStarLeagueUnitsFirst; @@ -431,6 +434,30 @@ public void setComboBattleMechQualityGenerationMethod( this.comboBattleMechQualityGenerationMethod = comboBattleMechQualityGenerationMethod; } + public JCheckBox getChkOnlyGenerateStarLeagueMechs() { + return chkOnlyGenerateStarLeagueMechs; + } + + public void setChkOnlyGenerateStarLeagueMechs(JCheckBox chkOnlyGenerateStarLeagueMechs) { + this.chkOnlyGenerateStarLeagueMechs = chkOnlyGenerateStarLeagueMechs; + } + + public JCheckBox getChkOnlyGenerateIndustrialMechs() { + return chkOnlyGenerateIndustrialMechs; + } + + public void setChkOnlyGenerateIndustrialMechs(JCheckBox chkOnlyGenerateIndustrialMechs) { + this.chkOnlyGenerateIndustrialMechs = chkOnlyGenerateIndustrialMechs; + } + + public JCheckBox getChkOnlyGenerateOmniMechs() { + return chkOnlyGenerateOmniMechs; + } + + public void setChkOnlyGenerateOmniMechs(JCheckBox chkOnlyGenerateOmniMechs) { + this.chkOnlyGenerateOmniMechs = chkOnlyGenerateOmniMechs; + } + public JCheckBox getChkGenerateUnitsAsAttached() { return chkGenerateUnitsAsAttached; } @@ -1296,6 +1323,22 @@ public Component getListCellRendererComponent(final JList list, final Object } }); + setChkOnlyGenerateStarLeagueMechs(new JCheckBox(resources.getString("chkOnlyGenerateStarLeagueMechs.text"))); + getChkOnlyGenerateStarLeagueMechs().setToolTipText(resources.getString("chkOnlyGenerateStarLeagueMechs.toolTipText")); + getChkOnlyGenerateStarLeagueMechs().setName("chkOnlyGenerateStarLeagueMechs"); + + setChkOnlyGenerateIndustrialMechs(new JCheckBox(resources.getString("chkOnlyGenerateIndustrialMechs.text"))); + getChkOnlyGenerateIndustrialMechs().setToolTipText(resources.getString("chkOnlyGenerateIndustrialMechs.toolTipText")); + getChkOnlyGenerateIndustrialMechs().setName("chkOnlyGenerateIndustrialMechs"); + getChkOnlyGenerateIndustrialMechs().addActionListener(evt -> + getChkOnlyGenerateOmniMechs().setEnabled(!getChkOnlyGenerateIndustrialMechs().isSelected())); + + setChkOnlyGenerateOmniMechs(new JCheckBox(resources.getString("chkOnlyGenerateOmniMechs.text"))); + getChkOnlyGenerateOmniMechs().setToolTipText(resources.getString("chkOnlyGenerateOmniMechs.toolTipText")); + getChkOnlyGenerateOmniMechs().setName("chkOnlyGenerateOmniMechs"); + getChkOnlyGenerateOmniMechs().addActionListener(evt -> + getChkOnlyGenerateIndustrialMechs().setEnabled(!getChkOnlyGenerateOmniMechs().isSelected())); + setChkGenerateUnitsAsAttached(new JCheckBox(resources.getString("chkGenerateUnitsAsAttached.text"))); getChkGenerateUnitsAsAttached().setToolTipText(resources.getString("chkGenerateUnitsAsAttached.toolTipText")); getChkGenerateUnitsAsAttached().setName("chkGenerateUnitsAsAttached"); @@ -1346,6 +1389,9 @@ public Component getListCellRendererComponent(final JList list, final Object .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblBattleMechQualityGenerationMethod) .addComponent(getComboBattleMechQualityGenerationMethod(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkOnlyGenerateStarLeagueMechs()) + .addComponent(getChkOnlyGenerateIndustrialMechs()) + .addComponent(getChkOnlyGenerateOmniMechs()) .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) .addComponent(getChkSortStarLeagueUnitsFirst()) @@ -1363,6 +1409,9 @@ public Component getListCellRendererComponent(final JList list, final Object .addGroup(layout.createSequentialGroup() .addComponent(lblBattleMechQualityGenerationMethod) .addComponent(getComboBattleMechQualityGenerationMethod())) + .addComponent(getChkOnlyGenerateStarLeagueMechs()) + .addComponent(getChkOnlyGenerateIndustrialMechs()) + .addComponent(getChkOnlyGenerateOmniMechs()) .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) .addComponent(getChkSortStarLeagueUnitsFirst()) @@ -1943,6 +1992,9 @@ public void setOptions(final CompanyGenerationOptions options) { // Units getComboBattleMechWeightClassGenerationMethod().setSelectedItem(options.getBattleMechWeightClassGenerationMethod()); getComboBattleMechQualityGenerationMethod().setSelectedItem(options.getBattleMechQualityGenerationMethod()); + getChkOnlyGenerateStarLeagueMechs().setSelected(options.isOnlyGenerateStarLeagueMechs()); + getChkOnlyGenerateIndustrialMechs().setSelected(options.isOnlyGenerateIndustrialMechs()); + getChkOnlyGenerateOmniMechs().setSelected(options.isOnlyGenerateOmniMechs()); getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); getChkAssignBestRollToUnitCommander().setSelected(options.isAssignBestRollToUnitCommander()); getChkSortStarLeagueUnitsFirst().setSelected(options.isSortStarLeagueUnitsFirst()); @@ -2058,6 +2110,9 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Units options.setBattleMechWeightClassGenerationMethod(getComboBattleMechWeightClassGenerationMethod().getSelectedItem()); options.setBattleMechQualityGenerationMethod(getComboBattleMechQualityGenerationMethod().getSelectedItem()); + options.setOnlyGenerateStarLeagueMechs(getChkOnlyGenerateStarLeagueMechs().isSelected()); + options.setOnlyGenerateIndustrialMechs(getChkOnlyGenerateIndustrialMechs().isSelected()); + options.setOnlyGenerateOmniMechs(getChkOnlyGenerateOmniMechs().isSelected()); options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); options.setAssignBestRollToUnitCommander(getChkAssignBestRollToUnitCommander().isSelected()); options.setSortStarLeagueUnitsFirst(getChkSortStarLeagueUnitsFirst().isSelected()); From 7bfdcab728ee45e56eba2dcbfeefadc0eb5ea10e Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 22 Dec 2021 15:30:27 -0500 Subject: [PATCH 074/115] Fixing minimum float tooltip --- MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 4e4e3d329a..11cdcbe0a9 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -1741,7 +1741,7 @@ private JPanel createFinancesPanel() { lblMinimumStartingFloat.setName("lblMinimumStartingFloat"); setSpnMinimumStartingFloat(new JSpinner(new SpinnerNumberModel(0, 0, 10000000, 100000))); - getSpnMinimumStartingFloat().setToolTipText("lblMinimumStartingFloat.toolTipText"); + getSpnMinimumStartingFloat().setToolTipText(resources.getString("lblMinimumStartingFloat.toolTipText")); getSpnMinimumStartingFloat().setName("spnMinimumStartingFloat"); setChkPayForSetup(new JCheckBox(resources.getString("chkPayForSetup.text"))); From d94b51f930d3884c1c35d665b671b7ecfba6af78 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 22 Dec 2021 16:37:42 -0500 Subject: [PATCH 075/115] Removing Industrial Mech only generation option as it is unworkable --- .../resources/mekhq/resources/GUI.properties | 2 -- .../CompanyGenerationOptions.java | 14 ------------- .../AbstractCompanyGenerator.java | 4 +--- .../panels/CompanyGenerationOptionsPanel.java | 21 ------------------- 4 files changed, 1 insertion(+), 40 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 1787a111ce..5667292ab6 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -799,8 +799,6 @@ lblBattleMechQualityGenerationMethod.text=BattleMech Quality Generation Method lblBattleMechQualityGenerationMethod.toolTipText= chkOnlyGenerateStarLeagueMechs.text=Only Generate Star League 'Mechs chkOnlyGenerateStarLeagueMechs.toolTipText= -chkOnlyGenerateIndustrialMechs.text=Only Generate IndustrialMechs -chkOnlyGenerateIndustrialMechs.toolTipText= chkOnlyGenerateOmniMechs.text=Only Generate OmniMechs chkOnlyGenerateOmniMechs.toolTipText= chkGenerateUnitsAsAttached.text=Generate Units as Attached diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 600c4de09d..0791341980 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -80,7 +80,6 @@ public class CompanyGenerationOptions implements Serializable { private BattleMechWeightClassGenerationMethod battleMechWeightClassGenerationMethod; private BattleMechQualityGenerationMethod battleMechQualityGenerationMethod; private boolean onlyGenerateStarLeagueMechs; - private boolean onlyGenerateIndustrialMechs; private boolean onlyGenerateOmniMechs; private boolean generateUnitsAsAttached; private boolean assignBestRollToUnitCommander; @@ -193,7 +192,6 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp ? BattleMechQualityGenerationMethod.AGAINST_THE_BOT : BattleMechQualityGenerationMethod.WINDCHILD); setOnlyGenerateStarLeagueMechs(false); - setOnlyGenerateIndustrialMechs(false); setOnlyGenerateOmniMechs(false); setGenerateUnitsAsAttached(method.isAtB()); setAssignBestRollToUnitCommander(method.isWindchild()); @@ -484,14 +482,6 @@ public void setOnlyGenerateStarLeagueMechs(final boolean onlyGenerateStarLeagueM this.onlyGenerateStarLeagueMechs = onlyGenerateStarLeagueMechs; } - public boolean isOnlyGenerateIndustrialMechs() { - return onlyGenerateIndustrialMechs; - } - - public void setOnlyGenerateIndustrialMechs(final boolean onlyGenerateIndustrialMechs) { - this.onlyGenerateIndustrialMechs = onlyGenerateIndustrialMechs; - } - public boolean isOnlyGenerateOmniMechs() { return onlyGenerateOmniMechs; } @@ -866,7 +856,6 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "battleMechWeightClassGenerationMethod", getBattleMechWeightClassGenerationMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "battleMechQualityGenerationMethod", getBattleMechQualityGenerationMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateStarLeagueMechs", isOnlyGenerateStarLeagueMechs()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateIndustrialMechs", isOnlyGenerateIndustrialMechs()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateOmniMechs", isOnlyGenerateOmniMechs()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToUnitCommander", isAssignBestRollToUnitCommander()); @@ -1084,9 +1073,6 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, case "onlyGenerateStarLeagueMechs": options.setOnlyGenerateStarLeagueMechs(Boolean.parseBoolean(wn.getTextContent().trim())); break; - case "onlyGenerateIndustrialMechs": - options.setOnlyGenerateIndustrialMechs(Boolean.parseBoolean(wn.getTextContent().trim())); - break; case "onlyGenerateOmniMechs": options.setOnlyGenerateOmniMechs(Boolean.parseBoolean(wn.getTextContent().trim())); break; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 47e6c7d097..c3502356a5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -833,9 +833,7 @@ protected MechSummary generateMechSummary(final Campaign campaign, final String faction, int year) { Predicate filter = ms -> (!campaign.getCampaignOptions().limitByYear() || (year > ms.getYear())); - if (getOptions().isOnlyGenerateIndustrialMechs()) { - filter = filter.and(ms -> "Industrial".equalsIgnoreCase(ms.getUnitSubType())); - } else if (getOptions().isOnlyGenerateOmniMechs()) { + if (getOptions().isOnlyGenerateOmniMechs()) { filter = filter.and(ms -> "Omni".equalsIgnoreCase(ms.getUnitSubType())); } diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 11cdcbe0a9..c6c9cb6379 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -86,7 +86,6 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { private MMComboBox comboBattleMechWeightClassGenerationMethod; private MMComboBox comboBattleMechQualityGenerationMethod; private JCheckBox chkOnlyGenerateStarLeagueMechs; - private JCheckBox chkOnlyGenerateIndustrialMechs; private JCheckBox chkOnlyGenerateOmniMechs; private JCheckBox chkGenerateUnitsAsAttached; private JCheckBox chkAssignBestRollToUnitCommander; @@ -442,14 +441,6 @@ public void setChkOnlyGenerateStarLeagueMechs(JCheckBox chkOnlyGenerateStarLeagu this.chkOnlyGenerateStarLeagueMechs = chkOnlyGenerateStarLeagueMechs; } - public JCheckBox getChkOnlyGenerateIndustrialMechs() { - return chkOnlyGenerateIndustrialMechs; - } - - public void setChkOnlyGenerateIndustrialMechs(JCheckBox chkOnlyGenerateIndustrialMechs) { - this.chkOnlyGenerateIndustrialMechs = chkOnlyGenerateIndustrialMechs; - } - public JCheckBox getChkOnlyGenerateOmniMechs() { return chkOnlyGenerateOmniMechs; } @@ -1327,17 +1318,9 @@ public Component getListCellRendererComponent(final JList list, final Object getChkOnlyGenerateStarLeagueMechs().setToolTipText(resources.getString("chkOnlyGenerateStarLeagueMechs.toolTipText")); getChkOnlyGenerateStarLeagueMechs().setName("chkOnlyGenerateStarLeagueMechs"); - setChkOnlyGenerateIndustrialMechs(new JCheckBox(resources.getString("chkOnlyGenerateIndustrialMechs.text"))); - getChkOnlyGenerateIndustrialMechs().setToolTipText(resources.getString("chkOnlyGenerateIndustrialMechs.toolTipText")); - getChkOnlyGenerateIndustrialMechs().setName("chkOnlyGenerateIndustrialMechs"); - getChkOnlyGenerateIndustrialMechs().addActionListener(evt -> - getChkOnlyGenerateOmniMechs().setEnabled(!getChkOnlyGenerateIndustrialMechs().isSelected())); - setChkOnlyGenerateOmniMechs(new JCheckBox(resources.getString("chkOnlyGenerateOmniMechs.text"))); getChkOnlyGenerateOmniMechs().setToolTipText(resources.getString("chkOnlyGenerateOmniMechs.toolTipText")); getChkOnlyGenerateOmniMechs().setName("chkOnlyGenerateOmniMechs"); - getChkOnlyGenerateOmniMechs().addActionListener(evt -> - getChkOnlyGenerateIndustrialMechs().setEnabled(!getChkOnlyGenerateOmniMechs().isSelected())); setChkGenerateUnitsAsAttached(new JCheckBox(resources.getString("chkGenerateUnitsAsAttached.text"))); getChkGenerateUnitsAsAttached().setToolTipText(resources.getString("chkGenerateUnitsAsAttached.toolTipText")); @@ -1390,7 +1373,6 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(lblBattleMechQualityGenerationMethod) .addComponent(getComboBattleMechQualityGenerationMethod(), GroupLayout.Alignment.LEADING)) .addComponent(getChkOnlyGenerateStarLeagueMechs()) - .addComponent(getChkOnlyGenerateIndustrialMechs()) .addComponent(getChkOnlyGenerateOmniMechs()) .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) @@ -1410,7 +1392,6 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(lblBattleMechQualityGenerationMethod) .addComponent(getComboBattleMechQualityGenerationMethod())) .addComponent(getChkOnlyGenerateStarLeagueMechs()) - .addComponent(getChkOnlyGenerateIndustrialMechs()) .addComponent(getChkOnlyGenerateOmniMechs()) .addComponent(getChkGenerateUnitsAsAttached()) .addComponent(getChkAssignBestRollToUnitCommander()) @@ -1993,7 +1974,6 @@ public void setOptions(final CompanyGenerationOptions options) { getComboBattleMechWeightClassGenerationMethod().setSelectedItem(options.getBattleMechWeightClassGenerationMethod()); getComboBattleMechQualityGenerationMethod().setSelectedItem(options.getBattleMechQualityGenerationMethod()); getChkOnlyGenerateStarLeagueMechs().setSelected(options.isOnlyGenerateStarLeagueMechs()); - getChkOnlyGenerateIndustrialMechs().setSelected(options.isOnlyGenerateIndustrialMechs()); getChkOnlyGenerateOmniMechs().setSelected(options.isOnlyGenerateOmniMechs()); getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); getChkAssignBestRollToUnitCommander().setSelected(options.isAssignBestRollToUnitCommander()); @@ -2111,7 +2091,6 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setBattleMechWeightClassGenerationMethod(getComboBattleMechWeightClassGenerationMethod().getSelectedItem()); options.setBattleMechQualityGenerationMethod(getComboBattleMechQualityGenerationMethod().getSelectedItem()); options.setOnlyGenerateStarLeagueMechs(getChkOnlyGenerateStarLeagueMechs().isSelected()); - options.setOnlyGenerateIndustrialMechs(getChkOnlyGenerateIndustrialMechs().isSelected()); options.setOnlyGenerateOmniMechs(getChkOnlyGenerateOmniMechs().isSelected()); options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); options.setAssignBestRollToUnitCommander(getChkAssignBestRollToUnitCommander().isSelected()); From 26b6e3dbf598ff9a15c75d954a0481d0450496a2 Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 22 Dec 2021 16:51:22 -0500 Subject: [PATCH 076/115] Adding never generate star league unit options --- .../resources/mekhq/resources/GUI.properties | 4 +++- .../CompanyGenerationOptions.java | 14 +++++++++++++ .../AbstractCompanyGenerator.java | 2 +- .../panels/CompanyGenerationOptionsPanel.java | 21 +++++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 5667292ab6..58deaaf825 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -797,10 +797,12 @@ lblBattleMechWeightClassGenerationMethod.text=BattleMech Weight Class Generation lblBattleMechWeightClassGenerationMethod.toolTipText= lblBattleMechQualityGenerationMethod.text=BattleMech Quality Generation Method lblBattleMechQualityGenerationMethod.toolTipText= +chkNeverGenerateStarLeagueMechs.text=Never Generate Star League 'Mechs +chkNeverGenerateStarLeagueMechs.toolTipText= chkOnlyGenerateStarLeagueMechs.text=Only Generate Star League 'Mechs chkOnlyGenerateStarLeagueMechs.toolTipText= chkOnlyGenerateOmniMechs.text=Only Generate OmniMechs -chkOnlyGenerateOmniMechs.toolTipText= +chkOnlyGenerateOmniMechs.toolTipText=This option only pairs with the chkGenerateUnitsAsAttached.text=Generate Units as Attached chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the Against the Bot rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MechWarrior when they retire
(provided the campaign options are enabled). chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 0791341980..720332a45d 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -79,6 +79,7 @@ public class CompanyGenerationOptions implements Serializable { // Units private BattleMechWeightClassGenerationMethod battleMechWeightClassGenerationMethod; private BattleMechQualityGenerationMethod battleMechQualityGenerationMethod; + private boolean neverGenerateStarLeagueMechs; private boolean onlyGenerateStarLeagueMechs; private boolean onlyGenerateOmniMechs; private boolean generateUnitsAsAttached; @@ -191,6 +192,7 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp setBattleMechQualityGenerationMethod(method.isAtB() ? BattleMechQualityGenerationMethod.AGAINST_THE_BOT : BattleMechQualityGenerationMethod.WINDCHILD); + setNeverGenerateStarLeagueMechs(false); setOnlyGenerateStarLeagueMechs(false); setOnlyGenerateOmniMechs(false); setGenerateUnitsAsAttached(method.isAtB()); @@ -474,6 +476,14 @@ public void setBattleMechQualityGenerationMethod( this.battleMechQualityGenerationMethod = battleMechQualityGenerationMethod; } + public boolean isNeverGenerateStarLeagueMechs() { + return neverGenerateStarLeagueMechs; + } + + public void setNeverGenerateStarLeagueMechs(final boolean neverGenerateStarLeagueMechs) { + this.neverGenerateStarLeagueMechs = neverGenerateStarLeagueMechs; + } + public boolean isOnlyGenerateStarLeagueMechs() { return onlyGenerateStarLeagueMechs; } @@ -855,6 +865,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String // Units MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "battleMechWeightClassGenerationMethod", getBattleMechWeightClassGenerationMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "battleMechQualityGenerationMethod", getBattleMechQualityGenerationMethod().name()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "neverGenerateStarLeagueMechs", isNeverGenerateStarLeagueMechs()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateStarLeagueMechs", isOnlyGenerateStarLeagueMechs()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateOmniMechs", isOnlyGenerateOmniMechs()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); @@ -1070,6 +1081,9 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, case "battleMechQualityGenerationMethod": options.setBattleMechQualityGenerationMethod(BattleMechQualityGenerationMethod.valueOf(wn.getTextContent().trim())); break; + case "neverGenerateStarLeagueMechs": + options.setNeverGenerateStarLeagueMechs(Boolean.parseBoolean(wn.getTextContent().trim())); + break; case "onlyGenerateStarLeagueMechs": options.setOnlyGenerateStarLeagueMechs(Boolean.parseBoolean(wn.getTextContent().trim())); break; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index c3502356a5..587148eaf3 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -648,7 +648,7 @@ private AtBRandomMechParameters createUnitGenerationParameter( final CompanyGenerationPersonTracker tracker) { final AtBRandomMechParameters parameters = new AtBRandomMechParameters( getOptions().isOnlyGenerateStarLeagueMechs() ? EntityWeightClass.WEIGHT_SUPER_HEAVY - : rollBattleMechWeight(tracker, true), + : rollBattleMechWeight(tracker, !getOptions().isNeverGenerateStarLeagueMechs()), rollBattleMechQuality(tracker)); if (parameters.isStarLeague()) { parameters.setWeight(rollBattleMechWeight(tracker, false)); diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index c6c9cb6379..31605a5c4b 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -85,6 +85,7 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { // Units private MMComboBox comboBattleMechWeightClassGenerationMethod; private MMComboBox comboBattleMechQualityGenerationMethod; + private JCheckBox chkNeverGenerateStarLeagueMechs; private JCheckBox chkOnlyGenerateStarLeagueMechs; private JCheckBox chkOnlyGenerateOmniMechs; private JCheckBox chkGenerateUnitsAsAttached; @@ -433,6 +434,14 @@ public void setComboBattleMechQualityGenerationMethod( this.comboBattleMechQualityGenerationMethod = comboBattleMechQualityGenerationMethod; } + public JCheckBox getChkNeverGenerateStarLeagueMechs() { + return chkNeverGenerateStarLeagueMechs; + } + + public void setChkNeverGenerateStarLeagueMechs(final JCheckBox chkNeverGenerateStarLeagueMechs) { + this.chkNeverGenerateStarLeagueMechs = chkNeverGenerateStarLeagueMechs; + } + public JCheckBox getChkOnlyGenerateStarLeagueMechs() { return chkOnlyGenerateStarLeagueMechs; } @@ -1314,9 +1323,17 @@ public Component getListCellRendererComponent(final JList list, final Object } }); + setChkNeverGenerateStarLeagueMechs(new JCheckBox(resources.getString("chkNeverGenerateStarLeagueMechs.text"))); + getChkNeverGenerateStarLeagueMechs().setToolTipText(resources.getString("chkNeverGenerateStarLeagueMechs.toolTipText")); + getChkNeverGenerateStarLeagueMechs().setName("chkNeverGenerateStarLeagueMechs"); + getChkNeverGenerateStarLeagueMechs().addActionListener(evt -> + getChkOnlyGenerateStarLeagueMechs().setEnabled(!getChkNeverGenerateStarLeagueMechs().isSelected())); + setChkOnlyGenerateStarLeagueMechs(new JCheckBox(resources.getString("chkOnlyGenerateStarLeagueMechs.text"))); getChkOnlyGenerateStarLeagueMechs().setToolTipText(resources.getString("chkOnlyGenerateStarLeagueMechs.toolTipText")); getChkOnlyGenerateStarLeagueMechs().setName("chkOnlyGenerateStarLeagueMechs"); + getChkOnlyGenerateStarLeagueMechs().addActionListener(evt -> + getChkNeverGenerateStarLeagueMechs().setEnabled(!getChkOnlyGenerateStarLeagueMechs().isSelected())); setChkOnlyGenerateOmniMechs(new JCheckBox(resources.getString("chkOnlyGenerateOmniMechs.text"))); getChkOnlyGenerateOmniMechs().setToolTipText(resources.getString("chkOnlyGenerateOmniMechs.toolTipText")); @@ -1372,6 +1389,7 @@ public Component getListCellRendererComponent(final JList list, final Object .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(lblBattleMechQualityGenerationMethod) .addComponent(getComboBattleMechQualityGenerationMethod(), GroupLayout.Alignment.LEADING)) + .addComponent(getChkNeverGenerateStarLeagueMechs()) .addComponent(getChkOnlyGenerateStarLeagueMechs()) .addComponent(getChkOnlyGenerateOmniMechs()) .addComponent(getChkGenerateUnitsAsAttached()) @@ -1391,6 +1409,7 @@ public Component getListCellRendererComponent(final JList list, final Object .addGroup(layout.createSequentialGroup() .addComponent(lblBattleMechQualityGenerationMethod) .addComponent(getComboBattleMechQualityGenerationMethod())) + .addComponent(getChkNeverGenerateStarLeagueMechs()) .addComponent(getChkOnlyGenerateStarLeagueMechs()) .addComponent(getChkOnlyGenerateOmniMechs()) .addComponent(getChkGenerateUnitsAsAttached()) @@ -1973,6 +1992,7 @@ public void setOptions(final CompanyGenerationOptions options) { // Units getComboBattleMechWeightClassGenerationMethod().setSelectedItem(options.getBattleMechWeightClassGenerationMethod()); getComboBattleMechQualityGenerationMethod().setSelectedItem(options.getBattleMechQualityGenerationMethod()); + getChkNeverGenerateStarLeagueMechs().setSelected(options.isNeverGenerateStarLeagueMechs()); getChkOnlyGenerateStarLeagueMechs().setSelected(options.isOnlyGenerateStarLeagueMechs()); getChkOnlyGenerateOmniMechs().setSelected(options.isOnlyGenerateOmniMechs()); getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); @@ -2090,6 +2110,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Units options.setBattleMechWeightClassGenerationMethod(getComboBattleMechWeightClassGenerationMethod().getSelectedItem()); options.setBattleMechQualityGenerationMethod(getComboBattleMechQualityGenerationMethod().getSelectedItem()); + options.setNeverGenerateStarLeagueMechs(getChkNeverGenerateStarLeagueMechs().isSelected()); options.setOnlyGenerateStarLeagueMechs(getChkOnlyGenerateStarLeagueMechs().isSelected()); options.setOnlyGenerateOmniMechs(getChkOnlyGenerateOmniMechs().isSelected()); options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); From ec005905b5f5487b52557f9b406cc8191fad72ba Mon Sep 17 00:00:00 2001 From: Windchild292 Date: Wed, 22 Dec 2021 17:47:10 -0500 Subject: [PATCH 077/115] Adding and removing from the TODO list --- .../companyGenerators/AbstractCompanyGenerator.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 587148eaf3..c39213b129 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -84,6 +84,11 @@ * Backgrounds don't work * Panel has odd whitespace usage * System, Planet text search (if possible and feasible - might also be a bugfix, or require a new component) + * Add dependent generation options, that apply pre-module simulation. + * Generate spare personnel (?) + * Add personnel generation sort options + * ---> Assign Most skilled to primary lance + * ---> sort by company * TODO - Wave 3: * Contract Market Pane * Campaign Options Pane, Campaign Options Dialog Base Validation From 253a85621375c3b828d3a04e5214d1953ca0e15d Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Jan 2022 16:38:12 -0500 Subject: [PATCH 078/115] Starting to migrate the force icon code after the rework --- MekHQ/src/mekhq/MekHqConstants.java | 13 ++-- .../LayeredForceIconOperationalStatus.java | 10 +-- .../CompanyGenerationPersonTracker.java | 1 + .../AbstractCompanyGenerator.java | 61 +++++++++---------- 4 files changed, 43 insertions(+), 42 deletions(-) diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index 0c94545fce..aa2a7f2b7c 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -148,17 +148,20 @@ public final class MekHqConstants extends SuiteConstants { //region File Paths // This holds all required file paths not saved as part of MekHQ Options public static final String LAYERED_FORCE_ICON_TYPE_PATH = "Pieces/Types/"; + public static final String LAYERED_FORCE_ICON_STRAT_OPS_PATH = "StratOps/"; + public static final String LAYERED_FORCE_ICON_BATTLEMECH_LEFT_FILENAME = "BattleMech (Left).png"; + public static final String LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME = "BattleMech (Center).png"; public static final String LAYERED_FORCE_ICON_FORMATION_PATH = "Pieces/Formations/"; public static final String LAYERED_FORCE_ICON_ADJUSTMENT_PATH = "Pieces/Adjustments/"; public static final String LAYERED_FORCE_ICON_ALPHANUMERIC_PATH = "Pieces/Alphanumerics/"; public static final String LAYERED_FORCE_ICON_SPECIAL_MODIFIER_PATH = "Pieces/Special Modifiers/"; public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_BORDER_PATH = "Operational Indicators (Border)/"; public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_TAB_PATH = "Operational Indicators (Tab)/"; - public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FULLY_OPERATIONAL_FILE_PATH = "(01) Green - Fully Operational.png"; - public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_SUBSTANTIALLY_OPERATIONAL_FILE_PATH = "(02) Yellow - Substantially Operational.png"; - public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_MARGINALLY_OPERATIONAL_FILE_PATH = "(03) Red - Marginally Operational.png"; - public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_NOT_OPERATIONAL_FILE_PATH = "(04) Gray - Not Operational.png"; - public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FACTORY_FRESH_FILE_PATH = "(05) Blue - Factory Fresh.png"; + public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FULLY_OPERATIONAL_FILENAME = "(01) Green - Fully Operational.png"; + public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_SUBSTANTIALLY_OPERATIONAL_FILENAME = "(02) Yellow - Substantially Operational.png"; + public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_MARGINALLY_OPERATIONAL_FILENAME = "(03) Red - Marginally Operational.png"; + public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_NOT_OPERATIONAL_FILENAME = "(04) Gray - Not Operational.png"; + public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FACTORY_FRESH_FILENAME = "(05) Blue - Factory Fresh.png"; public static final String LAYERED_FORCE_ICON_BACKGROUND_PATH = "Pieces/Backgrounds/"; public static final String LAYERED_FORCE_ICON_FRAME_PATH = "Pieces/Frames/"; public static final String LAYERED_FORCE_ICON_DEFAULT_FRAME_FILENAME = "Frame.png"; diff --git a/MekHQ/src/mekhq/campaign/icons/enums/LayeredForceIconOperationalStatus.java b/MekHQ/src/mekhq/campaign/icons/enums/LayeredForceIconOperationalStatus.java index 73fffa0a14..fafcede350 100644 --- a/MekHQ/src/mekhq/campaign/icons/enums/LayeredForceIconOperationalStatus.java +++ b/MekHQ/src/mekhq/campaign/icons/enums/LayeredForceIconOperationalStatus.java @@ -29,11 +29,11 @@ */ public enum LayeredForceIconOperationalStatus { //region Enum Declarations - FULLY_OPERATIONAL(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FULLY_OPERATIONAL_FILE_PATH), - SUBSTANTIALLY_OPERATIONAL(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_SUBSTANTIALLY_OPERATIONAL_FILE_PATH), - MARGINALLY_OPERATIONAL(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_MARGINALLY_OPERATIONAL_FILE_PATH), - NOT_OPERATIONAL(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_NOT_OPERATIONAL_FILE_PATH), - FACTORY_FRESH(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FACTORY_FRESH_FILE_PATH); + FULLY_OPERATIONAL(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FULLY_OPERATIONAL_FILENAME), + SUBSTANTIALLY_OPERATIONAL(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_SUBSTANTIALLY_OPERATIONAL_FILENAME), + MARGINALLY_OPERATIONAL(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_MARGINALLY_OPERATIONAL_FILENAME), + NOT_OPERATIONAL(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_NOT_OPERATIONAL_FILENAME), + FACTORY_FRESH(MekHqConstants.LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FACTORY_FRESH_FILENAME); //endregion Enum Declarations //region Variable Declarations diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java index f31415f036..d49ff078e7 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java @@ -36,6 +36,7 @@ public CompanyGenerationPersonTracker(final Person person) { this(CompanyGenerationPersonType.MECHWARRIOR, person); } + // TODO : Look into the constructors here, might be able to simplify the code public CompanyGenerationPersonTracker(final CompanyGenerationPersonType personType, final Person person) { setPersonType(personType); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index c39213b129..dabe3e1919 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -23,11 +23,15 @@ import megamek.common.options.OptionsConstants; import megamek.common.util.EncodeControl; import mekhq.MHQStaticDirectoryManager; +import mekhq.MekHqConstants; import mekhq.Utilities; import mekhq.campaign.Campaign; import mekhq.campaign.finances.Money; import mekhq.campaign.finances.enums.TransactionType; import mekhq.campaign.force.Force; +import mekhq.campaign.icons.ForcePieceIcon; +import mekhq.campaign.icons.LayeredForceIcon; +import mekhq.campaign.icons.enums.LayeredForceIconLayer; import mekhq.campaign.mission.Contract; import mekhq.campaign.parts.AmmoStorage; import mekhq.campaign.parts.Armor; @@ -50,13 +54,13 @@ import mekhq.campaign.universe.generators.battleMechQualityGenerators.AbstractBattleMechQualityGenerator; import mekhq.campaign.universe.generators.battleMechWeightClassGenerators.AbstractBattleMechWeightClassGenerator; import mekhq.campaign.work.WorkTime; -import mekhq.gui.enums.LayeredForceIcon; import org.apache.logging.log4j.LogManager; import java.time.LocalDate; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; /** @@ -79,7 +83,6 @@ * * TODO - Wave 2: * Random Origin Options : Open : MHQ 2856 - * Force Icon Rework : Open : MHQ 2946 * Finish Finances * Backgrounds don't work * Panel has odd whitespace usage @@ -223,13 +226,13 @@ public List generatePersonnel(final Campaign cam * @return the list of generated combat personnel within their individual trackers */ private List generateCombatPersonnel(final Campaign campaign) { - final List trackers = new ArrayList<>(); + final List trackers; final int numMechWarriors = determineNumberOfLances() * getOptions().getLanceSize(); - for (int i = 0; i < numMechWarriors; i++) { - trackers.add(new CompanyGenerationPersonTracker( - campaign.newPerson(PersonnelRole.MECHWARRIOR, getPersonnelGenerator()))); - } + trackers = IntStream.range(0, numMechWarriors) + .mapToObj(i -> new CompanyGenerationPersonTracker( + campaign.newPerson(PersonnelRole.MECHWARRIOR, getPersonnelGenerator()))) + .collect(Collectors.toList()); // Default Sort is Tactical Genius First Comparator personnelSorter = Comparator.comparing( @@ -238,7 +241,7 @@ private List generateCombatPersonnel(final Campa personnelSorter = personnelSorter .thenComparingInt(t -> Stream.of(SkillType.S_LEADER, SkillType.S_STRATEGY, SkillType.S_TACTICS) .mapToInt(s -> t.getPerson().getSkillLevel(s)).sum()) - .thenComparingInt(t -> t.getPerson().getExperienceLevel(false)); + .thenComparingInt(t -> t.getPerson().getExperienceLevel(campaign, false)); } personnelSorter = personnelSorter.reversed(); trackers.sort(personnelSorter); @@ -911,13 +914,11 @@ private void generateUnit(final Campaign campaign, final List trackers) { final Force originForce = campaign.getForce(0); final Alphabet[] alphabet = Alphabet.values(); - String background = ""; + String backgroundCategory = ""; + String backgroundFilename = ""; if (getOptions().isGenerateForceIcons()) { if (MHQStaticDirectoryManager.getForceIcons() != null) { - // FIXME : We need a new way to handle this form of search... just default to CSR for now - background = "CSR.png"; - /* if (MHQStaticDirectoryManager.getForceIcons().getItems().keySet().stream() .anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getFullName(campaign.getGameYear())))) { background = getOptions().getFaction().getFullName(campaign.getGameYear()); @@ -927,28 +928,28 @@ private void generateUnit(final Campaign campaign, .stream().anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getShortName())))) { background = getOptions().getFaction().getShortName(); } - */ } // Create the Origin Force Icon if (getOptions().isGenerateOriginNodeForceIcon()) { - final LinkedHashMap> iconMap = new LinkedHashMap<>(); + final LayeredForceIcon layeredForceIcon = new LayeredForceIcon(); // Type - iconMap.put(LayeredForceIcon.TYPE.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.TYPE.getLayerPath()).add("BattleMech.png"); + layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.TYPE, new ArrayList<>()); + layeredForceIcon.getPieces().get(LayeredForceIconLayer.TYPE) + .add(new ForcePieceIcon(LayeredForceIconLayer.TYPE, + MekHqConstants.LAYERED_FORCE_ICON_STRAT_OPS_PATH, + MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME)); // Background - if (!background.isBlank()) { - iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); + if (!backgroundCategory.isBlank() && !backgroundFilename.isBlank()) { + layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.BACKGROUND, new ArrayList<>()); + layeredForceIcon.getPieces().get(LayeredForceIconLayer.BACKGROUND) + .add(new ForcePieceIcon(LayeredForceIconLayer.BACKGROUND, + backgroundCategory, backgroundFilename)); } - // Frame - iconMap.put(LayeredForceIcon.FRAME.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.FRAME.getLayerPath()).add("Frame.png"); - - originForce.setIconMap(iconMap); + originForce.setForceIcon(layeredForceIcon); } } @@ -956,8 +957,8 @@ private void generateUnit(final Campaign campaign, if (getOptions().isGenerateMercenaryCompanyCommandLance()) { final Force commandLance = createLance(campaign, originForce, trackers, campaign.getName() + resources.getString("AbstractCompanyGenerator.commandLance.text"), background); - commandLance.getIconMap().put(LayeredForceIcon.SPECIAL_MODIFIER.getLayerPath(), new Vector<>()); - commandLance.getIconMap().get(LayeredForceIcon.SPECIAL_MODIFIER.getLayerPath()).add("HQ indicator.png"); + commandLance.getIconMap().put(LayeredForceIconLayer.SPECIAL_MODIFIER.getLayerPath(), new Vector<>()); + commandLance.getIconMap().get(LayeredForceIconLayer.SPECIAL_MODIFIER.getLayerPath()).add("HQ indicator.png"); } // Create Companies @@ -1033,7 +1034,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, return; } - final LinkedHashMap> iconMap = new LinkedHashMap<>(); + final LayeredForceIcon layeredForceIcon = new LayeredForceIcon(); // Type String filename = String.format("BattleMech %s.png", @@ -1059,11 +1060,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); } - // Frame - iconMap.put(LayeredForceIcon.FRAME.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.FRAME.getLayerPath()).add("Frame.png"); - - force.setIconMap(iconMap); + force.setForceIcon(layeredForceIcon); } /** From 5b978cd87f0f9f9291c424648955368686afedad Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 8 Jan 2022 17:17:20 -0500 Subject: [PATCH 079/115] Doing a bunch of code cleanup and adding author note --- .../resources/mekhq/resources/GUI.properties | 2 +- .../AtBRandomMechParameters.java | 2 +- .../CompanyGenerationOptions.java | 18 +-- .../CompanyGenerationPersonTracker.java | 3 +- .../campaign/universe/enums/Alphabet.java | 7 +- .../BattleMechQualityGenerationMethod.java | 7 +- ...BattleMechWeightClassGenerationMethod.java | 7 +- .../enums/CompanyGenerationMethod.java | 7 +- .../enums/CompanyGenerationPersonType.java | 7 +- .../campaign/universe/enums/EraFlag.java | 3 + .../universe/enums/ForceNamingMethod.java | 7 +- .../universe/enums/MysteryBoxType.java | 7 +- .../universe/enums/PartGenerationMethod.java | 7 +- .../ABattleMechQualityGenerator.java | 3 + .../AStarBattleMechQualityGenerator.java | 3 + .../AbstractBattleMechQualityGenerator.java | 1 + .../AtBBattleMechQualityGenerator.java | 3 + .../BBattleMechQualityGenerator.java | 3 + .../CBattleMechQualityGenerator.java | 3 + .../DBattleMechQualityGenerator.java | 3 + .../FBattleMechQualityGenerator.java | 3 + .../WindchildBattleMechQualityGenerator.java | 3 + ...bstractBattleMechWeightClassGenerator.java | 1 + ...AssaultBattleMechWeightClassGenerator.java | 3 + .../AtBBattleMechWeightClassGenerator.java | 3 + .../HeavyBattleMechWeightClassGenerator.java | 3 + .../LightBattleMechWeightClassGenerator.java | 3 + .../MediumBattleMechWeightClassGenerator.java | 3 + ...AssaultBattleMechWeightClassGenerator.java | 3 + ...ndchildBattleMechWeightClassGenerator.java | 3 + ...ldHeavyBattleMechWeightClassGenerator.java | 3 + ...ldLightBattleMechWeightClassGenerator.java | 3 + ...dMediumBattleMechWeightClassGenerator.java | 3 + .../AbstractCompanyGenerator.java | 32 +++-- .../AtBCompanyGenerator.java | 3 + .../WindchildCompanyGenerator.java | 3 + .../partGenerators/AbstractPartGenerator.java | 3 + .../partGenerators/MishraPartGenerator.java | 2 + .../partGenerators/MultiplePartGenerator.java | 3 + .../WindchildPartGenerator.java | 1 + .../gui/dialog/CompanyGenerationDialog.java | 1 + .../panels/CompanyGenerationOptionsPanel.java | 118 +++++++++--------- 42 files changed, 219 insertions(+), 87 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 6678b50426..b89dced63f 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -331,7 +331,7 @@ CampaignPresetSelectionDialog.title=Select Campaign Preset ### CompanyGenerationDialog Class CompanyGenerationDialog.title=Company Generator -CompanyGenerationDialog.btnGenerate.toolTipText=Generates a company based on the provided options. Currently this immediately applies it to the campaign, making this functionally identical to Apply in the current implementation. +CompanyGenerationDialog.btnGenerate.toolTipText=Generates a company based on the provided options. Currently, this immediately applies it to the campaign, making this functionally identical to Apply in the current implementation. CompanyGenerationDialog.btnApply.toolTipText=Immediately complete all remaining generation and apply the changes to the campaign. CompanyGenerationDialog.btnRestore.toolTipText=Restores the options on the current dialog to the default options for the currently selected company generation method. CompanyGenerationDialog.btnImport.toolTipText=Import the current options from an XML file. diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java index c3318b6da2..a295550567 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 720332a45d..4e314b0bbf 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -36,6 +36,7 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.ResourceBundle; import java.util.TreeMap; @@ -805,8 +806,8 @@ public void writeToFile(@Nullable File file) { // Then save it out to that file. pw.println(""); writeToXML(pw, 0, ResourceBundle.getBundle("mekhq.resources.MekHQ").getString("Application.version")); - } catch (Exception e) { - LogManager.getLogger().error(e); + } catch (Exception ex) { + LogManager.getLogger().error("", ex); } } @@ -835,7 +836,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String // Personnel MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "supportPersonnel"); - for (final Map.Entry entry : getSupportPersonnel().entrySet()) { + for (final Entry entry : getSupportPersonnel().entrySet()) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().name(), entry.getValue()); } MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "supportPersonnel"); @@ -881,7 +882,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateForceIcons", isGenerateForceIcons()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateOriginNodeForceIcon", isGenerateOriginNodeForceIcon()); MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "forceWeightLimits"); - for (final Map.Entry entry : getForceWeightLimits().entrySet()) { + for (final Entry entry : getForceWeightLimits().entrySet()) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().toString(), entry.getValue()); } MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "forceWeightLimits"); @@ -916,7 +917,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateSurprises", isGenerateSurprises()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateMysteryBoxes", isGenerateMysteryBoxes()); MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "generateMysteryBoxTypes"); - for (final Map.Entry entry : getGenerateMysteryBoxTypes().entrySet()) { + for (final Entry entry : getGenerateMysteryBoxTypes().entrySet()) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().name(), entry.getValue()); } MekHqXmlUtil.writeSimpleXMLCloseTag(pw, --indent, "generateMysteryBoxTypes"); @@ -1232,10 +1233,13 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, break; } //endregion Surprises + + default: + break; } } - } catch (Exception e) { - LogManager.getLogger().error(e); + } catch (Exception ex) { + LogManager.getLogger().error("", ex); return null; } diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java index d49ff078e7..0636234c26 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -36,7 +36,6 @@ public CompanyGenerationPersonTracker(final Person person) { this(CompanyGenerationPersonType.MECHWARRIOR, person); } - // TODO : Look into the constructors here, might be able to simplify the code public CompanyGenerationPersonTracker(final CompanyGenerationPersonType personType, final Person person) { setPersonType(personType); diff --git a/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java b/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java index 5bce3aaefe..8d70942047 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/Alphabet.java @@ -19,9 +19,13 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import java.util.ResourceBundle; +/** + * @author Justin "Windchild" Bowen + */ public enum Alphabet { //region Enum Declarations A("Alphabets.A.ccb1943.text", "Alphabets.A.icao1956.text", "Alphabets.A.english.text", "Alphabets.A.greek.text"), @@ -61,7 +65,8 @@ public enum Alphabet { //region Constructors Alphabet(final String ccb1943, final String icao1956, final String english, final String greek) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); this.ccb1943 = resources.getString(ccb1943); this.icao1956 = resources.getString(icao1956); this.english = resources.getString(english); diff --git a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java index 7373f9c81f..f75e8517ea 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechQualityGenerationMethod.java @@ -19,10 +19,14 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import mekhq.campaign.universe.generators.battleMechQualityGenerators.*; import java.util.ResourceBundle; +/** + * @author Justin "Windchild" Bowen + */ public enum BattleMechQualityGenerationMethod { //region Enum Declarations AGAINST_THE_BOT("BattleMechQualityGenerationMethod.AGAINST_THE_BOT.text", "BattleMechQualityGenerationMethod.AGAINST_THE_BOT.toolTipText"), @@ -42,7 +46,8 @@ public enum BattleMechQualityGenerationMethod { //region Constructors BattleMechQualityGenerationMethod(final String name, final String toolTipText) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java index b473506430..ccd778c5bf 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/BattleMechWeightClassGenerationMethod.java @@ -19,10 +19,14 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import mekhq.campaign.universe.generators.battleMechWeightClassGenerators.*; import java.util.ResourceBundle; +/** + * @author Justin "Windchild" Bowen + */ public enum BattleMechWeightClassGenerationMethod { //region Enum Declarations AGAINST_THE_BOT("BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.text", "BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.toolTipText"), @@ -44,7 +48,8 @@ public enum BattleMechWeightClassGenerationMethod { //region Constructors BattleMechWeightClassGenerationMethod(final String name, final String toolTipText) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java index fac1755dbe..0db70f5bba 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationMethod.java @@ -19,12 +19,16 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.campaign.universe.generators.companyGenerators.*; import java.util.ResourceBundle; +/** + * @author Justin "Windchild" Bowen + */ public enum CompanyGenerationMethod { //region Enum Declarations AGAINST_THE_BOT("CompanyGenerationMethod.AGAINST_THE_BOT.text", "CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText"), @@ -38,7 +42,8 @@ public enum CompanyGenerationMethod { //region Constructors CompanyGenerationMethod(final String name, final String toolTipText) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java index 15bed74750..cb6449ca21 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java @@ -19,9 +19,13 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import java.util.ResourceBundle; +/** + * @author Justin "Windchild" Bowen + */ public enum CompanyGenerationPersonType { //region Enum Declarations COMPANY_COMMANDER("CompanyGenerationPersonType.COMPANY_COMMANDER.text", "CompanyGenerationPersonType.COMPANY_COMMANDER.toolTipText"), @@ -39,7 +43,8 @@ public enum CompanyGenerationPersonType { //region Constructors CompanyGenerationPersonType(final String name, final String toolTipText) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/EraFlag.java b/MekHQ/src/mekhq/campaign/universe/enums/EraFlag.java index 1e78d49cf2..9cd4bed44c 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/EraFlag.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/EraFlag.java @@ -18,6 +18,9 @@ */ package mekhq.campaign.universe.enums; +/** + * @author Justin "Windchild" Bowen + */ public enum EraFlag { //region Enum Declarations PRE_SPACEFLIGHT, diff --git a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java index 4cab8b0faa..33dfb8d38c 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/ForceNamingMethod.java @@ -19,9 +19,13 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import java.util.ResourceBundle; +/** + * @author Justin "Windchild" Bowen + */ public enum ForceNamingMethod { //region Enum Declarations CCB_1943("ForceNamingMethod.CCB_1943.text", "ForceNamingMethod.CCB_1943.toolTipText"), @@ -37,7 +41,8 @@ public enum ForceNamingMethod { //region Constructors ForceNamingMethod(final String name, final String toolTipText) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java index cc6e91f923..5a69db5482 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/MysteryBoxType.java @@ -19,9 +19,13 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import java.util.ResourceBundle; +/** + * @author Justin "Windchild" Bowen + */ public enum MysteryBoxType { //region Enum Declarations THIRD_SUCCESSION_WAR("MysteryBoxType.THIRD_SUCCESSION_WAR.text", "MysteryBoxType.THIRD_SUCCESSION_WAR.toolTipText"), @@ -41,7 +45,8 @@ public enum MysteryBoxType { //region Constructors MysteryBoxType(final String name, final String toolTipText) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java b/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java index 382e129467..85b901388f 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/PartGenerationMethod.java @@ -19,6 +19,7 @@ package mekhq.campaign.universe.enums; import megamek.common.util.EncodeControl; +import mekhq.MekHQ; import mekhq.campaign.universe.generators.partGenerators.AbstractPartGenerator; import mekhq.campaign.universe.generators.partGenerators.MishraPartGenerator; import mekhq.campaign.universe.generators.partGenerators.MultiplePartGenerator; @@ -27,6 +28,9 @@ import java.util.ResourceBundle; +/** + * @author Justin "Windchild" Bowen + */ public enum PartGenerationMethod { //region Enum Declarations DISABLED("PartGenerationMethod.DISABLED.text", "PartGenerationMethod.DISABLED.toolTipText"), @@ -44,7 +48,8 @@ public enum PartGenerationMethod { //region Constructors PartGenerationMethod(final String name, final String toolTipText) { - final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); this.name = resources.getString(name); this.toolTipText = resources.getString(toolTipText); } diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/ABattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/ABattleMechQualityGenerator.java index df54156799..d44dd320a5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/ABattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/ABattleMechQualityGenerator.java @@ -21,6 +21,9 @@ import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class ABattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { //region Constructors public ABattleMechQualityGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AStarBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AStarBattleMechQualityGenerator.java index 2aa9fc0ac8..b1fb23fc40 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AStarBattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AStarBattleMechQualityGenerator.java @@ -21,6 +21,9 @@ import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class AStarBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { //region Constructors public AStarBattleMechQualityGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AbstractBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AbstractBattleMechQualityGenerator.java index d098ce1d52..b421901a07 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AbstractBattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AbstractBattleMechQualityGenerator.java @@ -23,6 +23,7 @@ /** * This was designed to provide options for the method of quality generation for Company Generators, * and any use outside of them should take this specific design into consideration. + * @author Justin "Windchild" Bowen */ public abstract class AbstractBattleMechQualityGenerator { //region Variable Declarations diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AtBBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AtBBattleMechQualityGenerator.java index 6ca997d200..06e4a340e5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AtBBattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/AtBBattleMechQualityGenerator.java @@ -21,6 +21,9 @@ import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class AtBBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { //region Constructors public AtBBattleMechQualityGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/BBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/BBattleMechQualityGenerator.java index 44421c4c89..5c7f44bcac 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/BBattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/BBattleMechQualityGenerator.java @@ -21,6 +21,9 @@ import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class BBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { //region Constructors public BBattleMechQualityGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/CBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/CBattleMechQualityGenerator.java index f7fb4a1f61..f325f33a56 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/CBattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/CBattleMechQualityGenerator.java @@ -21,6 +21,9 @@ import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class CBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { //region Constructors public CBattleMechQualityGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/DBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/DBattleMechQualityGenerator.java index 72a235e00a..146301c2ad 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/DBattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/DBattleMechQualityGenerator.java @@ -21,6 +21,9 @@ import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class DBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { //region Constructors public DBattleMechQualityGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/FBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/FBattleMechQualityGenerator.java index 8161a9b647..7dfac52ce7 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/FBattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/FBattleMechQualityGenerator.java @@ -21,6 +21,9 @@ import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class FBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { //region Constructors public FBattleMechQualityGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/WindchildBattleMechQualityGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/WindchildBattleMechQualityGenerator.java index e47c5820bd..5d4f3bd4c3 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/WindchildBattleMechQualityGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechQualityGenerators/WindchildBattleMechQualityGenerator.java @@ -21,6 +21,9 @@ import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.enums.BattleMechQualityGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class WindchildBattleMechQualityGenerator extends AbstractBattleMechQualityGenerator { //region Constructors public WindchildBattleMechQualityGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java index 70ecec3968..313a064c57 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AbstractBattleMechWeightClassGenerator.java @@ -23,6 +23,7 @@ /** * This was designed to provide options for the method of weight generation for Company Generators, * and any use outside of them should take this specific design into consideration. + * @author Justin "Windchild" Bowen */ public abstract class AbstractBattleMechWeightClassGenerator { //region Variable Declarations diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AssaultBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AssaultBattleMechWeightClassGenerator.java index e4b54f7bf1..c6d4f1dd75 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AssaultBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AssaultBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class AssaultBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public AssaultBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AtBBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AtBBattleMechWeightClassGenerator.java index 305779dc66..a975932223 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AtBBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/AtBBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class AtBBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public AtBBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/HeavyBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/HeavyBattleMechWeightClassGenerator.java index ca8ef951ce..51d5587582 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/HeavyBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/HeavyBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class HeavyBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public HeavyBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/LightBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/LightBattleMechWeightClassGenerator.java index 083a35e7a3..55cd020669 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/LightBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/LightBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class LightBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public LightBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/MediumBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/MediumBattleMechWeightClassGenerator.java index 25eae0578e..6800cfd68c 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/MediumBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/MediumBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class MediumBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public MediumBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildAssaultBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildAssaultBattleMechWeightClassGenerator.java index c1b46ce36d..406ae66a42 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildAssaultBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildAssaultBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class WindchildAssaultBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public WindchildAssaultBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildBattleMechWeightClassGenerator.java index 113de8826d..d39ac3ae6a 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class WindchildBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public WindchildBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildHeavyBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildHeavyBattleMechWeightClassGenerator.java index 65b120b594..7c7d45278f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildHeavyBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildHeavyBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class WindchildHeavyBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public WindchildHeavyBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildLightBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildLightBattleMechWeightClassGenerator.java index ebe9e204c1..0b5e34b712 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildLightBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildLightBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class WindchildLightBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public WindchildLightBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildMediumBattleMechWeightClassGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildMediumBattleMechWeightClassGenerator.java index b4ef682731..ff819ef963 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildMediumBattleMechWeightClassGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/battleMechWeightClassGenerators/WindchildMediumBattleMechWeightClassGenerator.java @@ -21,6 +21,9 @@ import megamek.common.EntityWeightClass; import mekhq.campaign.universe.enums.BattleMechWeightClassGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class WindchildMediumBattleMechWeightClassGenerator extends AbstractBattleMechWeightClassGenerator { //region Constructors public WindchildMediumBattleMechWeightClassGenerator() { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index dabe3e1919..8e112ff7aa 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -23,6 +23,7 @@ import megamek.common.options.OptionsConstants; import megamek.common.util.EncodeControl; import mekhq.MHQStaticDirectoryManager; +import mekhq.MekHQ; import mekhq.MekHqConstants; import mekhq.Utilities; import mekhq.campaign.Campaign; @@ -58,6 +59,7 @@ import java.time.LocalDate; import java.util.*; +import java.util.Map.Entry; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -109,6 +111,8 @@ * Implement Surprises * Implement Mystery Boxes * Optional: Mercenaries may customize their 'Mechs, with clantech if enabled only post-3055 + * + * @author Justin "Windchild" Bowen */ public abstract class AbstractCompanyGenerator { //region Variable Declarations @@ -118,7 +122,8 @@ public abstract class AbstractCompanyGenerator { private final AbstractBattleMechWeightClassGenerator battleMechWeightClassGenerator; private final AbstractBattleMechQualityGenerator battleMechQualityGenerator; - private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", new EncodeControl()); + private final ResourceBundle resources = ResourceBundle.getBundle("mekhq.resources.Universe", + MekHQ.getMekHQOptions().getLocale(), new EncodeControl()); //endregion Variable Declarations //region Constructors @@ -226,10 +231,9 @@ public List generatePersonnel(final Campaign cam * @return the list of generated combat personnel within their individual trackers */ private List generateCombatPersonnel(final Campaign campaign) { - final List trackers; final int numMechWarriors = determineNumberOfLances() * getOptions().getLanceSize(); - trackers = IntStream.range(0, numMechWarriors) + final List trackers = IntStream.range(0, numMechWarriors) .mapToObj(i -> new CompanyGenerationPersonTracker( campaign.newPerson(PersonnelRole.MECHWARRIOR, getPersonnelGenerator()))) .collect(Collectors.toList()); @@ -397,6 +401,8 @@ private void assignRandomOfficerSkillIncrease(final Person person, final int boo person.improveSkill(SkillType.S_TACTICS); } break; + default: + break; } } } @@ -440,7 +446,7 @@ private void generateStandardMechWarrior(final Campaign campaign, final Person p private List generateSupportPersonnel(final Campaign campaign) { final List trackers = new ArrayList<>(); - for (final Map.Entry entry : getOptions().getSupportPersonnel().entrySet()) { + for (final Entry entry : getOptions().getSupportPersonnel().entrySet()) { for (int i = 0; i < entry.getValue(); i++) { trackers.add(new CompanyGenerationPersonTracker(CompanyGenerationPersonType.SUPPORT, generateSupportPerson(campaign, entry.getKey()))); @@ -1043,8 +1049,8 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, if (MHQStaticDirectoryManager.getForceIcons().getItem(LayeredForceIcon.TYPE.getLayerPath(), filename) == null) { filename = "BattleMech.png"; } - } catch (Exception e) { - LogManager.getLogger().error(e); + } catch (Exception ex) { + LogManager.getLogger().error("", ex); filename = "BattleMech.png"; } iconMap.put(LayeredForceIcon.TYPE.getLayerPath(), new Vector<>()); @@ -1076,7 +1082,7 @@ private int determineForceWeightClass(final Campaign campaign, final Force force .filter(unit -> (unit != null) && (unit.getEntity() != null)) .mapToDouble(unit -> unit.getEntity().getWeight()).sum(); weight = weight * 4.0 / (getOptions().getLanceSize() * (isLance ? 1 : getOptions().getLancesPerCompany())); - final Map.Entry entry = getOptions().getForceWeightLimits().ceilingEntry((int) Math.round(weight)); + final Entry entry = getOptions().getForceWeightLimits().ceilingEntry((int) Math.round(weight)); return (entry == null) ? EntityWeightClass.WEIGHT_SUPER_HEAVY : entry.getValue(); } //endregion Unit @@ -1304,7 +1310,7 @@ private void processFinances(final Campaign campaign, Money startingCash = generateStartingCash(); Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); if (getOptions().isPayForSetup()) { - final Money costs = calculateHiringCosts(trackers) + final Money costs = calculateHiringCosts(campaign, trackers) .plus(calculateUnitCosts(units)) .plus(calculatePartCosts(parts)) .plus(calculateArmourCosts(armour)) @@ -1370,22 +1376,24 @@ private Money generateStartingCash() { */ private Money rollRandomStartingCash() { return getOptions().isRandomizeStartingCash() - ? Money.of(10^6).multipliedBy(Utilities.dice(getOptions().getRandomStartingCashDiceCount(), 6)) + ? Money.of(Math.pow(10, 6)).multipliedBy(Utilities.dice(getOptions().getRandomStartingCashDiceCount(), 6)) : Money.zero(); } /** + * @param campaign the campaign to use in determining the hiring costs * @param trackers the trackers containing the personnel to get the hiring cost for * @return the cost of hiring the personnel, or zero if you aren't paying for hiring costs */ - private Money calculateHiringCosts(final List trackers) { + private Money calculateHiringCosts(final Campaign campaign, + final List trackers) { if (!getOptions().isPayForPersonnel()) { return Money.zero(); } Money hiringCosts = Money.zero(); for (final CompanyGenerationPersonTracker tracker : trackers) { - hiringCosts = hiringCosts.plus(tracker.getPerson().getSalary().multipliedBy(2)); + hiringCosts = hiringCosts.plus(tracker.getPerson().getSalary(campaign).multipliedBy(2)); } return hiringCosts; } @@ -1552,7 +1560,7 @@ public List applyPhaseTwoToCampaign(final Campaign campaign, * Phase Three: Finalizing Contract and Finances * * @param campaign the campaign to apply the generation to - * @param trackers the trackers containing all of the data required for Phase One, which + * @param trackers the trackers containing all the data required for Phase One, which * includes all Personnel * @param units the units added to the campaign, including any mothballed units * @param parts the spare parts generated diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index 15c140d728..ca52b046f7 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -28,6 +28,9 @@ import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.campaign.universe.enums.CompanyGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class AtBCompanyGenerator extends AbstractCompanyGenerator { //region Constructors public AtBCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 8aa5572b70..8bf42f480a 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -28,6 +28,9 @@ import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.campaign.universe.enums.CompanyGenerationMethod; +/** + * @author Justin "Windchild" Bowen + */ public class WindchildCompanyGenerator extends AbstractCompanyGenerator { //region Constructors public WindchildCompanyGenerator(final Campaign campaign, final CompanyGenerationOptions options) { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java index bd0c23494f..b90d451a3f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/AbstractPartGenerator.java @@ -30,6 +30,9 @@ import java.util.List; import java.util.stream.Collectors; +/** + * @author Justin "Windchild" Bowen + */ public abstract class AbstractPartGenerator { //region Variable Declarations private final PartGenerationMethod method; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java index cc76974eb3..729f5599bd 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MishraPartGenerator.java @@ -38,6 +38,8 @@ * 5) All Gyros are capped at 1 per weight/type * 6) MASC is capped at 1 per type * 7) Any other parts are capped at 6. + * + * @author Justin "Windchild" Bowen */ public class MishraPartGenerator extends MultiplePartGenerator { //region Constructors diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java index b08644023b..8e49cd1333 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/MultiplePartGenerator.java @@ -24,6 +24,9 @@ import java.util.List; +/** + * @author Justin "Windchild" Bowen + */ public class MultiplePartGenerator extends AbstractPartGenerator { //region Variable Declarations private final int multiple; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java index dccefc4e99..c87a775c13 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java @@ -27,6 +27,7 @@ /** * 1 Part for every 3, rounded normally. * This means you get 1 part for 2-4 in the input array, plus another for every interval above that. + * @author Justin "Windchild" Bowen */ public class WindchildPartGenerator extends AbstractPartGenerator { //region Constructors diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 43d3d5afb9..7546bfbff4 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -43,6 +43,7 @@ /** * This is currently just a temporary dialog over the CompanyGenerationOptionsPanel. * Wave 5 will be when this gets redone to be far nicer and more customizable. + * @author Justin "Windchild" Bowen */ public class CompanyGenerationDialog extends AbstractMHQValidationButtonDialog { //region Variable Declarations diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 31605a5c4b..a5a154c4e3 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -35,13 +35,19 @@ import mekhq.gui.baseComponents.JDisableablePanel; import javax.swing.*; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JSpinner.NumberEditor; import java.awt.*; import java.util.Comparator; import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.TreeMap; import java.util.stream.Collectors; +/** + * @author Justin "Windchild" Bowen + */ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { //region Variable Declarations private final Campaign campaign; @@ -856,7 +862,7 @@ public Component getListCellRendererComponent(final JList list, final Object setSpnStarLeagueYear(new JSpinner(new SpinnerNumberModel(2765, 2571, 2780, 1))); getSpnStarLeagueYear().setToolTipText(resources.getString("lblStarLeagueYear.toolTipText")); getSpnStarLeagueYear().setName("spnStarLeagueYear"); - getSpnStarLeagueYear().setEditor(new JSpinner.NumberEditor(getSpnStarLeagueYear(), "#")); + getSpnStarLeagueYear().setEditor(new NumberEditor(getSpnStarLeagueYear(), "#")); // Programmatically Assign Accessibility Labels lblCompanyGenerationMethod.setLabelFor(getComboCompanyGenerationMethod()); @@ -878,27 +884,27 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblCompanyGenerationMethod) - .addComponent(getComboCompanyGenerationMethod(), GroupLayout.Alignment.LEADING)) + .addComponent(getComboCompanyGenerationMethod(), Alignment.LEADING)) .addComponent(getChkGenerateMercenaryCompanyCommandLance()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblCompanyCount) .addComponent(getSpnCompanyCount()) .addComponent(lblIndividualLanceCount) - .addComponent(getSpnIndividualLanceCount(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getSpnIndividualLanceCount(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblLancesPerCompany) .addComponent(getSpnLancesPerCompany()) .addComponent(lblLanceSize) - .addComponent(getSpnLanceSize(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getSpnLanceSize(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblStarLeagueYear) - .addComponent(getSpnStarLeagueYear(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnStarLeagueYear(), Alignment.LEADING)) ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(lblCompanyGenerationMethod) .addComponent(getComboCompanyGenerationMethod())) @@ -982,7 +988,7 @@ private JPanel createPersonnelPanel() { ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addComponent(getLblTotalSupportPersonnel()) .addComponent(supportPersonnelNumbersPanel) .addComponent(getChkPoolAssistants()) @@ -998,7 +1004,7 @@ private JPanel createPersonnelPanel() { } private JPanel createSupportPersonnelNumbersPanel() { - final PersonnelRole[] personnelRoles = { + final PersonnelRole[] personnelRoles = new PersonnelRole[] { PersonnelRole.MECH_TECH, PersonnelRole.MECHANIC, PersonnelRole.AERO_TECH, PersonnelRole.BA_TECH, PersonnelRole.DOCTOR, PersonnelRole.ADMINISTRATOR_COMMAND, PersonnelRole.ADMINISTRATOR_LOGISTICS, PersonnelRole.ADMINISTRATOR_TRANSPORT, PersonnelRole.ADMINISTRATOR_HR @@ -1173,24 +1179,24 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() .addComponent(getChkRandomizeOrigin()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(getChkRandomizeAroundCentralPlanet()) - .addComponent(getChkCentralSystemFactionSpecific(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getChkCentralSystemFactionSpecific(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblCentralPlanet) .addComponent(getComboCentralSystem()) - .addComponent(getComboCentralPlanet(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getComboCentralPlanet(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblOriginSearchRadius) - .addComponent(getSpnOriginSearchRadius(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnOriginSearchRadius(), Alignment.LEADING)) .addComponent(getChkExtraRandomOrigin()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblOriginDistanceScale) - .addComponent(getSpnOriginDistanceScale(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnOriginDistanceScale(), Alignment.LEADING)) ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addComponent(getChkRandomizeOrigin()) .addGroup(layout.createSequentialGroup() .addComponent(getChkRandomizeAroundCentralPlanet()) @@ -1263,15 +1269,15 @@ private JPanel createStartingSimulationPanel() { layout.setVerticalGroup( layout.createSequentialGroup() .addComponent(getChkRunStartingSimulation()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblSimulationDuration) - .addComponent(getSpnSimulationDuration(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnSimulationDuration(), Alignment.LEADING)) .addComponent(getChkSimulateRandomMarriages()) .addComponent(getChkSimulateRandomProcreation()) ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addComponent(getChkRunStartingSimulation()) .addGroup(layout.createSequentialGroup() .addComponent(lblSimulationDuration) @@ -1383,12 +1389,12 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblBattleMechWeightClassGenerationMethod) - .addComponent(getComboBattleMechWeightClassGenerationMethod(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getComboBattleMechWeightClassGenerationMethod(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblBattleMechQualityGenerationMethod) - .addComponent(getComboBattleMechQualityGenerationMethod(), GroupLayout.Alignment.LEADING)) + .addComponent(getComboBattleMechQualityGenerationMethod(), Alignment.LEADING)) .addComponent(getChkNeverGenerateStarLeagueMechs()) .addComponent(getChkOnlyGenerateStarLeagueMechs()) .addComponent(getChkOnlyGenerateOmniMechs()) @@ -1402,7 +1408,7 @@ public Component getListCellRendererComponent(final JList list, final Object ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(lblBattleMechWeightClassGenerationMethod) .addComponent(getComboBattleMechWeightClassGenerationMethod())) @@ -1478,16 +1484,16 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblForceNamingMethod) - .addComponent(getComboForceNamingMethod(), GroupLayout.Alignment.LEADING)) + .addComponent(getComboForceNamingMethod(), Alignment.LEADING)) .addComponent(getChkGenerateForceIcons()) .addComponent(getChkGenerateOriginNodeForceIcon()) .addComponent(forceWeightLimitsPanel) ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(lblForceNamingMethod) .addComponent(getComboForceNamingMethod())) @@ -1618,24 +1624,24 @@ public Component getListCellRendererComponent(final JList list, final Object layout.setVerticalGroup( layout.createSequentialGroup() .addComponent(getChkGenerateMothballedSpareUnits()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblSparesPercentOfActiveUnits) - .addComponent(getSpnSparesPercentOfActiveUnits(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getSpnSparesPercentOfActiveUnits(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblPartGenerationMethod) - .addComponent(getComboPartGenerationMethod(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getComboPartGenerationMethod(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblStartingArmourWeight) - .addComponent(getSpnStartingArmourWeight(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnStartingArmourWeight(), Alignment.LEADING)) .addComponent(getChkGenerateSpareAmmunition()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblNumberReloadsPerWeapon) - .addComponent(getSpnNumberReloadsPerWeapon(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnNumberReloadsPerWeapon(), Alignment.LEADING)) .addComponent(getChkGenerateFractionalMachineGunAmmunition()) ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addComponent(getChkGenerateMothballedSpareUnits()) .addGroup(layout.createSequentialGroup() .addComponent(lblSparesPercentOfActiveUnits) @@ -1691,7 +1697,7 @@ private JPanel createContractsPanel() { ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addComponent(getChkSelectStartingContract()) .addComponent(getChkStartCourseToContractPlanet()) ); @@ -1802,16 +1808,16 @@ private JPanel createFinancesPanel() { layout.setVerticalGroup( layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblStartingCash) - .addComponent(getSpnStartingCash(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnStartingCash(), Alignment.LEADING)) .addComponent(getChkRandomizeStartingCash()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblRandomStartingCashDiceCount) - .addComponent(getSpnRandomStartingCashDiceCount(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getSpnRandomStartingCashDiceCount(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblMinimumStartingFloat) - .addComponent(getSpnMinimumStartingFloat(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnMinimumStartingFloat(), Alignment.LEADING)) .addComponent(getChkPayForSetup()) .addComponent(getChkStartingLoan()) .addComponent(getChkPayForPersonnel()) @@ -1822,7 +1828,7 @@ private JPanel createFinancesPanel() { ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(lblStartingCash) .addComponent(getSpnStartingCash())) @@ -1890,7 +1896,7 @@ private JPanel createSurprisesPanel() { ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addComponent(getChkGenerateSurprises()) .addComponent(getChkGenerateMysteryBoxes()) .addComponent(mysteryBoxPanel) @@ -1954,7 +1960,7 @@ public void setOptions(final CompanyGenerationOptions options) { // Personnel updateLblTotalSupportPersonnel(determineMaximumSupportPersonnel()); - for (final Map.Entry entry : getSpnSupportPersonnelNumbers().entrySet()) { + for (final Entry entry : getSpnSupportPersonnelNumbers().entrySet()) { entry.getValue().setValue(options.getSupportPersonnel().getOrDefault(entry.getKey(), 0)); } getChkPoolAssistants().setSelected(options.isPoolAssistants()); @@ -2009,7 +2015,7 @@ public void setOptions(final CompanyGenerationOptions options) { getChkGenerateForceIcons().doClick(); } getChkGenerateOriginNodeForceIcon().setSelected(options.isGenerateOriginNodeForceIcon()); - for (final Map.Entry entry : options.getForceWeightLimits().entrySet()) { + for (final Entry entry : options.getForceWeightLimits().entrySet()) { getSpnForceWeightLimits().get(entry.getValue()).setValue(entry.getKey()); } @@ -2056,7 +2062,7 @@ public void setOptions(final CompanyGenerationOptions options) { getChkGenerateMysteryBoxes().doClick(); } - for (final Map.Entry entry : getChkGenerateMysteryBoxTypes().entrySet()) { + for (final Entry entry : getChkGenerateMysteryBoxTypes().entrySet()) { entry.getValue().setSelected(options.getGenerateMysteryBoxTypes().getOrDefault(entry.getKey(), false)); } } @@ -2078,7 +2084,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { // Personnel options.setSupportPersonnel(new HashMap<>()); - for (final Map.Entry entry : getSpnSupportPersonnelNumbers().entrySet()) { + for (final Entry entry : getSpnSupportPersonnelNumbers().entrySet()) { final int value = (int) entry.getValue().getValue(); if (value <= 0) { continue; @@ -2126,7 +2132,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setGenerateForceIcons(getChkGenerateForceIcons().isSelected()); options.setGenerateOriginNodeForceIcon(getChkGenerateOriginNodeForceIcon().isSelected()); options.setForceWeightLimits(new TreeMap<>()); - for (final Map.Entry entry : getSpnForceWeightLimits().entrySet()) { + for (final Entry entry : getSpnForceWeightLimits().entrySet()) { options.getForceWeightLimits().put((int) entry.getValue().getValue(), entry.getKey()); } @@ -2160,7 +2166,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setGenerateSurprises(getChkGenerateSurprises().isSelected()); options.setGenerateMysteryBoxes(getChkGenerateMysteryBoxes().isSelected()); options.setGenerateMysteryBoxTypes(new HashMap<>()); - for (final Map.Entry entry : getChkGenerateMysteryBoxTypes().entrySet()) { + for (final Entry entry : getChkGenerateMysteryBoxTypes().entrySet()) { options.getGenerateMysteryBoxTypes().put(entry.getKey(), entry.getValue().isSelected()); } From dcb18ce61944010cc634325d3f46ccaf907758be Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 8 Jan 2022 18:01:56 -0500 Subject: [PATCH 080/115] Cleaning up a bit of person creation --- MekHQ/src/mekhq/campaign/Campaign.java | 22 +++++++++++-------- .../DefaultFactionSelector.java | 14 +----------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/Campaign.java b/MekHQ/src/mekhq/campaign/Campaign.java index 29296f5c50..70fcdf1bf5 100644 --- a/MekHQ/src/mekhq/campaign/Campaign.java +++ b/MekHQ/src/mekhq/campaign/Campaign.java @@ -1244,7 +1244,7 @@ public Person newDependent(boolean baby) { * @param role The primary role * @return A new {@link Person}. */ - public Person newPerson(PersonnelRole role) { + public Person newPerson(final PersonnelRole role) { return newPerson(role, PersonnelRole.NONE); } @@ -1270,9 +1270,11 @@ public Person newPerson(final PersonnelRole primaryRole, final PersonnelRole sec * @param gender The gender of the person to be generated, or a randomize it value * @return A new {@link Person}. */ - public Person newPerson(final PersonnelRole primaryRole, final String factionCode, final Gender gender) { + public Person newPerson(final PersonnelRole primaryRole, final String factionCode, + final Gender gender) { return newPerson(primaryRole, PersonnelRole.NONE, - new DefaultFactionSelector(getCampaignOptions().getRandomOriginOptions(), factionCode), + new DefaultFactionSelector(getCampaignOptions().getRandomOriginOptions(), + (factionCode == null) ? null : Factions.getInstance().getFaction(factionCode)), getPlanetSelector(), gender); } @@ -1289,9 +1291,9 @@ public Person newPerson(final PersonnelRole primaryRole, final String factionCod */ public Person newPerson(final PersonnelRole primaryRole, final PersonnelRole secondaryRole, final AbstractFactionSelector factionSelector, - final AbstractPlanetSelector planetSelector, Gender gender) { - AbstractPersonnelGenerator personnelGenerator = getPersonnelGenerator(factionSelector, planetSelector); - return newPerson(primaryRole, secondaryRole, personnelGenerator, gender); + final AbstractPlanetSelector planetSelector, final Gender gender) { + return newPerson(primaryRole, secondaryRole, + getPersonnelGenerator(factionSelector, planetSelector), gender); } /** @@ -1300,7 +1302,8 @@ public Person newPerson(final PersonnelRole primaryRole, final PersonnelRole sec * @param personnelGenerator The {@link AbstractPersonnelGenerator} to use when creating the {@link Person}. * @return A new {@link Person} configured using {@code personnelGenerator}. */ - public Person newPerson(final PersonnelRole primaryRole, final AbstractPersonnelGenerator personnelGenerator) { + public Person newPerson(final PersonnelRole primaryRole, + final AbstractPersonnelGenerator personnelGenerator) { return newPerson(primaryRole, PersonnelRole.NONE, personnelGenerator, Gender.RANDOMIZE); } @@ -1313,8 +1316,9 @@ public Person newPerson(final PersonnelRole primaryRole, final AbstractPersonnel * @return A new {@link Person} configured using {@code personnelGenerator}. */ public Person newPerson(final PersonnelRole primaryRole, final PersonnelRole secondaryRole, - final AbstractPersonnelGenerator personnelGenerator, final Gender gender) { - Person person = personnelGenerator.generate(this, primaryRole, secondaryRole, gender); + final AbstractPersonnelGenerator personnelGenerator, + final Gender gender) { + final Person person = personnelGenerator.generate(this, primaryRole, secondaryRole, gender); // Assign a random portrait after we generate a new person if (getCampaignOptions().usePortraitForRole(primaryRole)) { diff --git a/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/DefaultFactionSelector.java b/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/DefaultFactionSelector.java index a112ee86f1..b117ccfa7f 100644 --- a/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/DefaultFactionSelector.java +++ b/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/DefaultFactionSelector.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2019-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -22,7 +22,6 @@ import mekhq.campaign.Campaign; import mekhq.campaign.RandomOriginOptions; import mekhq.campaign.universe.Faction; -import mekhq.campaign.universe.Factions; /** * Selects a {@link Faction} object. @@ -42,17 +41,6 @@ public DefaultFactionSelector(final RandomOriginOptions options) { super(options); } - /** - * Creates a new DefaultFactionSelector using the specified faction. - * @param options the {@link RandomOriginOptions} to use in faction selection - * @param factionCode The short name of the {@link Faction}. - */ - @Deprecated // Replaced with it being based on Faction - public DefaultFactionSelector(final RandomOriginOptions options, - final @Nullable String factionCode) { - this(options, (factionCode == null) ? null : Factions.getInstance().getFaction(factionCode)); - } - /** * Creates a new DefaultFactionSelector using the specified faction * @param options the {@link RandomOriginOptions} to use in faction selection From acd2d31f04face77669b3c5b3b84e38ef7033548 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 8 Jan 2022 18:13:24 -0500 Subject: [PATCH 081/115] RandomOriginOptions swapover... and some cleanup on the RandomOriginOptionsPanel based on changes over the past year --- .../resources/mekhq/resources/GUI.properties | 44 +-- .../mekhq/campaign/RandomOriginOptions.java | 4 +- .../CompanyGenerationOptions.java | 112 ++----- .../AbstractCompanyGenerator.java | 42 +-- .../panels/CompanyGenerationOptionsPanel.java | 314 +----------------- .../gui/panels/RandomOriginOptionsPanel.java | 130 +++++--- 6 files changed, 161 insertions(+), 485 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 659896a1b3..0f3fa8d17f 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -23,6 +23,7 @@ Generate.text=Generate GMMode.text=GM Mode GMMode.toolTipText=The contents of this menu are intended solely for GM use. Import.text=Import +InvalidOptions.title=Error: Invalid Option Selection None.text=None Ok.text=Ok Ok.toolTipText=Confirm the changes and close the dialog. @@ -727,8 +728,8 @@ UnitMarketTableModel.columnNames=Market,Type,Weight Class,Unit,Price,Percent,Del #### CampaignPresetPanel Class btnEditPreset.toolTipText=Edit the selected preset, which allows you to make changes to it and overwrite the current saved preset. -### CompanyGenerationOptionsPanel Class -## Base Information Panel +#### CompanyGenerationOptionsPanel Class +### Base Information Panel baseInformationPanel.title=Base Information lblCompanyGenerationMethod.text=Company Generation Method lblCompanyGenerationMethod.toolTipText=This is the method of company generator to use. These have hardcoded differences described in their tooltips. @@ -742,7 +743,7 @@ lblLancesPerCompany.text=Lances per Company lblLancesPerCompany.toolTipText=The number of lances generated per company, from 2 to 6. lblLanceSize.text=BattleMechs per Lance lblLanceSize.toolTipText=The number of BattleMechs to generate per lance, from 3 to 6. -## Personnel Panel +### Personnel Panel personnelPanel.title=Personnel lblTotalSupportPersonnel.text=Number of Support Personnel: %d lblTotalSupportPersonnel.toolTipText=This is the maximum number of starting support personnel for the force. This does not include assistants. @@ -762,23 +763,9 @@ chkAutomaticallyAssignRanks.text=Automatically Assign Ranks chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command
while MechWarriors are assigned Sergeant ranks and support personnel are assigned Corporal ranks. chkAssignFounderFlag.text=Assign Founder Flag chkAssignFounderFlag.toolTipText=This automatically applies the founder flag to all generated personnel. -## Personnel Randomization Panel +### Personnel Randomization Panel personnelRandomizationPanel.title=Personnel Randomization -chkRandomizeOrigin.text=Randomize Origin -chkRandomizeOrigin.toolTipText=This randomizes the personnel origin. If disabled this will roll all 'Mechs on the faction's RAT. -chkRandomizeAroundCentralPlanet.text=Randomize Around Central Planet -chkRandomizeAroundCentralPlanet.toolTipText=This randomizes the personnel around a central planet, which allows one to have a company generated from within a specified region around that planet.
Terra is recommended for a wide variety around the Inner Sphere. -chkCentralSystemFactionSpecific.toolTipText=Filter the central planet options so they are specific to the faction selected. -lblCentralPlanet.text=Central Planet -lblCentralPlanet.toolTipText=This is the central planet around which personnel are randomized. -comboCentralSystem.toolTipText=This is the system from which to select the central planet around which personnel are randomized. -lblOriginSearchRadius.text=Origin Search Radius -lblOriginSearchRadius.toolTipText=This is the radius that is used to find factions and planets when randomizing a person's origin. -chkExtraRandomOrigin.text=Extra Random Planetary Origin -chkExtraRandomOrigin.toolTipText=When selected random origin is randomized to the planetary level, rather than just randomizing to the system level
(with the planet being the primary planet). -lblOriginDistanceScale.text=Origin Distance Scaling Factor -lblOriginDistanceScale.toolTipText=A scaling factor to apply to planetary distances during weighting when randomizing the faction and planetary origins.
Values above 1.0 prefer the current location, while values closer to 0.1 spread out the faction selection. -## Starting Simulation Panel +### Starting Simulation Panel startingSimulationPanel.title=Starting Simulation chkRunStartingSimulation.text=Run Starting Simulation chkRunStartingSimulation.toolTipText=This will simulate any enabled simulations for duration years, starting that length before the current day. @@ -788,7 +775,7 @@ chkSimulateRandomMarriages.text=Simulate Random Marriages chkSimulateRandomMarriages.toolTipText=This runs random marriages for the duration of the simulation. chkSimulateRandomProcreation.text=Simulate Random Procreation chkSimulateRandomProcreation.toolTipText=This runs random procreation for the duration of the simulation. -## Units Panel +### Units Panel unitsPanel.title=Units lblBattleMechWeightClassGenerationMethod.text=BattleMech Weight Class Generation Method lblBattleMechWeightClassGenerationMethod.toolTipText= @@ -816,7 +803,7 @@ lblStarLeagueYear.text=Star League Year lblStarLeagueYear.toolTipText=This is the year to use when rolling for Star League 'Mechs. Valid years are 2571 to 2780, with 2765 being the default. chkAssignTechsToUnits.text=Assign Techs to Units chkAssignTechsToUnits.toolTipText=This automatically assigns techs to units during company generation. -## Unit Panel +### Unit Panel unitPanel.title=Unit lblForceNamingMethod.text=Force Naming Method lblForceNamingMethod.toolTipText=This is the method used for generating lance and company names, producing names like "Baker Company", "Bravo Company", and "Beta Company". @@ -826,7 +813,7 @@ chkGenerateOriginNodeForceIcon.text=Generate Origin Node Force Icon chkGenerateOriginNodeForceIcon.toolTipText=This will automatically generate a force icon for the origin force node. forceWeightLimitsPanel.title=Force Weight Limits forceWeightLimitsPanel.toolTipText=These are the weight levels used for determining the force icon weight level. All limits are the maximum tonnage for their weight class, with anything above the value for Assault being considered as Super Heavy. -## Spares Panel +### Spares Panel sparesPanel.title=Spares chkGenerateMothballedSpareUnits.text=Generate Mothballed Spare Units chkGenerateMothballedSpareUnits.toolTipText=This generates the specified percentage of active units as mothballed spares kept by the company to replace destroyed 'Mechs. @@ -842,13 +829,13 @@ lblNumberReloadsPerWeapon.text=Reloads per Weapon lblNumberReloadsPerWeapon.toolTipText=This is the number of reloads to generate per weapon requiring the specified ammunition type. chkGenerateFractionalMachineGunAmmunition.text=Generate Fractional Machine Gun Ammunition chkGenerateFractionalMachineGunAmmunition.toolTipText=Generate 50 rounds of machine gun ammunition per machine gun instead of the full ammunition bin, which has a default count of 100 (half ton) or 200 (full ton) rounds. -## Contracts Panel +### Contracts Panel contractsPanel.title=Contracts (Unimplemented) chkSelectStartingContract.text=Select Starting Contract chkSelectStartingContract.toolTipText=This enables a panel where the company's starting contract can be selected.
(This panel will only show when there is not an active contract and a contract market is enabled) chkStartCourseToContractPlanet.text=Start Course to Contract Planet chkStartCourseToContractPlanet.toolTipText=This automatically charts and starts the company's travel towards the planet of the selected contract. -## Finances Panel +### Finances Panel financesPanel.title=Finances lblStartingCash.text=Starting C-Bills lblStartingCash.toolTipText=The number of C-Bills to start with, minus expenses, if not randomizing the starting cash. @@ -872,7 +859,7 @@ chkPayForArmour.text=Pay for Armour chkPayForArmour.toolTipText=Pay for the spare armour generated, if any is generated. chkPayForAmmunition.text=Pay for Ammunition chkPayForAmmunition.toolTipText=Pay for the spare ammunition generated, if any is generated. -## Surprises Panel +### Surprises Panel surprisesPanel.title=Surprises (Unimplemented) surprisesPanel.toolTipText=Surprises are applied to the campaign immediately, with no user input, at the end of company generation. chkGenerateSurprises.text=Generate Surprises @@ -881,10 +868,8 @@ mysteryBoxPanel.title=Mystery Boxes mysteryBoxPanel.toolTipText=Mystery Boxes each contain a 'Mech and between two and four parts randomly determined based on the individual type. chkGenerateMysteryBoxes.text=Generate Mystery Boxes chkGenerateMysteryBoxes.toolTipText=Allow the generation of enabled mystery box types, if any are enabled. -## Option Validation Warnings -CompanyGenerationOptionsPanel.InvalidOptions.title=Error: Invalid Option Selection +### Option Validation Warnings CompanyGenerationOptionsPanel.InvalidGenerationSize.text=You must select at least one company or independent lance to generate -CompanyGenerationOptionsPanel.InvalidCentralPlanet.text=You must select a valid central planet. CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.title=Over Maximum Support Personnel CompanyGenerationOptionsPanel.OverMaximumSupportPersonnel.text=The specified number of support personnel to generate is over the recommended maximum number of support personnel. Select "Ok" to continue, or "Cancel" to make changes to these Company Generation Options. CompanyGenerationOptionsPanel.UnderHalfMaximumSupportPersonnel.title=Under Half Maximum Support Personnel @@ -918,7 +903,8 @@ chkAllowClanOrigins.text=Clan Origin Faction Generated for Non-Clan Factions chkAllowClanOrigins.toolTipText=Generate Clan origin factions for factions that are not tagged as Clan. chkExtraRandomOrigin.text=Extra Random Planetary Origin chkExtraRandomOrigin.toolTipText=Random origin is randomized to the planetary level when selected, rather than just randomizing to the system level
(with the planet being the primary planet). - +### Option Validation Warnings +RandomOriginOptionsPanel.InvalidSpecifiedPlanet.text=You must select a valid specified planet. ##### Panes diff --git a/MekHQ/src/mekhq/campaign/RandomOriginOptions.java b/MekHQ/src/mekhq/campaign/RandomOriginOptions.java index 4c06c06d36..aa7785a130 100644 --- a/MekHQ/src/mekhq/campaign/RandomOriginOptions.java +++ b/MekHQ/src/mekhq/campaign/RandomOriginOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -234,6 +234,8 @@ public void writeToXML(final PrintWriter pw, int indent) { case "extraRandomOrigin": options.setExtraRandomOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); break; + default: + break; } } } catch (Exception ex) { diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 4e314b0bbf..4dcfbee797 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -23,9 +23,8 @@ import megamek.common.annotations.Nullable; import mekhq.MekHqXmlUtil; import mekhq.campaign.Campaign; +import mekhq.campaign.RandomOriginOptions; import mekhq.campaign.personnel.enums.PersonnelRole; -import mekhq.campaign.universe.Planet; -import mekhq.campaign.universe.Systems; import mekhq.campaign.universe.enums.*; import org.apache.logging.log4j.LogManager; import org.w3c.dom.Element; @@ -64,12 +63,7 @@ public class CompanyGenerationOptions implements Serializable { private boolean assignFounderFlag; // Personnel Randomization - private boolean randomizeOrigin; - private boolean randomizeAroundCentralPlanet; - private Planet centralPlanet; // Not Implemented - private int originSearchRadius; - private boolean extraRandomOrigin; - private double originDistanceScale; + private RandomOriginOptions randomOriginOptions; // Starting Simulation private boolean runStartingSimulation; @@ -137,7 +131,7 @@ private CompanyGenerationOptions() { } - public CompanyGenerationOptions(final CompanyGenerationMethod method, final Campaign campaign) { + public CompanyGenerationOptions(final CompanyGenerationMethod method) { // Base Information setMethod(method); setGenerateMercenaryCompanyCommandLance(false); @@ -173,12 +167,7 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method, final Camp setAssignFounderFlag(true); // Personnel Randomization - setRandomizeOrigin(true); - setRandomizeAroundCentralPlanet(true); - setCentralPlanet(campaign.getSystemByName("Terra").getPrimaryPlanet()); - setOriginSearchRadius(1000); - setExtraRandomOrigin(false); - setOriginDistanceScale(0.2); + setRandomOriginOptions(new RandomOriginOptions(false)); // Starting Simulation setRunStartingSimulation(method.isWindchild()); @@ -375,52 +364,12 @@ public void setAssignFounderFlag(final boolean assignFounderFlag) { //endregion Personnel //region Personnel Randomization - public boolean isRandomizeOrigin() { - return randomizeOrigin; + public RandomOriginOptions getRandomOriginOptions() { + return randomOriginOptions; } - public void setRandomizeOrigin(final boolean randomizeOrigin) { - this.randomizeOrigin = randomizeOrigin; - } - - public boolean isRandomizeAroundCentralPlanet() { - return randomizeAroundCentralPlanet; - } - - public void setRandomizeAroundCentralPlanet(final boolean randomizeAroundCentralPlanet) { - this.randomizeAroundCentralPlanet = randomizeAroundCentralPlanet; - } - - public Planet getCentralPlanet() { - return centralPlanet; - } - - public void setCentralPlanet(final Planet centralPlanet) { - this.centralPlanet = centralPlanet; - } - - public int getOriginSearchRadius() { - return originSearchRadius; - } - - public void setOriginSearchRadius(final int originSearchRadius) { - this.originSearchRadius = originSearchRadius; - } - - public boolean isExtraRandomOrigin() { - return extraRandomOrigin; - } - - public void setExtraRandomOrigin(final boolean extraRandomOrigin) { - this.extraRandomOrigin = extraRandomOrigin; - } - - public double getOriginDistanceScale() { - return originDistanceScale; - } - - public void setOriginDistanceScale(final double originDistanceScale) { - this.originDistanceScale = originDistanceScale; + public void setRandomOriginOptions(final RandomOriginOptions randomOriginOptions) { + this.randomOriginOptions = randomOriginOptions; } //endregion Personnel Randomization @@ -849,13 +798,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignFounderFlag", isAssignFounderFlag()); // Personnel Randomization - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeOrigin", isRandomizeOrigin()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeAroundCentralPlanet", isRandomizeAroundCentralPlanet()); - MekHqXmlUtil.writeSimpleXMLAttributedTag(pw, indent, "centralPlanet", "systemId", - getCentralPlanet().getParentSystem().getId(), getCentralPlanet().getId()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originSearchRadius", getOriginSearchRadius()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "extraRandomOrigin", isExtraRandomOrigin()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "originDistanceScale", getOriginDistanceScale()); + getRandomOriginOptions().writeToXML(pw, indent); // Starting Simulation MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "runStartingSimulation", isRunStartingSimulation()); @@ -925,17 +868,15 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String } /** - * @param campaign the campaign to parse the options based on * @param file the XML file to parse the company generation options from. This should not be null, * but null values are handled nicely. * @return the parsed CompanyGenerationOptions, or the default Windchild options if there is an * issue parsing the file. */ - public static CompanyGenerationOptions parseFromXML(final Campaign campaign, - final @Nullable File file) { + public static CompanyGenerationOptions parseFromXML(final @Nullable File file) { if (file == null) { LogManager.getLogger().error("Received a null file, returning the default Windchild options"); - return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD); } final Element element; @@ -944,7 +885,7 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, element = MekHqXmlUtil.newSafeDocumentBuilder().parse(is).getDocumentElement(); } catch (Exception e) { LogManager.getLogger().error("Failed to open file, returning the default Windchild options", e); - return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD); } element.normalize(); @@ -960,7 +901,7 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, } } LogManager.getLogger().error("Failed to parse file, returning the default Windchild options"); - return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD, campaign); + return new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD); } /** @@ -1038,25 +979,14 @@ public static CompanyGenerationOptions parseFromXML(final Campaign campaign, //endregion Personnel //region Personnel Randomization - case "randomizeOrigin": - options.setRandomizeOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "randomizeAroundCentralPlanet": - options.setRandomizeAroundCentralPlanet(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "centralPlanet": - String centralPlanetSystemId = wn.getAttributes().getNamedItem("systemId").getTextContent().trim(); - String centralPlanetPlanetId = wn.getTextContent().trim(); - options.setCentralPlanet(Systems.getInstance().getSystemById(centralPlanetSystemId).getPlanetById(centralPlanetPlanetId)); - break; - case "originSearchRadius": - options.setOriginSearchRadius(Integer.parseInt(wn.getTextContent().trim())); - break; - case "extraRandomOrigin": - options.setExtraRandomOrigin(Boolean.parseBoolean(wn.getTextContent().trim())); - break; - case "originDistanceScale": - options.setOriginDistanceScale(Double.parseDouble(wn.getTextContent().trim())); + case "randomOriginOptions": + if (!wn.hasChildNodes()) { + continue; + } + final RandomOriginOptions randomOriginOptions = RandomOriginOptions.parseFromXML(wn.getChildNodes(), false); + if (randomOriginOptions != null) { + options.setRandomOriginOptions(randomOriginOptions); + } break; //endregion Personnel Randomization diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 8e112ff7aa..4a62f6fc98 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -54,6 +54,12 @@ import mekhq.campaign.universe.enums.CompanyGenerationPersonType; import mekhq.campaign.universe.generators.battleMechQualityGenerators.AbstractBattleMechQualityGenerator; import mekhq.campaign.universe.generators.battleMechWeightClassGenerators.AbstractBattleMechWeightClassGenerator; +import mekhq.campaign.universe.selectors.factionSelectors.AbstractFactionSelector; +import mekhq.campaign.universe.selectors.factionSelectors.DefaultFactionSelector; +import mekhq.campaign.universe.selectors.factionSelectors.RangedFactionSelector; +import mekhq.campaign.universe.selectors.planetSelectors.AbstractPlanetSelector; +import mekhq.campaign.universe.selectors.planetSelectors.DefaultPlanetSelector; +import mekhq.campaign.universe.selectors.planetSelectors.RangedPlanetSelector; import mekhq.campaign.work.WorkTime; import org.apache.logging.log4j.LogManager; @@ -131,7 +137,7 @@ protected AbstractCompanyGenerator(final CompanyGenerationMethod method, final C final CompanyGenerationOptions options) { this.method = method; this.options = options; - this.personnelGenerator = campaign.getPersonnelGenerator(createFactionSelector(campaign), createPlanetSelector()); + this.personnelGenerator = campaign.getPersonnelGenerator(createFactionSelector(), createPlanetSelector()); this.battleMechWeightClassGenerator = getOptions().getBattleMechWeightClassGenerationMethod().getGenerator(); this.battleMechQualityGenerator = getOptions().getBattleMechQualityGenerationMethod().getGenerator(); } @@ -151,37 +157,21 @@ public AbstractPersonnelGenerator getPersonnelGenerator() { } /** - * @param campaign the campaign to select a faction using - * @return a newly created Faction Selector based on the provided options + * @return a newly created Faction Selector */ - private AbstractFactionSelector createFactionSelector(final Campaign campaign) { - // TODO : central planet/system - - final AbstractFactionSelector factionSelector; - if (getOptions().isRandomizeOrigin()) { - factionSelector = new RangedFactionSelector(getOptions().getOriginSearchRadius()); - ((RangedFactionSelector) factionSelector).setDistanceScale(getOptions().getOriginDistanceScale()); - } else { - factionSelector = new DefaultFactionSelector(campaign.getFaction()); - } - return factionSelector; + private AbstractFactionSelector createFactionSelector() { + return getOptions().getRandomOriginOptions().isRandomizeOrigin() + ? new RangedFactionSelector(getOptions().getRandomOriginOptions()) + : new DefaultFactionSelector(getOptions().getRandomOriginOptions()); } /** * @return a newly created Planet Selector based on the provided options */ private AbstractPlanetSelector createPlanetSelector() { - // TODO : central planet/system - - final AbstractPlanetSelector planetSelector; - if (getOptions().isRandomizeOrigin()) { - planetSelector = new RangedPlanetSelector(getOptions().getOriginSearchRadius(), - getOptions().isExtraRandomOrigin()); - ((RangedPlanetSelector) planetSelector).setDistanceScale(getOptions().getOriginDistanceScale()); - } else { - planetSelector = new DefaultPlanetSelector(); - } - return planetSelector; + return getOptions().getRandomOriginOptions().isRandomizeOrigin() + ? new RangedPlanetSelector(getOptions().getRandomOriginOptions()) + : new DefaultPlanetSelector(getOptions().getRandomOriginOptions()); } public AbstractBattleMechWeightClassGenerator getBattleMechWeightClassGenerator() { @@ -1118,7 +1108,7 @@ public List generateMothballedEntities(final Campaign campaign, final List mothballedEntities = new ArrayList<>(); // Create the Faction Selector - final AbstractFactionSelector factionSelector = createFactionSelector(campaign); + final AbstractFactionSelector factionSelector = createFactionSelector(); // Create the Mothballed Entities for (int i = 0; i < numberMothballedEntities; i++) { diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index a5a154c4e3..0c02b9f4aa 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -25,11 +25,8 @@ import mekhq.MekHQ; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.enums.PersonnelRole; -import mekhq.campaign.universe.Faction; -import mekhq.campaign.universe.Planet; -import mekhq.campaign.universe.PlanetarySystem; -import mekhq.campaign.universe.enums.*; import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.enums.*; import mekhq.gui.FileDialogs; import mekhq.gui.baseComponents.AbstractMHQPanel; import mekhq.gui.baseComponents.JDisableablePanel; @@ -38,12 +35,10 @@ import javax.swing.GroupLayout.Alignment; import javax.swing.JSpinner.NumberEditor; import java.awt.*; -import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; -import java.util.stream.Collectors; /** * @author Justin "Windchild" Bowen @@ -73,14 +68,7 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { private JCheckBox chkAssignFounderFlag; // Personnel Randomization - private JCheckBox chkRandomizeOrigin; - private JCheckBox chkRandomizeAroundCentralPlanet; - private JCheckBox chkCentralSystemFactionSpecific; - private MMComboBox comboCentralSystem; - private MMComboBox comboCentralPlanet; - private JSpinner spnOriginSearchRadius; - private JCheckBox chkExtraRandomOrigin; - private JSpinner spnOriginDistanceScale; + private RandomOriginOptionsPanel randomOriginOptionsPanel; // Starting Simulation private JCheckBox chkRunStartingSimulation; @@ -299,91 +287,12 @@ public void setChkAssignFounderFlag(final JCheckBox chkAssignFounderFlag) { //endregion Personnel //region Personnel Randomization - public JCheckBox getChkRandomizeOrigin() { - return chkRandomizeOrigin; - } - - public void setChkRandomizeOrigin(final JCheckBox chkRandomizeOrigin) { - this.chkRandomizeOrigin = chkRandomizeOrigin; - } - - public JCheckBox getChkRandomizeAroundCentralPlanet() { - return chkRandomizeAroundCentralPlanet; - } - - public void setChkRandomizeAroundCentralPlanet(final JCheckBox chkRandomizeAroundCentralPlanet) { - this.chkRandomizeAroundCentralPlanet = chkRandomizeAroundCentralPlanet; - } - - public JCheckBox getChkCentralSystemFactionSpecific() { - return chkCentralSystemFactionSpecific; - } - - public void setChkCentralSystemFactionSpecific(final JCheckBox chkCentralSystemFactionSpecific) { - this.chkCentralSystemFactionSpecific = chkCentralSystemFactionSpecific; - } - - public MMComboBox getComboCentralSystem() { - return comboCentralSystem; - } - - public void setComboCentralSystem(final MMComboBox comboCentralSystem) { - this.comboCentralSystem = comboCentralSystem; - } - - private void restoreComboCentralSystem() { - getComboCentralSystem().removeAllItems(); - final Faction faction = getChkCentralSystemFactionSpecific().isSelected() - ? getCampaign().getFaction() : null; - final PlanetarySystem[] planetarySystems = getCampaign().getSystems().stream() - .filter(p -> (faction == null) || p.getFactionSet(getCampaign().getLocalDate()).contains(faction)) - .sorted(Comparator.comparing(p -> p.getName(getCampaign().getLocalDate()))) - .collect(Collectors.toList()).toArray(new PlanetarySystem[]{}); - getComboCentralSystem().setModel(new DefaultComboBoxModel<>(planetarySystems)); - restoreComboCentralPlanet(); - } - - public MMComboBox getComboCentralPlanet() { - return comboCentralPlanet; - } - - public void setComboCentralPlanet(final MMComboBox comboCentralPlanet) { - this.comboCentralPlanet = comboCentralPlanet; - } - - private void restoreComboCentralPlanet() { - final PlanetarySystem centralSystem = getComboCentralSystem().getSelectedItem(); - if (centralSystem != null) { - getComboCentralPlanet().setModel(new DefaultComboBoxModel<>( - centralSystem.getPlanets().toArray(new Planet[]{}))); - getComboCentralPlanet().setSelectedItem(centralSystem.getPrimaryPlanet()); - } else { - getComboCentralPlanet().removeAllItems(); - } - } - - public JSpinner getSpnOriginSearchRadius() { - return spnOriginSearchRadius; + public RandomOriginOptionsPanel getRandomOriginOptionsPanel() { + return randomOriginOptionsPanel; } - public void setSpnOriginSearchRadius(final JSpinner spnOriginSearchRadius) { - this.spnOriginSearchRadius = spnOriginSearchRadius; - } - - public JCheckBox getChkExtraRandomOrigin() { - return chkExtraRandomOrigin; - } - - public void setChkExtraRandomOrigin(final JCheckBox chkExtraRandomOrigin) { - this.chkExtraRandomOrigin = chkExtraRandomOrigin; - } - - public JSpinner getSpnOriginDistanceScale() { - return spnOriginDistanceScale; - } - - public void setSpnOriginDistanceScale(final JSpinner spnOriginDistanceScale) { - this.spnOriginDistanceScale = spnOriginDistanceScale; + public void setRandomOriginOptionsPanel(final RandomOriginOptionsPanel randomOriginOptionsPanel) { + this.randomOriginOptionsPanel = randomOriginOptionsPanel; } //endregion Personnel Randomization @@ -1050,171 +959,9 @@ private JPanel createSupportPersonnelNumbersPanel() { } private JPanel createPersonnelRandomizationPanel() { - // Initialize Labels Used in ActionListeners - final JLabel lblCentralPlanet = new JLabel(); - final JLabel lblOriginSearchRadius = new JLabel(); - final JLabel lblOriginDistanceScale = new JLabel(); - - // Create Panel Components - setChkRandomizeOrigin(new JCheckBox(resources.getString("chkRandomizeOrigin.text"))); - getChkRandomizeOrigin().setToolTipText(resources.getString("chkRandomizeOrigin.toolTipText")); - getChkRandomizeOrigin().setName("chkRandomizeOrigin"); - getChkRandomizeOrigin().addActionListener(evt -> { - final boolean selected = getChkRandomizeOrigin().isSelected(); - getChkRandomizeAroundCentralPlanet().setEnabled(selected); - getChkCentralSystemFactionSpecific().setEnabled(selected && getChkRandomizeAroundCentralPlanet().isSelected()); - lblCentralPlanet.setEnabled(selected && getChkRandomizeAroundCentralPlanet().isSelected()); - getComboCentralSystem().setEnabled(selected && getChkRandomizeAroundCentralPlanet().isSelected()); - getComboCentralPlanet().setEnabled(selected && getChkRandomizeAroundCentralPlanet().isSelected()); - lblOriginSearchRadius.setEnabled(selected); - getSpnOriginSearchRadius().setEnabled(selected); - getChkExtraRandomOrigin().setEnabled(selected); - lblOriginDistanceScale.setEnabled(selected); - getSpnOriginDistanceScale().setEnabled(selected); - }); - - setChkRandomizeAroundCentralPlanet(new JCheckBox(resources.getString("chkRandomizeAroundCentralPlanet.text"))); - getChkRandomizeAroundCentralPlanet().setToolTipText(resources.getString("chkRandomizeAroundCentralPlanet.toolTipText")); - getChkRandomizeAroundCentralPlanet().setName("chkRandomizeAroundCentralPlanet"); - getChkRandomizeAroundCentralPlanet().addActionListener(evt -> { - final boolean selected = getChkRandomizeAroundCentralPlanet().isSelected() - && getChkRandomizeAroundCentralPlanet().isEnabled(); - getChkCentralSystemFactionSpecific().setEnabled(selected); - lblCentralPlanet.setEnabled(selected); - getComboCentralSystem().setEnabled(selected); - getComboCentralPlanet().setEnabled(selected); - }); - - setChkCentralSystemFactionSpecific(new JCheckBox(resources.getString("FactionSpecific.text"))); - getChkCentralSystemFactionSpecific().setToolTipText(resources.getString("chkCentralSystemFactionSpecific.toolTipText")); - getChkCentralSystemFactionSpecific().setName("chkCentralSystemFactionSpecific"); - getChkCentralSystemFactionSpecific().addActionListener(evt -> { - final PlanetarySystem system = getComboCentralSystem().getSelectedItem(); - if ((system == null) - || !system.getFactionSet(getCampaign().getLocalDate()).contains(getCampaign().getFaction())) { - restoreComboCentralSystem(); - } - }); - - lblCentralPlanet.setText(resources.getString("lblCentralPlanet.text")); - lblCentralPlanet.setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); - lblCentralPlanet.setName("lblCentralPlanet"); - - setComboCentralSystem(new MMComboBox<>("comboCentralSystem")); - getComboCentralSystem().setToolTipText(resources.getString("comboCentralSystem.toolTipText")); - getComboCentralSystem().setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(final JList list, final Object value, - final int index, final boolean isSelected, - final boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof PlanetarySystem) { - setText(((PlanetarySystem) value).getName(getCampaign().getLocalDate())); - } - return this; - } - }); - getComboCentralSystem().addActionListener(evt -> { - final PlanetarySystem system = getComboCentralSystem().getSelectedItem(); - final Planet planet = getComboCentralPlanet().getSelectedItem(); - if ((system == null) || ((planet != null) && !planet.getParentSystem().equals(system))) { - restoreComboCentralPlanet(); - } - }); - - setComboCentralPlanet(new MMComboBox<>("comboCentralPlanet")); - getComboCentralPlanet().setToolTipText(resources.getString("lblCentralPlanet.toolTipText")); - getComboCentralPlanet().setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(final JList list, final Object value, - final int index, final boolean isSelected, - final boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof Planet) { - setText(((Planet) value).getName(getCampaign().getLocalDate())); - } - return this; - } - }); - - lblOriginSearchRadius.setText(resources.getString("lblOriginSearchRadius.text")); - lblOriginSearchRadius.setToolTipText(resources.getString("lblOriginSearchRadius.toolTipText")); - lblOriginSearchRadius.setName("lblOriginSearchRadius"); - - setSpnOriginSearchRadius(new JSpinner(new SpinnerNumberModel(0, 0, 2000, 25))); - getSpnOriginSearchRadius().setToolTipText(resources.getString("lblOriginSearchRadius.toolTipText")); - getSpnOriginSearchRadius().setName("spnOriginSearchRadius"); - - setChkExtraRandomOrigin(new JCheckBox(resources.getString("chkExtraRandomOrigin.text"))); - getChkExtraRandomOrigin().setToolTipText(resources.getString("chkExtraRandomOrigin.toolTipText")); - getChkExtraRandomOrigin().setName("chkExtraRandomOrigin"); - - lblOriginDistanceScale.setText(resources.getString("lblOriginDistanceScale.text")); - lblOriginDistanceScale.setToolTipText(resources.getString("lblOriginDistanceScale.toolTipText")); - lblOriginDistanceScale.setName("lblOriginDistanceScale"); - - setSpnOriginDistanceScale(new JSpinner(new SpinnerNumberModel(0.6, 0.1, 2.0, 0.1))); - getSpnOriginDistanceScale().setToolTipText(resources.getString("lblOriginDistanceScale.toolTipText")); - getSpnOriginDistanceScale().setName("spnOriginDistanceScale"); - - // Programmatically Assign Accessibility Labels - lblCentralPlanet.setLabelFor(getComboCentralPlanet()); - lblOriginSearchRadius.setLabelFor(getSpnOriginSearchRadius()); - lblOriginDistanceScale.setLabelFor(getSpnOriginDistanceScale()); - - // Disable Panel by Default - getChkRandomizeOrigin().setSelected(true); - getChkRandomizeOrigin().doClick(); - - // Layout the UI - final JPanel panel = new JPanel(); - panel.setBorder(BorderFactory.createTitledBorder(resources.getString("personnelRandomizationPanel.title"))); - panel.setName("personnelRandomizationPanel"); - final GroupLayout layout = new GroupLayout(panel); - panel.setLayout(layout); - - layout.setAutoCreateGaps(true); - layout.setAutoCreateContainerGaps(true); - - layout.setVerticalGroup( - layout.createSequentialGroup() - .addComponent(getChkRandomizeOrigin()) - .addGroup(layout.createParallelGroup(Alignment.BASELINE) - .addComponent(getChkRandomizeAroundCentralPlanet()) - .addComponent(getChkCentralSystemFactionSpecific(), Alignment.LEADING)) - .addGroup(layout.createParallelGroup(Alignment.BASELINE) - .addComponent(lblCentralPlanet) - .addComponent(getComboCentralSystem()) - .addComponent(getComboCentralPlanet(), Alignment.LEADING)) - .addGroup(layout.createParallelGroup(Alignment.BASELINE) - .addComponent(lblOriginSearchRadius) - .addComponent(getSpnOriginSearchRadius(), Alignment.LEADING)) - .addComponent(getChkExtraRandomOrigin()) - .addGroup(layout.createParallelGroup(Alignment.BASELINE) - .addComponent(lblOriginDistanceScale) - .addComponent(getSpnOriginDistanceScale(), Alignment.LEADING)) - ); - - layout.setHorizontalGroup( - layout.createParallelGroup(Alignment.LEADING) - .addComponent(getChkRandomizeOrigin()) - .addGroup(layout.createSequentialGroup() - .addComponent(getChkRandomizeAroundCentralPlanet()) - .addComponent(getChkCentralSystemFactionSpecific())) - .addGroup(layout.createSequentialGroup() - .addComponent(lblCentralPlanet) - .addComponent(getComboCentralSystem()) - .addComponent(getComboCentralPlanet())) - .addGroup(layout.createSequentialGroup() - .addComponent(lblOriginSearchRadius) - .addComponent(getSpnOriginSearchRadius())) - .addComponent(getChkExtraRandomOrigin()) - .addGroup(layout.createSequentialGroup() - .addComponent(lblOriginDistanceScale) - .addComponent(getSpnOriginDistanceScale())) - ); - - return panel; + setRandomOriginOptionsPanel(new RandomOriginOptionsPanel(getFrame(), getCampaign(), + getCampaign().getFaction())); + return getRandomOriginOptionsPanel(); } private JPanel createStartingSimulationPanel() { @@ -1941,7 +1688,7 @@ public void setOptions() { * @param method the CompanyGenerationOptions to create the CompanyGenerationOptions from */ public void setOptions(final CompanyGenerationMethod method) { - setOptions(new CompanyGenerationOptions(method, getCampaign())); + setOptions(new CompanyGenerationOptions(method)); } /** @@ -1972,20 +1719,7 @@ public void setOptions(final CompanyGenerationOptions options) { getChkAssignFounderFlag().setSelected(options.isAssignFounderFlag()); // Personnel Randomization - if (getChkRandomizeOrigin().isSelected() != options.isRandomizeOrigin()) { - getChkRandomizeOrigin().doClick(); - } - - if (getChkRandomizeAroundCentralPlanet().isSelected() != options.isRandomizeAroundCentralPlanet()) { - getChkRandomizeAroundCentralPlanet().doClick(); - } - getChkCentralSystemFactionSpecific().setSelected(false); - restoreComboCentralSystem(); - getComboCentralSystem().setSelectedItem(options.getCentralPlanet().getParentSystem()); - getComboCentralPlanet().setSelectedItem(options.getCentralPlanet()); - getSpnOriginSearchRadius().setValue(options.getOriginSearchRadius()); - getChkExtraRandomOrigin().setSelected(options.isExtraRandomOrigin()); - getSpnOriginDistanceScale().setValue(options.getOriginDistanceScale()); + getRandomOriginOptionsPanel().setOptions(options.getRandomOriginOptions()); // Starting Simulation if (getChkRunStartingSimulation().isSelected() != options.isRunStartingSimulation()) { @@ -2072,7 +1806,7 @@ public void setOptions(final CompanyGenerationOptions options) { */ public CompanyGenerationOptions createOptionsFromPanel() { final CompanyGenerationOptions options = new CompanyGenerationOptions( - getComboCompanyGenerationMethod().getSelectedItem(), getCampaign()); + getComboCompanyGenerationMethod().getSelectedItem()); // Base Information options.setGenerateMercenaryCompanyCommandLance(getChkGenerateMercenaryCompanyCommandLance().isSelected()); @@ -2100,12 +1834,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setAssignFounderFlag(getChkAssignFounderFlag().isSelected()); // Personnel Randomization - options.setRandomizeOrigin(getChkRandomizeOrigin().isSelected()); - options.setRandomizeAroundCentralPlanet(getChkRandomizeAroundCentralPlanet().isSelected()); - options.setCentralPlanet(getComboCentralPlanet().getSelectedItem()); - options.setOriginSearchRadius((Integer) getSpnOriginSearchRadius().getValue()); - options.setExtraRandomOrigin(getChkExtraRandomOrigin().isSelected()); - options.setOriginDistanceScale((Double) getSpnOriginDistanceScale().getValue()); + options.setRandomOriginOptions(getRandomOriginOptionsPanel().createOptionsFromPanel()); // Starting Simulation options.setRunStartingSimulation(getChkRunStartingSimulation().isSelected()); @@ -2187,21 +1916,14 @@ public ValidationState validateOptions(final boolean display) { if (display) { JOptionPane.showMessageDialog(getFrame(), resources.getString("CompanyGenerationOptionsPanel.InvalidGenerationSize.text"), - resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), + resources.getString("InvalidOptions.title"), JOptionPane.ERROR_MESSAGE); } return ValidationState.FAILURE; } - // Central System/Planet Validation - if ((getComboCentralSystem().getSelectedItem() == null) - || (getComboCentralPlanet().getSelectedItem() == null)) { - if (display) { - JOptionPane.showMessageDialog(getFrame(), - resources.getString("CompanyGenerationOptionsPanel.InvalidCentralPlanet.text"), - resources.getString("CompanyGenerationOptionsPanel.InvalidOptions.title"), - JOptionPane.ERROR_MESSAGE); - } + // Random Origin Options Validation + if (getRandomOriginOptionsPanel().validateOptions(display).isFailure()) { return ValidationState.FAILURE; } //endregion Errors @@ -2242,7 +1964,7 @@ public ValidationState validateOptions(final boolean display) { */ public void importOptionsFromXML() { FileDialogs.openCompanyGenerationOptions(getFrame()) - .ifPresent(file -> setOptions(CompanyGenerationOptions.parseFromXML(getCampaign(), file))); + .ifPresent(file -> setOptions(CompanyGenerationOptions.parseFromXML(file))); } /** diff --git a/MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java index 0822eefcc0..d6ab48dff6 100644 --- a/MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -19,6 +19,7 @@ package mekhq.gui.panels; import megamek.client.ui.baseComponents.MMComboBox; +import megamek.client.ui.enums.ValidationState; import megamek.common.annotations.Nullable; import mekhq.campaign.Campaign; import mekhq.campaign.RandomOriginOptions; @@ -30,22 +31,29 @@ import org.apache.logging.log4j.LogManager; import javax.swing.*; +import javax.swing.GroupLayout.Alignment; import java.awt.*; import java.util.Comparator; import java.util.Objects; import java.util.stream.Collectors; +/** + * This is used to select a set of RandomOriginOptions. It requires either the faction or the + * ComboBox from which a faction is selected, the former when the faction is constant and the + * latter when it can change after this panel is initialized. + */ public class RandomOriginOptionsPanel extends AbstractMHQPanel { //region Variable Declarations private final Campaign campaign; + private final Faction faction; private final MMComboBox comboFaction; private JCheckBox chkRandomizeOrigin; private JCheckBox chkRandomizeDependentsOrigin; private JCheckBox chkRandomizeAroundSpecifiedPlanet; private JCheckBox chkSpecifiedSystemFactionSpecific; - private JComboBox comboSpecifiedSystem; - private JComboBox comboSpecifiedPlanet; + private MMComboBox comboSpecifiedSystem; + private MMComboBox comboSpecifiedPlanet; private JSpinner spnOriginSearchRadius; private JSpinner spnOriginDistanceScale; private JCheckBox chkAllowClanOrigins; @@ -53,10 +61,22 @@ public class RandomOriginOptionsPanel extends AbstractMHQPanel { //endregion Variable Declarations //region Constructors + public RandomOriginOptionsPanel(final JFrame frame, final Campaign campaign, + final Faction faction) { + this(frame, campaign, faction, null); + } + public RandomOriginOptionsPanel(final JFrame frame, final Campaign campaign, final MMComboBox comboFaction) { + this(frame, campaign, null, comboFaction); + } + + private RandomOriginOptionsPanel(final JFrame frame, final Campaign campaign, + final @Nullable Faction faction, + final @Nullable MMComboBox comboFaction) { super(frame, "RandomOriginOptionsPanel"); this.campaign = campaign; + this.faction = faction; this.comboFaction = comboFaction; initialize(); } @@ -67,12 +87,17 @@ public Campaign getCampaign() { return campaign; } - public MMComboBox getComboFaction() { - return comboFaction; + public Faction getFaction() { + return (getComboFaction() == null) ? getFactionDirect() + : Objects.requireNonNull(getComboFaction().getSelectedItem()).getFaction(); } - public Faction getFaction() { - return Objects.requireNonNull(getComboFaction().getSelectedItem()).getFaction(); + private @Nullable Faction getFactionDirect() { + return faction; + } + + public @Nullable MMComboBox getComboFaction() { + return comboFaction; } public JCheckBox getChkRandomizeOrigin() { @@ -107,15 +132,11 @@ public void setChkSpecifiedSystemFactionSpecific(final JCheckBox chkSpecifiedSys this.chkSpecifiedSystemFactionSpecific = chkSpecifiedSystemFactionSpecific; } - public JComboBox getComboSpecifiedSystem() { + public MMComboBox getComboSpecifiedSystem() { return comboSpecifiedSystem; } - public @Nullable PlanetarySystem getSpecifiedSystem() { - return (PlanetarySystem) getComboSpecifiedSystem().getSelectedItem(); - } - - public void setComboSpecifiedSystem(final JComboBox comboSpecifiedSystem) { + public void setComboSpecifiedSystem(final MMComboBox comboSpecifiedSystem) { this.comboSpecifiedSystem = comboSpecifiedSystem; } @@ -126,25 +147,22 @@ private void restoreComboSpecifiedSystem() { restoreComboSpecifiedPlanet(); } - public JComboBox getComboSpecifiedPlanet() { + public MMComboBox getComboSpecifiedPlanet() { return comboSpecifiedPlanet; } - public @Nullable Planet getSpecifiedPlanet() { - return (Planet) getComboSpecifiedPlanet().getSelectedItem(); - } - - public void setComboSpecifiedPlanet(final JComboBox comboSpecifiedPlanet) { + public void setComboSpecifiedPlanet(final MMComboBox comboSpecifiedPlanet) { this.comboSpecifiedPlanet = comboSpecifiedPlanet; } private void restoreComboSpecifiedPlanet() { - if (getSpecifiedSystem() != null) { - getComboSpecifiedPlanet().setModel(new DefaultComboBoxModel<>( - getSpecifiedSystem().getPlanets().toArray(new Planet[]{}))); - getComboSpecifiedPlanet().setSelectedItem(getSpecifiedSystem().getPrimaryPlanet()); - } else { + final PlanetarySystem planetarySystem = getComboSpecifiedSystem().getSelectedItem(); + if (planetarySystem == null) { getComboSpecifiedPlanet().removeAllItems(); + } else { + getComboSpecifiedPlanet().setModel(new DefaultComboBoxModel<>( + planetarySystem.getPlanets().toArray(new Planet[]{}))); + getComboSpecifiedPlanet().setSelectedItem(planetarySystem.getPrimaryPlanet()); } } @@ -227,8 +245,9 @@ protected void initialize() { getChkSpecifiedSystemFactionSpecific().setToolTipText(resources.getString("chkSpecifiedSystemFactionSpecific.toolTipText")); getChkSpecifiedSystemFactionSpecific().setName("chkSpecifiedSystemFactionSpecific"); getChkSpecifiedSystemFactionSpecific().addActionListener(evt -> { - if ((getSpecifiedSystem() == null) || ((getSpecifiedSystem() != null) - && !getSpecifiedSystem().getFactionSet(getCampaign().getLocalDate()).contains(getFaction()))) { + final PlanetarySystem planetarySystem = getComboSpecifiedSystem().getSelectedItem(); + if ((planetarySystem == null) + || !planetarySystem.getFactionSet(getCampaign().getLocalDate()).contains(getFaction())) { restoreComboSpecifiedSystem(); } }); @@ -237,9 +256,8 @@ protected void initialize() { lblSpecifiedPlanet.setToolTipText(resources.getString("lblSpecifiedPlanet.toolTipText")); lblSpecifiedPlanet.setName("lblSpecifiedPlanet"); - setComboSpecifiedSystem(new JComboBox<>()); + setComboSpecifiedSystem(new MMComboBox<>("comboSpecifiedSystem")); getComboSpecifiedSystem().setToolTipText(resources.getString("comboSpecifiedSystem.toolTipText")); - getComboSpecifiedSystem().setName("comboSpecifiedSystem"); getComboSpecifiedSystem().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -253,15 +271,16 @@ public Component getListCellRendererComponent(final JList list, final Object } }); getComboSpecifiedSystem().addActionListener(evt -> { - if ((getSpecifiedSystem() == null) || ((getSpecifiedSystem() != null) && (getSpecifiedPlanet() != null) - && !getSpecifiedPlanet().getParentSystem().equals(getSpecifiedSystem()))) { + final PlanetarySystem planetarySystem = getComboSpecifiedSystem().getSelectedItem(); + final Planet planet = getComboSpecifiedPlanet().getSelectedItem(); + if ((planetarySystem == null) + || ((planet != null) && !planet.getParentSystem().equals(planetarySystem))) { restoreComboSpecifiedPlanet(); } }); - setComboSpecifiedPlanet(new JComboBox<>()); + setComboSpecifiedPlanet(new MMComboBox<>("comboSpecifiedPlanet")); getComboSpecifiedPlanet().setToolTipText(resources.getString("lblSpecifiedPlanet.toolTipText")); - getComboSpecifiedPlanet().setName("comboSpecifiedPlanet"); getComboSpecifiedPlanet().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, @@ -321,25 +340,25 @@ public Component getListCellRendererComponent(final JList list, final Object layout.createSequentialGroup() .addComponent(getChkRandomizeOrigin()) .addComponent(getChkRandomizeDependentsOrigin()) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(getChkRandomizeAroundSpecifiedPlanet()) - .addComponent(getChkSpecifiedSystemFactionSpecific(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getChkSpecifiedSystemFactionSpecific(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblSpecifiedPlanet) .addComponent(getComboSpecifiedSystem()) - .addComponent(getComboSpecifiedPlanet(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getComboSpecifiedPlanet(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblOriginSearchRadius) - .addComponent(getSpnOriginSearchRadius(), GroupLayout.Alignment.LEADING)) - .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(getSpnOriginSearchRadius(), Alignment.LEADING)) + .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblOriginDistanceScale) - .addComponent(getSpnOriginDistanceScale(), GroupLayout.Alignment.LEADING)) + .addComponent(getSpnOriginDistanceScale(), Alignment.LEADING)) .addComponent(getChkAllowClanOrigins()) .addComponent(getChkExtraRandomOrigin()) ); layout.setHorizontalGroup( - layout.createParallelGroup(GroupLayout.Alignment.LEADING) + layout.createParallelGroup(Alignment.LEADING) .addComponent(getChkRandomizeOrigin()) .addComponent(getChkRandomizeDependentsOrigin()) .addGroup(layout.createSequentialGroup() @@ -368,6 +387,7 @@ private PlanetarySystem[] getPlanetarySystems(final @Nullable Faction faction) { } //endregion Initialization + //region Options public void setOptions(final RandomOriginOptions options) { if (getChkRandomizeOrigin().isSelected() != options.isRandomizeOrigin()) { getChkRandomizeOrigin().doClick(); @@ -392,7 +412,7 @@ public RandomOriginOptions createOptionsFromPanel() { options.setRandomizeOrigin(getChkRandomizeOrigin().isSelected()); options.setRandomizeDependentOrigin(getChkRandomizeDependentsOrigin().isSelected()); options.setRandomizeAroundSpecifiedPlanet(getChkRandomizeAroundSpecifiedPlanet().isSelected()); - options.setSpecifiedPlanet(getSpecifiedPlanet()); + options.setSpecifiedPlanet(getComboSpecifiedPlanet().getSelectedItem()); options.setOriginSearchRadius((Integer) getSpnOriginSearchRadius().getValue()); options.setOriginDistanceScale((Double) getSpnOriginDistanceScale().getValue()); options.setAllowClanOrigins(getChkAllowClanOrigins().isSelected()); @@ -402,4 +422,30 @@ public RandomOriginOptions createOptionsFromPanel() { } return options; } + + /** + * Validates the data contained in this panel, returning the current state of validation. + * @param display to display dialogs containing the messages or not + * @return ValidationState.SUCCESS if the data validates successfully, ValidationState.WARNING + * if a warning was issued, or ValidationState.FAILURE if validation fails + */ + public ValidationState validateOptions(final boolean display) { + //region Errors + // Specified System/Planet Validation + if ((getComboSpecifiedSystem().getSelectedItem() == null) + || (getComboSpecifiedPlanet().getSelectedItem() == null)) { + if (display) { + JOptionPane.showMessageDialog(getFrame(), + resources.getString("RandomOriginOptionsPanel.InvalidSpecifiedPlanet.text"), + resources.getString("InvalidOptions.title"), + JOptionPane.ERROR_MESSAGE); + } + return ValidationState.FAILURE; + } + //endregion Errors + + // The options specified are correct, and thus can be saved + return ValidationState.SUCCESS; + } + //endregion Options } From 5475c8073dbf4114c93e4da2d6ace0a6b111ad24 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 8 Jan 2022 20:51:12 -0500 Subject: [PATCH 082/115] Finishing Force Icons swapover --- .../mekhq/resources/Universe.properties | 6 +- MekHQ/src/mekhq/MekHqConstants.java | 30 ++++-- .../AbstractCompanyGenerator.java | 96 ++++++++++++++----- 3 files changed, 96 insertions(+), 36 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 85e373905d..510dd5ed44 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -213,7 +213,7 @@ PartGenerationMethod.TRIPLE.toolTipText=This returns three parts for every one i ## Generators # AbstractCompanyGenerator -AbstractCompanyGenerator.commandLance.text=\u0020Command Lance -AbstractCompanyGenerator.company.text=\u0020Company -AbstractCompanyGenerator.lance.text=\u0020Lance +AbstractCompanyGenerator.CommandLance.text=\u0020Command Lance +AbstractCompanyGenerator.Company.text=\u0020Company +AbstractCompanyGenerator.Lance.text=\u0020Lance AbstractCompanyGenerator.CompanyStartupFunding.text=Remaining Company Startup Funding diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index aa2a7f2b7c..1239316e59 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -147,13 +147,25 @@ public final class MekHqConstants extends SuiteConstants { //region File Paths // This holds all required file paths not saved as part of MekHQ Options - public static final String LAYERED_FORCE_ICON_TYPE_PATH = "Pieces/Types/"; - public static final String LAYERED_FORCE_ICON_STRAT_OPS_PATH = "StratOps/"; - public static final String LAYERED_FORCE_ICON_BATTLEMECH_LEFT_FILENAME = "BattleMech (Left).png"; - public static final String LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME = "BattleMech (Center).png"; - public static final String LAYERED_FORCE_ICON_FORMATION_PATH = "Pieces/Formations/"; public static final String LAYERED_FORCE_ICON_ADJUSTMENT_PATH = "Pieces/Adjustments/"; public static final String LAYERED_FORCE_ICON_ALPHANUMERIC_PATH = "Pieces/Alphanumerics/"; + public static final String LAYERED_FORCE_ICON_ALPHANUMERIC_BOTTOM_RIGHT_PATH = "Bottom Right/"; + public static final String LAYERED_FORCE_ICON_ALPHANUMERIC_HQ_FILENAME = "HQ.png"; + public static final String LAYERED_FORCE_ICON_BACKGROUND_PATH = "Pieces/Backgrounds/"; + public static final String LAYERED_FORCE_ICON_BACKGROUND_CLAN_PATH = "Clan/"; + public static final String LAYERED_FORCE_ICON_FORMATION_PATH = "Pieces/Formations/"; + public static final String LAYERED_FORCE_ICON_FORMATION_CLAN_PATH = "Clan/"; + public static final String LAYERED_FORCE_ICON_FORMATION_STAR_FILENAME = "(02) Star.png"; + public static final String LAYERED_FORCE_ICON_FORMATION_TRINARY_FILENAME = "(06) Trinary.png"; + public static final String LAYERED_FORCE_ICON_FORMATION_COMSTAR_PATH = "ComStar/"; + public static final String LAYERED_FORCE_ICON_FORMATION_LEVEL_II_FILENAME = "(02) Level II.png"; + public static final String LAYERED_FORCE_ICON_FORMATION_LEVEL_III_FILENAME = "(04) Level III.png"; + public static final String LAYERED_FORCE_ICON_FORMATION_INNER_SPHERE_PATH = "Inner Sphere/"; + public static final String LAYERED_FORCE_ICON_FORMATION_LANCE_FILENAME = "(04) Lance.png"; + public static final String LAYERED_FORCE_ICON_FORMATION_COMPANY_FILENAME = "(05) Company.png"; + public static final String LAYERED_FORCE_ICON_FRAME_PATH = "Pieces/Frames/"; + public static final String LAYERED_FORCE_ICON_DEFAULT_FRAME_FILENAME = "Frame.png"; + public static final String LAYERED_FORCE_ICON_LOGO_PATH = "Pieces/Logos/"; public static final String LAYERED_FORCE_ICON_SPECIAL_MODIFIER_PATH = "Pieces/Special Modifiers/"; public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_BORDER_PATH = "Operational Indicators (Border)/"; public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_TAB_PATH = "Operational Indicators (Tab)/"; @@ -162,10 +174,10 @@ public final class MekHqConstants extends SuiteConstants { public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_MARGINALLY_OPERATIONAL_FILENAME = "(03) Red - Marginally Operational.png"; public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_NOT_OPERATIONAL_FILENAME = "(04) Gray - Not Operational.png"; public static final String LAYERED_FORCE_ICON_OPERATIONAL_STATUS_FACTORY_FRESH_FILENAME = "(05) Blue - Factory Fresh.png"; - public static final String LAYERED_FORCE_ICON_BACKGROUND_PATH = "Pieces/Backgrounds/"; - public static final String LAYERED_FORCE_ICON_FRAME_PATH = "Pieces/Frames/"; - public static final String LAYERED_FORCE_ICON_DEFAULT_FRAME_FILENAME = "Frame.png"; - public static final String LAYERED_FORCE_ICON_LOGO_PATH = "Pieces/Logos/"; + public static final String LAYERED_FORCE_ICON_TYPE_PATH = "Pieces/Types/"; + public static final String LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH = "StratOps/"; + public static final String LAYERED_FORCE_ICON_BATTLEMECH_LEFT_FILENAME = "BattleMech (Left).png"; + public static final String LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME = "BattleMech (Center).png"; public static final String CUSTOM_MECHFILES_DIRECTORY_PATH = "data/mechfiles/customs/"; public static final String AWARDS_DIRECTORY_PATH = "data/universe/awards/"; public static final String RATINFO_DIR = "data/universe/ratdata/"; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 4a62f6fc98..6a0d4a549a 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -910,11 +910,15 @@ private void generateUnit(final Campaign campaign, final List trackers) { final Force originForce = campaign.getForce(0); final Alphabet[] alphabet = Alphabet.values(); + ForcePieceIcon background = null; String backgroundCategory = ""; String backgroundFilename = ""; if (getOptions().isGenerateForceIcons()) { if (MHQStaticDirectoryManager.getForceIcons() != null) { + background = new ForcePieceIcon(LayeredForceIconLayer.BACKGROUND, + MekHqConstants.LAYERED_FORCE_ICON_BACKGROUND_CLAN_PATH, "Clan Snow Raven.png"); +/* if (MHQStaticDirectoryManager.getForceIcons().getItems().keySet().stream() .anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getFullName(campaign.getGameYear())))) { background = getOptions().getFaction().getFullName(campaign.getGameYear()); @@ -924,6 +928,7 @@ private void generateUnit(final Campaign campaign, .stream().anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getShortName())))) { background = getOptions().getFaction().getShortName(); } +*/ } // Create the Origin Force Icon @@ -934,7 +939,7 @@ private void generateUnit(final Campaign campaign, layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.TYPE, new ArrayList<>()); layeredForceIcon.getPieces().get(LayeredForceIconLayer.TYPE) .add(new ForcePieceIcon(LayeredForceIconLayer.TYPE, - MekHqConstants.LAYERED_FORCE_ICON_STRAT_OPS_PATH, + MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME)); // Background @@ -952,15 +957,22 @@ private void generateUnit(final Campaign campaign, // Generate the Mercenary Company Command Lance if (getOptions().isGenerateMercenaryCompanyCommandLance()) { final Force commandLance = createLance(campaign, originForce, trackers, campaign.getName() - + resources.getString("AbstractCompanyGenerator.commandLance.text"), background); - commandLance.getIconMap().put(LayeredForceIconLayer.SPECIAL_MODIFIER.getLayerPath(), new Vector<>()); - commandLance.getIconMap().get(LayeredForceIconLayer.SPECIAL_MODIFIER.getLayerPath()).add("HQ indicator.png"); + + resources.getString("AbstractCompanyGenerator.CommandLance.text"), background); + if (getOptions().isGenerateForceIcons() + && (commandLance.getForceIcon() instanceof LayeredForceIcon)) { + final LayeredForceIcon icon = (LayeredForceIcon) commandLance.getForceIcon(); + icon.getPieces().putIfAbsent(LayeredForceIconLayer.ALPHANUMERIC, new ArrayList<>()); + icon.getPieces().get(LayeredForceIconLayer.ALPHANUMERIC) + .add(new ForcePieceIcon(LayeredForceIconLayer.ALPHANUMERIC, + MekHqConstants.LAYERED_FORCE_ICON_ALPHANUMERIC_BOTTOM_RIGHT_PATH, + MekHqConstants.LAYERED_FORCE_ICON_ALPHANUMERIC_HQ_FILENAME)); + } } // Create Companies for (int i = 0; i < getOptions().getCompanyCount(); i++) { final Force company = new Force(getOptions().getForceNamingMethod().getValue(alphabet[i]) - + resources.getString("AbstractCompanyGenerator.company.text")); + + resources.getString("AbstractCompanyGenerator.Company.text")); campaign.addForce(company, originForce); for (int y = 0; y < getOptions().getLancesPerCompany(); y++) { createLance(campaign, company, trackers, alphabet[y], background); @@ -983,14 +995,15 @@ private void generateUnit(final Campaign campaign, * @param head the force to append the new lance to * @param trackers the list of trackers, properly ordered to be assigned to the lance * @param alphabet the alphabet value to determine the lance name from - * @param background the background filename + * @param background the background force piece icon, which is null when the layered force + * icon isn't being created */ private void createLance(final Campaign campaign, final Force head, final List trackers, - final Alphabet alphabet, final String background) { + final Alphabet alphabet, final @Nullable ForcePieceIcon background) { createLance(campaign, head, trackers, getOptions().getForceNamingMethod().getValue(alphabet) - + resources.getString("AbstractCompanyGenerator.lance.text"), + + resources.getString("AbstractCompanyGenerator.Lance.text"), background); } @@ -999,21 +1012,23 @@ private void createLance(final Campaign campaign, final Force head, * @param head the force to append the new lance to * @param trackers the list of trackers, properly ordered to be assigned to the lance * @param name the lance's name - * @param background the background filename + * @param background the background force piece icon, which is null when the layered force + * icon isn't being created * @return the newly created lance */ private Force createLance(final Campaign campaign, final Force head, final List trackers, - final String name, final String background) { + final String name, final @Nullable ForcePieceIcon background) { final Force lance = new Force(name); campaign.addForce(lance, head); for (int i = 0; (i < getOptions().getLanceSize()) && !trackers.isEmpty(); i++) { campaign.addUnitToForce(trackers.remove(0).getPerson().getUnit(), lance); } - if (getOptions().isGenerateForceIcons()) { + if (background != null) { createLayeredForceIcon(campaign, lance, true, background); } + return lance; } @@ -1022,10 +1037,10 @@ private Force createLance(final Campaign campaign, final Force head, * @param campaign the campaign the force is a part of * @param force the force to create a layered force icon for * @param isLance whether the force is a lance or a company - * @param background the background filename + * @param background the background force piece icon */ private void createLayeredForceIcon(final Campaign campaign, final Force force, - final boolean isLance, final String background) { + final boolean isLance, final ForcePieceIcon background) { if (MHQStaticDirectoryManager.getForceIcons() == null) { return; } @@ -1033,27 +1048,60 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, final LayeredForceIcon layeredForceIcon = new LayeredForceIcon(); // Type + // FIXME : I'm currently very broken because of the force icon changes String filename = String.format("BattleMech %s.png", EntityWeightClass.getClassName(determineForceWeightClass(campaign, force, isLance))); try { - if (MHQStaticDirectoryManager.getForceIcons().getItem(LayeredForceIcon.TYPE.getLayerPath(), filename) == null) { - filename = "BattleMech.png"; + layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.TYPE, new ArrayList<>()); + if (MHQStaticDirectoryManager.getForceIcons().getItem( + LayeredForceIconLayer.TYPE.getLayerPath() + MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, + filename) == null) { + layeredForceIcon.getPieces().get(LayeredForceIconLayer.TYPE).add( + new ForcePieceIcon(LayeredForceIconLayer.TYPE, + MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, + MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME)); + } else { + layeredForceIcon.getPieces().get(LayeredForceIconLayer.TYPE).add( + new ForcePieceIcon(LayeredForceIconLayer.TYPE, + MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, + MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_LEFT_FILENAME)); + layeredForceIcon.getPieces().get(LayeredForceIconLayer.TYPE).add( + new ForcePieceIcon(LayeredForceIconLayer.TYPE, + MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, + MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME)); } } catch (Exception ex) { - LogManager.getLogger().error("", ex); - filename = "BattleMech.png"; + LogManager.getLogger().error("Cannot create a layered force icon, setting " + force + " to the default", ex); + force.setForceIcon(new LayeredForceIcon()); + return; } - iconMap.put(LayeredForceIcon.TYPE.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.TYPE.getLayerPath()).add(filename); // Formation - iconMap.put(LayeredForceIcon.FORMATION.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.FORMATION.getLayerPath()).add(isLance ? "04 Lance.png" : "06 Company.png"); + layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.FORMATION, new ArrayList<>()); + if (campaign.getFaction().isClan()) { + layeredForceIcon.getPieces().get(LayeredForceIconLayer.FORMATION) + .add(new ForcePieceIcon(LayeredForceIconLayer.FORMATION, + MekHqConstants.LAYERED_FORCE_ICON_FORMATION_CLAN_PATH, + isLance ? MekHqConstants.LAYERED_FORCE_ICON_FORMATION_STAR_FILENAME + : MekHqConstants.LAYERED_FORCE_ICON_FORMATION_TRINARY_FILENAME)); + } else if (campaign.getFaction().isComStarOrWoB()) { + layeredForceIcon.getPieces().get(LayeredForceIconLayer.FORMATION) + .add(new ForcePieceIcon(LayeredForceIconLayer.FORMATION, + MekHqConstants.LAYERED_FORCE_ICON_FORMATION_COMSTAR_PATH, + isLance ? MekHqConstants.LAYERED_FORCE_ICON_FORMATION_LEVEL_II_FILENAME + : MekHqConstants.LAYERED_FORCE_ICON_FORMATION_LEVEL_III_FILENAME)); + } else { + layeredForceIcon.getPieces().get(LayeredForceIconLayer.FORMATION) + .add(new ForcePieceIcon(LayeredForceIconLayer.FORMATION, + MekHqConstants.LAYERED_FORCE_ICON_FORMATION_INNER_SPHERE_PATH, + isLance ? MekHqConstants.LAYERED_FORCE_ICON_FORMATION_LANCE_FILENAME + : MekHqConstants.LAYERED_FORCE_ICON_FORMATION_COMPANY_FILENAME)); + } // Background - if (!background.isBlank()) { - iconMap.put(LayeredForceIcon.BACKGROUND.getLayerPath(), new Vector<>()); - iconMap.get(LayeredForceIcon.BACKGROUND.getLayerPath()).add(background); + if (!MekHqConstants.LAYERED_FORCE_ICON_DEFAULT_FRAME_FILENAME.equals(background.getFilename())) { + layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.BACKGROUND, new ArrayList<>()); + layeredForceIcon.getPieces().get(LayeredForceIconLayer.BACKGROUND).add(background.clone()); } force.setForceIcon(layeredForceIcon); From b45d85bc6e1e0bc23031be704120b018ba1bb5bd Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 8 Jan 2022 20:52:26 -0500 Subject: [PATCH 083/115] Adding fixme note --- .../generators/companyGenerators/AbstractCompanyGenerator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 6a0d4a549a..31b69da681 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -916,6 +916,7 @@ private void generateUnit(final Campaign campaign, if (getOptions().isGenerateForceIcons()) { if (MHQStaticDirectoryManager.getForceIcons() != null) { + // FIXME : Finish implementation background = new ForcePieceIcon(LayeredForceIconLayer.BACKGROUND, MekHqConstants.LAYERED_FORCE_ICON_BACKGROUND_CLAN_PATH, "Clan Snow Raven.png"); /* From 4d86865e1498a1312a21b91323c33d18f33a8dc9 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 9 Jan 2022 11:12:58 -0500 Subject: [PATCH 084/115] Adding missing nullable tag and fixing missing null handling for faction selector --- MekHQ/src/mekhq/campaign/Campaign.java | 16 +++++++++++----- .../AbstractFactionSelector.java | 5 +++-- .../factionSelectors/DefaultFactionSelector.java | 2 +- .../factionSelectors/RangedFactionSelector.java | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/Campaign.java b/MekHQ/src/mekhq/campaign/Campaign.java index 70fcdf1bf5..1f989aaa39 100644 --- a/MekHQ/src/mekhq/campaign/Campaign.java +++ b/MekHQ/src/mekhq/campaign/Campaign.java @@ -5607,12 +5607,18 @@ public void assignRandomPortraitFor(final Person person) { * @param person The {@link Person} who should receive a randomized origin. */ public void assignRandomOriginFor(final Person person) { - final AbstractFactionSelector factionSelector = getFactionSelector(); - final AbstractPlanetSelector planetSelector = getPlanetSelector(); - - final Faction faction = factionSelector.selectFaction(this); + final Faction faction = getFactionSelector().selectFaction(this); + if (faction == null) { + LogManager.getLogger().error("Cannot assign a random origin to " + person.getFullTitle() + + " because no faction could be generated."); + return; + } person.setOriginFaction(faction); - person.setOriginPlanet(planetSelector.selectPlanet(this, faction)); + + final Planet planet = getPlanetSelector().selectPlanet(this, faction); + if (planet != null) { + person.setOriginPlanet(planet); + } } /** diff --git a/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/AbstractFactionSelector.java b/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/AbstractFactionSelector.java index 1ae37b7cf0..6281d16392 100644 --- a/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/AbstractFactionSelector.java +++ b/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/AbstractFactionSelector.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2019-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -18,6 +18,7 @@ */ package mekhq.campaign.universe.selectors.factionSelectors; +import megamek.common.annotations.Nullable; import mekhq.campaign.Campaign; import mekhq.campaign.RandomOriginOptions; import mekhq.campaign.universe.Faction; @@ -56,7 +57,7 @@ public void setOptionsDirect(final RandomOriginOptions options) { * @param campaign The {@link Campaign} within which this {@link Faction} exists. * @return A {@link Faction} selected for {@code campaign}. */ - public abstract Faction selectFaction(final Campaign campaign); + public abstract @Nullable Faction selectFaction(final Campaign campaign); /** * Clears any cache associated with faction selection. diff --git a/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/DefaultFactionSelector.java b/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/DefaultFactionSelector.java index b117ccfa7f..e76bbdbffe 100644 --- a/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/DefaultFactionSelector.java +++ b/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/DefaultFactionSelector.java @@ -63,7 +63,7 @@ public void setFaction(final @Nullable Faction faction) { //endregion Getters/Setters @Override - public Faction selectFaction(final Campaign campaign) { + public @Nullable Faction selectFaction(final Campaign campaign) { return (getFaction() == null) ? campaign.getFaction() : getFaction(); } } diff --git a/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/RangedFactionSelector.java b/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/RangedFactionSelector.java index e4b7c580de..883e9b721d 100644 --- a/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/RangedFactionSelector.java +++ b/MekHQ/src/mekhq/campaign/universe/selectors/factionSelectors/RangedFactionSelector.java @@ -90,7 +90,7 @@ public void setCachedFactions(final @Nullable WeightedDoubleMap cachedF //endregion Getters/Setters @Override - public Faction selectFaction(final Campaign campaign) { + public @Nullable Faction selectFaction(final Campaign campaign) { final Planet planet = getOptions().determinePlanet(campaign.getCurrentSystem().getPrimaryPlanet()); if ((getCachedFactions() == null) || !planet.equals(getCachedPlanet()) From 4d751b21081428dbdb4e537e4aa116bbb5591167 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 9 Jan 2022 11:18:45 -0500 Subject: [PATCH 085/115] Fixing some gui property issues --- .../resources/mekhq/resources/GUI.properties | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 0f3fa8d17f..e6438452a2 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -156,7 +156,7 @@ editKillLog.text=Edit Kill Log... assignKill.text=Assign Kill... exportPersonnel.text=Export Personnel sack.text=Sack... -## Randomization Menu +### Randomization Menu randomizationMenu.text=Randomization Menu miRandomName.single.text=Randomize Name miRandomName.bulk.text=Randomize Names @@ -174,7 +174,7 @@ miRandomOriginFaction.single.text=Randomize Origin Faction miRandomOriginFaction.bulk.text=Randomize Origin Factions miRandomOriginPlanet.single.text=Randomize Origin Planet miRandomOriginPlanet.bulk.text=Randomize Origin Planets -## GM Menu +### GM Menu gmMode.text=GM Mode changePrisonerStatus.text=Change Prisoner Status removePerson.text=Remove Person @@ -208,7 +208,7 @@ ProcurementTableMouseAdapter.ProcuredItem.report=Procured ProcurementTableMouseAdapter.CannotAffordToPurchaseItem.report=You cannot afford to purchase %s ProcurementTableMouseAdapter.GMAdded.report=GM Added %s -### UnitTableMouseAdapter Class - TODO : unfinished, with cleanup required +#### UnitTableMouseAdapter Class - TODO : unfinished, with cleanup required deleteUnitsCount.text=%d units removeQ.title=Remove? confirmRemove.text=Do you really want to remove %s? @@ -342,7 +342,7 @@ txtPresetName.text=Enter Preset Name txtPresetName.toolTipText=This is the name of the preset, which we recommend ensuring is unique. txtPresetDescription.text=Enter Preset Description txtPresetDescription.toolTipText=This is used to describe the preset in the selection screen. -## Continuous Panel +## Startup Panel startupCampaignPresetPanel.title=Startup Options startupCampaignPresetPanel.toolTipText=These are options that are only applied when starting a new campaign. chkSpecifyDate.text=Specify Starting Date @@ -585,7 +585,7 @@ PersonnelFilterStyle.STANDARD.toolTipText=This is the standard filter style for PersonnelFilterStyle.INDIVIDUAL_ROLE.text=Individual Role PersonnelFilterStyle.INDIVIDUAL_ROLE.toolTipText=This filter style provides filters that allow one to filter personnel by each individual role, without the filter groupings as seen previously. PersonnelFilterStyle.ALL.text=All -PersonnelFilterStyle.ALL.toolTipText=This filter style provides all of the standard AND individual role filters. +PersonnelFilterStyle.ALL.toolTipText=This filter style provides all the standard AND individual role filters. #### PersonnelTableModelColumn Enum PersonnelTableModelColumn.RANK.text=Rank @@ -673,8 +673,8 @@ PersonnelTabView.OTHER.toolTipText=View various values for a person that are oth -#### Menus -### AssignPersonToUnitMenu Class +##### Menus +#### AssignPersonToUnitMenu Class AssignPersonToUnitMenu.title=Assign to Unit asPilotMenu.text=As Pilot asDriverMenu.text=As Driver @@ -685,10 +685,10 @@ asConsoleCommanderMenu.text=As Command Commander asSoldierMenu.text=As Soldier asNavigatorMenu.text=As Navigator -### AssignTechToUnitMenu Class +#### AssignTechToUnitMenu Class AssignTechToUnitMenu.title=As Tech -### AssignUnitToPersonMenu Class +#### AssignUnitToPersonMenu Class AssignUnitToPersonMenu.title=Assign Person pilotMenu.text=Pilot driverMenu.text=Driver @@ -700,7 +700,7 @@ soldierMenu.text=Soldier navigatorMenu.text=Navigator miUnassignCrew.text=Unassign Crew -### AssignUnitToTechMenu Class +#### AssignUnitToTechMenu Class AssignUnitToTechMenu.title=Tech miAssignTech.text=%s (%sm) miUnassignTech.text=Unassign Tech @@ -763,8 +763,6 @@ chkAutomaticallyAssignRanks.text=Automatically Assign Ranks chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command
while MechWarriors are assigned Sergeant ranks and support personnel are assigned Corporal ranks. chkAssignFounderFlag.text=Assign Founder Flag chkAssignFounderFlag.toolTipText=This automatically applies the founder flag to all generated personnel. -### Personnel Randomization Panel -personnelRandomizationPanel.title=Personnel Randomization ### Starting Simulation Panel startingSimulationPanel.title=Starting Simulation chkRunStartingSimulation.text=Run Starting Simulation From 6e3b685b77819e0b37d73f19177cbfd700135d9b Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 9 Jan 2022 11:29:09 -0500 Subject: [PATCH 086/115] Converting missed methods to use trackers instead of the person directly --- .../AbstractCompanyGenerator.java | 103 +++++++++--------- .../AtBCompanyGenerator.java | 14 +-- .../WindchildCompanyGenerator.java | 14 +-- 3 files changed, 64 insertions(+), 67 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 31b69da681..239be5144f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -90,7 +90,6 @@ * Button that lets you pop out the options panel with everything disabled * * TODO - Wave 2: - * Random Origin Options : Open : MHQ 2856 * Finish Finances * Backgrounds don't work * Panel has odd whitespace usage @@ -257,30 +256,30 @@ private List generateCombatPersonnel(final Campa * 4) Gets the highest rank possible assigned to them * * @param campaign the campaign to use in generating the commanding officer - * @param commandingOfficer the commanding officer's tracker + * @param tracker the commanding officer's tracker * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ private void generateCommandingOfficer(final Campaign campaign, - final CompanyGenerationPersonTracker commandingOfficer, + final CompanyGenerationPersonTracker tracker, final int numMechWarriors) { - commandingOfficer.setPersonType(CompanyGenerationPersonType.COMPANY_COMMANDER); - commandingOfficer.getPerson().setCommander(getOptions().isAssignCompanyCommanderFlag()); - commandingOfficer.getPerson().improveSkill(SkillType.S_GUN_MECH); - commandingOfficer.getPerson().improveSkill(SkillType.S_PILOT_MECH); - assignRandomOfficerSkillIncrease(commandingOfficer.getPerson(), 2); + tracker.setPersonType(CompanyGenerationPersonType.COMPANY_COMMANDER); + tracker.getPerson().setCommander(getOptions().isAssignCompanyCommanderFlag()); + tracker.getPerson().improveSkill(SkillType.S_GUN_MECH); + tracker.getPerson().improveSkill(SkillType.S_PILOT_MECH); + assignRandomOfficerSkillIncrease(tracker, 2); if (getOptions().isAutomaticallyAssignRanks()) { - generateCommandingOfficerRank(campaign, commandingOfficer.getPerson(), numMechWarriors); + generateCommandingOfficerRank(campaign, tracker, numMechWarriors); } } /** * @param campaign the campaign to use in generating the commanding officer's rank - * @param commandingOfficer the commanding officer + * @param tracker the commanding officer's tracker * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ protected abstract void generateCommandingOfficerRank(final Campaign campaign, - final Person commandingOfficer, + final CompanyGenerationPersonTracker tracker, final int numMechWarriors); /** @@ -297,7 +296,7 @@ private void generateOfficers(final List tracker trackers.get(i).setPersonType((i < captainThreshold) ? CompanyGenerationPersonType.CAPTAIN : CompanyGenerationPersonType.LIEUTENANT); // Generate the individual officer - generateOfficer(trackers.get(i).getPerson(), trackers.get(i).getPersonType()); + generateOfficer(trackers.get(i)); } } @@ -316,48 +315,47 @@ private void generateOfficers(final List tracker * 2) Two random officer skill increases if they are a Captain, otherwise they get one * 3) A rank of O4 - Captain for Captains, otherwise O3 - Lieutenant * - * @param officer the officer to generate - * @param type the type of the officer (Captain or Lieutenant) + * @param tracker the officer's tracker */ - private void generateOfficer(final Person officer, final CompanyGenerationPersonType type) { - if (!type.isOfficer()) { - LogManager.getLogger().error(officer.getFullTitle() + private void generateOfficer(final CompanyGenerationPersonTracker tracker) { + if (!tracker.getPersonType().isOfficer()) { + LogManager.getLogger().error(tracker.getPerson().getFullTitle() + " is not a valid officer for the officer generation, cannot generate them as an officer."); return; } // Improve Skills - final Skill gunnery = officer.getSkill(SkillType.S_GUN_MECH); - final Skill piloting = officer.getSkill(SkillType.S_PILOT_MECH); + final Skill gunnery = tracker.getPerson().getSkill(SkillType.S_GUN_MECH); + final Skill piloting = tracker.getPerson().getSkill(SkillType.S_PILOT_MECH); if ((gunnery == null) && (piloting != null)) { - officer.improveSkill(SkillType.S_GUN_MECH); + tracker.getPerson().improveSkill(SkillType.S_GUN_MECH); } else if ((gunnery != null) && (piloting == null)) { - officer.improveSkill(SkillType.S_PILOT_MECH); + tracker.getPerson().improveSkill(SkillType.S_PILOT_MECH); } else if (gunnery == null) { // Both are null... this shouldn't occur. In this case, boost both - officer.improveSkill(SkillType.S_GUN_MECH); - officer.improveSkill(SkillType.S_PILOT_MECH); + tracker.getPerson().improveSkill(SkillType.S_GUN_MECH); + tracker.getPerson().improveSkill(SkillType.S_PILOT_MECH); } else { - officer.improveSkill((((gunnery.getLevel() > piloting.getLevel()) + tracker.getPerson().improveSkill((((gunnery.getLevel() > piloting.getLevel()) && getOptions().isApplyOfficerStatBonusToWorstSkill()) ? piloting : gunnery) .getType().getName()); } - if (type.isCaptain()) { + if (tracker.getPersonType().isCaptain()) { // Assign Random Officer Skill Increase - assignRandomOfficerSkillIncrease(officer, 2); + assignRandomOfficerSkillIncrease(tracker, 2); if (getOptions().isAutomaticallyAssignRanks()) { // Assign Rank of O4 - Captain - officer.setRank(Rank.RWO_MAX + 4); + tracker.getPerson().setRank(Rank.RWO_MAX + 4); } } else { // Assign Random Officer Skill Increase - assignRandomOfficerSkillIncrease(officer, 1); + assignRandomOfficerSkillIncrease(tracker, 1); if (getOptions().isAutomaticallyAssignRanks()) { // Assign Rank of O3 - Lieutenant - officer.setRank(Rank.RWO_MAX + 3); + tracker.getPerson().setRank(Rank.RWO_MAX + 3); } } } @@ -367,28 +365,29 @@ && getOptions().isApplyOfficerStatBonusToWorstSkill()) ? piloting : gunnery) * The skill level is improved by one level per roll, but if the skill is newly acquired * it applies a second boost so that the value is set to 1. * - * @param person the person to assign the skill increases to + * @param tracker the tracker to assign the skill increases to * @param boosts the number of boosts to apply */ - private void assignRandomOfficerSkillIncrease(final Person person, final int boosts) { + private void assignRandomOfficerSkillIncrease(final CompanyGenerationPersonTracker tracker, + final int boosts) { for (int i = 0; i < boosts; i++) { switch (Utilities.dice(1, 3)) { case 0: - person.improveSkill(SkillType.S_LEADER); - if (person.getSkillLevel(SkillType.S_LEADER) == 0) { - person.improveSkill(SkillType.S_LEADER); + tracker.getPerson().improveSkill(SkillType.S_LEADER); + if (tracker.getPerson().getSkillLevel(SkillType.S_LEADER) == 0) { + tracker.getPerson().improveSkill(SkillType.S_LEADER); } break; case 1: - person.improveSkill(SkillType.S_STRATEGY); - if (person.getSkillLevel(SkillType.S_STRATEGY) == 0) { - person.improveSkill(SkillType.S_STRATEGY); + tracker.getPerson().improveSkill(SkillType.S_STRATEGY); + if (tracker.getPerson().getSkillLevel(SkillType.S_STRATEGY) == 0) { + tracker.getPerson().improveSkill(SkillType.S_STRATEGY); } break; case 2: - person.improveSkill(SkillType.S_TACTICS); - if (person.getSkillLevel(SkillType.S_TACTICS) == 0) { - person.improveSkill(SkillType.S_TACTICS); + tracker.getPerson().improveSkill(SkillType.S_TACTICS); + if (tracker.getPerson().getSkillLevel(SkillType.S_TACTICS) == 0) { + tracker.getPerson().improveSkill(SkillType.S_TACTICS); } break; default: @@ -409,7 +408,7 @@ private void generateStandardMechWarriors(final Campaign campaign, continue; } - generateStandardMechWarrior(campaign, tracker.getPerson()); + generateStandardMechWarrior(campaign, tracker); } } @@ -418,11 +417,12 @@ private void generateStandardMechWarriors(final Campaign campaign, * 1) Assigns rank of E12 - Sergeant, or E4 for Clan, WoB, and ComStar * * @param campaign the campaign to generate the MechWarrior based on - * @param person the MechWarrior to set up + * @param tracker the MechWarrior tracker to set up */ - private void generateStandardMechWarrior(final Campaign campaign, final Person person) { + private void generateStandardMechWarrior(final Campaign campaign, + final CompanyGenerationPersonTracker tracker) { if (getOptions().isAutomaticallyAssignRanks()) { - person.setRank((campaign.getFaction().isComStarOrWoB() || campaign.getFaction().isClan()) + tracker.getPerson().setRank((campaign.getFaction().isComStarOrWoB() || campaign.getFaction().isClan()) ? 4 : 12); } } @@ -527,8 +527,8 @@ private void finalizePersonnel(final Campaign campaign, final List tracker.getPerson().setFounder(true)); } - // Recruit all of the personnel, GM-style so that the initial hiring cost is calculated as - // part of the financial model + // Recruit all the personnel, GM-style so that the initial hiring cost is calculated as part + // of the financial model trackers.forEach(t -> campaign.recruitPerson(t.getPerson(), true)); // Now that they are recruited, we can simulate backwards a few years and generate marriages @@ -784,7 +784,8 @@ public void generateEntities(final Campaign campaign, * @param campaign the campaign to generate for * @param tracker the tracker to generate based on the parameters and to assign the result to */ - private void generateEntity(final Campaign campaign, final CompanyGenerationPersonTracker tracker) { + private void generateEntity(final Campaign campaign, + final CompanyGenerationPersonTracker tracker) { tracker.setEntity((tracker.getParameters() == null) ? null : generateEntity(campaign, tracker.getParameters(), tracker.getPerson().getOriginFaction())); } @@ -911,8 +912,6 @@ private void generateUnit(final Campaign campaign, final Force originForce = campaign.getForce(0); final Alphabet[] alphabet = Alphabet.values(); ForcePieceIcon background = null; - String backgroundCategory = ""; - String backgroundFilename = ""; if (getOptions().isGenerateForceIcons()) { if (MHQStaticDirectoryManager.getForceIcons() != null) { @@ -944,11 +943,9 @@ private void generateUnit(final Campaign campaign, MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME)); // Background - if (!backgroundCategory.isBlank() && !backgroundFilename.isBlank()) { + if (background != null) { layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.BACKGROUND, new ArrayList<>()); - layeredForceIcon.getPieces().get(LayeredForceIconLayer.BACKGROUND) - .add(new ForcePieceIcon(LayeredForceIconLayer.BACKGROUND, - backgroundCategory, backgroundFilename)); + layeredForceIcon.getPieces().get(LayeredForceIconLayer.BACKGROUND).add(background.clone()); } originForce.setForceIcon(layeredForceIcon); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index ca52b046f7..4a4fcee74e 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -20,12 +20,12 @@ import megamek.common.MechSummary; import mekhq.campaign.Campaign; -import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.ranks.Rank; import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.companyGeneration.AtBRandomMechParameters; import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationPersonTracker; import mekhq.campaign.universe.enums.CompanyGenerationMethod; /** @@ -41,21 +41,21 @@ public AtBCompanyGenerator(final Campaign campaign, final CompanyGenerationOptio //region Personnel /** * @param campaign the campaign to use in generating the commanding officer's rank - * @param commandingOfficer the commanding officer + * @param tracker the commanding officer's tracker * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ @Override protected void generateCommandingOfficerRank(final Campaign campaign, - final Person commandingOfficer, + final CompanyGenerationPersonTracker tracker, final int numMechWarriors) { if (numMechWarriors >= 36) { - commandingOfficer.setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 8)); + tracker.getPerson().setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 8)); } else if (numMechWarriors >= 12) { - commandingOfficer.setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 5)); + tracker.getPerson().setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 5)); } else if (numMechWarriors >= 4) { - commandingOfficer.setRank(Rank.RWO_MAX + 4); + tracker.getPerson().setRank(Rank.RWO_MAX + 4); } else { - commandingOfficer.setRank(Rank.RWO_MAX + 3); + tracker.getPerson().setRank(Rank.RWO_MAX + 3); } } //endregion Personnel diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 8bf42f480a..02ea41daef 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -20,12 +20,12 @@ import megamek.common.MechSummary; import mekhq.campaign.Campaign; -import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.ranks.Rank; import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.companyGeneration.AtBRandomMechParameters; import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; +import mekhq.campaign.universe.companyGeneration.CompanyGenerationPersonTracker; import mekhq.campaign.universe.enums.CompanyGenerationMethod; /** @@ -42,21 +42,21 @@ public WindchildCompanyGenerator(final Campaign campaign, final CompanyGeneratio /** * Set based on greater than instead of the greater than or equal to of AtB * @param campaign the campaign to use in generating the commanding officer's rank - * @param commandingOfficer the commanding officer + * @param tracker the commanding officer's tracker * @param numMechWarriors the number of MechWarriors in their force, used to determine their rank */ @Override protected void generateCommandingOfficerRank(final Campaign campaign, - final Person commandingOfficer, + final CompanyGenerationPersonTracker tracker, final int numMechWarriors) { if (numMechWarriors > 36) { - commandingOfficer.setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 8)); + tracker.getPerson().setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 8)); } else if (numMechWarriors > 12) { - commandingOfficer.setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 5)); + tracker.getPerson().setRank(Rank.RWO_MAX + (campaign.getFaction().isComStarOrWoB() ? 7 : 5)); } else if (numMechWarriors > 4) { - commandingOfficer.setRank(Rank.RWO_MAX + 4); + tracker.getPerson().setRank(Rank.RWO_MAX + 4); } else { - commandingOfficer.setRank(Rank.RWO_MAX + 3); + tracker.getPerson().setRank(Rank.RWO_MAX + 3); } } //endregion Personnel From 6023dd377efcb7802f6c905de61231ec50fee675 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 9 Jan 2022 11:48:57 -0500 Subject: [PATCH 087/115] Missed that a null faction is fine for planet generation --- MekHQ/src/mekhq/campaign/Campaign.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/Campaign.java b/MekHQ/src/mekhq/campaign/Campaign.java index 1f989aaa39..fc8548aace 100644 --- a/MekHQ/src/mekhq/campaign/Campaign.java +++ b/MekHQ/src/mekhq/campaign/Campaign.java @@ -5608,12 +5608,9 @@ public void assignRandomPortraitFor(final Person person) { */ public void assignRandomOriginFor(final Person person) { final Faction faction = getFactionSelector().selectFaction(this); - if (faction == null) { - LogManager.getLogger().error("Cannot assign a random origin to " + person.getFullTitle() - + " because no faction could be generated."); - return; + if (faction != null) { + person.setOriginFaction(faction); } - person.setOriginFaction(faction); final Planet planet = getPlanetSelector().selectPlanet(this, faction); if (planet != null) { From f7deefd23852475fe4d20b003c9ff71a67bb3496 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 9 Jan 2022 12:56:54 -0500 Subject: [PATCH 088/115] Fixing missing nullable annotations and expanding error handling for Mech Summary creation --- .../AbstractCompanyGenerator.java | 28 +++++++++++-------- .../AtBCompanyGenerator.java | 11 ++++---- .../WindchildCompanyGenerator.java | 11 ++++---- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 239be5144f..f839922cc9 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -807,35 +807,39 @@ private void generateEntity(final Campaign campaign, final MechSummary mechSummary = generateMechSummary(campaign, parameters, faction); + if (mechSummary == null) { + LogManager.getLogger().error("Failed to generate an entity due to a null mech summary for faction " + faction); + return null; + } + try { return new MechFileParser(mechSummary.getSourceFile(), mechSummary.getEntryName()).getEntity(); - } catch (Exception ignored) { - LogManager.getLogger().error("Failed to generate entity"); + } catch (Exception ex) { + LogManager.getLogger().error("Failed to generate entity", ex); + return null; } - - return null; } /** * @param campaign the campaign to generate for * @param parameters the parameters to use in generation * @param faction the faction to generate the mech from - * @return the MechSummary generated from the provided parameters + * @return the MechSummary generated from the provided parameters, or null if generation fails */ - protected abstract MechSummary generateMechSummary(final Campaign campaign, - final AtBRandomMechParameters parameters, - final Faction faction); + protected abstract @Nullable MechSummary generateMechSummary(final Campaign campaign, + final AtBRandomMechParameters parameters, + final Faction faction); /** * @param campaign the campaign to generate for * @param parameters the parameters to use in generation * @param faction the faction code to use in generation * @param year the year to use in generation - * @return the MechSummary generated from the provided parameters + * @return the MechSummary generated from the provided parameters, or null if generation fails */ - protected MechSummary generateMechSummary(final Campaign campaign, - final AtBRandomMechParameters parameters, - final String faction, int year) { + protected @Nullable MechSummary generateMechSummary(final Campaign campaign, + final AtBRandomMechParameters parameters, + final String faction, int year) { Predicate filter = ms -> (!campaign.getCampaignOptions().limitByYear() || (year > ms.getYear())); if (getOptions().isOnlyGenerateOmniMechs()) { diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java index 4a4fcee74e..5bfcb4b288 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AtBCompanyGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -19,6 +19,7 @@ package mekhq.campaign.universe.generators.companyGenerators; import megamek.common.MechSummary; +import megamek.common.annotations.Nullable; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.ranks.Rank; import mekhq.campaign.rating.IUnitRating; @@ -65,12 +66,12 @@ protected void generateCommandingOfficerRank(final Campaign campaign, * @param campaign the campaign to generate for * @param parameters the parameters to use in generation * @param faction the faction to generate the mech from - * @return the MechSummary generated from the provided parameters + * @return the MechSummary generated from the provided parameters, or null if generation fails */ @Override - protected MechSummary generateMechSummary(final Campaign campaign, - final AtBRandomMechParameters parameters, - final Faction faction) { + protected @Nullable MechSummary generateMechSummary(final Campaign campaign, + final AtBRandomMechParameters parameters, + final Faction faction) { if (parameters.isStarLeague() && !faction.isComStarOrWoB()) { if (faction.isClan()) { // Clanners generate from Front Line tables instead of Star League diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java index 02ea41daef..2aaf2e9c08 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/WindchildCompanyGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -19,6 +19,7 @@ package mekhq.campaign.universe.generators.companyGenerators; import megamek.common.MechSummary; +import megamek.common.annotations.Nullable; import mekhq.campaign.Campaign; import mekhq.campaign.personnel.ranks.Rank; import mekhq.campaign.rating.IUnitRating; @@ -68,12 +69,12 @@ protected void generateCommandingOfficerRank(final Campaign campaign, * @param campaign the campaign to generate for * @param parameters the parameters to use in generation * @param faction the faction to generate the mech from - * @return the MechSummary generated from the provided parameters + * @return the MechSummary generated from the provided parameters, or null if generation fails */ @Override - protected MechSummary generateMechSummary(final Campaign campaign, - final AtBRandomMechParameters parameters, - final Faction faction) { + protected @Nullable MechSummary generateMechSummary(final Campaign campaign, + final AtBRandomMechParameters parameters, + final Faction faction) { if (parameters.isStarLeague()) { if (faction.isClan()) { // Clanners generate using the Keshik Table if they roll A*, otherwise they roll on From 84779eb35f3868a5c9c26c2bc47246d9e7637a47 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 9 Jan 2022 16:45:24 -0500 Subject: [PATCH 089/115] Fixing force icon type generation --- .../companyGenerators/AbstractCompanyGenerator.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index f839922cc9..636857dbb2 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -92,10 +92,7 @@ * TODO - Wave 2: * Finish Finances * Backgrounds don't work - * Panel has odd whitespace usage - * System, Planet text search (if possible and feasible - might also be a bugfix, or require a new component) * Add dependent generation options, that apply pre-module simulation. - * Generate spare personnel (?) * Add personnel generation sort options * ---> Assign Most skilled to primary lance * ---> sort by company @@ -115,6 +112,7 @@ * Implement Era-based Part Generators * Implement Surprises * Implement Mystery Boxes + * Generate spare personnel (?) * Optional: Mercenaries may customize their 'Mechs, with clantech if enabled only post-3055 * * @author Justin "Windchild" Bowen @@ -1050,8 +1048,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, final LayeredForceIcon layeredForceIcon = new LayeredForceIcon(); // Type - // FIXME : I'm currently very broken because of the force icon changes - String filename = String.format("BattleMech %s.png", + final String filename = String.format("%s.png", EntityWeightClass.getClassName(determineForceWeightClass(campaign, force, isLance))); try { layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.TYPE, new ArrayList<>()); @@ -1069,8 +1066,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_LEFT_FILENAME)); layeredForceIcon.getPieces().get(LayeredForceIconLayer.TYPE).add( new ForcePieceIcon(LayeredForceIconLayer.TYPE, - MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, - MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME)); + MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, filename)); } } catch (Exception ex) { LogManager.getLogger().error("Cannot create a layered force icon, setting " + force + " to the default", ex); From fde09b5f234e8b08160769219969a9c4d46a7dab Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 9 Jan 2022 18:29:08 -0500 Subject: [PATCH 090/115] Fixing LayeredForceIcon Background Generation and adding Logo generation --- MekHQ/data/universe/factions.xml | 286 +++++++++++++++++- .../resources/mekhq/resources/GUI.properties | 2 + MekHQ/src/mekhq/MekHqConstants.java | 1 - .../src/mekhq/campaign/universe/Faction.java | 50 ++- .../CompanyGenerationOptions.java | 25 +- .../AbstractCompanyGenerator.java | 53 ++-- .../panels/CompanyGenerationOptionsPanel.java | 27 +- 7 files changed, 405 insertions(+), 39 deletions(-) diff --git a/MekHQ/data/universe/factions.xml b/MekHQ/data/universe/factions.xml index 70118775f8..5f920dbc1c 100644 --- a/MekHQ/data/universe/factions.xml +++ b/MekHQ/data/universe/factions.xml @@ -24,6 +24,10 @@ eraMods - A comma-separated 9-item list of optional modifiers to repair/replacem nameGenerator - The name of the faction name generator that should be used for this faction. If left out, then this defaults to "General." colorRGB - a comma-separated 3-item list defining the RGB codes for the color used on the map for this faction. Defaults to light gray if missing. currencyCode - partially implemented (likely buggy) currency code value used by the faction. +layeredForceIconBackgroundCategory - the category of the faction's background piece +layeredForceIconBackgroundFilename - the filename of the faction's background piece +layeredForceIconLogoCategory - the category of the faction's logo piece +layeredForceIconLogoFilename - the filename of the faction's logo piece tags - a comma-separated list of tags. Currently recognised tags: "is", "periphery", "deep_periphery", "clan", "pirate", "merc", "trader", "minor", "rebel", "inactive", "hidden", "abandoned", "chaos", "playable" start - the founding date of the faction end - the date the faction ceases to exist @@ -68,6 +72,10 @@ successor - unimplemented tag describing another faction code as the specified f Terra -1,-1,-1,0,0,0,0,0,0 255,255,255 + Inner Sphere/ + Terran Hegemony.png + Inner Sphere/ + Terran Hegemony.png is,super,playable 2315 2790 @@ -78,6 +86,8 @@ successor - unimplemented tag describing another faction code as the specified f Terra -1,-1,-1,0,0,0,0,0,0 142,74,123 + Periphery/ + Amaris Empire.png is,minor 2767 2779 @@ -97,6 +107,10 @@ successor - unimplemented tag describing another faction code as the specified f 1,0,0,1,2,3,2,1,0 CC 0,156,85 + Inner Sphere/ + Capellan Confederation.png + Inner Sphere/ + Capellan Confederation.png is,major,playable 2367
@@ -108,6 +122,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,2,1,0,0 DC 234,45,46 + Inner Sphere/ + Draconis Combine.png + Inner Sphere/ + Draconis Combine.png is,major,playable 2319 @@ -118,6 +136,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,2,1,0,0 FS 248,212,44 + Inner Sphere/ + Federated Suns.png + Inner Sphere/ + Federated Suns.png is,major,playable 2317 @@ -128,6 +150,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 165,94,160 + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Free Worlds League.png is,major,playable 2271 @@ -140,6 +166,10 @@ successor - unimplemented tag describing another faction code as the specified f 1,0,0,1,2,3,2,1,0 LA 0,124,186 + Inner Sphere/ + Lyran Commonwealth.png + Inner Sphere/ + Lyran Commonwealth.png is,major,playable 2340 @@ -417,6 +447,10 @@ successor - unimplemented tag describing another faction code as the specified f Apollo 1,1,1,0,0,0,0,0,0 232,202,173 + Periphery/ + Rim Worlds Republic.png + Periphery/ + Rim Worlds Republic.png periphery,playable 2250 2779 @@ -448,6 +482,10 @@ successor - unimplemented tag describing another faction code as the specified f Taurus 1,1,1,1,2,3,2,1,0 179,62,38 + Periphery/ + Taurian Concordat.png + Periphery/ + Taurian Concordat.png periphery,playable 2335 @@ -457,6 +495,10 @@ successor - unimplemented tag describing another faction code as the specified f Canopus IV 1,1,1,1,2,3,2,1,1 57,158,145 + Periphery/ + Magistracy of Canopus.png + Periphery/ + Magistracy of Canopus.png periphery,playable 2530 @@ -467,6 +509,10 @@ successor - unimplemented tag describing another faction code as the specified f Alpheratz 1,1,1,1,2,3,2,1,0 210,190,153 + Periphery/ + Outworlds Alliance.png + Periphery/ + Outworlds Alliance.png periphery,playable 2413 3083 @@ -522,6 +568,10 @@ successor - unimplemented tag describing another faction code as the specified f Erod's Escape 1,1,1,1,2,3,2,2,1 0,128,128 + Periphery/ + Taurian Concordat.png + Periphery/ + Calderon Protectorate.png periphery,playable 2253 @@ -531,6 +581,8 @@ successor - unimplemented tag describing another faction code as the specified f Chainelane Isles 1,1,1,1,2,3,2,1,0 255,80,93 + Periphery/ + Chainelane Isles.png deep_periphery,minor @@ -548,6 +600,10 @@ successor - unimplemented tag describing another faction code as the specified f Circinus 1,1,1,1,2,3,2,2,1 198,36,58 + Periphery/ + Circinus Federation.png + Periphery/ + Circinus Federation.png periphery 2785 3081 @@ -559,6 +615,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 255,99,71 + Clan/ + Clan Blood Spirit.png + Clan/ + Clan Blood Spirit.png clan,minor,playable 2807 3085 @@ -569,6 +629,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 255,165,0 + Clan/ + Clan Burrock.png + Clan/ + Clan Burrock.png clan,minor 2807 3059 @@ -580,6 +644,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 147,112,219 + Clan/ + Clan Cloud Cobra.png + Clan/ + Clan Cloud Cobra.png clan,minor,playable 2807 @@ -590,6 +658,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 0,0,205 + Clan/ + Clan Coyote.png + Clan/ + Clan Coyote.png clan,minor,playable 2807 @@ -599,6 +671,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 147,112,219 + Clan/ + The Society.png + Clan/ + The Society.png clan @@ -611,6 +687,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 0,255,255 + Clan/ + Clan Diamond Shark.png + Clan/ + Clan Diamond Shark.png clan,minor,playable 2807 @@ -621,6 +701,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 165,42,42 + Clan/ + Clan Fire Mandrill.png + Clan/ + Clan Fire Mandrill.png clan,minor,playable 2807 3073 @@ -634,6 +718,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 188,222,235 + Clan/ + Clan Ghost Bear.png + Clan/ + Clan Ghost Bear.png clan,major,playable 2807 3103 @@ -646,6 +734,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 238,232,170 + Clan/ + Clan Goliath Scorpion.png + Clan/ + Clan Goliath Scorpion.png clan,minor,playable 2807 3080 @@ -659,6 +751,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 241,168,110 + Clan/ + Clan Hell's Horses.png + Clan/ + Clan Hell's Horses.png clan,minor,playable 2807 @@ -669,6 +765,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 248,248,255 + Clan/ + Clan Ice Hellion.png + Clan/ + Clan Ice Hellion.png clan,minor,playable 2807 3074 @@ -681,6 +781,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 172,208,115 + Clan/ + Clan Jade Falcon.png + Clan/ + Clan Jade Falcon.png clan,major,playable 2807 @@ -690,6 +794,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 100,149,237 + Clan/ + Clan Mongoose.png + Clan/ + Clan Mongoose.png clan,minor 2807 2868 @@ -702,6 +810,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 245,255,250 + Clan/ + Clan Nova Cat.png + Clan/ + Clan Nova Cat.png clan,minor,playable 2807 3143 @@ -714,6 +826,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 152,164,129 + Clan/ + Clan Smoke Jaguar.png + Clan/ + Clan Smoke Jaguar.png clan,minor,playable 2807 3060 @@ -726,6 +842,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 135,206,235 + Clan/ + Clan Snow Raven.png + Clan/ + Clan Snow Raven.png clan,minor,playable 2807 3083 @@ -737,6 +857,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 218,165,32 + Clan/ + Clan Star Adder.png + Clan/ + Clan Star Adder.png clan,minor,playable 2807 @@ -747,6 +871,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 127,255,0 + Clan/ + Clan Steel Viper.png + Clan/ + Clan Steel Viper.png clan,minor,playable 2807 3075 @@ -759,6 +887,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 241,168,110 + Clan/ + Clan Stone Lion.png + Clan/ + Clan Stone Lion.png clan,minor 3075 @@ -768,6 +900,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 222,184,135 + Clan/ + Clan Widowmaker.png + Clan/ + Clan Widowmaker.png clan,minor 2807 2834 @@ -780,6 +916,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 207,114,58 + Clan/ + Clan Wolf.png + Clan/ + Clan Wolf.png clan,major,playable 2807 3142 @@ -792,6 +932,8 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 207,114,58 + Clan/ + Wolf Empire.png clan,minor 3142 @@ -802,6 +944,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 160,82,45 + Clan/ + Clan Wolf-in-Exile.png + Clan/ + Clan Wolf-in-Exile.png clan,small 3057 @@ -811,6 +957,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 143,188,143 + Clan/ + Clan Wolverine.png + Clan/ + Clan Wolverine.png clan,minor 2807 2823 @@ -822,6 +972,10 @@ successor - unimplemented tag describing another faction code as the specified f Tukayyid 0,0,0,0,0,0,0,0,0 255,250,240 + Inner Sphere/ + ComStar.png + Inner Sphere/ + ComStar.png is,inactive,major,playable 2788 @@ -833,6 +987,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 148,148,255 + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Duchy of Andurien.png is,minor 3030 @@ -892,6 +1050,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 99,94,165 + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Duchy of Tamarind-Abbey.png is,minor 3078 3139 @@ -912,6 +1074,8 @@ successor - unimplemented tag describing another faction code as the specified f Elysian Fields Nyserta 1,1,1,1,2,3,2,2,1 + Periphery/ + Elysian Fields.png 255,0,255 periphery @@ -922,6 +1086,10 @@ successor - unimplemented tag describing another faction code as the specified f Granada 1,1,1,1,2,3,2,2,1 238,232,170 + Clan/ + Escorpion Imperio.png + Clan/ + Escorpion Imperio.png clan,deep_periphery 3080 @@ -931,6 +1099,10 @@ successor - unimplemented tag describing another faction code as the specified f FS,LA New Avalon 0,0,0,1,2,2,1,0,0 + Inner Sphere/ + Federated Commonwealth.png + Inner Sphere/ + Federated Commonwealth.png 248,212,44 is,super,playable @@ -942,6 +1114,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,2,1,0,0 FS 255,228,181 + Inner Sphere/ + Federated Suns.png + Periphery/ + Filtvelt Coalition.png periphery 3072 @@ -953,6 +1129,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,2,1,0 FRR 116,171,206 + Inner Sphere/ + Free Rasalhague Republic.png + Inner Sphere/ + Free Rasalhague Republic.png is,minor,playable 3034 3103 @@ -974,6 +1154,8 @@ successor - unimplemented tag describing another faction code as the specified f Fronc 1,1,1,1,2,3,2,2,1 128,169,127 + Periphery/ + Fronc Reaches.png periphery 3066 @@ -983,6 +1165,8 @@ successor - unimplemented tag describing another faction code as the specified f Gotterdammerung 1,1,1,1,2,3,2,2,1 255,105,180 + Periphery/ + Greater Valkyrate.png periphery 3028 3049 @@ -993,6 +1177,10 @@ successor - unimplemented tag describing another faction code as the specified f Bremen (HL) 1,1,1,1,2,3,2,2,1 219,112,147 + Periphery/ + Hanseatic League.png + Periphery/ + Hanseatic League.png deep_periphery,playable 2891 @@ -1002,6 +1190,10 @@ successor - unimplemented tag describing another faction code as the specified f Illyria 1,1,1,1,2,3,2,2,1 0,255,255 + Periphery/ + Illyrian Palatinate.png + Periphery/ + Illyrian Palatinate.png periphery 2350 3063 @@ -1011,6 +1203,8 @@ successor - unimplemented tag describing another faction code as the specified f Independent (Periphery) 1,1,1,1,2,3,2,2,1 190,190,190 + + Independent.png periphery,chaos,small @@ -1018,15 +1212,19 @@ successor - unimplemented tag describing another faction code as the specified f Independent 1,1,1,1,2,3,2,2,1 210,210,210 + + Independent.png is,chaos,small JF - Jarnfolk + JàrnFòlk Trondheim (JF) 1,1,1,1,2,3,2,2,1 FRR 153,50,204 + Periphery/ + JarnFolk.png deep_periphery,minor @@ -1062,6 +1260,8 @@ successor - unimplemented tag describing another faction code as the specified f Lothario 1,1,1,1,2,3,2,2,1 255,140,0 + Periphery/ + Lothian League.png periphery 2691 @@ -1083,6 +1283,10 @@ successor - unimplemented tag describing another faction code as the specified f Alphard (MH) 1,1,1,1,2,3,2,2,1 236,136,65 + Periphery/ + Marian Hegemony.png + Periphery/ + Marian Hegemony.png periphery,playable 2920 @@ -1105,6 +1309,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 117,65,113 + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Marik-Stewart Commonwealth.png is 3082 3139 @@ -1118,6 +1326,8 @@ successor - unimplemented tag describing another faction code as the specified f Galatea 1,1,1,1,2,3,2,1,0 169,169,169 + + Mercenary.png merc,playable @@ -1166,6 +1376,10 @@ successor - unimplemented tag describing another faction code as the specified f Asturias 1,1,1,1,2,3,2,2,1 0,255,0 + Periphery/ + Nueva Castile.png + Periphery/ + Nueva Castile.png deep_periphery,playable 2392 3080 @@ -1176,6 +1390,10 @@ successor - unimplemented tag describing another faction code as the specified f Oberon VI 1,1,1,1,2,3,2,2,1 50,205,50 + Periphery/ + Oberon Confederation.png + Periphery/ + Oberon Confederation.png periphery 2775 3049 @@ -1208,6 +1426,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 163,112,120 + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Oriente Protectorate.png is,minor 3086 3139 @@ -1243,6 +1465,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,2,1,0 FRR 188,222,235 + Clan/ + Ghost Bear Dominion.png + Clan/ + Rasalhague Dominion.png clan,is,minor,playable 3103 @@ -1253,6 +1479,10 @@ successor - unimplemented tag describing another faction code as the specified f Alpheratz 1,1,1,1,2,3,2,1,0 25,120,110 + Clan/ + Raven Alliance.png + Clan/ + Raven Alliance.png clan,periphery,playable 3083 @@ -1264,6 +1494,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 255,51,51 + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Regulan Fiefs.png is,minor 3086 @@ -1285,6 +1519,10 @@ successor - unimplemented tag describing another faction code as the specified f Terra 0,0,0,0,0,0,0,0,0 207,119,57 + Inner Sphere/ + Republic of the Sphere.png + Inner Sphere/ + Republic of the Sphere.png is,major,playable 3081 @@ -1321,6 +1559,10 @@ successor - unimplemented tag describing another faction code as the specified f Lesnovo 1,1,1,1,2,3,2,2,1 95,158,160 + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Rim Commonality.png periphery 3075 3139 @@ -1381,6 +1623,8 @@ successor - unimplemented tag describing another faction code as the specified f 1,0,0,1,2,3,2,1,0 CC 188,223,186 + Periphery/ + St. Ives Compact.png is,minor,playable 3029 3063 @@ -1391,6 +1635,10 @@ successor - unimplemented tag describing another faction code as the specified f Terra -1,-1,-1,0,0,0,0,0,0 176,196,222 + Inner Sphere/ + Star League.png + Inner Sphere/ + Star League.png is,super,playable 2570 2781 @@ -1488,6 +1736,10 @@ successor - unimplemented tag describing another faction code as the specified f Tortuga Prime 1,1,1,1,2,3,2,2,1 34,139,34 + Tortuga Dominions/ + Tortuga Dominions.png + Periphery/ + Tortuga Dominions.png periphery,pirate 2577 @@ -1505,6 +1757,10 @@ successor - unimplemented tag describing another faction code as the specified f Terra 0,0,0,0,0,0,0,1,1 205,192,176 + Inner Sphere/ + Word of Blake.png + Inner Sphere/ + Word of Blake.png is,minor,playable 3052 @@ -1522,6 +1778,8 @@ successor - unimplemented tag describing another faction code as the specified f Niops Association Niops (Niops V, VI, VII) 205,173,0 + Periphery/ + Niops Association.png periphery,minor @@ -1532,9 +1790,13 @@ successor - unimplemented tag describing another faction code as the specified f FOR - Fiefdom Randis + Fiefdom of Randis Randis IV (Hope IV 2988-) 30,144,255 + Periphery/ + Fiefdom of Randis.png + Periphery/ + Fiefdom of Randis.png periphery,minor 2988 @@ -1646,6 +1908,8 @@ successor - unimplemented tag describing another faction code as the specified f Pirate 2,2,2,2,2,2,2,2,2 128,40,0 + + Pirate.png pirate,playable @@ -1655,6 +1919,10 @@ successor - unimplemented tag describing another faction code as the specified f Granada 1,1,1,1,2,3,2,2,1 0,255,0 + Periphery/ + Umayyad Caliphate.png + Periphery/ + Umayyad Caliphate.png deep_periphery 2830 @@ -1682,6 +1950,10 @@ successor - unimplemented tag describing another faction code as the specified f Thala 1,1,1,1,2,3,2,2,1 153,50,204 + Periphery/ + Axumite Providence.png + Periphery/ + Axumite Providence.png deep_periphery 2245 @@ -1727,6 +1999,8 @@ successor - unimplemented tag describing another faction code as the specified f New Delphi Compact New Delphi 127,151,139 + Periphery/ + New Delphi Compact.png deep_periphery 2602 @@ -1769,6 +2043,10 @@ successor - unimplemented tag describing another faction code as the specified f New Abilene Coromodir 255,36,0 + Periphery/ + Aurigan Coalition.png + Periphery/ + Aurigan Coalition.png periphery,minor,playable 2910 @@ -1777,6 +2055,10 @@ successor - unimplemented tag describing another faction code as the specified f Aurigan Directorate Coromodir 103,140,73 + Periphery/ + Aurigan Directorate.png + Periphery/ + Aurigan Directorate.png periphery,minor 3022 3025 diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index e6438452a2..e9b7e62110 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -809,6 +809,8 @@ chkGenerateForceIcons.text=Generate Force Icons chkGenerateForceIcons.toolTipText=This will automatically create force icons for generated lances and companies, displaying the weight class, type, formation, and faction background (if possible, otherwise using Mercenary). chkGenerateOriginNodeForceIcon.text=Generate Origin Node Force Icon chkGenerateOriginNodeForceIcon.toolTipText=This will automatically generate a force icon for the origin force node. +chkUseOriginNodeForceIconLogo.text=Use Faction Logo for Origin Node Force Icon +chkUseOriginNodeForceIconLogo.toolTipText=This generates an origin node force icon containing the faction's logo. If there isn't one specified in Factions.xml, it will use the normal central BattleMech instead. forceWeightLimitsPanel.title=Force Weight Limits forceWeightLimitsPanel.toolTipText=These are the weight levels used for determining the force icon weight level. All limits are the maximum tonnage for their weight class, with anything above the value for Assault being considered as Super Heavy. ### Spares Panel diff --git a/MekHQ/src/mekhq/MekHqConstants.java b/MekHQ/src/mekhq/MekHqConstants.java index 1239316e59..d9b3808388 100644 --- a/MekHQ/src/mekhq/MekHqConstants.java +++ b/MekHQ/src/mekhq/MekHqConstants.java @@ -152,7 +152,6 @@ public final class MekHqConstants extends SuiteConstants { public static final String LAYERED_FORCE_ICON_ALPHANUMERIC_BOTTOM_RIGHT_PATH = "Bottom Right/"; public static final String LAYERED_FORCE_ICON_ALPHANUMERIC_HQ_FILENAME = "HQ.png"; public static final String LAYERED_FORCE_ICON_BACKGROUND_PATH = "Pieces/Backgrounds/"; - public static final String LAYERED_FORCE_ICON_BACKGROUND_CLAN_PATH = "Clan/"; public static final String LAYERED_FORCE_ICON_FORMATION_PATH = "Pieces/Formations/"; public static final String LAYERED_FORCE_ICON_FORMATION_CLAN_PATH = "Clan/"; public static final String LAYERED_FORCE_ICON_FORMATION_STAR_FILENAME = "(02) Star.png"; diff --git a/MekHQ/src/mekhq/campaign/universe/Faction.java b/MekHQ/src/mekhq/campaign/universe/Faction.java index ca9a9e30cc..ae8f5fe75e 100644 --- a/MekHQ/src/mekhq/campaign/universe/Faction.java +++ b/MekHQ/src/mekhq/campaign/universe/Faction.java @@ -53,6 +53,10 @@ public class Faction { private int[] eraMods; private Color color; private String currencyCode = ""; // Currency of the faction, if any + private String layeredForceIconBackgroundCategory; + private String layeredForceIconBackgroundFilename; + private String layeredForceIconLogoCategory; + private String layeredForceIconLogoFilename; private Set tags; private int start; // Start year (inclusive) private int end; // End year (inclusive) @@ -70,7 +74,11 @@ public Faction(final String shortName, final String fullName) { color = Color.LIGHT_GRAY; startingPlanet = "Terra"; eraMods = null; - tags = EnumSet.noneOf(Faction.Tag.class); + setLayeredForceIconBackgroundCategory(""); + setLayeredForceIconBackgroundFilename(null); + setLayeredForceIconLogoCategory(""); + setLayeredForceIconLogoFilename(null); + tags = EnumSet.noneOf(Tag.class); start = 0; end = 9999; } @@ -177,6 +185,38 @@ public String getCurrencyCode() { return currencyCode; } + public String getLayeredForceIconBackgroundCategory() { + return layeredForceIconBackgroundCategory; + } + + public void setLayeredForceIconBackgroundCategory(final String layeredForceIconBackgroundCategory) { + this.layeredForceIconBackgroundCategory = layeredForceIconBackgroundCategory; + } + + public @Nullable String getLayeredForceIconBackgroundFilename() { + return layeredForceIconBackgroundFilename; + } + + public void setLayeredForceIconBackgroundFilename(final @Nullable String layeredForceIconBackgroundFilename) { + this.layeredForceIconBackgroundFilename = layeredForceIconBackgroundFilename; + } + + public String getLayeredForceIconLogoCategory() { + return layeredForceIconLogoCategory; + } + + public void setLayeredForceIconLogoCategory(final String layeredForceIconLogoCategory) { + this.layeredForceIconLogoCategory = layeredForceIconLogoCategory; + } + + public @Nullable String getLayeredForceIconLogoFilename() { + return layeredForceIconLogoFilename; + } + + public void setLayeredForceIconLogoFilename(final @Nullable String layeredForceIconLogoFilename) { + this.layeredForceIconLogoFilename = layeredForceIconLogoFilename; + } + //region Checks public boolean isPlayable() { return is(Tag.PLAYABLE); @@ -299,6 +339,14 @@ public static Faction getFactionFromXML(Node wn) throws DOMException { } } else if (wn2.getNodeName().equalsIgnoreCase("currencyCode")) { retVal.currencyCode = wn2.getTextContent(); + } else if (wn2.getNodeName().equalsIgnoreCase("layeredForceIconBackgroundCategory")) { + retVal.setLayeredForceIconBackgroundCategory(wn2.getTextContent().trim()); + } else if (wn2.getNodeName().equalsIgnoreCase("layeredForceIconBackgroundFilename")) { + retVal.setLayeredForceIconBackgroundFilename(wn2.getTextContent().trim()); + } else if (wn2.getNodeName().equalsIgnoreCase("layeredForceIconLogoCategory")) { + retVal.setLayeredForceIconLogoCategory(wn2.getTextContent().trim()); + } else if (wn2.getNodeName().equalsIgnoreCase("layeredForceIconLogoFilename")) { + retVal.setLayeredForceIconLogoFilename(wn2.getTextContent().trim()); } else if (wn2.getNodeName().equalsIgnoreCase("tags")) { Arrays.stream(wn2.getTextContent().split(",")).map(tag -> tag.toUpperCase(Locale.ROOT)) .map(Tag::valueOf).forEach(tag -> retVal.tags.add(tag)); diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 4dcfbee797..f445de2c37 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -22,7 +22,6 @@ import megamek.common.EntityWeightClass; import megamek.common.annotations.Nullable; import mekhq.MekHqXmlUtil; -import mekhq.campaign.Campaign; import mekhq.campaign.RandomOriginOptions; import mekhq.campaign.personnel.enums.PersonnelRole; import mekhq.campaign.universe.enums.*; @@ -87,8 +86,9 @@ public class CompanyGenerationOptions implements Serializable { // Unit private ForceNamingMethod forceNamingMethod; - private boolean generateForceIcons; // Very Buggy + private boolean generateForceIcons; private boolean generateOriginNodeForceIcon; + private boolean useOriginNodeForceIconLogo; private TreeMap forceWeightLimits; // Spares @@ -105,12 +105,12 @@ public class CompanyGenerationOptions implements Serializable { private boolean startCourseToContractPlanet; // Finances - private int startingCash; // Not Implemented + private int startingCash; private boolean randomizeStartingCash; private int randomStartingCashDiceCount; - private int minimumStartingFloat; // Not Implemented - private boolean payForSetup; // Not Implemented - private boolean startingLoan; // Not Implemented + private int minimumStartingFloat; + private boolean payForSetup; + private boolean startingLoan; private boolean payForPersonnel; private boolean payForUnits; private boolean payForParts; @@ -197,6 +197,7 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method) { setForceNamingMethod(ForceNamingMethod.CCB_1943); setGenerateForceIcons(true); setGenerateOriginNodeForceIcon(true); + setUseOriginNodeForceIconLogo(false); setForceWeightLimits(new TreeMap<>()); getForceWeightLimits().put(390, EntityWeightClass.WEIGHT_ASSAULT); getForceWeightLimits().put(280, EntityWeightClass.WEIGHT_HEAVY); @@ -532,6 +533,14 @@ public void setGenerateOriginNodeForceIcon(final boolean generateOriginNodeForce this.generateOriginNodeForceIcon = generateOriginNodeForceIcon; } + public boolean isUseOriginNodeForceIconLogo() { + return useOriginNodeForceIconLogo; + } + + public void setUseOriginNodeForceIconLogo(final boolean useOriginNodeForceIconLogo) { + this.useOriginNodeForceIconLogo = useOriginNodeForceIconLogo; + } + public TreeMap getForceWeightLimits() { return forceWeightLimits; } @@ -824,6 +833,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "forceNamingMethod", getForceNamingMethod().name()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateForceIcons", isGenerateForceIcons()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateOriginNodeForceIcon", isGenerateOriginNodeForceIcon()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "useOriginNodeForceIconLogo", isUseOriginNodeForceIconLogo()); MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "forceWeightLimits"); for (final Entry entry : getForceWeightLimits().entrySet()) { MekHqXmlUtil.writeSimpleXMLTag(pw, indent, entry.getKey().toString(), entry.getValue()); @@ -1054,6 +1064,9 @@ public static CompanyGenerationOptions parseFromXML(final @Nullable File file) { case "generateOriginNodeForceIcon": options.setGenerateOriginNodeForceIcon(Boolean.parseBoolean(wn.getTextContent().trim())); break; + case "useOriginNodeForceIconLogo": + options.setUseOriginNodeForceIconLogo(Boolean.parseBoolean(wn.getTextContent().trim())); + break; case "forceWeightLimits": { options.setForceWeightLimits(new TreeMap<>()); final NodeList nl2 = wn.getChildNodes(); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 636857dbb2..4a42910644 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -916,33 +916,31 @@ private void generateUnit(final Campaign campaign, ForcePieceIcon background = null; if (getOptions().isGenerateForceIcons()) { - if (MHQStaticDirectoryManager.getForceIcons() != null) { - // FIXME : Finish implementation + if (campaign.getFaction().getLayeredForceIconBackgroundFilename() != null) { background = new ForcePieceIcon(LayeredForceIconLayer.BACKGROUND, - MekHqConstants.LAYERED_FORCE_ICON_BACKGROUND_CLAN_PATH, "Clan Snow Raven.png"); -/* - if (MHQStaticDirectoryManager.getForceIcons().getItems().keySet().stream() - .anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getFullName(campaign.getGameYear())))) { - background = getOptions().getFaction().getFullName(campaign.getGameYear()); - } - - if (background.isBlank() && (MHQStaticDirectoryManager.getForceIcons().getItems().keySet() - .stream().anyMatch(s -> s.equalsIgnoreCase(getOptions().getFaction().getShortName())))) { - background = getOptions().getFaction().getShortName(); - } -*/ + campaign.getFaction().getLayeredForceIconBackgroundCategory(), + campaign.getFaction().getLayeredForceIconBackgroundFilename()); } // Create the Origin Force Icon if (getOptions().isGenerateOriginNodeForceIcon()) { final LayeredForceIcon layeredForceIcon = new LayeredForceIcon(); - // Type - layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.TYPE, new ArrayList<>()); - layeredForceIcon.getPieces().get(LayeredForceIconLayer.TYPE) - .add(new ForcePieceIcon(LayeredForceIconLayer.TYPE, - MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, - MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME)); + // Logo / Type + if (getOptions().isUseOriginNodeForceIconLogo() + && (campaign.getFaction().getLayeredForceIconLogoFilename() != null)) { + layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.LOGO, new ArrayList<>()); + layeredForceIcon.getPieces().get(LayeredForceIconLayer.LOGO) + .add(new ForcePieceIcon(LayeredForceIconLayer.LOGO, + campaign.getFaction().getLayeredForceIconLogoCategory(), + campaign.getFaction().getLayeredForceIconLogoFilename())); + } else { + layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.TYPE, new ArrayList<>()); + layeredForceIcon.getPieces().get(LayeredForceIconLayer.TYPE) + .add(new ForcePieceIcon(LayeredForceIconLayer.TYPE, + MekHqConstants.LAYERED_FORCE_ICON_TYPE_STRAT_OPS_PATH, + MekHqConstants.LAYERED_FORCE_ICON_BATTLEMECH_CENTER_FILENAME)); + } // Background if (background != null) { @@ -995,8 +993,7 @@ private void generateUnit(final Campaign campaign, * @param head the force to append the new lance to * @param trackers the list of trackers, properly ordered to be assigned to the lance * @param alphabet the alphabet value to determine the lance name from - * @param background the background force piece icon, which is null when the layered force - * icon isn't being created + * @param background the background force piece icon, which is null when there's no valid background */ private void createLance(final Campaign campaign, final Force head, final List trackers, @@ -1012,8 +1009,7 @@ private void createLance(final Campaign campaign, final Force head, * @param head the force to append the new lance to * @param trackers the list of trackers, properly ordered to be assigned to the lance * @param name the lance's name - * @param background the background force piece icon, which is null when the layered force - * icon isn't being created + * @param background the background force piece icon, which is null when there's no valid background * @return the newly created lance */ private Force createLance(final Campaign campaign, final Force head, @@ -1025,7 +1021,7 @@ private Force createLance(final Campaign campaign, final Force head, campaign.addUnitToForce(trackers.remove(0).getPerson().getUnit(), lance); } - if (background != null) { + if (getOptions().isGenerateForceIcons()) { createLayeredForceIcon(campaign, lance, true, background); } @@ -1037,10 +1033,11 @@ private Force createLance(final Campaign campaign, final Force head, * @param campaign the campaign the force is a part of * @param force the force to create a layered force icon for * @param isLance whether the force is a lance or a company - * @param background the background force piece icon + * @param background the background force piece icon, which is null when there's no valid background */ private void createLayeredForceIcon(final Campaign campaign, final Force force, - final boolean isLance, final ForcePieceIcon background) { + final boolean isLance, + final @Nullable ForcePieceIcon background) { if (MHQStaticDirectoryManager.getForceIcons() == null) { return; } @@ -1097,7 +1094,7 @@ private void createLayeredForceIcon(final Campaign campaign, final Force force, } // Background - if (!MekHqConstants.LAYERED_FORCE_ICON_DEFAULT_FRAME_FILENAME.equals(background.getFilename())) { + if (background != null) { layeredForceIcon.getPieces().putIfAbsent(LayeredForceIconLayer.BACKGROUND, new ArrayList<>()); layeredForceIcon.getPieces().get(LayeredForceIconLayer.BACKGROUND).add(background.clone()); } diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 0c02b9f4aa..e1ac2922ef 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -94,6 +94,7 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { private MMComboBox comboForceNamingMethod; private JCheckBox chkGenerateForceIcons; private JCheckBox chkGenerateOriginNodeForceIcon; + private JCheckBox chkUseOriginNodeForceIconLogo; private Map spnForceWeightLimits; // Spares @@ -455,6 +456,14 @@ public void setChkGenerateOriginNodeForceIcon(final JCheckBox chkGenerateOriginN this.chkGenerateOriginNodeForceIcon = chkGenerateOriginNodeForceIcon; } + public JCheckBox getChkUseOriginNodeForceIconLogo() { + return chkUseOriginNodeForceIconLogo; + } + + public void setChkUseOriginNodeForceIconLogo(final JCheckBox chkUseOriginNodeForceIconLogo) { + this.chkUseOriginNodeForceIconLogo = chkUseOriginNodeForceIconLogo; + } + public Map getSpnForceWeightLimits() { return spnForceWeightLimits; } @@ -1207,12 +1216,21 @@ public Component getListCellRendererComponent(final JList list, final Object getChkGenerateForceIcons().addActionListener(evt -> { final boolean selected = getChkGenerateForceIcons().isSelected(); getChkGenerateOriginNodeForceIcon().setEnabled(selected); + getChkUseOriginNodeForceIconLogo().setEnabled(selected + && getChkGenerateOriginNodeForceIcon().isSelected()); forceWeightLimitsPanel.setEnabled(selected); }); setChkGenerateOriginNodeForceIcon(new JCheckBox(resources.getString("chkGenerateOriginNodeForceIcon.text"))); getChkGenerateOriginNodeForceIcon().setToolTipText(resources.getString("chkGenerateOriginNodeForceIcon.toolTipText")); getChkGenerateOriginNodeForceIcon().setName("chkGenerateOriginNodeForceIcon"); + getChkGenerateOriginNodeForceIcon().addActionListener(evt -> getChkUseOriginNodeForceIconLogo() + .setEnabled(getChkGenerateOriginNodeForceIcon().isEnabled() + && getChkGenerateOriginNodeForceIcon().isSelected())); + + setChkUseOriginNodeForceIconLogo(new JCheckBox(resources.getString("chkUseOriginNodeForceIconLogo.text"))); + getChkUseOriginNodeForceIconLogo().setToolTipText(resources.getString("chkUseOriginNodeForceIconLogo.toolTipText")); + getChkUseOriginNodeForceIconLogo().setName("chkUseOriginNodeForceIconLogo"); createForceWeightLimitsPanel(forceWeightLimitsPanel); @@ -1236,6 +1254,7 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getComboForceNamingMethod(), Alignment.LEADING)) .addComponent(getChkGenerateForceIcons()) .addComponent(getChkGenerateOriginNodeForceIcon()) + .addComponent(getChkUseOriginNodeForceIconLogo()) .addComponent(forceWeightLimitsPanel) ); @@ -1246,6 +1265,7 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getComboForceNamingMethod())) .addComponent(getChkGenerateForceIcons()) .addComponent(getChkGenerateOriginNodeForceIcon()) + .addComponent(getChkUseOriginNodeForceIconLogo()) .addComponent(forceWeightLimitsPanel) ); return panel; @@ -1748,7 +1768,11 @@ public void setOptions(final CompanyGenerationOptions options) { if (getChkGenerateForceIcons().isSelected() != options.isGenerateForceIcons()) { getChkGenerateForceIcons().doClick(); } - getChkGenerateOriginNodeForceIcon().setSelected(options.isGenerateOriginNodeForceIcon()); + + if (getChkGenerateOriginNodeForceIcon().isSelected() != options.isGenerateOriginNodeForceIcon()) { + getChkGenerateOriginNodeForceIcon().doClick(); + } + getChkUseOriginNodeForceIconLogo().setSelected(options.isUseOriginNodeForceIconLogo()); for (final Entry entry : options.getForceWeightLimits().entrySet()) { getSpnForceWeightLimits().get(entry.getValue()).setValue(entry.getKey()); } @@ -1860,6 +1884,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setForceNamingMethod(getComboForceNamingMethod().getSelectedItem()); options.setGenerateForceIcons(getChkGenerateForceIcons().isSelected()); options.setGenerateOriginNodeForceIcon(getChkGenerateOriginNodeForceIcon().isSelected()); + options.setUseOriginNodeForceIconLogo(getChkUseOriginNodeForceIconLogo().isSelected()); options.setForceWeightLimits(new TreeMap<>()); for (final Entry entry : getSpnForceWeightLimits().entrySet()) { options.getForceWeightLimits().put((int) entry.getValue().getValue(), entry.getKey()); From 3cf424e1b991735427b280862d7bd1ec435f6d75 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 10 Jan 2022 17:01:17 -0500 Subject: [PATCH 091/115] Removing old comments --- .../CompanyGenerationOptions.java | 22 +++++++------------ .../AbstractCompanyGenerator.java | 3 +-- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index f445de2c37..1e088dfa58 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -101,7 +101,7 @@ public class CompanyGenerationOptions implements Serializable { private boolean generateFractionalMachineGunAmmunition; // Contracts - private boolean selectStartingContract; // Not Implemented + private boolean selectStartingContract; private boolean startCourseToContractPlanet; // Finances @@ -118,19 +118,12 @@ public class CompanyGenerationOptions implements Serializable { private boolean payForAmmunition; // Surprises - private boolean generateSurprises; // Not Implemented - private boolean generateMysteryBoxes; // Not Implemented - private Map generateMysteryBoxTypes; // Not Implemented + private boolean generateSurprises; + private boolean generateMysteryBoxes; + private Map generateMysteryBoxTypes; //endregion Variable Declarations //region Constructors - /** - * This is only to be used when reading from XML - */ - private CompanyGenerationOptions() { - - } - public CompanyGenerationOptions(final CompanyGenerationMethod method) { // Base Information setMethod(method); @@ -919,8 +912,9 @@ public static CompanyGenerationOptions parseFromXML(final @Nullable File file) { * @param version the Version of the XML to parse from. This is included for future-proofing * @return the parsed company generation options, or null if the parsing fails */ - public static @Nullable CompanyGenerationOptions parseFromXML(final NodeList nl, final Version version) { - final CompanyGenerationOptions options = new CompanyGenerationOptions(); + public static @Nullable CompanyGenerationOptions parseFromXML(final NodeList nl, + final Version version) { + final CompanyGenerationOptions options = new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD); try { for (int x = 0; x < nl.getLength(); x++) { final Node wn = nl.item(x); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 4a42910644..b48a45b811 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -91,7 +91,6 @@ * * TODO - Wave 2: * Finish Finances - * Backgrounds don't work * Add dependent generation options, that apply pre-module simulation. * Add personnel generation sort options * ---> Assign Most skilled to primary lance From 147b3a6065eed6d522a0685f482581a5742ae8c1 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 10 Jan 2022 18:42:33 -0500 Subject: [PATCH 092/115] Expanding financial options and organizing them into debits and credits --- .../resources/mekhq/resources/GUI.properties | 13 +- .../CompanyGenerationOptions.java | 64 ++++-- .../AbstractCompanyGenerator.java | 9 +- .../panels/CompanyGenerationOptionsPanel.java | 215 +++++++++++++----- 4 files changed, 225 insertions(+), 76 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index e9b7e62110..a5d8ecb9b7 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -837,6 +837,10 @@ chkStartCourseToContractPlanet.text=Start Course to Contract Planet chkStartCourseToContractPlanet.toolTipText=This automatically charts and starts the company's travel towards the planet of the selected contract. ### Finances Panel financesPanel.title=Finances +chkProcessFinances.text=Process Finances +chkProcessFinances.toolTipText= +financialCreditsPanel.title=Credits +financialCreditsPanel.toolTipText= lblStartingCash.text=Starting C-Bills lblStartingCash.toolTipText=The number of C-Bills to start with, minus expenses, if not randomizing the starting cash. chkRandomizeStartingCash.text=Randomize Starting C-Bills @@ -845,10 +849,15 @@ lblRandomStartingCashDiceCount.text=Random Starting C-Bills d6 Count lblRandomStartingCashDiceCount.toolTipText=This is the number of d6s rolled to generate the random starting C-Bills when randomizing starting funds.
The base value of 8 will generate approximately 28m C-Bills, which is enough for a company in 3025 with a small float.
For later eras 10 to 12 per company is recommended. lblMinimumStartingFloat.text=Minimum Starting Float lblMinimumStartingFloat.toolTipText=This is the minimum number of available C-Bills the company will start with following generation. -chkPayForSetup.text=Pay for Setup -chkPayForSetup.toolTipText=Pay for the generated unit from the starting cash, to a minimum of the starting float. +chkIncludeInitialContractPayment.text=Initial Contract Pay +chkIncludeInitialContractPayment.toolTipText= chkStartingLoan.text=Starting Loan chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended,
leaving the starting float as available C-Bills. + +financialDebitsPanel.title=Debits +financialDebitsPanel.toolTipText= +chkPayForSetup.text=Pay for Setup +chkPayForSetup.toolTipText=Pay for the generated unit from the starting cash, to a minimum of the starting float. chkPayForPersonnel.text=Pay for Personnel chkPayForPersonnel.toolTipText=Pay to hire personnel, at the standard hiring rate of two months salary. chkPayForUnits.text=Pay for Units diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 1e088dfa58..e087287ec3 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -105,12 +105,14 @@ public class CompanyGenerationOptions implements Serializable { private boolean startCourseToContractPlanet; // Finances + private boolean processFinances; private int startingCash; private boolean randomizeStartingCash; private int randomStartingCashDiceCount; private int minimumStartingFloat; - private boolean payForSetup; + private boolean includeInitialContractPayment; private boolean startingLoan; + private boolean payForSetup; private boolean payForPersonnel; private boolean payForUnits; private boolean payForParts; @@ -212,17 +214,19 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method) { setStartCourseToContractPlanet(true); // Finances - setStartingCash(0); + setProcessFinances(true); + setStartingCash(method.isWindchild() ? 3500000 : 0); setRandomizeStartingCash(method.isWindchild()); setRandomStartingCashDiceCount(8); setMinimumStartingFloat(method.isWindchild() ? 3500000 : 0); - setPayForSetup(method.isWindchild()); - setStartingLoan(method.isWindchild()); - setPayForPersonnel(method.isWindchild()); - setPayForUnits(method.isWindchild()); - setPayForParts(method.isWindchild()); - setPayForArmour(method.isWindchild()); - setPayForAmmunition(method.isWindchild()); + setIncludeInitialContractPayment(method.isWindchild()); + setStartingLoan(true); + setPayForSetup(true); + setPayForPersonnel(true); + setPayForUnits(true); + setPayForParts(true); + setPayForArmour(true); + setPayForAmmunition(true); // Surprises setGenerateSurprises(true); @@ -620,6 +624,14 @@ public void setStartCourseToContractPlanet(final boolean startCourseToContractPl //endregion Contracts //region Finances + public boolean isProcessFinances() { + return processFinances; + } + + public void setProcessFinances(final boolean processFinances) { + this.processFinances = processFinances; + } + public int getStartingCash() { return startingCash; } @@ -652,12 +664,12 @@ public void setMinimumStartingFloat(final int minimumStartingFloat) { this.minimumStartingFloat = minimumStartingFloat; } - public boolean isPayForSetup() { - return payForSetup; + public boolean isIncludeInitialContractPayment() { + return includeInitialContractPayment; } - public void setPayForSetup(final boolean payForSetup) { - this.payForSetup = payForSetup; + public void setIncludeInitialContractPayment(final boolean includeInitialContractPayment) { + this.includeInitialContractPayment = includeInitialContractPayment; } public boolean isStartingLoan() { @@ -668,6 +680,14 @@ public void setStartingLoan(final boolean startingLoan) { this.startingLoan = startingLoan; } + public boolean isPayForSetup() { + return payForSetup; + } + + public void setPayForSetup(final boolean payForSetup) { + this.payForSetup = payForSetup; + } + public boolean isPayForPersonnel() { return payForPersonnel; } @@ -847,12 +867,14 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startCourseToContractPlanet", isStartCourseToContractPlanet()); // Finances + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "processFinances", isProcessFinances()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingCash", getStartingCash()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomizeStartingCash", isRandomizeStartingCash()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "randomStartingCashDiceCount", getRandomStartingCashDiceCount()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "minimumStartingFloat", getMinimumStartingFloat()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForSetup", isPayForSetup()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "includeInitialContractPayment", isIncludeInitialContractPayment()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "startingLoan", isStartingLoan()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForSetup", isPayForSetup()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForPersonnel", isPayForPersonnel()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForUnits", isPayForUnits()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "payForParts", isPayForParts()); @@ -909,11 +931,11 @@ public static CompanyGenerationOptions parseFromXML(final @Nullable File file) { /** * @param nl the node list to parse the options from - * @param version the Version of the XML to parse from. This is included for future-proofing + * @param ignoredVersion the Version of the XML to parse from. This is included for future-proofing * @return the parsed company generation options, or null if the parsing fails */ public static @Nullable CompanyGenerationOptions parseFromXML(final NodeList nl, - final Version version) { + final Version ignoredVersion) { final CompanyGenerationOptions options = new CompanyGenerationOptions(CompanyGenerationMethod.WINDCHILD); try { for (int x = 0; x < nl.getLength(); x++) { @@ -1112,6 +1134,9 @@ public static CompanyGenerationOptions parseFromXML(final @Nullable File file) { //endregion Contracts //region Finances + case "processFinances": + options.setProcessFinances(Boolean.parseBoolean(wn.getTextContent().trim())); + break; case "startingCash": options.setStartingCash(Integer.parseInt(wn.getTextContent().trim())); break; @@ -1124,12 +1149,15 @@ public static CompanyGenerationOptions parseFromXML(final @Nullable File file) { case "minimumStartingFloat": options.setMinimumStartingFloat(Integer.parseInt(wn.getTextContent().trim())); break; - case "payForSetup": - options.setPayForSetup(Boolean.parseBoolean(wn.getTextContent().trim())); + case "includeInitialContractPayment": + options.setIncludeInitialContractPayment(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "startingLoan": options.setStartingLoan(Boolean.parseBoolean(wn.getTextContent().trim())); break; + case "payForSetup": + options.setPayForSetup(Boolean.parseBoolean(wn.getTextContent().trim())); + break; case "payForPersonnel": options.setPayForPersonnel(Boolean.parseBoolean(wn.getTextContent().trim())); break; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index b48a45b811..2f64dbe720 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1338,7 +1338,6 @@ private void processFinances(final Campaign campaign, final List units, final List parts, final List armour, final List ammunition, final @Nullable Contract contract) { - // TODO : Finish implementation Money startingCash = generateStartingCash(); Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); if (getOptions().isPayForSetup()) { @@ -1364,15 +1363,15 @@ private void processFinances(final Campaign campaign, campaign.getLocalDate(), startingCash, resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.text")); if (loan.isZero()) { - campaign.addReport(""); + campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithoutLoan.report")); } else { - + campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithLoan.report")); } } else if (startingCash.isZero()) { if (loan.isZero()) { - campaign.addReport(""); + campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupBarelyFundedWithoutLoan.report")); } else { - + campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupBarelyFundedWithLoan.report")); } } else { if (loan.isZero()) { diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index e1ac2922ef..fa5fab045b 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -111,12 +111,14 @@ public class CompanyGenerationOptionsPanel extends AbstractMHQPanel { private JCheckBox chkStartCourseToContractPlanet; // Finances + private JCheckBox chkProcessFinances; private JSpinner spnStartingCash; private JCheckBox chkRandomizeStartingCash; private JSpinner spnRandomStartingCashDiceCount; private JSpinner spnMinimumStartingFloat; - private JCheckBox chkPayForSetup; + private JCheckBox chkIncludeInitialContractPayment; private JCheckBox chkStartingLoan; + private JCheckBox chkPayForSetup; private JCheckBox chkPayForPersonnel; private JCheckBox chkPayForUnits; private JCheckBox chkPayForParts; @@ -550,6 +552,14 @@ public void setChkStartCourseToContractPlanet(final JCheckBox chkStartCourseToCo //endregion Contracts //region Finances + public JCheckBox getChkProcessFinances() { + return chkProcessFinances; + } + + public void setChkProcessFinances(final JCheckBox chkProcessFinances) { + this.chkProcessFinances = chkProcessFinances; + } + public JSpinner getSpnStartingCash() { return spnStartingCash; } @@ -582,12 +592,12 @@ public void setSpnMinimumStartingFloat(final JSpinner spnMinimumStartingFloat) { this.spnMinimumStartingFloat = spnMinimumStartingFloat; } - public JCheckBox getChkPayForSetup() { - return chkPayForSetup; + public JCheckBox getChkIncludeInitialContractPayment() { + return chkIncludeInitialContractPayment; } - public void setChkPayForSetup(final JCheckBox chkPayForSetup) { - this.chkPayForSetup = chkPayForSetup; + public void setChkIncludeInitialContractPayment(final JCheckBox chkIncludeInitialContractPayment) { + this.chkIncludeInitialContractPayment = chkIncludeInitialContractPayment; } public JCheckBox getChkStartingLoan() { @@ -598,6 +608,14 @@ public void setChkStartingLoan(final JCheckBox chkStartingLoan) { this.chkStartingLoan = chkStartingLoan; } + public JCheckBox getChkPayForSetup() { + return chkPayForSetup; + } + + public void setChkPayForSetup(final JCheckBox chkPayForSetup) { + this.chkPayForSetup = chkPayForSetup; + } + public JCheckBox getChkPayForPersonnel() { return chkPayForPersonnel; } @@ -1437,6 +1455,9 @@ private JPanel createContractsPanel() { getChkSelectStartingContract().addActionListener(evt -> { final boolean selected = getChkSelectStartingContract().isSelected(); getChkStartCourseToContractPlanet().setEnabled(selected); + if (getChkIncludeInitialContractPayment() != null) { + getChkIncludeInitialContractPayment().setEnabled(selected); + } }); setChkStartCourseToContractPlanet(new JCheckBox(resources.getString("chkStartCourseToContractPlanet.text"))); @@ -1478,7 +1499,67 @@ private JPanel createContractsPanel() { } private JPanel createFinancesPanel() { - // Initialize Labels Used in ActionListeners + // Initialize Components Used in ActionListeners + final JPanel financialCreditsPanel = new JDisableablePanel("financialCreditsPanel"); + final JPanel financialDebitsPanel = new JDisableablePanel("financialDebitsPanel"); + + // Create Panel Components + setChkProcessFinances(new JCheckBox(resources.getString("chkProcessFinances.text"))); + getChkProcessFinances().setToolTipText(resources.getString("chkProcessFinances.toolTipText")); + getChkProcessFinances().setName("chkProcessFinances"); + getChkProcessFinances().addActionListener(evt -> { + final boolean selected = getChkProcessFinances().isSelected(); + financialCreditsPanel.setEnabled(selected); + financialDebitsPanel.setEnabled(selected); + + if (selected) { + getChkRandomizeStartingCash().setSelected(!getChkRandomizeStartingCash().isSelected()); + getChkRandomizeStartingCash().doClick(); + + getChkIncludeInitialContractPayment().setEnabled(getChkSelectStartingContract().isSelected()); + + getChkPayForSetup().setSelected(!getChkPayForSetup().isSelected()); + getChkPayForSetup().doClick(); + } + }); + + createFinancialCreditsPanel(financialCreditsPanel); + + createFinancialDebitsPanel(financialDebitsPanel); + + // Disable Panel Portions by Default + getChkProcessFinances().setSelected(true); + getChkProcessFinances().doClick(); + + // Layout the UI + final JPanel panel = new JPanel(); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financesPanel.title"))); + panel.setName("financesPanel"); + final GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getChkProcessFinances()) + .addComponent(financialCreditsPanel) + .addComponent(financialDebitsPanel) + ); + + layout.setHorizontalGroup( + layout.createParallelGroup(Alignment.LEADING) + .addComponent(getChkProcessFinances()) + .addComponent(financialCreditsPanel) + .addComponent(financialDebitsPanel) + ); + + return panel; + } + + private void createFinancialCreditsPanel(final JPanel panel) { + // Initialize Components Used in ActionListeners final JLabel lblRandomStartingCashDiceCount = new JLabel(); // Create Panel Components @@ -1517,43 +1598,14 @@ private JPanel createFinancesPanel() { getSpnMinimumStartingFloat().setToolTipText(resources.getString("lblMinimumStartingFloat.toolTipText")); getSpnMinimumStartingFloat().setName("spnMinimumStartingFloat"); - setChkPayForSetup(new JCheckBox(resources.getString("chkPayForSetup.text"))); - getChkPayForSetup().setToolTipText(resources.getString("chkPayForSetup.toolTipText")); - getChkPayForSetup().setName("chkPayForSetup"); - getChkPayForSetup().addActionListener(evt -> { - final boolean selected = getChkPayForSetup().isSelected(); - getChkStartingLoan().setEnabled(selected); - getChkPayForPersonnel().setEnabled(selected); - getChkPayForUnits().setEnabled(selected); - getChkPayForParts().setEnabled(selected); - getChkPayForArmour().setEnabled(selected); - getChkPayForAmmunition().setEnabled(selected); - }); + setChkIncludeInitialContractPayment(new JCheckBox(resources.getString("chkIncludeInitialContractPayment.text"))); + getChkIncludeInitialContractPayment().setToolTipText(resources.getString("chkIncludeInitialContractPayment.toolTipText")); + getChkIncludeInitialContractPayment().setName("chkIncludeInitialContractPayment"); setChkStartingLoan(new JCheckBox(resources.getString("chkStartingLoan.text"))); getChkStartingLoan().setToolTipText(resources.getString("chkStartingLoan.toolTipText")); getChkStartingLoan().setName("chkStartingLoan"); - setChkPayForPersonnel(new JCheckBox(resources.getString("chkPayForPersonnel.text"))); - getChkPayForPersonnel().setToolTipText(resources.getString("chkPayForPersonnel.toolTipText")); - getChkPayForPersonnel().setName("chkPayForPersonnel"); - - setChkPayForUnits(new JCheckBox(resources.getString("chkPayForUnits.text"))); - getChkPayForUnits().setToolTipText(resources.getString("chkPayForUnits.toolTipText")); - getChkPayForUnits().setName("chkPayForUnits"); - - setChkPayForParts(new JCheckBox(resources.getString("chkPayForParts.text"))); - getChkPayForParts().setToolTipText(resources.getString("chkPayForParts.toolTipText")); - getChkPayForParts().setName("chkPayForParts"); - - setChkPayForArmour(new JCheckBox(resources.getString("chkPayForArmour.text"))); - getChkPayForArmour().setToolTipText(resources.getString("chkPayForArmour.toolTipText")); - getChkPayForArmour().setName("chkPayForArmour"); - - setChkPayForAmmunition(new JCheckBox(resources.getString("chkPayForAmmunition.text"))); - getChkPayForAmmunition().setToolTipText(resources.getString("chkPayForAmmunition.toolTipText")); - getChkPayForAmmunition().setName("chkPayForAmmunition"); - // Programmatically Assign Accessibility Labels lblStartingCash.setLabelFor(getSpnStartingCash()); lblRandomStartingCashDiceCount.setLabelFor(getSpnRandomStartingCashDiceCount()); @@ -1564,9 +1616,8 @@ private JPanel createFinancesPanel() { getChkRandomizeStartingCash().doClick(); // Layout the UI - final JPanel panel = new JPanel(); - panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financesPanel.title"))); - panel.setName("financesPanel"); + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financialCreditsPanel.title"))); + panel.setToolTipText(resources.getString("financialCreditsPanel.toolTipText")); final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); @@ -1585,13 +1636,8 @@ private JPanel createFinancesPanel() { .addGroup(layout.createParallelGroup(Alignment.BASELINE) .addComponent(lblMinimumStartingFloat) .addComponent(getSpnMinimumStartingFloat(), Alignment.LEADING)) - .addComponent(getChkPayForSetup()) + .addComponent(getChkIncludeInitialContractPayment()) .addComponent(getChkStartingLoan()) - .addComponent(getChkPayForPersonnel()) - .addComponent(getChkPayForUnits()) - .addComponent(getChkPayForParts()) - .addComponent(getChkPayForArmour()) - .addComponent(getChkPayForAmmunition()) ); layout.setHorizontalGroup( @@ -1606,8 +1652,61 @@ private JPanel createFinancesPanel() { .addGroup(layout.createSequentialGroup() .addComponent(lblMinimumStartingFloat) .addComponent(getSpnMinimumStartingFloat())) - .addComponent(getChkPayForSetup()) + .addComponent(getChkIncludeInitialContractPayment()) .addComponent(getChkStartingLoan()) + ); + } + + private void createFinancialDebitsPanel(final JPanel panel) { + // Create Panel Components + setChkPayForSetup(new JCheckBox(resources.getString("chkPayForSetup.text"))); + getChkPayForSetup().setToolTipText(resources.getString("chkPayForSetup.toolTipText")); + getChkPayForSetup().setName("chkPayForSetup"); + getChkPayForSetup().addActionListener(evt -> { + final boolean enabled = getChkPayForSetup().isEnabled() && getChkPayForSetup().isSelected(); + getChkPayForPersonnel().setEnabled(enabled); + getChkPayForUnits().setEnabled(enabled); + getChkPayForParts().setEnabled(enabled); + getChkPayForArmour().setEnabled(enabled); + getChkPayForAmmunition().setEnabled(enabled); + }); + + setChkPayForPersonnel(new JCheckBox(resources.getString("chkPayForPersonnel.text"))); + getChkPayForPersonnel().setToolTipText(resources.getString("chkPayForPersonnel.toolTipText")); + getChkPayForPersonnel().setName("chkPayForPersonnel"); + + setChkPayForUnits(new JCheckBox(resources.getString("chkPayForUnits.text"))); + getChkPayForUnits().setToolTipText(resources.getString("chkPayForUnits.toolTipText")); + getChkPayForUnits().setName("chkPayForUnits"); + + setChkPayForParts(new JCheckBox(resources.getString("chkPayForParts.text"))); + getChkPayForParts().setToolTipText(resources.getString("chkPayForParts.toolTipText")); + getChkPayForParts().setName("chkPayForParts"); + + setChkPayForArmour(new JCheckBox(resources.getString("chkPayForArmour.text"))); + getChkPayForArmour().setToolTipText(resources.getString("chkPayForArmour.toolTipText")); + getChkPayForArmour().setName("chkPayForArmour"); + + setChkPayForAmmunition(new JCheckBox(resources.getString("chkPayForAmmunition.text"))); + getChkPayForAmmunition().setToolTipText(resources.getString("chkPayForAmmunition.toolTipText")); + getChkPayForAmmunition().setName("chkPayForAmmunition"); + + // Disable Panel Portions by Default + getChkPayForSetup().setSelected(true); + getChkPayForSetup().doClick(); + + // Layout the UI + panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financialDebitsPanel.title"))); + panel.setToolTipText(resources.getString("financialDebitsPanel.toolTipText")); + final GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); + + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); + + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(getChkPayForSetup()) .addComponent(getChkPayForPersonnel()) .addComponent(getChkPayForUnits()) .addComponent(getChkPayForParts()) @@ -1615,7 +1714,15 @@ private JPanel createFinancesPanel() { .addComponent(getChkPayForAmmunition()) ); - return panel; + layout.setHorizontalGroup( + layout.createParallelGroup(Alignment.LEADING) + .addComponent(getChkPayForSetup()) + .addComponent(getChkPayForPersonnel()) + .addComponent(getChkPayForUnits()) + .addComponent(getChkPayForParts()) + .addComponent(getChkPayForArmour()) + .addComponent(getChkPayForAmmunition()) + ); } private JPanel createSurprisesPanel() { @@ -1797,14 +1904,18 @@ public void setOptions(final CompanyGenerationOptions options) { getChkStartCourseToContractPlanet().setSelected(options.isStartCourseToContractPlanet()); // Finances + if (getChkProcessFinances().isSelected() != options.isProcessFinances()) { + getChkProcessFinances().doClick(); + } getSpnStartingCash().setValue(options.getStartingCash()); if (getChkRandomizeStartingCash().isSelected() != options.isRandomizeStartingCash()) { getChkRandomizeStartingCash().doClick(); } getSpnRandomStartingCashDiceCount().setValue(options.getRandomStartingCashDiceCount()); getSpnMinimumStartingFloat().setValue(options.getMinimumStartingFloat()); - getChkPayForSetup().setSelected(options.isPayForSetup()); + getChkIncludeInitialContractPayment().setSelected(options.isIncludeInitialContractPayment()); getChkStartingLoan().setSelected(options.isStartingLoan()); + getChkPayForSetup().setSelected(options.isPayForSetup()); getChkPayForPersonnel().setSelected(options.isPayForPersonnel()); getChkPayForUnits().setSelected(options.isPayForUnits()); getChkPayForParts().setSelected(options.isPayForParts()); @@ -1904,12 +2015,14 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setStartCourseToContractPlanet(getChkStartCourseToContractPlanet().isSelected()); // Finances + options.setProcessFinances(getChkProcessFinances().isSelected()); options.setStartingCash((Integer) getSpnStartingCash().getValue()); options.setRandomizeStartingCash(getChkRandomizeStartingCash().isSelected()); options.setRandomStartingCashDiceCount((Integer) getSpnRandomStartingCashDiceCount().getValue()); options.setMinimumStartingFloat((Integer) getSpnMinimumStartingFloat().getValue()); - options.setPayForSetup(getChkPayForSetup().isSelected()); + options.setIncludeInitialContractPayment(getChkIncludeInitialContractPayment().isSelected()); options.setStartingLoan(getChkStartingLoan().isSelected()); + options.setPayForSetup(getChkPayForSetup().isSelected()); options.setPayForPersonnel(getChkPayForPersonnel().isSelected()); options.setPayForUnits(getChkPayForUnits().isSelected()); options.setPayForParts(getChkPayForParts().isSelected()); From 216903c21a2b0c058d5253df6db7ebc9e0ef5adf Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jan 2022 18:16:02 -0500 Subject: [PATCH 093/115] More work towards coding finances --- .../resources/mekhq/resources/GUI.properties | 15 +++----- .../AbstractCompanyGenerator.java | 37 +++++++++---------- .../panels/CompanyGenerationOptionsPanel.java | 2 - 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index a5d8ecb9b7..5f76019211 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -838,9 +838,8 @@ chkStartCourseToContractPlanet.toolTipText=This automatically charts and starts ### Finances Panel financesPanel.title=Finances chkProcessFinances.text=Process Finances -chkProcessFinances.toolTipText= +chkProcessFinances.toolTipText=Process finances during startup.
The company will always be left with a minimum of the starting float, although they may have to take out a significant loan if that option is enabled.
If disabled, the initial contract payment will be paid out normally. financialCreditsPanel.title=Credits -financialCreditsPanel.toolTipText= lblStartingCash.text=Starting C-Bills lblStartingCash.toolTipText=The number of C-Bills to start with, minus expenses, if not randomizing the starting cash. chkRandomizeStartingCash.text=Randomize Starting C-Bills @@ -848,14 +847,12 @@ chkRandomizeStartingCash.toolTipText=This overrides the starting C-Bills with a lblRandomStartingCashDiceCount.text=Random Starting C-Bills d6 Count lblRandomStartingCashDiceCount.toolTipText=This is the number of d6s rolled to generate the random starting C-Bills when randomizing starting funds.
The base value of 8 will generate approximately 28m C-Bills, which is enough for a company in 3025 with a small float.
For later eras 10 to 12 per company is recommended. lblMinimumStartingFloat.text=Minimum Starting Float -lblMinimumStartingFloat.toolTipText=This is the minimum number of available C-Bills the company will start with following generation. -chkIncludeInitialContractPayment.text=Initial Contract Pay -chkIncludeInitialContractPayment.toolTipText= +lblMinimumStartingFloat.toolTipText=This is the minimum number of available C-Bills the company will start with following generation. The minimum value to start with is 0 C-Bills. +chkIncludeInitialContractPayment.text=Include Initial Contract Selection Payment In Calculations +chkIncludeInitialContractPayment.toolTipText=Include the payment from the selected contract as a fund .

If disabled, the initial contract payment will be paid out normally. chkStartingLoan.text=Starting Loan -chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended,
leaving the starting float as available C-Bills. - +chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended, leaving the starting float as available C-Bills. financialDebitsPanel.title=Debits -financialDebitsPanel.toolTipText= chkPayForSetup.text=Pay for Setup chkPayForSetup.toolTipText=Pay for the generated unit from the starting cash, to a minimum of the starting float. chkPayForPersonnel.text=Pay for Personnel @@ -872,7 +869,7 @@ chkPayForAmmunition.toolTipText=Pay for the spare ammunition generated, if any i surprisesPanel.title=Surprises (Unimplemented) surprisesPanel.toolTipText=Surprises are applied to the campaign immediately, with no user input, at the end of company generation. chkGenerateSurprises.text=Generate Surprises -chkGenerateSurprises.toolTipText=Allow the generation of surprises. These are applied to the campaign immediately, at the end of company generation. +chkGenerateSurprises.toolTipText=Allow the generation of surprises. These are immediately applied to the campaign at the end of company generation. mysteryBoxPanel.title=Mystery Boxes mysteryBoxPanel.toolTipText=Mystery Boxes each contain a 'Mech and between two and four parts randomly determined based on the individual type. chkGenerateMysteryBoxes.text=Generate Mystery Boxes diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 2f64dbe720..a9e5c662c5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1338,8 +1338,18 @@ private void processFinances(final Campaign campaign, final List units, final List parts, final List armour, final List ammunition, final @Nullable Contract contract) { + if (!getOptions().isProcessFinances()) { + return; + } + Money startingCash = generateStartingCash(); + if (getOptions().isIncludeInitialContractPayment() && (contract != null)) { + startingCash = startingCash.plus(contract.getTotalAdvanceAmount()); + } + Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); + Money loan = Money.zero(); + if (getOptions().isPayForSetup()) { final Money costs = calculateHiringCosts(campaign, trackers) .plus(calculateUnitCosts(units)) @@ -1348,7 +1358,6 @@ private void processFinances(final Campaign campaign, .plus(calculateAmmunitionCosts(ammunition)); final Money maximumPreLoanCosts = startingCash.minus(minimumStartingFloat); - Money loan = Money.zero(); if (maximumPreLoanCosts.isGreaterOrEqualThan(costs)) { startingCash = startingCash.minus(costs); } else { @@ -1362,23 +1371,10 @@ private void processFinances(final Campaign campaign, campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.text")); - if (loan.isZero()) { - campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithoutLoan.report")); - } else { - campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithLoan.report")); - } - } else if (startingCash.isZero()) { - if (loan.isZero()) { - campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupBarelyFundedWithoutLoan.report")); - } else { - campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupBarelyFundedWithLoan.report")); - } - } else { - if (loan.isZero()) { + } - } else { + if (!loan.isZero()) { - } } } else { startingCash = startingCash.isGreaterOrEqualThan(minimumStartingFloat) ? startingCash @@ -1387,11 +1383,14 @@ private void processFinances(final Campaign campaign, campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.text")); - //campaign.addReport(resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.report")); - } else { - //campaign.addReport(resources.getString("")); } } + + if (loan.isZero()) { + campaign.addReport(String.format(resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithoutLoan.report"), startingCash)); + } else { + campaign.addReport(String.format(resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithLoan.report"), startingCash, loan)); + } } /** diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index fa5fab045b..192181a09c 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -1617,7 +1617,6 @@ private void createFinancialCreditsPanel(final JPanel panel) { // Layout the UI panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financialCreditsPanel.title"))); - panel.setToolTipText(resources.getString("financialCreditsPanel.toolTipText")); final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); @@ -1697,7 +1696,6 @@ private void createFinancialDebitsPanel(final JPanel panel) { // Layout the UI panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financialDebitsPanel.title"))); - panel.setToolTipText(resources.getString("financialDebitsPanel.toolTipText")); final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); From 25ec31faf2b41e18c2cf026530e54ef6c3c79a8c Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jan 2022 18:20:03 -0500 Subject: [PATCH 094/115] Adding MechWarrior to types, just to be on the safe side --- .../mekhq/resources/Universe.properties | 20 +++++++------- .../enums/CompanyGenerationPersonType.java | 25 ++++++++--------- .../AbstractCompanyGenerator.java | 27 +++++++++++-------- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 510dd5ed44..6183d82e0d 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -156,12 +156,12 @@ CompanyGenerationMethod.WINDCHILD.text=Windchild CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that assigns the commanding officer a rank better fitting the force size, and handles BattleMech quality differently so that Clan 'Mechs can generate from any quality. # CompanyGenerationPersonType Enum -CompanyGenerationPersonType.COMPANY_COMMANDER.text=Company Commander -CompanyGenerationPersonType.COMPANY_COMMANDER.toolTipText=They are the person who leads the entire Mercenary company. -CompanyGenerationPersonType.CAPTAIN.text=Captain -CompanyGenerationPersonType.CAPTAIN.toolTipText=They lead a BattleMech company from their BattleMech. -CompanyGenerationPersonType.LIEUTENANT.text=Lieutenant -CompanyGenerationPersonType.LIEUTENANT.toolTipText=They lead a BattleMech lance from their BattleMech. +CompanyGenerationPersonType.MECHWARRIOR_COMPANY_COMMANDER.text=MechWarrior Company Commander +CompanyGenerationPersonType.MECHWARRIOR_COMPANY_COMMANDER.toolTipText=They are the MechWarrior who leads the entire Mercenary company. +CompanyGenerationPersonType.MECHWARRIOR_CAPTAIN.text=MechWarrior Captain +CompanyGenerationPersonType.MECHWARRIOR_CAPTAIN.toolTipText=They lead a BattleMech company from their BattleMech. +CompanyGenerationPersonType.MECHWARRIOR_LIEUTENANT.text=MechWarrior Lieutenant +CompanyGenerationPersonType.MECHWARRIOR_LIEUTENANT.toolTipText=They lead a BattleMech lance from their BattleMech. CompanyGenerationPersonType.MECHWARRIOR.text=MechWarrior CompanyGenerationPersonType.MECHWARRIOR.toolTipText=They pilot a BattleMech. CompanyGenerationPersonType.SUPPORT.text=Support @@ -189,11 +189,11 @@ MysteryBoxType.STAR_LEAGUE_REGULAR.toolTipText=This generates a random Bat MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.text=Inner Sphere Experimental Tech Mystery Box MysteryBoxType.INNER_SPHERE_EXPERIMENTAL.toolTipText=This generates a random experimental Inner Sphere BattleMech and two to four experimental parts based on the current campaign date.
Expect weird and wacky technology and new, rare, and/or unusual Inner Sphere 'Mechs and parts from this mystery box. MysteryBoxType.CLAN_KESHIK.text=Clan Keshik Mystery Box -MysteryBoxType.CLAN_KESHIK.toolTipText=This generates a random Clan 'Mech used by their Keshik forces and two to four parts based on the current year.
Expect the best technology of the Clans, as used by their elite.
This returns an Star League Royal Mystery Box if the current year predates the Clans. +MysteryBoxType.CLAN_KESHIK.toolTipText=This generates a random Clan 'Mech used by their Keshik forces and two to four parts based on the current year.
Expect the best technology of the Clans, as used by their elite.
This returns a Star League Royal Mystery Box if the current year predates the Clans. MysteryBoxType.CLAN_FRONT_LINE.text=Clan Front Line Mystery Box -MysteryBoxType.CLAN_FRONT_LINE.toolTipText=This generate a Clan front line 'Mech and two to four parts based on the current year.
This returns an Star League Royal Mystery Box if the current year predates the Clans. +MysteryBoxType.CLAN_FRONT_LINE.toolTipText=This generates a Clan front line 'Mech and two to four parts based on the current year.
This returns a Star League Royal Mystery Box if the current year predates the Clans. MysteryBoxType.CLAN_SECOND_LINE.text=Clan Second Line Mystery Box -MysteryBoxType.CLAN_SECOND_LINE.toolTipText=This generate a Clan second line 'Mech and two to four parts based on the current year.
This returns an Star League Defence Force Mystery Box if the current year predates the Clans. +MysteryBoxType.CLAN_SECOND_LINE.toolTipText=This generates a Clan second line 'Mech and two to four parts based on the current year.
This returns a Star League Defence Force Mystery Box if the current year predates the Clans. MysteryBoxType.CLAN_EXPERIMENTAL.text=Clan Experimental Tech Mystery Box MysteryBoxType.CLAN_EXPERIMENTAL.toolTipText=This generates a random experimental Clan BattleMech and two to four experimental Clan parts based on the current campaign date.
Expect weird and wacky Clan technology, unusual 'Mechs... or maybe just getting them early!
This returns an Inner Sphere Experimental Mystery Box if the current year predates the Clans. @@ -217,3 +217,5 @@ AbstractCompanyGenerator.CommandLance.text=\u0020Command Lance AbstractCompanyGenerator.Company.text=\u0020Company AbstractCompanyGenerator.Lance.text=\u0020Lance AbstractCompanyGenerator.CompanyStartupFunding.text=Remaining Company Startup Funding +AbstractCompanyGenerator.CompanyStartupFundedWithoutLoan.report=The company has been founded with an initial float of %s. +AbstractCompanyGenerator.CompanyStartupFundedWithLoan.report=The company has been founded with an initial float of %s and a loan totalling %s. diff --git a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java index cb6449ca21..92b236242b 100644 --- a/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java +++ b/MekHQ/src/mekhq/campaign/universe/enums/CompanyGenerationPersonType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -28,9 +28,9 @@ */ public enum CompanyGenerationPersonType { //region Enum Declarations - COMPANY_COMMANDER("CompanyGenerationPersonType.COMPANY_COMMANDER.text", "CompanyGenerationPersonType.COMPANY_COMMANDER.toolTipText"), - CAPTAIN("CompanyGenerationPersonType.CAPTAIN.text", "CompanyGenerationPersonType.CAPTAIN.toolTipText"), - LIEUTENANT("CompanyGenerationPersonType.LIEUTENANT.text", "CompanyGenerationPersonType.LIEUTENANT.toolTipText"), + MECHWARRIOR_COMPANY_COMMANDER("CompanyGenerationPersonType.MECHWARRIOR_COMPANY_COMMANDER.text", "CompanyGenerationPersonType.MECHWARRIOR_COMPANY_COMMANDER.toolTipText"), + MECHWARRIOR_CAPTAIN("CompanyGenerationPersonType.MECHWARRIOR_CAPTAIN.text", "CompanyGenerationPersonType.MECHWARRIOR_CAPTAIN.toolTipText"), + MECHWARRIOR_LIEUTENANT("CompanyGenerationPersonType.MECHWARRIOR_LIEUTENANT.text", "CompanyGenerationPersonType.MECHWARRIOR_LIEUTENANT.toolTipText"), MECHWARRIOR("CompanyGenerationPersonType.MECHWARRIOR.text", "CompanyGenerationPersonType.MECHWARRIOR.toolTipText"), SUPPORT("CompanyGenerationPersonType.SUPPORT.text", "CompanyGenerationPersonType.SUPPORT.toolTipText"), ASSISTANT("CompanyGenerationPersonType.ASSISTANT.text", "CompanyGenerationPersonType.ASSISTANT.toolTipText"); @@ -57,16 +57,16 @@ public String getToolTipText() { //endregion Getters //region Boolean Comparison Methods - public boolean isCompanyCommander() { - return this == COMPANY_COMMANDER; + public boolean isMechWarriorCompanyCommander() { + return this == MECHWARRIOR_COMPANY_COMMANDER; } - public boolean isCaptain() { - return this == CAPTAIN; + public boolean isMechWarriorCaptain() { + return this == MECHWARRIOR_CAPTAIN; } - public boolean isLieutenant() { - return this == LIEUTENANT; + public boolean isMechWarriorLieutenant() { + return this == MECHWARRIOR_LIEUTENANT; } public boolean isMechWarrior() { @@ -82,11 +82,12 @@ public boolean isAssistant() { } public boolean isOfficer() { - return isCaptain() || isLieutenant(); + return isMechWarriorCaptain() || isMechWarriorLieutenant(); } public boolean isCombat() { - return isCompanyCommander() || isCaptain() || isLieutenant() || isMechWarrior(); + return isMechWarriorCompanyCommander() || isMechWarriorCaptain() + || isMechWarriorLieutenant() || isMechWarrior(); } //endregion Boolean Comparison Methods diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index a9e5c662c5..5011e13871 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -259,7 +259,7 @@ private List generateCombatPersonnel(final Campa private void generateCommandingOfficer(final Campaign campaign, final CompanyGenerationPersonTracker tracker, final int numMechWarriors) { - tracker.setPersonType(CompanyGenerationPersonType.COMPANY_COMMANDER); + tracker.setPersonType(CompanyGenerationPersonType.MECHWARRIOR_COMPANY_COMMANDER); tracker.getPerson().setCommander(getOptions().isAssignCompanyCommanderFlag()); tracker.getPerson().improveSkill(SkillType.S_GUN_MECH); tracker.getPerson().improveSkill(SkillType.S_PILOT_MECH); @@ -290,8 +290,9 @@ private void generateOfficers(final List tracker // Starting at 1, as 0 is the mercenary company commander for (int i = 1; i < determineNumberOfLances(); i++) { // Set the Person Type on the tracker, so we can properly reroll later - trackers.get(i).setPersonType((i < captainThreshold) ? CompanyGenerationPersonType.CAPTAIN - : CompanyGenerationPersonType.LIEUTENANT); + trackers.get(i).setPersonType((i < captainThreshold) + ? CompanyGenerationPersonType.MECHWARRIOR_CAPTAIN + : CompanyGenerationPersonType.MECHWARRIOR_LIEUTENANT); // Generate the individual officer generateOfficer(trackers.get(i)); } @@ -338,7 +339,7 @@ && getOptions().isApplyOfficerStatBonusToWorstSkill()) ? piloting : gunnery) .getType().getName()); } - if (tracker.getPersonType().isCaptain()) { + if (tracker.getPersonType().isMechWarriorCaptain()) { // Assign Random Officer Skill Increase assignRandomOfficerSkillIncrease(tracker, 2); @@ -687,10 +688,10 @@ private int rollBattleMechQuality(final CompanyGenerationPersonTracker tracker) */ private int getUnitGenerationParameterModifier(final CompanyGenerationPersonTracker tracker) { switch (tracker.getPersonType()) { - case COMPANY_COMMANDER: + case MECHWARRIOR_COMPANY_COMMANDER: return 2; - case CAPTAIN: - case LIEUTENANT: + case MECHWARRIOR_CAPTAIN: + case MECHWARRIOR_LIEUTENANT: return 1; case MECHWARRIOR: return 0; @@ -711,9 +712,9 @@ private List sortPersonnelIntoLances( // and the MechWarriors list final List sortedTrackers = new ArrayList<>(); final List captains = trackers.stream().filter(tracker -> - tracker.getPersonType().isCaptain()).collect(Collectors.toList()); + tracker.getPersonType().isMechWarriorCaptain()).collect(Collectors.toList()); final List lieutenants = trackers.stream().filter(tracker -> - tracker.getPersonType().isLieutenant()).collect(Collectors.toList()); + tracker.getPersonType().isMechWarriorLieutenant()).collect(Collectors.toList()); final List standardMechWarriors = trackers.stream().filter(tracker -> tracker.getPersonType().isMechWarrior()).collect(Collectors.toList()); @@ -1387,9 +1388,13 @@ private void processFinances(final Campaign campaign, } if (loan.isZero()) { - campaign.addReport(String.format(resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithoutLoan.report"), startingCash)); + campaign.addReport(String.format( + resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithoutLoan.report"), + startingCash)); } else { - campaign.addReport(String.format(resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithLoan.report"), startingCash, loan)); + campaign.addReport(String.format( + resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithLoan.report"), + startingCash, loan)); } } From 7f52ad6a06045070a4127ddf378eedb3c345b108 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jan 2022 18:55:54 -0500 Subject: [PATCH 095/115] Writing the faction code instead of the faction object --- .../generators/companyGenerators/AbstractCompanyGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 5011e13871..73d965a21d 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -806,7 +806,7 @@ private void generateEntity(final Campaign campaign, final MechSummary mechSummary = generateMechSummary(campaign, parameters, faction); if (mechSummary == null) { - LogManager.getLogger().error("Failed to generate an entity due to a null mech summary for faction " + faction); + LogManager.getLogger().error("Failed to generate an entity due to a null mech summary for faction " + faction.getShortName()); return null; } From fbcac6f29179fe0d059885526706dc013beb663f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jan 2022 19:24:09 -0500 Subject: [PATCH 096/115] Fixing merge conflicts --- MekHQ/resources/mekhq/resources/GUI.properties | 14 +++++++------- .../resources/mekhq/resources/Universe.properties | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 5f76019211..687e72d1dd 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -776,21 +776,21 @@ chkSimulateRandomProcreation.toolTipText=This runs random procreation for the du ### Units Panel unitsPanel.title=Units lblBattleMechWeightClassGenerationMethod.text=BattleMech Weight Class Generation Method -lblBattleMechWeightClassGenerationMethod.toolTipText= +lblBattleMechWeightClassGenerationMethod.toolTipText=This is the method to use in generating the weight classes used to generate BattleMechs for the force. lblBattleMechQualityGenerationMethod.text=BattleMech Quality Generation Method -lblBattleMechQualityGenerationMethod.toolTipText= +lblBattleMechQualityGenerationMethod.toolTipText=This is the method to use in generating the quality levels used to generate BattleMechs for the force. chkNeverGenerateStarLeagueMechs.text=Never Generate Star League 'Mechs -chkNeverGenerateStarLeagueMechs.toolTipText= +chkNeverGenerateStarLeagueMechs.toolTipText=Never generate from the Star League BattleMech Tables. Clan factions will instead generate solely from Secondline and lower Clan tables. chkOnlyGenerateStarLeagueMechs.text=Only Generate Star League 'Mechs -chkOnlyGenerateStarLeagueMechs.toolTipText= +chkOnlyGenerateStarLeagueMechs.toolTipText=Only generate from the Star League BattleMech Tables. Clan factions will instead generate from Frontline and higher Clan tables. chkOnlyGenerateOmniMechs.text=Only Generate OmniMechs -chkOnlyGenerateOmniMechs.toolTipText=This option only pairs with the +chkOnlyGenerateOmniMechs.toolTipText=Only allow OmniMechs to be generated.
General / Inner Sphere Faction: This option may lead to gaps in the force, as the Star League didn't have OmniMechs and OmniMech availability varies heavily even after their Inner Sphere introduction.
Clan Faction: This option may lead to gaps in the force unless the following steps are taken. First, ensure that year is 2876 or later. Second, enable the Only Generate Star League 'Mechs option as that will force generation to a minimum of Clan Frontline BattleMechs. chkGenerateUnitsAsAttached.text=Generate Units as Attached chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the Against the Bot rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MechWarrior when they retire
(provided the campaign options are enabled). chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander chkAssignBestRollToUnitCommander.toolTipText=This assigns the best rolled unit to the unit commander.
The heaviest Star League weight class will be assigned to them if a Star League 'Mech is rolled, or otherwise they will be assigned the heaviest 'Mech. chkSortStarLeagueUnitsFirst.text=Sort Star League Units First -chkSortStarLeagueUnitsFirst.toolTipText=This sorts any Star League rolls so they will be assigned to either the highest rank officers (with Keep Officer Rolls Separate) or to lances in order of the roll. +chkSortStarLeagueUnitsFirst.toolTipText=This sorts any Star League rolls, so they will be assigned to either the highest rank officers (with Keep Officer Rolls Separate) or to lances in order of the roll. chkGroupByWeight.text=Group Units by Weight chkGroupByWeight.toolTipText=This groups the rolls so that the 'Mechs are sorted into lances (largely) by weight class.
Otherwise, you can expect lances to have highly varied weight classes between the 'Mechs. chkGroupByQuality.text=Group Units by Quality @@ -849,7 +849,7 @@ lblRandomStartingCashDiceCount.toolTipText=This is the number of d6s rolle lblMinimumStartingFloat.text=Minimum Starting Float lblMinimumStartingFloat.toolTipText=This is the minimum number of available C-Bills the company will start with following generation. The minimum value to start with is 0 C-Bills. chkIncludeInitialContractPayment.text=Include Initial Contract Selection Payment In Calculations -chkIncludeInitialContractPayment.toolTipText=Include the payment from the selected contract as a fund .

If disabled, the initial contract payment will be paid out normally. +chkIncludeInitialContractPayment.toolTipText=Include the payment from the selected contract as part of the starting funds. This will mean the force may spend this cash during force creation, up to the limit of the minimum starting float.

If disabled, the initial contract payment will be paid out normally. chkStartingLoan.text=Starting Loan chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended, leaving the starting float as available C-Bills. financialDebitsPanel.title=Debits diff --git a/MekHQ/resources/mekhq/resources/Universe.properties b/MekHQ/resources/mekhq/resources/Universe.properties index 6183d82e0d..59f73ce49c 100644 --- a/MekHQ/resources/mekhq/resources/Universe.properties +++ b/MekHQ/resources/mekhq/resources/Universe.properties @@ -115,17 +115,17 @@ BattleMechQualityGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows BattleMechQualityGenerationMethod.WINDCHILD.text=Windchild BattleMechQualityGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB method that generates a higher base quality.
Generates (before modifiers): 17% F, 25% D, 31% C, 19% B, 8% A. BattleMechQualityGenerationMethod.F.text=F -BattleMechQualityGenerationMethod.F.toolTipText=This generates a force solely containing units of F quality.

+BattleMechQualityGenerationMethod.F.toolTipText=This generates a force solely containing units of F quality. BattleMechQualityGenerationMethod.D.text=D -BattleMechQualityGenerationMethod.D.toolTipText=This generates a force solely containing units of D quality.

+BattleMechQualityGenerationMethod.D.toolTipText=This generates a force solely containing units of D quality. BattleMechQualityGenerationMethod.C.text=C -BattleMechQualityGenerationMethod.C.toolTipText=This generates a force solely containing units of C quality.

+BattleMechQualityGenerationMethod.C.toolTipText=This generates a force solely containing units of C quality. BattleMechQualityGenerationMethod.B.text=B -BattleMechQualityGenerationMethod.B.toolTipText=This generates a force solely containing units of B quality.

+BattleMechQualityGenerationMethod.B.toolTipText=This generates a force solely containing units of B quality. BattleMechQualityGenerationMethod.A.text=A -BattleMechQualityGenerationMethod.A.toolTipText=This generates a force solely containing units of A quality.

+BattleMechQualityGenerationMethod.A.toolTipText=This generates a force solely containing units of A quality. BattleMechQualityGenerationMethod.A_STAR.text=A* -BattleMechQualityGenerationMethod.A_STAR.toolTipText=This generates a force solely containing units of A* quality.

+BattleMechQualityGenerationMethod.A_STAR.toolTipText=This generates a force solely containing units of A* quality. # BattleMechWeightClassGenerationMethod Enum BattleMechWeightClassGenerationMethod.AGAINST_THE_BOT.text=AtB @@ -153,7 +153,7 @@ BattleMechWeightClassGenerationMethod.ASSAULT.toolTipText=This generates a force CompanyGenerationMethod.AGAINST_THE_BOT.text=AtB CompanyGenerationMethod.AGAINST_THE_BOT.toolTipText=This follows the core AtB rules to generate a mercenary company. CompanyGenerationMethod.WINDCHILD.text=Windchild -CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that assigns the commanding officer a rank better fitting the force size, and handles BattleMech quality differently so that Clan 'Mechs can generate from any quality. +CompanyGenerationMethod.WINDCHILD.toolTipText=This is a variant of the AtB Method that assigns the commanding officer a rank better fitting the force size, and handles BattleMech quality differently so that Clan 'Mechs can generate from any quality. # CompanyGenerationPersonType Enum CompanyGenerationPersonType.MECHWARRIOR_COMPANY_COMMANDER.text=MechWarrior Company Commander From ca239b1f9289cf0277e02a51da1e947252523ab0 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jan 2022 19:53:11 -0500 Subject: [PATCH 097/115] Fixing options panel selection --- .../gui/panels/CompanyGenerationOptionsPanel.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java index 192181a09c..666eb15f0a 100644 --- a/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/CompanyGenerationOptionsPanel.java @@ -1612,8 +1612,7 @@ private void createFinancialCreditsPanel(final JPanel panel) { lblMinimumStartingFloat.setLabelFor(getSpnMinimumStartingFloat()); // Disable Panel Portions by Default - getChkRandomizeStartingCash().setSelected(true); - getChkRandomizeStartingCash().doClick(); + // This is handled by createFinancesPanel // Layout the UI panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financialCreditsPanel.title"))); @@ -1691,8 +1690,7 @@ private void createFinancialDebitsPanel(final JPanel panel) { getChkPayForAmmunition().setName("chkPayForAmmunition"); // Disable Panel Portions by Default - getChkPayForSetup().setSelected(true); - getChkPayForSetup().doClick(); + // This is handled by createFinancesPanel // Layout the UI panel.setBorder(BorderFactory.createTitledBorder(resources.getString("financialDebitsPanel.title"))); @@ -1913,7 +1911,9 @@ public void setOptions(final CompanyGenerationOptions options) { getSpnMinimumStartingFloat().setValue(options.getMinimumStartingFloat()); getChkIncludeInitialContractPayment().setSelected(options.isIncludeInitialContractPayment()); getChkStartingLoan().setSelected(options.isStartingLoan()); - getChkPayForSetup().setSelected(options.isPayForSetup()); + if (getChkPayForSetup().isSelected() != options.isPayForSetup()) { + getChkPayForSetup().doClick(); + } getChkPayForPersonnel().setSelected(options.isPayForPersonnel()); getChkPayForUnits().setSelected(options.isPayForUnits()); getChkPayForParts().setSelected(options.isPayForParts()); From 4707949283c8e814f2c1dc479b6aa5b54086343c Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jan 2022 19:59:21 -0500 Subject: [PATCH 098/115] Adjusting based on some testing... probably too generous, and might need to make the dice size modifiable --- MekHQ/resources/mekhq/resources/GUI.properties | 2 +- .../companyGeneration/CompanyGenerationOptions.java | 4 ++-- .../companyGenerators/AbstractCompanyGenerator.java | 7 +++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 687e72d1dd..bf21fb7ccf 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -845,7 +845,7 @@ lblStartingCash.toolTipText=The number of C-Bills to start with, minus expenses, chkRandomizeStartingCash.text=Randomize Starting C-Bills chkRandomizeStartingCash.toolTipText=This overrides the starting C-Bills with a random roll of nd6 million C-Bills, with the n specified below. lblRandomStartingCashDiceCount.text=Random Starting C-Bills d6 Count -lblRandomStartingCashDiceCount.toolTipText=This is the number of d6s rolled to generate the random starting C-Bills when randomizing starting funds.
The base value of 8 will generate approximately 28m C-Bills, which is enough for a company in 3025 with a small float.
For later eras 10 to 12 per company is recommended. +lblRandomStartingCashDiceCount.toolTipText=This is the number of d6s rolled to generate the random starting C-Bills when randomizing starting funds.
The base value of 18 will generate approximately 63m C-Bills, which is enough for a company in 3025 with a small float.
For later eras 22 to 30 per company is recommended. lblMinimumStartingFloat.text=Minimum Starting Float lblMinimumStartingFloat.toolTipText=This is the minimum number of available C-Bills the company will start with following generation. The minimum value to start with is 0 C-Bills. chkIncludeInitialContractPayment.text=Include Initial Contract Selection Payment In Calculations diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index e087287ec3..9a76aed84f 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -215,9 +215,9 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method) { // Finances setProcessFinances(true); - setStartingCash(method.isWindchild() ? 3500000 : 0); + setStartingCash(60000000); setRandomizeStartingCash(method.isWindchild()); - setRandomStartingCashDiceCount(8); + setRandomStartingCashDiceCount(17); setMinimumStartingFloat(method.isWindchild() ? 3500000 : 0); setIncludeInitialContractPayment(method.isWindchild()); setStartingLoan(true); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 73d965a21d..fbe7615da5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1347,6 +1347,9 @@ private void processFinances(final Campaign campaign, if (getOptions().isIncludeInitialContractPayment() && (contract != null)) { startingCash = startingCash.plus(contract.getTotalAdvanceAmount()); } + //temp + var initialStartingCash = startingCash; + //temp Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); Money loan = Money.zero(); @@ -1374,6 +1377,10 @@ private void processFinances(final Campaign campaign, resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.text")); } + //temp + LogManager.getLogger().warn(String.format("Initial Starting Cash %s, Maximum Pre Loan %s, Costs %s, Starting Cash %s", initialStartingCash, maximumPreLoanCosts, costs, startingCash)); + //temp + if (!loan.isZero()) { } From 56e60f21255b93b6be1b832c0d39cf5455356f0e Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Jan 2022 20:27:01 -0500 Subject: [PATCH 099/115] Finishing up the Random C-Bills d6 values --- .../companyGenerators/AbstractCompanyGenerator.java | 11 ++--------- .../src/mekhq/gui/dialog/CompanyGenerationDialog.java | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index fbe7615da5..1b91df0aad 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -90,8 +90,7 @@ * Button that lets you pop out the options panel with everything disabled * * TODO - Wave 2: - * Finish Finances - * Add dependent generation options, that apply pre-module simulation. + * Finish Loans * Add personnel generation sort options * ---> Assign Most skilled to primary lance * ---> sort by company @@ -104,6 +103,7 @@ * TODO - Wave 5: * Company Generator GUI * Implement Contracts + * Add dependent generation options, that apply pre-module simulation. * TODO - Wave 6: * Suite Options loading during startup, during the first load of a newer version (use a SuiteOption to track) * Add MegaMek Options as a panel during the startup @@ -1347,9 +1347,6 @@ private void processFinances(final Campaign campaign, if (getOptions().isIncludeInitialContractPayment() && (contract != null)) { startingCash = startingCash.plus(contract.getTotalAdvanceAmount()); } - //temp - var initialStartingCash = startingCash; - //temp Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); Money loan = Money.zero(); @@ -1377,10 +1374,6 @@ private void processFinances(final Campaign campaign, resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.text")); } - //temp - LogManager.getLogger().warn(String.format("Initial Starting Cash %s, Maximum Pre Loan %s, Costs %s, Starting Cash %s", initialStartingCash, maximumPreLoanCosts, costs, startingCash)); - //temp - if (!loan.isZero()) { } diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 7546bfbff4..0a7ba22487 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -30,9 +30,9 @@ import mekhq.campaign.parts.Armor; import mekhq.campaign.parts.Part; import mekhq.campaign.unit.Unit; -import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; import mekhq.campaign.universe.companyGeneration.CompanyGenerationOptions; import mekhq.campaign.universe.companyGeneration.CompanyGenerationPersonTracker; +import mekhq.campaign.universe.generators.companyGenerators.AbstractCompanyGenerator; import mekhq.gui.baseComponents.AbstractMHQValidationButtonDialog; import mekhq.gui.panels.CompanyGenerationOptionsPanel; From 4ceca867418697b74eb617b6b398dfa0436ee548 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Jan 2022 16:24:15 -0500 Subject: [PATCH 100/115] Finishing basic loan implementation --- .../resources/mekhq/resources/GUI.properties | 2 +- MekHQ/src/mekhq/campaign/finances/Money.java | 7 ++++++ .../AbstractCompanyGenerator.java | 24 ++++++++++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index bf21fb7ccf..26489e9e7d 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -851,7 +851,7 @@ lblMinimumStartingFloat.toolTipText=This is the minimum number of available C-Bi chkIncludeInitialContractPayment.text=Include Initial Contract Selection Payment In Calculations chkIncludeInitialContractPayment.toolTipText=Include the payment from the selected contract as part of the starting funds. This will mean the force may spend this cash during force creation, up to the limit of the minimum starting float.

If disabled, the initial contract payment will be paid out normally. chkStartingLoan.text=Starting Loan -chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended, leaving the starting float as available C-Bills. +chkStartingLoan.toolTipText=Take a loan containing the remaining cost of the unit after the starting cash has been expended, leaving the starting float as available C-Bills.
The loan will be 2 years long, monthly payments, 100% collateral, and at 15% interest. financialDebitsPanel.title=Debits chkPayForSetup.text=Pay for Setup chkPayForSetup.toolTipText=Pay for the generated unit from the starting cash, to a minimum of the starting float. diff --git a/MekHQ/src/mekhq/campaign/finances/Money.java b/MekHQ/src/mekhq/campaign/finances/Money.java index d88325ccbf..4303df989d 100644 --- a/MekHQ/src/mekhq/campaign/finances/Money.java +++ b/MekHQ/src/mekhq/campaign/finances/Money.java @@ -159,6 +159,13 @@ public String toAmountAndNameString() { return CurrencyManager.getInstance().getUiAmountAndNamePrinter().print(getWrapped().toMoney(RoundingMode.HALF_EVEN)); } + /** + * @return a new money object, rounded to use a scale of 0 with no trailing 0's + */ + public Money round() { + return new Money(getWrapped().withScale(0, RoundingMode.HALF_UP)); + } + //region File I/O public String toXmlString() { return CurrencyManager.getInstance().getXmlMoneyFormatter().print(getWrapped().toMoney(RoundingMode.HALF_EVEN)); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 1b91df0aad..e0ae62e108 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -27,7 +27,9 @@ import mekhq.MekHqConstants; import mekhq.Utilities; import mekhq.campaign.Campaign; +import mekhq.campaign.finances.Loan; import mekhq.campaign.finances.Money; +import mekhq.campaign.finances.enums.FinancialTerm; import mekhq.campaign.finances.enums.TransactionType; import mekhq.campaign.force.Force; import mekhq.campaign.icons.ForcePieceIcon; @@ -90,7 +92,6 @@ * Button that lets you pop out the options panel with everything disabled * * TODO - Wave 2: - * Finish Loans * Add personnel generation sort options * ---> Assign Most skilled to primary lance * ---> sort by company @@ -98,6 +99,8 @@ * Contract Market Pane * Campaign Options Pane, Campaign Options Dialog Base Validation * Date Pane + * Loan Selection Pane + * Implement Loan Options * TODO - Wave 4: * Startup GUI Rework * TODO - Wave 5: @@ -1334,6 +1337,18 @@ private void processContract(final Campaign campaign, final @Nullable Contract c //endregion Contract //region Finances + /** + * This processes the full financial setup for a campaign based on the one's options + * + * @param campaign the campaign to process finances for + * @param trackers the trackers containing the personnel to get the hiring cost for + * @param units the list of units to get the cost for + * @param parts the list of parts to get the cost for + * @param armour the list of different armours to get the cost for + * @param ammunition the list of ammunition to get the cost for + * @param contract the contract to potentially process the initial contract payment, which may + * be null. + */ private void processFinances(final Campaign campaign, final List trackers, final List units, final List parts, @@ -1364,10 +1379,12 @@ private void processFinances(final Campaign campaign, } else { startingCash = minimumStartingFloat; if (getOptions().isStartingLoan()) { - loan = costs.minus(maximumPreLoanCosts); + loan = costs.minus(maximumPreLoanCosts).round(); } } + startingCash = startingCash.round(); + if (startingCash.isPositive()) { campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, @@ -1375,7 +1392,8 @@ private void processFinances(final Campaign campaign, } if (!loan.isZero()) { - + campaign.getFinances().addLoan(new Loan(loan, 15, 2, FinancialTerm.MONTHLY, + 100, campaign.getLocalDate())); } } else { startingCash = startingCash.isGreaterOrEqualThan(minimumStartingFloat) ? startingCash From cf40748733feca19ca77ed3aae1b6836ed56c441 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Jan 2022 16:41:03 -0500 Subject: [PATCH 101/115] Adding another TODO --- .../generators/companyGenerators/AbstractCompanyGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index e0ae62e108..286a95c0f5 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -106,7 +106,7 @@ * TODO - Wave 5: * Company Generator GUI * Implement Contracts - * Add dependent generation options, that apply pre-module simulation. + * Add dependent generation options, that apply pre-module simulation * TODO - Wave 6: * Suite Options loading during startup, during the first load of a newer version (use a SuiteOption to track) * Add MegaMek Options as a panel during the startup From 9da55f399adc22d4f40dac6f5000c3df366156de Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Jan 2022 17:00:00 -0500 Subject: [PATCH 102/115] Adding a bunch of processing comments --- .../AbstractCompanyGenerator.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 286a95c0f5..d28d8b4020 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -1354,50 +1354,64 @@ private void processFinances(final Campaign campaign, final List units, final List parts, final List armour, final List ammunition, final @Nullable Contract contract) { + // Don't bother processing if it's disabled if (!getOptions().isProcessFinances()) { return; } + // Create Base Parsing Variables Money startingCash = generateStartingCash(); + Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); + Money loan = Money.zero(); + + // Process Initial Contract Payment if (getOptions().isIncludeInitialContractPayment() && (contract != null)) { startingCash = startingCash.plus(contract.getTotalAdvanceAmount()); } - Money minimumStartingFloat = Money.of(getOptions().getMinimumStartingFloat()); - Money loan = Money.zero(); - if (getOptions().isPayForSetup()) { + // Calculate the total costs of setup final Money costs = calculateHiringCosts(campaign, trackers) .plus(calculateUnitCosts(units)) .plus(calculatePartCosts(parts)) .plus(calculateArmourCosts(armour)) .plus(calculateAmmunitionCosts(ammunition)); + // Determine the maximum costs before a loan needs to be taken, and determine the + // starting cash based on it. final Money maximumPreLoanCosts = startingCash.minus(minimumStartingFloat); if (maximumPreLoanCosts.isGreaterOrEqualThan(costs)) { startingCash = startingCash.minus(costs); } else { + // Otherwise, the starting cash is the minimum float, with a loan created with the + // remaining costs if that option is selected startingCash = minimumStartingFloat; if (getOptions().isStartingLoan()) { loan = costs.minus(maximumPreLoanCosts).round(); } } + // Round the starting cash so we don't have any weird trailing numbers startingCash = startingCash.round(); + // Credit the campaign with the starting cash if it is positive if (startingCash.isPositive()) { campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, resources.getString("AbstractCompanyGenerator.CompanyStartupFunding.text")); } + // Add the loan if there's one to add if (!loan.isZero()) { campaign.getFinances().addLoan(new Loan(loan, 15, 2, FinancialTerm.MONTHLY, 100, campaign.getLocalDate())); } } else { + // Credit the campaign with the starting cash if it is positive startingCash = startingCash.isGreaterOrEqualThan(minimumStartingFloat) ? startingCash : minimumStartingFloat; + + // Credit the campaign with the starting cash if it is positive if (startingCash.isPositive()) { campaign.getFinances().credit(TransactionType.STARTING_CAPITAL, campaign.getLocalDate(), startingCash, @@ -1405,6 +1419,7 @@ private void processFinances(final Campaign campaign, } } + // Report the financial state in the daily report if (loan.isZero()) { campaign.addReport(String.format( resources.getString("AbstractCompanyGenerator.CompanyStartupFundedWithoutLoan.report"), From b28df3371fe631b5c8a653743384a0182ba13663 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 17 Jan 2022 14:17:28 -0500 Subject: [PATCH 103/115] Changing some priorities --- .../companyGenerators/AbstractCompanyGenerator.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index d28d8b4020..33db368efc 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -396,6 +396,7 @@ private void assignRandomOfficerSkillIncrease(final CompanyGenerationPersonTrack } } } + /** * Sets up standard MechWarriors from the provided trackers * @@ -522,7 +523,8 @@ private void generateAssistants(final Campaign campaign, * @param campaign the campaign to use in processing and to add the personnel to * @param trackers ALL trackers for the campaign */ - private void finalizePersonnel(final Campaign campaign, final List trackers) { + private void finalizePersonnel(final Campaign campaign, + final List trackers) { // Assign the founder flag if we need to if (getOptions().isAssignFounderFlag()) { trackers.forEach(tracker -> tracker.getPerson().setFounder(true)); @@ -609,7 +611,8 @@ public void generateUnitGenerationParameters(List Date: Mon, 17 Jan 2022 14:52:10 -0500 Subject: [PATCH 104/115] Convert everything to spaces --- MekHQ/data/universe/factions.xml | 558 +++++++++++++++---------------- 1 file changed, 279 insertions(+), 279 deletions(-) diff --git a/MekHQ/data/universe/factions.xml b/MekHQ/data/universe/factions.xml index 5f920dbc1c..49feff483b 100644 --- a/MekHQ/data/universe/factions.xml +++ b/MekHQ/data/universe/factions.xml @@ -24,7 +24,7 @@ eraMods - A comma-separated 9-item list of optional modifiers to repair/replacem nameGenerator - The name of the faction name generator that should be used for this faction. If left out, then this defaults to "General." colorRGB - a comma-separated 3-item list defining the RGB codes for the color used on the map for this faction. Defaults to light gray if missing. currencyCode - partially implemented (likely buggy) currency code value used by the faction. -layeredForceIconBackgroundCategory - the category of the faction's background piece +layeredForceIconBackgroundCategory - the category of the faction's background piece layeredForceIconBackgroundFilename - the filename of the faction's background piece layeredForceIconLogoCategory - the category of the faction's logo piece layeredForceIconLogoFilename - the filename of the faction's logo piece @@ -72,10 +72,10 @@ successor - unimplemented tag describing another faction code as the specified f Terra -1,-1,-1,0,0,0,0,0,0 255,255,255 - Inner Sphere/ - Terran Hegemony.png - Inner Sphere/ - Terran Hegemony.png + Inner Sphere/ + Terran Hegemony.png + Inner Sphere/ + Terran Hegemony.png is,super,playable 2315 2790 @@ -86,8 +86,8 @@ successor - unimplemented tag describing another faction code as the specified f Terra -1,-1,-1,0,0,0,0,0,0 142,74,123 - Periphery/ - Amaris Empire.png + Periphery/ + Amaris Empire.png is,minor 2767 2779 @@ -107,10 +107,10 @@ successor - unimplemented tag describing another faction code as the specified f 1,0,0,1,2,3,2,1,0 CC 0,156,85 - Inner Sphere/ - Capellan Confederation.png - Inner Sphere/ - Capellan Confederation.png + Inner Sphere/ + Capellan Confederation.png + Inner Sphere/ + Capellan Confederation.png is,major,playable 2367 @@ -122,10 +122,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,2,1,0,0 DC 234,45,46 - Inner Sphere/ - Draconis Combine.png - Inner Sphere/ - Draconis Combine.png + Inner Sphere/ + Draconis Combine.png + Inner Sphere/ + Draconis Combine.png is,major,playable 2319 @@ -136,10 +136,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,2,1,0,0 FS 248,212,44 - Inner Sphere/ - Federated Suns.png - Inner Sphere/ - Federated Suns.png + Inner Sphere/ + Federated Suns.png + Inner Sphere/ + Federated Suns.png is,major,playable 2317 @@ -150,10 +150,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 165,94,160 - Inner Sphere/ - Free Worlds League.png - Inner Sphere/ - Free Worlds League.png + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Free Worlds League.png is,major,playable 2271 @@ -166,10 +166,10 @@ successor - unimplemented tag describing another faction code as the specified f 1,0,0,1,2,3,2,1,0 LA 0,124,186 - Inner Sphere/ - Lyran Commonwealth.png - Inner Sphere/ - Lyran Commonwealth.png + Inner Sphere/ + Lyran Commonwealth.png + Inner Sphere/ + Lyran Commonwealth.png is,major,playable 2340 @@ -447,10 +447,10 @@ successor - unimplemented tag describing another faction code as the specified f Apollo 1,1,1,0,0,0,0,0,0 232,202,173 - Periphery/ - Rim Worlds Republic.png - Periphery/ - Rim Worlds Republic.png + Periphery/ + Rim Worlds Republic.png + Periphery/ + Rim Worlds Republic.png periphery,playable 2250 2779 @@ -482,10 +482,10 @@ successor - unimplemented tag describing another faction code as the specified f Taurus 1,1,1,1,2,3,2,1,0 179,62,38 - Periphery/ - Taurian Concordat.png - Periphery/ - Taurian Concordat.png + Periphery/ + Taurian Concordat.png + Periphery/ + Taurian Concordat.png periphery,playable 2335 @@ -495,10 +495,10 @@ successor - unimplemented tag describing another faction code as the specified f Canopus IV 1,1,1,1,2,3,2,1,1 57,158,145 - Periphery/ - Magistracy of Canopus.png - Periphery/ - Magistracy of Canopus.png + Periphery/ + Magistracy of Canopus.png + Periphery/ + Magistracy of Canopus.png periphery,playable 2530 @@ -509,10 +509,10 @@ successor - unimplemented tag describing another faction code as the specified f Alpheratz 1,1,1,1,2,3,2,1,0 210,190,153 - Periphery/ - Outworlds Alliance.png - Periphery/ - Outworlds Alliance.png + Periphery/ + Outworlds Alliance.png + Periphery/ + Outworlds Alliance.png periphery,playable 2413 3083 @@ -568,10 +568,10 @@ successor - unimplemented tag describing another faction code as the specified f Erod's Escape 1,1,1,1,2,3,2,2,1 0,128,128 - Periphery/ - Taurian Concordat.png - Periphery/ - Calderon Protectorate.png + Periphery/ + Taurian Concordat.png + Periphery/ + Calderon Protectorate.png periphery,playable 2253 @@ -581,8 +581,8 @@ successor - unimplemented tag describing another faction code as the specified f Chainelane Isles 1,1,1,1,2,3,2,1,0 255,80,93 - Periphery/ - Chainelane Isles.png + Periphery/ + Chainelane Isles.png deep_periphery,minor @@ -600,10 +600,10 @@ successor - unimplemented tag describing another faction code as the specified f Circinus 1,1,1,1,2,3,2,2,1 198,36,58 - Periphery/ - Circinus Federation.png - Periphery/ - Circinus Federation.png + Periphery/ + Circinus Federation.png + Periphery/ + Circinus Federation.png periphery 2785 3081 @@ -615,10 +615,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 255,99,71 - Clan/ - Clan Blood Spirit.png - Clan/ - Clan Blood Spirit.png + Clan/ + Clan Blood Spirit.png + Clan/ + Clan Blood Spirit.png clan,minor,playable 2807 3085 @@ -629,10 +629,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 255,165,0 - Clan/ - Clan Burrock.png - Clan/ - Clan Burrock.png + Clan/ + Clan Burrock.png + Clan/ + Clan Burrock.png clan,minor 2807 3059 @@ -644,10 +644,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 147,112,219 - Clan/ - Clan Cloud Cobra.png - Clan/ - Clan Cloud Cobra.png + Clan/ + Clan Cloud Cobra.png + Clan/ + Clan Cloud Cobra.png clan,minor,playable 2807 @@ -658,10 +658,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 0,0,205 - Clan/ - Clan Coyote.png - Clan/ - Clan Coyote.png + Clan/ + Clan Coyote.png + Clan/ + Clan Coyote.png clan,minor,playable 2807 @@ -671,10 +671,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 147,112,219 - Clan/ - The Society.png - Clan/ - The Society.png + Clan/ + The Society.png + Clan/ + The Society.png clan @@ -687,10 +687,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 0,255,255 - Clan/ - Clan Diamond Shark.png - Clan/ - Clan Diamond Shark.png + Clan/ + Clan Diamond Shark.png + Clan/ + Clan Diamond Shark.png clan,minor,playable 2807 @@ -701,10 +701,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 165,42,42 - Clan/ - Clan Fire Mandrill.png - Clan/ - Clan Fire Mandrill.png + Clan/ + Clan Fire Mandrill.png + Clan/ + Clan Fire Mandrill.png clan,minor,playable 2807 3073 @@ -718,10 +718,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 188,222,235 - Clan/ - Clan Ghost Bear.png - Clan/ - Clan Ghost Bear.png + Clan/ + Clan Ghost Bear.png + Clan/ + Clan Ghost Bear.png clan,major,playable 2807 3103 @@ -734,10 +734,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 238,232,170 - Clan/ - Clan Goliath Scorpion.png - Clan/ - Clan Goliath Scorpion.png + Clan/ + Clan Goliath Scorpion.png + Clan/ + Clan Goliath Scorpion.png clan,minor,playable 2807 3080 @@ -751,10 +751,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 241,168,110 - Clan/ - Clan Hell's Horses.png - Clan/ - Clan Hell's Horses.png + Clan/ + Clan Hell's Horses.png + Clan/ + Clan Hell's Horses.png clan,minor,playable 2807 @@ -765,10 +765,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 248,248,255 - Clan/ - Clan Ice Hellion.png - Clan/ - Clan Ice Hellion.png + Clan/ + Clan Ice Hellion.png + Clan/ + Clan Ice Hellion.png clan,minor,playable 2807 3074 @@ -781,10 +781,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 172,208,115 - Clan/ - Clan Jade Falcon.png - Clan/ - Clan Jade Falcon.png + Clan/ + Clan Jade Falcon.png + Clan/ + Clan Jade Falcon.png clan,major,playable 2807 @@ -794,10 +794,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 100,149,237 - Clan/ - Clan Mongoose.png - Clan/ - Clan Mongoose.png + Clan/ + Clan Mongoose.png + Clan/ + Clan Mongoose.png clan,minor 2807 2868 @@ -810,10 +810,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 245,255,250 - Clan/ - Clan Nova Cat.png - Clan/ - Clan Nova Cat.png + Clan/ + Clan Nova Cat.png + Clan/ + Clan Nova Cat.png clan,minor,playable 2807 3143 @@ -826,10 +826,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 152,164,129 - Clan/ - Clan Smoke Jaguar.png - Clan/ - Clan Smoke Jaguar.png + Clan/ + Clan Smoke Jaguar.png + Clan/ + Clan Smoke Jaguar.png clan,minor,playable 2807 3060 @@ -842,10 +842,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 135,206,235 - Clan/ - Clan Snow Raven.png - Clan/ - Clan Snow Raven.png + Clan/ + Clan Snow Raven.png + Clan/ + Clan Snow Raven.png clan,minor,playable 2807 3083 @@ -857,10 +857,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 218,165,32 - Clan/ - Clan Star Adder.png - Clan/ - Clan Star Adder.png + Clan/ + Clan Star Adder.png + Clan/ + Clan Star Adder.png clan,minor,playable 2807 @@ -871,10 +871,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 127,255,0 - Clan/ - Clan Steel Viper.png - Clan/ - Clan Steel Viper.png + Clan/ + Clan Steel Viper.png + Clan/ + Clan Steel Viper.png clan,minor,playable 2807 3075 @@ -887,10 +887,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 241,168,110 - Clan/ - Clan Stone Lion.png - Clan/ - Clan Stone Lion.png + Clan/ + Clan Stone Lion.png + Clan/ + Clan Stone Lion.png clan,minor 3075 @@ -900,10 +900,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 222,184,135 - Clan/ - Clan Widowmaker.png - Clan/ - Clan Widowmaker.png + Clan/ + Clan Widowmaker.png + Clan/ + Clan Widowmaker.png clan,minor 2807 2834 @@ -916,10 +916,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 207,114,58 - Clan/ - Clan Wolf.png - Clan/ - Clan Wolf.png + Clan/ + Clan Wolf.png + Clan/ + Clan Wolf.png clan,major,playable 2807 3142 @@ -932,8 +932,8 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 207,114,58 - Clan/ - Wolf Empire.png + Clan/ + Wolf Empire.png clan,minor 3142 @@ -944,10 +944,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 160,82,45 - Clan/ - Clan Wolf-in-Exile.png - Clan/ - Clan Wolf-in-Exile.png + Clan/ + Clan Wolf-in-Exile.png + Clan/ + Clan Wolf-in-Exile.png clan,small 3057 @@ -957,10 +957,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,0,0,0 Clan 143,188,143 - Clan/ - Clan Wolverine.png - Clan/ - Clan Wolverine.png + Clan/ + Clan Wolverine.png + Clan/ + Clan Wolverine.png clan,minor 2807 2823 @@ -972,10 +972,10 @@ successor - unimplemented tag describing another faction code as the specified f Tukayyid 0,0,0,0,0,0,0,0,0 255,250,240 - Inner Sphere/ - ComStar.png - Inner Sphere/ - ComStar.png + Inner Sphere/ + ComStar.png + Inner Sphere/ + ComStar.png is,inactive,major,playable 2788 @@ -987,10 +987,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 148,148,255 - Inner Sphere/ - Free Worlds League.png - Inner Sphere/ - Duchy of Andurien.png + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Duchy of Andurien.png is,minor 3030 @@ -1050,10 +1050,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 99,94,165 - Inner Sphere/ - Free Worlds League.png - Inner Sphere/ - Duchy of Tamarind-Abbey.png + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Duchy of Tamarind-Abbey.png is,minor 3078 3139 @@ -1074,8 +1074,8 @@ successor - unimplemented tag describing another faction code as the specified f Elysian Fields Nyserta 1,1,1,1,2,3,2,2,1 - Periphery/ - Elysian Fields.png + Periphery/ + Elysian Fields.png 255,0,255 periphery @@ -1086,10 +1086,10 @@ successor - unimplemented tag describing another faction code as the specified f Granada 1,1,1,1,2,3,2,2,1 238,232,170 - Clan/ - Escorpion Imperio.png - Clan/ - Escorpion Imperio.png + Clan/ + Escorpion Imperio.png + Clan/ + Escorpion Imperio.png clan,deep_periphery 3080 @@ -1099,10 +1099,10 @@ successor - unimplemented tag describing another faction code as the specified f FS,LA New Avalon 0,0,0,1,2,2,1,0,0 - Inner Sphere/ - Federated Commonwealth.png - Inner Sphere/ - Federated Commonwealth.png + Inner Sphere/ + Federated Commonwealth.png + Inner Sphere/ + Federated Commonwealth.png 248,212,44 is,super,playable @@ -1114,10 +1114,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,2,1,0,0 FS 255,228,181 - Inner Sphere/ - Federated Suns.png - Periphery/ - Filtvelt Coalition.png + Inner Sphere/ + Federated Suns.png + Periphery/ + Filtvelt Coalition.png periphery 3072 @@ -1129,10 +1129,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,2,1,0 FRR 116,171,206 - Inner Sphere/ - Free Rasalhague Republic.png - Inner Sphere/ - Free Rasalhague Republic.png + Inner Sphere/ + Free Rasalhague Republic.png + Inner Sphere/ + Free Rasalhague Republic.png is,minor,playable 3034 3103 @@ -1154,8 +1154,8 @@ successor - unimplemented tag describing another faction code as the specified f Fronc 1,1,1,1,2,3,2,2,1 128,169,127 - Periphery/ - Fronc Reaches.png + Periphery/ + Fronc Reaches.png periphery 3066 @@ -1165,8 +1165,8 @@ successor - unimplemented tag describing another faction code as the specified f Gotterdammerung 1,1,1,1,2,3,2,2,1 255,105,180 - Periphery/ - Greater Valkyrate.png + Periphery/ + Greater Valkyrate.png periphery 3028 3049 @@ -1177,10 +1177,10 @@ successor - unimplemented tag describing another faction code as the specified f Bremen (HL) 1,1,1,1,2,3,2,2,1 219,112,147 - Periphery/ - Hanseatic League.png - Periphery/ - Hanseatic League.png + Periphery/ + Hanseatic League.png + Periphery/ + Hanseatic League.png deep_periphery,playable 2891 @@ -1190,10 +1190,10 @@ successor - unimplemented tag describing another faction code as the specified f Illyria 1,1,1,1,2,3,2,2,1 0,255,255 - Periphery/ - Illyrian Palatinate.png - Periphery/ - Illyrian Palatinate.png + Periphery/ + Illyrian Palatinate.png + Periphery/ + Illyrian Palatinate.png periphery 2350 3063 @@ -1203,8 +1203,8 @@ successor - unimplemented tag describing another faction code as the specified f Independent (Periphery) 1,1,1,1,2,3,2,2,1 190,190,190 - - Independent.png + + Independent.png periphery,chaos,small @@ -1212,8 +1212,8 @@ successor - unimplemented tag describing another faction code as the specified f Independent 1,1,1,1,2,3,2,2,1 210,210,210 - - Independent.png + + Independent.png is,chaos,small @@ -1223,8 +1223,8 @@ successor - unimplemented tag describing another faction code as the specified f 1,1,1,1,2,3,2,2,1 FRR 153,50,204 - Periphery/ - JarnFolk.png + Periphery/ + JarnFolk.png deep_periphery,minor @@ -1260,8 +1260,8 @@ successor - unimplemented tag describing another faction code as the specified f Lothario 1,1,1,1,2,3,2,2,1 255,140,0 - Periphery/ - Lothian League.png + Periphery/ + Lothian League.png periphery 2691 @@ -1283,10 +1283,10 @@ successor - unimplemented tag describing another faction code as the specified f Alphard (MH) 1,1,1,1,2,3,2,2,1 236,136,65 - Periphery/ - Marian Hegemony.png - Periphery/ - Marian Hegemony.png + Periphery/ + Marian Hegemony.png + Periphery/ + Marian Hegemony.png periphery,playable 2920 @@ -1309,10 +1309,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 117,65,113 - Inner Sphere/ - Free Worlds League.png - Inner Sphere/ - Marik-Stewart Commonwealth.png + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Marik-Stewart Commonwealth.png is 3082 3139 @@ -1326,8 +1326,8 @@ successor - unimplemented tag describing another faction code as the specified f Galatea 1,1,1,1,2,3,2,1,0 169,169,169 - - Mercenary.png + + Mercenary.png merc,playable @@ -1376,10 +1376,10 @@ successor - unimplemented tag describing another faction code as the specified f Asturias 1,1,1,1,2,3,2,2,1 0,255,0 - Periphery/ - Nueva Castile.png - Periphery/ - Nueva Castile.png + Periphery/ + Nueva Castile.png + Periphery/ + Nueva Castile.png deep_periphery,playable 2392 3080 @@ -1390,10 +1390,10 @@ successor - unimplemented tag describing another faction code as the specified f Oberon VI 1,1,1,1,2,3,2,2,1 50,205,50 - Periphery/ - Oberon Confederation.png - Periphery/ - Oberon Confederation.png + Periphery/ + Oberon Confederation.png + Periphery/ + Oberon Confederation.png periphery 2775 3049 @@ -1426,10 +1426,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 163,112,120 - Inner Sphere/ - Free Worlds League.png - Inner Sphere/ - Oriente Protectorate.png + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Oriente Protectorate.png is,minor 3086 3139 @@ -1465,10 +1465,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,0,0,0,2,1,0 FRR 188,222,235 - Clan/ - Ghost Bear Dominion.png - Clan/ - Rasalhague Dominion.png + Clan/ + Ghost Bear Dominion.png + Clan/ + Rasalhague Dominion.png clan,is,minor,playable 3103 @@ -1479,10 +1479,10 @@ successor - unimplemented tag describing another faction code as the specified f Alpheratz 1,1,1,1,2,3,2,1,0 25,120,110 - Clan/ - Raven Alliance.png - Clan/ - Raven Alliance.png + Clan/ + Raven Alliance.png + Clan/ + Raven Alliance.png clan,periphery,playable 3083 @@ -1494,10 +1494,10 @@ successor - unimplemented tag describing another faction code as the specified f 0,0,0,1,2,3,1,1,0 FWL 255,51,51 - Inner Sphere/ - Free Worlds League.png - Inner Sphere/ - Regulan Fiefs.png + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Regulan Fiefs.png is,minor 3086 @@ -1519,10 +1519,10 @@ successor - unimplemented tag describing another faction code as the specified f Terra 0,0,0,0,0,0,0,0,0 207,119,57 - Inner Sphere/ - Republic of the Sphere.png - Inner Sphere/ - Republic of the Sphere.png + Inner Sphere/ + Republic of the Sphere.png + Inner Sphere/ + Republic of the Sphere.png is,major,playable 3081 @@ -1559,10 +1559,10 @@ successor - unimplemented tag describing another faction code as the specified f Lesnovo 1,1,1,1,2,3,2,2,1 95,158,160 - Inner Sphere/ - Free Worlds League.png - Inner Sphere/ - Rim Commonality.png + Inner Sphere/ + Free Worlds League.png + Inner Sphere/ + Rim Commonality.png periphery 3075 3139 @@ -1623,8 +1623,8 @@ successor - unimplemented tag describing another faction code as the specified f 1,0,0,1,2,3,2,1,0 CC 188,223,186 - Periphery/ - St. Ives Compact.png + Periphery/ + St. Ives Compact.png is,minor,playable 3029 3063 @@ -1635,10 +1635,10 @@ successor - unimplemented tag describing another faction code as the specified f Terra -1,-1,-1,0,0,0,0,0,0 176,196,222 - Inner Sphere/ - Star League.png - Inner Sphere/ - Star League.png + Inner Sphere/ + Star League.png + Inner Sphere/ + Star League.png is,super,playable 2570 2781 @@ -1736,10 +1736,10 @@ successor - unimplemented tag describing another faction code as the specified f Tortuga Prime 1,1,1,1,2,3,2,2,1 34,139,34 - Tortuga Dominions/ - Tortuga Dominions.png - Periphery/ - Tortuga Dominions.png + Tortuga Dominions/ + Tortuga Dominions.png + Periphery/ + Tortuga Dominions.png periphery,pirate 2577 @@ -1757,10 +1757,10 @@ successor - unimplemented tag describing another faction code as the specified f Terra 0,0,0,0,0,0,0,1,1 205,192,176 - Inner Sphere/ - Word of Blake.png - Inner Sphere/ - Word of Blake.png + Inner Sphere/ + Word of Blake.png + Inner Sphere/ + Word of Blake.png is,minor,playable 3052 @@ -1778,8 +1778,8 @@ successor - unimplemented tag describing another faction code as the specified f Niops Association Niops (Niops V, VI, VII) 205,173,0 - Periphery/ - Niops Association.png + Periphery/ + Niops Association.png periphery,minor @@ -1793,10 +1793,10 @@ successor - unimplemented tag describing another faction code as the specified f Fiefdom of Randis Randis IV (Hope IV 2988-) 30,144,255 - Periphery/ - Fiefdom of Randis.png - Periphery/ - Fiefdom of Randis.png + Periphery/ + Fiefdom of Randis.png + Periphery/ + Fiefdom of Randis.png periphery,minor 2988 @@ -1908,8 +1908,8 @@ successor - unimplemented tag describing another faction code as the specified f Pirate 2,2,2,2,2,2,2,2,2 128,40,0 - - Pirate.png + + Pirate.png pirate,playable @@ -1919,10 +1919,10 @@ successor - unimplemented tag describing another faction code as the specified f Granada 1,1,1,1,2,3,2,2,1 0,255,0 - Periphery/ - Umayyad Caliphate.png - Periphery/ - Umayyad Caliphate.png + Periphery/ + Umayyad Caliphate.png + Periphery/ + Umayyad Caliphate.png deep_periphery 2830 @@ -1950,10 +1950,10 @@ successor - unimplemented tag describing another faction code as the specified f Thala 1,1,1,1,2,3,2,2,1 153,50,204 - Periphery/ - Axumite Providence.png - Periphery/ - Axumite Providence.png + Periphery/ + Axumite Providence.png + Periphery/ + Axumite Providence.png deep_periphery 2245 @@ -1999,8 +1999,8 @@ successor - unimplemented tag describing another faction code as the specified f New Delphi Compact New Delphi 127,151,139 - Periphery/ - New Delphi Compact.png + Periphery/ + New Delphi Compact.png deep_periphery 2602 @@ -2043,10 +2043,10 @@ successor - unimplemented tag describing another faction code as the specified f New Abilene Coromodir 255,36,0 - Periphery/ - Aurigan Coalition.png - Periphery/ - Aurigan Coalition.png + Periphery/ + Aurigan Coalition.png + Periphery/ + Aurigan Coalition.png periphery,minor,playable 2910 @@ -2055,10 +2055,10 @@ successor - unimplemented tag describing another faction code as the specified f Aurigan Directorate Coromodir 103,140,73 - Periphery/ - Aurigan Directorate.png - Periphery/ - Aurigan Directorate.png + Periphery/ + Aurigan Directorate.png + Periphery/ + Aurigan Directorate.png periphery,minor 3022 3025 From 26558c7e07004527848f175f4adda99601f33756 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 19 Jan 2022 14:57:53 -0500 Subject: [PATCH 105/115] Finishing the company generation sort options --- .../resources/mekhq/resources/GUI.properties | 14 ++- .../CompanyGenerationOptions.java | 74 ++++++++++-- .../AbstractCompanyGenerator.java | 96 +++++++++++++--- .../panels/CompanyGenerationOptionsPanel.java | 108 +++++++++++++++--- 4 files changed, 251 insertions(+), 41 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 26489e9e7d..76646882d4 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -757,8 +757,16 @@ chkAssignCompanyCommanderFlag.text=Assign Commander Flag chkAssignCompanyCommanderFlag.toolTipText=This assigns the Commander flag to the generated Company Commander, designating them as the overall commander for the mercenary company. chkApplyOfficerStatBonusToWorstSkill.text=Apply Officer Stat Bonus to Weaker Skill chkApplyOfficerStatBonusToWorstSkill.toolTipText=This applies the single officer stat bonus to the weaker of their primary skills, normally piloting. +chkAssignBestCompanyCommander.text=Assign Best Company Commander +chkAssignBestCompanyCommander.toolTipText=This assigns the best person as the Company Commander. This is determined based on Tactical Genius, their combined command skill levels, and then their combat skill level. +chkPrioritizeCompanyCommanderCombatSkills.text=Prioritize Company Commander Combat Skills Over Command Skills +chkPrioritizeCompanyCommanderCombatSkills.toolTipText=Prioritize Company Commander sorting based on their combat skill experience level over their combined command skill levels. chkAssignBestOfficers.text=Assign Best Officers -chkAssignBestOfficers.toolTipText=Tactical Genius is always sorted first, but this continues the sort so that it is then sorted by their total officer skill level followed by their experience level. +chkAssignBestOfficers.toolTipText=This assigns the best people as officers. This is determined based on Tactical Genius, their combined command skill levels, and then their combat skill level.
If Assign Best Company Commander is disabled this sort will also be used to select the Company Commander. +chkPrioritizeOfficerCombatSkills.text=Prioritize Officer Combat Skills Over Command Skills +chkPrioritizeOfficerCombatSkills.toolTipText=Prioritize officer sorting based on their combat skill experience level over their combined command skill levels. +chkAssignMostSkilledToPrimaryLances.text=Assign Most Skilled to Primary Lances +chkAssignMostSkilledToPrimaryLances.toolTipText=This assigns the most skilled personnel to the highest lances in the TO&E, determined based on Tactical Genius and then by their combat skill level.
If Assign Best Company Commander and Assign Best Officers are both disabled then this sort will apply to all generated personnel, with the person sorted first as the Company Commander,
followed by one person per lance as an officer, and finally the normal personnel. chkAutomaticallyAssignRanks.text=Automatically Assign Ranks chkAutomaticallyAssignRanks.toolTipText=This automatically assigns ranks to all hired personnel, with officers getting officer ranks dependent on the size force they command
while MechWarriors are assigned Sergeant ranks and support personnel are assigned Corporal ranks. chkAssignFounderFlag.text=Assign Founder Flag @@ -787,8 +795,8 @@ chkOnlyGenerateOmniMechs.text=Only Generate OmniMechs chkOnlyGenerateOmniMechs.toolTipText=Only allow OmniMechs to be generated.
General / Inner Sphere Faction: This option may lead to gaps in the force, as the Star League didn't have OmniMechs and OmniMech availability varies heavily even after their Inner Sphere introduction.
Clan Faction: This option may lead to gaps in the force unless the following steps are taken. First, ensure that year is 2876 or later. Second, enable the Only Generate Star League 'Mechs option as that will force generation to a minimum of Clan Frontline BattleMechs. chkGenerateUnitsAsAttached.text=Generate Units as Attached chkGenerateUnitsAsAttached.toolTipText=All units rolled during company creation are attached units as per the Against the Bot rules.
These cost half as much when paying for units at startup, but are either converted into shares or are taken by the MechWarrior when they retire
(provided the campaign options are enabled). -chkAssignBestRollToUnitCommander.text=Assign Best Roll to Unit Commander -chkAssignBestRollToUnitCommander.toolTipText=This assigns the best rolled unit to the unit commander.
The heaviest Star League weight class will be assigned to them if a Star League 'Mech is rolled, or otherwise they will be assigned the heaviest 'Mech. +chkAssignBestRollToCompanyCommander.text=Assign Best Roll to Unit Commander +chkAssignBestRollToCompanyCommander.toolTipText=This assigns the best rolled unit to the unit commander.
The heaviest Star League weight class will be assigned to them if a Star League 'Mech is rolled, or otherwise they will be assigned the heaviest 'Mech. chkSortStarLeagueUnitsFirst.text=Sort Star League Units First chkSortStarLeagueUnitsFirst.toolTipText=This sorts any Star League rolls, so they will be assigned to either the highest rank officers (with Keep Officer Rolls Separate) or to lances in order of the roll. chkGroupByWeight.text=Group Units by Weight diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 9a76aed84f..947d4bb3ba 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -57,7 +57,11 @@ public class CompanyGenerationOptions implements Serializable { private boolean generateCaptains; private boolean assignCompanyCommanderFlag; private boolean applyOfficerStatBonusToWorstSkill; + private boolean assignBestCompanyCommander; + private boolean prioritizeCompanyCommanderCombatSkills; private boolean assignBestOfficers; + private boolean prioritizeOfficerCombatSkills; + private boolean assignMostSkilledToPrimaryLances; private boolean automaticallyAssignRanks; private boolean assignFounderFlag; @@ -77,7 +81,7 @@ public class CompanyGenerationOptions implements Serializable { private boolean onlyGenerateStarLeagueMechs; private boolean onlyGenerateOmniMechs; private boolean generateUnitsAsAttached; - private boolean assignBestRollToUnitCommander; + private boolean assignBestRollToCompanyCommander; private boolean sortStarLeagueUnitsFirst; private boolean groupByWeight; private boolean groupByQuality; @@ -157,7 +161,11 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method) { setGenerateCaptains(method.isWindchild()); setAssignCompanyCommanderFlag(true); setApplyOfficerStatBonusToWorstSkill(method.isWindchild()); + setAssignBestCompanyCommander(method.isWindchild()); + setPrioritizeCompanyCommanderCombatSkills(false); setAssignBestOfficers(method.isWindchild()); + setPrioritizeOfficerCombatSkills(false); + setAssignMostSkilledToPrimaryLances(method.isWindchild()); setAutomaticallyAssignRanks(true); setAssignFounderFlag(true); @@ -181,7 +189,7 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method) { setOnlyGenerateStarLeagueMechs(false); setOnlyGenerateOmniMechs(false); setGenerateUnitsAsAttached(method.isAtB()); - setAssignBestRollToUnitCommander(method.isWindchild()); + setAssignBestRollToCompanyCommander(method.isWindchild()); setSortStarLeagueUnitsFirst(true); setGroupByWeight(true); setGroupByQuality(method.isWindchild()); @@ -336,6 +344,22 @@ public void setApplyOfficerStatBonusToWorstSkill(final boolean applyOfficerStatB this.applyOfficerStatBonusToWorstSkill = applyOfficerStatBonusToWorstSkill; } + public boolean isAssignBestCompanyCommander() { + return assignBestCompanyCommander; + } + + public void setAssignBestCompanyCommander(final boolean assignBestCompanyCommander) { + this.assignBestCompanyCommander = assignBestCompanyCommander; + } + + public boolean isPrioritizeCompanyCommanderCombatSkills() { + return prioritizeCompanyCommanderCombatSkills; + } + + public void setPrioritizeCompanyCommanderCombatSkills(final boolean prioritizeCompanyCommanderCombatSkills) { + this.prioritizeCompanyCommanderCombatSkills = prioritizeCompanyCommanderCombatSkills; + } + public boolean isAssignBestOfficers() { return assignBestOfficers; } @@ -344,6 +368,22 @@ public void setAssignBestOfficers(final boolean assignBestOfficers) { this.assignBestOfficers = assignBestOfficers; } + public boolean isPrioritizeOfficerCombatSkills() { + return prioritizeOfficerCombatSkills; + } + + public void setPrioritizeOfficerCombatSkills(final boolean prioritizeOfficerCombatSkills) { + this.prioritizeOfficerCombatSkills = prioritizeOfficerCombatSkills; + } + + public boolean isAssignMostSkilledToPrimaryLances() { + return assignMostSkilledToPrimaryLances; + } + + public void setAssignMostSkilledToPrimaryLances(final boolean assignMostSkilledToPrimaryLances) { + this.assignMostSkilledToPrimaryLances = assignMostSkilledToPrimaryLances; + } + public boolean isAutomaticallyAssignRanks() { return automaticallyAssignRanks; } @@ -456,12 +496,12 @@ public void setGenerateUnitsAsAttached(final boolean generateUnitsAsAttached) { this.generateUnitsAsAttached = generateUnitsAsAttached; } - public boolean isAssignBestRollToUnitCommander() { - return assignBestRollToUnitCommander; + public boolean isAssignBestRollToCompanyCommander() { + return assignBestRollToCompanyCommander; } - public void setAssignBestRollToUnitCommander(final boolean assignBestRollToUnitCommander) { - this.assignBestRollToUnitCommander = assignBestRollToUnitCommander; + public void setAssignBestRollToCompanyCommander(final boolean assignBestRollToCompanyCommander) { + this.assignBestRollToCompanyCommander = assignBestRollToCompanyCommander; } public boolean isSortStarLeagueUnitsFirst() { @@ -815,7 +855,11 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateCaptains", isGenerateCaptains()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignCompanyCommanderFlag", isAssignCompanyCommanderFlag()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "applyOfficerStatBonusToWorstSkill", isApplyOfficerStatBonusToWorstSkill()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestCompanyCommander", isAssignBestCompanyCommander()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "prioritizeCompanyCommanderCombatSkills", isPrioritizeCompanyCommanderCombatSkills()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestOfficers", isAssignBestOfficers()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "prioritizeOfficerCombatSkills", isPrioritizeOfficerCombatSkills()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignMostSkilledToPrimaryLances", isAssignMostSkilledToPrimaryLances()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "automaticallyAssignRanks", isAutomaticallyAssignRanks()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignFounderFlag", isAssignFounderFlag()); @@ -835,7 +879,7 @@ public void writeToXML(final PrintWriter pw, int indent, final @Nullable String MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateStarLeagueMechs", isOnlyGenerateStarLeagueMechs()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "onlyGenerateOmniMechs", isOnlyGenerateOmniMechs()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "generateUnitsAsAttached", isGenerateUnitsAsAttached()); - MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToUnitCommander", isAssignBestRollToUnitCommander()); + MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "assignBestRollToCompanyCommander", isAssignBestRollToCompanyCommander()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "sortStarLeagueUnitsFirst", isSortStarLeagueUnitsFirst()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByWeight", isGroupByWeight()); MekHqXmlUtil.writeSimpleXMLTag(pw, indent, "groupByQuality", isGroupByQuality()); @@ -993,9 +1037,21 @@ public static CompanyGenerationOptions parseFromXML(final @Nullable File file) { case "applyOfficerStatBonusToWorstSkill": options.setApplyOfficerStatBonusToWorstSkill(Boolean.parseBoolean(wn.getTextContent().trim())); break; + case "assignBestCompanyCommander": + options.setAssignBestCompanyCommander(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "prioritizeCompanyCommanderCombatSkills": + options.setPrioritizeCompanyCommanderCombatSkills(Boolean.parseBoolean(wn.getTextContent().trim())); + break; case "assignBestOfficers": options.setAssignBestOfficers(Boolean.parseBoolean(wn.getTextContent().trim())); break; + case "prioritizeOfficerCombatSkills": + options.setPrioritizeOfficerCombatSkills(Boolean.parseBoolean(wn.getTextContent().trim())); + break; + case "assignMostSkilledToPrimaryLances": + options.setAssignMostSkilledToPrimaryLances(Boolean.parseBoolean(wn.getTextContent().trim())); + break; case "automaticallyAssignRanks": options.setAutomaticallyAssignRanks(Boolean.parseBoolean(wn.getTextContent().trim())); break; @@ -1050,8 +1106,8 @@ public static CompanyGenerationOptions parseFromXML(final @Nullable File file) { case "generateUnitsAsAttached": options.setGenerateUnitsAsAttached(Boolean.parseBoolean(wn.getTextContent().trim())); break; - case "assignBestRollToUnitCommander": - options.setAssignBestRollToUnitCommander(Boolean.parseBoolean(wn.getTextContent().trim())); + case "assignBestRollToCompanyCommander": + options.setAssignBestRollToCompanyCommander(Boolean.parseBoolean(wn.getTextContent().trim())); break; case "sortStarLeagueUnitsFirst": options.setSortStarLeagueUnitsFirst(Boolean.parseBoolean(wn.getTextContent().trim())); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 33db368efc..59819f3323 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -222,30 +222,94 @@ public List generatePersonnel(final Campaign cam private List generateCombatPersonnel(final Campaign campaign) { final int numMechWarriors = determineNumberOfLances() * getOptions().getLanceSize(); - final List trackers = IntStream.range(0, numMechWarriors) + final List initialTrackers = IntStream.range(0, numMechWarriors) .mapToObj(i -> new CompanyGenerationPersonTracker( campaign.newPerson(PersonnelRole.MECHWARRIOR, getPersonnelGenerator()))) .collect(Collectors.toList()); - // Default Sort is Tactical Genius First - Comparator personnelSorter = Comparator.comparing( - t -> t.getPerson().getOptions().booleanOption(OptionsConstants.MISC_TACTICAL_GENIUS)); + final List sortedTrackers = new ArrayList<>(); + + Comparator personnelSorter; + + // First, Assign the Company Commander + if (getOptions().isAssignBestCompanyCommander()) { + // Tactical Genius makes for the best commanders + personnelSorter = Comparator.comparing(t -> t.getPerson().getOptions().booleanOption(OptionsConstants.MISC_TACTICAL_GENIUS)); + + // Then prioritize either combat or command skills based on the selected option + if (getOptions().isPrioritizeCompanyCommanderCombatSkills()) { + personnelSorter = personnelSorter + .thenComparingInt(t -> t.getPerson().getExperienceLevel(campaign, false)) + .thenComparingInt(t -> Stream.of(SkillType.S_LEADER, SkillType.S_STRATEGY, SkillType.S_TACTICS) + .mapToInt(s -> t.getPerson().getSkillLevel(s)).sum()); + } else { + personnelSorter = personnelSorter + .thenComparingInt(t -> Stream.of(SkillType.S_LEADER, SkillType.S_STRATEGY, SkillType.S_TACTICS) + .mapToInt(s -> t.getPerson().getSkillLevel(s)).sum()) + .thenComparingInt(t -> t.getPerson().getExperienceLevel(campaign, false)); + } + // Always need to reverse it at the end + personnelSorter = personnelSorter.reversed(); + + // Find the best commander using the minimum value from the comparator, use a fallback + // that can never occur. Then remove the commander from the initial trackers + sortedTrackers.add(initialTrackers.stream() + .min(personnelSorter) + .orElse(new CompanyGenerationPersonTracker( + campaign.newPerson(PersonnelRole.MECHWARRIOR, getPersonnelGenerator())))); + initialTrackers.remove(sortedTrackers.get(0)); + } + + // Second, Assign the Officers if (getOptions().isAssignBestOfficers()) { + // Tactical Genius makes for the best officers + personnelSorter = Comparator.comparing(t -> + t.getPerson().getOptions().booleanOption(OptionsConstants.MISC_TACTICAL_GENIUS)); + // Then prioritize either combat or command skills based on the selected option + if (getOptions().isPrioritizeOfficerCombatSkills()) { + personnelSorter = personnelSorter + .thenComparingInt(t -> t.getPerson().getExperienceLevel(campaign, false)) + .thenComparingInt(t -> Stream.of(SkillType.S_LEADER, SkillType.S_STRATEGY, SkillType.S_TACTICS) + .mapToInt(s -> t.getPerson().getSkillLevel(s)).sum()); + } else { + personnelSorter = personnelSorter + .thenComparingInt(t -> Stream.of(SkillType.S_LEADER, SkillType.S_STRATEGY, SkillType.S_TACTICS) + .mapToInt(s -> t.getPerson().getSkillLevel(s)).sum()) + .thenComparingInt(t -> t.getPerson().getExperienceLevel(campaign, false)); + } + // Always need to reverse it at the end + personnelSorter = personnelSorter.reversed(); + + // Sort the current trackers based on the provided sorter, then select one per lance + // minus the one for taken by the company commander if they're already assigned + sortedTrackers.addAll(initialTrackers.stream() + .sorted(personnelSorter) + .collect(Collectors.toList()) + .subList(0, determineNumberOfLances() - (getOptions().isAssignBestCompanyCommander() ? 1 : 0))); + + // Finally, remove the officers from the initial trackers + initialTrackers.removeAll(sortedTrackers); + } + + // Default Sort is Tactical Genius First + personnelSorter = Comparator.comparing(t -> + t.getPerson().getOptions().booleanOption(OptionsConstants.MISC_TACTICAL_GENIUS)); + if (getOptions().isAssignMostSkilledToPrimaryLances()) { + // Unless we are prioritizing the most skilled, then we also care about experience level personnelSorter = personnelSorter - .thenComparingInt(t -> Stream.of(SkillType.S_LEADER, SkillType.S_STRATEGY, SkillType.S_TACTICS) - .mapToInt(s -> t.getPerson().getSkillLevel(s)).sum()) .thenComparingInt(t -> t.getPerson().getExperienceLevel(campaign, false)); } - personnelSorter = personnelSorter.reversed(); - trackers.sort(personnelSorter); - - generateCommandingOfficer(campaign, trackers.get(0), numMechWarriors); - generateOfficers(trackers); + // Sort whatever is left of the initial trackers before adding them to the initial trackers + initialTrackers.sort(personnelSorter.reversed()); + sortedTrackers.addAll(initialTrackers); - generateStandardMechWarriors(campaign, trackers); + // Then generate the individuals based on their sorted trackers + generateCommandingOfficer(campaign, sortedTrackers.get(0), numMechWarriors); + generateOfficers(sortedTrackers); + generateStandardMechWarriors(campaign, sortedTrackers); - return trackers; + return sortedTrackers; } /** @@ -566,7 +630,7 @@ public void generateUnitGenerationParameters(List parameters = createUnitGenerationParameters(trackers); // Then, we need to separate out the best roll for the unit commander if that option is enabled - if (getOptions().isAssignBestRollToUnitCommander()) { + if (getOptions().isAssignBestRollToCompanyCommander()) { int bestIndex = 0; AtBRandomMechParameters bestParameters = parameters.get(bestIndex); for (int i = 1; i < parameters.size(); i++) { @@ -611,13 +675,13 @@ public void generateUnitGenerationParameters(List + getChkPrioritizeCompanyCommanderCombatSkills().setEnabled(getChkAssignBestCompanyCommander().isSelected())); + + setChkPrioritizeCompanyCommanderCombatSkills(new JCheckBox(resources.getString("chkPrioritizeCompanyCommanderCombatSkills.text"))); + getChkPrioritizeCompanyCommanderCombatSkills().setToolTipText(resources.getString("chkPrioritizeCompanyCommanderCombatSkills.toolTipText")); + getChkPrioritizeCompanyCommanderCombatSkills().setName("chkPrioritizeCompanyCommanderCombatSkills"); + setChkAssignBestOfficers(new JCheckBox(resources.getString("chkAssignBestOfficers.text"))); getChkAssignBestOfficers().setToolTipText(resources.getString("chkAssignBestOfficers.toolTipText")); getChkAssignBestOfficers().setName("chkAssignBestOfficers"); + getChkAssignBestOfficers().addActionListener(evt -> + getChkPrioritizeOfficerCombatSkills().setEnabled(getChkAssignBestOfficers().isSelected())); + + setChkPrioritizeOfficerCombatSkills(new JCheckBox(resources.getString("chkPrioritizeOfficerCombatSkills.text"))); + getChkPrioritizeOfficerCombatSkills().setToolTipText(resources.getString("chkPrioritizeOfficerCombatSkills.toolTipText")); + getChkPrioritizeOfficerCombatSkills().setName("chkPrioritizeOfficerCombatSkills"); + + setChkAssignMostSkilledToPrimaryLances(new JCheckBox(resources.getString("chkAssignMostSkilledToPrimaryLances.text"))); + getChkAssignMostSkilledToPrimaryLances().setToolTipText(resources.getString("chkAssignMostSkilledToPrimaryLances.toolTipText")); + getChkAssignMostSkilledToPrimaryLances().setName("chkAssignMostSkilledToPrimaryLances"); setChkAutomaticallyAssignRanks(new JCheckBox(resources.getString("chkAutomaticallyAssignRanks.text"))); getChkAutomaticallyAssignRanks().setToolTipText(resources.getString("chkAutomaticallyAssignRanks.toolTipText")); @@ -900,6 +956,12 @@ private JPanel createPersonnelPanel() { getChkAssignFounderFlag().setToolTipText(resources.getString("chkAssignFounderFlag.toolTipText")); getChkAssignFounderFlag().setName("chkAssignFounderFlag"); + // Disable Panel Portions by Default + getChkAssignBestCompanyCommander().setSelected(true); + getChkAssignBestCompanyCommander().doClick(); + getChkAssignBestOfficers().setSelected(true); + getChkAssignBestOfficers().doClick(); + // Layout the UI final JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(resources.getString("personnelPanel.title"))); @@ -918,7 +980,11 @@ private JPanel createPersonnelPanel() { .addComponent(getChkGenerateCaptains()) .addComponent(getChkAssignCompanyCommanderFlag()) .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) + .addComponent(getChkAssignBestCompanyCommander()) + .addComponent(getChkPrioritizeCompanyCommanderCombatSkills()) .addComponent(getChkAssignBestOfficers()) + .addComponent(getChkPrioritizeOfficerCombatSkills()) + .addComponent(getChkAssignMostSkilledToPrimaryLances()) .addComponent(getChkAutomaticallyAssignRanks()) .addComponent(getChkAssignFounderFlag()) ); @@ -931,7 +997,11 @@ private JPanel createPersonnelPanel() { .addComponent(getChkGenerateCaptains()) .addComponent(getChkAssignCompanyCommanderFlag()) .addComponent(getChkApplyOfficerStatBonusToWorstSkill()) + .addComponent(getChkAssignBestCompanyCommander()) + .addComponent(getChkPrioritizeCompanyCommanderCombatSkills()) .addComponent(getChkAssignBestOfficers()) + .addComponent(getChkPrioritizeOfficerCombatSkills()) + .addComponent(getChkAssignMostSkilledToPrimaryLances()) .addComponent(getChkAutomaticallyAssignRanks()) .addComponent(getChkAssignFounderFlag()) ); @@ -1123,9 +1193,9 @@ public Component getListCellRendererComponent(final JList list, final Object getChkGenerateUnitsAsAttached().setToolTipText(resources.getString("chkGenerateUnitsAsAttached.toolTipText")); getChkGenerateUnitsAsAttached().setName("chkGenerateUnitsAsAttached"); - setChkAssignBestRollToUnitCommander(new JCheckBox(resources.getString("chkAssignBestRollToUnitCommander.text"))); - getChkAssignBestRollToUnitCommander().setToolTipText(resources.getString("chkAssignBestRollToUnitCommander.toolTipText")); - getChkAssignBestRollToUnitCommander().setName("chkAssignBestRollToUnitCommander"); + setChkAssignBestRollToCompanyCommander(new JCheckBox(resources.getString("chkAssignBestRollToCompanyCommander.text"))); + getChkAssignBestRollToCompanyCommander().setToolTipText(resources.getString("chkAssignBestRollToCompanyCommander.toolTipText")); + getChkAssignBestRollToCompanyCommander().setName("chkAssignBestRollToCompanyCommander"); setChkSortStarLeagueUnitsFirst(new JCheckBox(resources.getString("chkSortStarLeagueUnitsFirst.text"))); getChkSortStarLeagueUnitsFirst().setToolTipText(resources.getString("chkSortStarLeagueUnitsFirst.toolTipText")); @@ -1173,7 +1243,7 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getChkOnlyGenerateStarLeagueMechs()) .addComponent(getChkOnlyGenerateOmniMechs()) .addComponent(getChkGenerateUnitsAsAttached()) - .addComponent(getChkAssignBestRollToUnitCommander()) + .addComponent(getChkAssignBestRollToCompanyCommander()) .addComponent(getChkSortStarLeagueUnitsFirst()) .addComponent(getChkGroupByWeight()) .addComponent(getChkGroupByQuality()) @@ -1193,7 +1263,7 @@ public Component getListCellRendererComponent(final JList list, final Object .addComponent(getChkOnlyGenerateStarLeagueMechs()) .addComponent(getChkOnlyGenerateOmniMechs()) .addComponent(getChkGenerateUnitsAsAttached()) - .addComponent(getChkAssignBestRollToUnitCommander()) + .addComponent(getChkAssignBestRollToCompanyCommander()) .addComponent(getChkSortStarLeagueUnitsFirst()) .addComponent(getChkGroupByWeight()) .addComponent(getChkGroupByQuality()) @@ -1837,7 +1907,15 @@ public void setOptions(final CompanyGenerationOptions options) { getChkGenerateCaptains().setSelected(options.isGenerateCaptains()); getChkAssignCompanyCommanderFlag().setSelected(options.isAssignCompanyCommanderFlag()); getChkApplyOfficerStatBonusToWorstSkill().setSelected(options.isApplyOfficerStatBonusToWorstSkill()); - getChkAssignBestOfficers().setSelected(options.isAssignBestOfficers()); + if (getChkAssignBestCompanyCommander().isSelected() != options.isAssignBestCompanyCommander()) { + getChkAssignBestCompanyCommander().doClick(); + } + getChkPrioritizeCompanyCommanderCombatSkills().setSelected(options.isPrioritizeCompanyCommanderCombatSkills()); + if (getChkAssignBestOfficers().isSelected() != options.isAssignBestOfficers()) { + getChkAssignBestOfficers().doClick(); + } + getChkPrioritizeOfficerCombatSkills().setSelected(options.isPrioritizeOfficerCombatSkills()); + getChkAssignMostSkilledToPrimaryLances().setSelected(options.isAssignMostSkilledToPrimaryLances()); getChkAutomaticallyAssignRanks().setSelected(options.isAutomaticallyAssignRanks()); getChkAssignFounderFlag().setSelected(options.isAssignFounderFlag()); @@ -1859,7 +1937,7 @@ public void setOptions(final CompanyGenerationOptions options) { getChkOnlyGenerateStarLeagueMechs().setSelected(options.isOnlyGenerateStarLeagueMechs()); getChkOnlyGenerateOmniMechs().setSelected(options.isOnlyGenerateOmniMechs()); getChkGenerateUnitsAsAttached().setSelected(options.isGenerateUnitsAsAttached()); - getChkAssignBestRollToUnitCommander().setSelected(options.isAssignBestRollToUnitCommander()); + getChkAssignBestRollToCompanyCommander().setSelected(options.isAssignBestRollToCompanyCommander()); getChkSortStarLeagueUnitsFirst().setSelected(options.isSortStarLeagueUnitsFirst()); getChkGroupByWeight().setSelected(options.isGroupByWeight()); getChkGroupByQuality().setSelected(options.isGroupByQuality()); @@ -1962,7 +2040,11 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setGenerateCaptains(getChkGenerateCaptains().isSelected()); options.setAssignCompanyCommanderFlag(getChkAssignCompanyCommanderFlag().isSelected()); options.setApplyOfficerStatBonusToWorstSkill(getChkApplyOfficerStatBonusToWorstSkill().isSelected()); + options.setAssignBestCompanyCommander(getChkAssignBestCompanyCommander().isSelected()); + options.setPrioritizeCompanyCommanderCombatSkills(getChkPrioritizeCompanyCommanderCombatSkills().isSelected()); options.setAssignBestOfficers(getChkAssignBestOfficers().isSelected()); + options.setPrioritizeOfficerCombatSkills(getChkPrioritizeOfficerCombatSkills().isSelected()); + options.setAssignMostSkilledToPrimaryLances(getChkAssignMostSkilledToPrimaryLances().isSelected()); options.setAutomaticallyAssignRanks(getChkAutomaticallyAssignRanks().isSelected()); options.setAssignFounderFlag(getChkAssignFounderFlag().isSelected()); @@ -1982,7 +2064,7 @@ public CompanyGenerationOptions createOptionsFromPanel() { options.setOnlyGenerateStarLeagueMechs(getChkOnlyGenerateStarLeagueMechs().isSelected()); options.setOnlyGenerateOmniMechs(getChkOnlyGenerateOmniMechs().isSelected()); options.setGenerateUnitsAsAttached(getChkGenerateUnitsAsAttached().isSelected()); - options.setAssignBestRollToUnitCommander(getChkAssignBestRollToUnitCommander().isSelected()); + options.setAssignBestRollToCompanyCommander(getChkAssignBestRollToCompanyCommander().isSelected()); options.setSortStarLeagueUnitsFirst(getChkSortStarLeagueUnitsFirst().isSelected()); options.setGroupByWeight(getChkGroupByWeight().isSelected()); options.setGroupByQuality(getChkGroupByQuality().isSelected()); From b100909b917e3be505e03bd86b253ae3c688eded Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 19 Jan 2022 15:40:36 -0500 Subject: [PATCH 106/115] Applying changes from personal review --- .../companyGenerators/AbstractCompanyGenerator.java | 5 +---- MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 59819f3323..a62c5230f2 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -91,16 +91,13 @@ * * Button that lets you pop out the options panel with everything disabled * - * TODO - Wave 2: - * Add personnel generation sort options - * ---> Assign Most skilled to primary lance - * ---> sort by company * TODO - Wave 3: * Contract Market Pane * Campaign Options Pane, Campaign Options Dialog Base Validation * Date Pane * Loan Selection Pane * Implement Loan Options + * Probably some stuff from public requests * TODO - Wave 4: * Startup GUI Rework * TODO - Wave 5: diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java index 0a7ba22487..5e327f1e2a 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationDialog.java @@ -110,8 +110,8 @@ protected JPanel createButtonPanel() { "Cancel.toolTipText", this::cancelActionPerformed)); panel.add(new MMButton("btnRestore", resources, "RestoreDefaults.text", - "CompanyGenerationDialog.btnRestore.toolTipText", evt -> - getCompanyGenerationOptionsPanel().setOptions())); + "CompanyGenerationDialog.btnRestore.toolTipText", + evt -> getCompanyGenerationOptionsPanel().setOptions())); panel.add(new MMButton("btnImport", resources, "Import.text", "CompanyGenerationDialog.btnImport.toolTipText", From 7ff4f09f19a3732bde8febe507f2a41d30fe84a9 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jan 2022 18:42:42 -0500 Subject: [PATCH 107/115] Adding a bunch of author comments --- MekHQ/src/mekhq/campaign/RandomOriginOptions.java | 3 +++ .../icons/enums/LayeredForceIconOperationalStatus.java | 2 ++ .../universe/companyGeneration/AtBRandomMechParameters.java | 2 ++ .../universe/companyGeneration/CompanyGenerationOptions.java | 3 +++ .../companyGeneration/CompanyGenerationPersonTracker.java | 3 +++ .../generators/partGenerators/WindchildPartGenerator.java | 1 + .../src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java | 3 +++ MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java | 5 ++++- MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java | 2 ++ 9 files changed, 23 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/RandomOriginOptions.java b/MekHQ/src/mekhq/campaign/RandomOriginOptions.java index d6ccbafb05..46ed7549d3 100644 --- a/MekHQ/src/mekhq/campaign/RandomOriginOptions.java +++ b/MekHQ/src/mekhq/campaign/RandomOriginOptions.java @@ -29,6 +29,9 @@ import java.io.PrintWriter; import java.io.Serializable; +/** + * @author Justin "Windchild" Bowen + */ public class RandomOriginOptions implements Serializable { //region Variable Declarations private static final long serialVersionUID = 8347933663775775825L; diff --git a/MekHQ/src/mekhq/campaign/icons/enums/LayeredForceIconOperationalStatus.java b/MekHQ/src/mekhq/campaign/icons/enums/LayeredForceIconOperationalStatus.java index fafcede350..65e216aa25 100644 --- a/MekHQ/src/mekhq/campaign/icons/enums/LayeredForceIconOperationalStatus.java +++ b/MekHQ/src/mekhq/campaign/icons/enums/LayeredForceIconOperationalStatus.java @@ -26,6 +26,8 @@ * This is the Operational Status of a force or unit, as part of automatically assigning and * updating the force's LayeredForceIcon on a new day. It is also used to determine the Operation * Status for a unit. + * + * @author Justin "Windchild" Bowen */ public enum LayeredForceIconOperationalStatus { //region Enum Declarations diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java index a295550567..bbcd6cd43b 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/AtBRandomMechParameters.java @@ -23,6 +23,8 @@ /** * This class contains the parameters used to generate a random mech, and allows sorting and * swapping the order of rolled parameters while keeping them connected. + * + * @author Justin "Windchild" Bowen */ public class AtBRandomMechParameters { //region Variable Declarations diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 947d4bb3ba..6ca8a233a1 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -38,6 +38,9 @@ import java.util.ResourceBundle; import java.util.TreeMap; +/** + * @author Justin "Windchild" Bowen + */ public class CompanyGenerationOptions implements Serializable { //region Variable Declarations private static final long serialVersionUID = 3034123423672457769L; diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java index 0636234c26..db8e7e56e5 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationPersonTracker.java @@ -23,6 +23,9 @@ import mekhq.campaign.personnel.Person; import mekhq.campaign.universe.enums.CompanyGenerationPersonType; +/** + * @author Justin "Windchild" Bowen + */ public class CompanyGenerationPersonTracker { //region Variable Declarations private CompanyGenerationPersonType personType; diff --git a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java index c87a775c13..f17d74d3b0 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/partGenerators/WindchildPartGenerator.java @@ -27,6 +27,7 @@ /** * 1 Part for every 3, rounded normally. * This means you get 1 part for 2-4 in the input array, plus another for every interval above that. + * * @author Justin "Windchild" Bowen */ public class WindchildPartGenerator extends AbstractPartGenerator { diff --git a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java index 28b1096695..a5602717ea 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompanyGenerationOptionsDialog.java @@ -28,6 +28,9 @@ import javax.swing.*; import java.awt.*; +/** + * @author Justin "Windchild" Bowen + */ public class CompanyGenerationOptionsDialog extends AbstractMHQValidationButtonDialog { //region Variable Declarations private final Campaign campaign; diff --git a/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java b/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java index 736a8f6763..605e3e7570 100644 --- a/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CreateCampaignPresetDialog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -56,6 +56,9 @@ import java.util.Hashtable; import java.util.stream.Collectors; +/** + * @author Justin "Windchild" Bowen + */ public class CreateCampaignPresetDialog extends AbstractMHQValidationButtonDialog { //region Variable Declarations private final Campaign campaign; diff --git a/MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java b/MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java index d6ab48dff6..1b23e00b5d 100644 --- a/MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java +++ b/MekHQ/src/mekhq/gui/panels/RandomOriginOptionsPanel.java @@ -41,6 +41,8 @@ * This is used to select a set of RandomOriginOptions. It requires either the faction or the * ComboBox from which a faction is selected, the former when the faction is constant and the * latter when it can change after this panel is initialized. + * + * @author Justin "Windchild" Bowen */ public class RandomOriginOptionsPanel extends AbstractMHQPanel { //region Variable Declarations From 06f4f13bf4a31bca29477099c3c0df983cffe0f9 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jan 2022 18:44:55 -0500 Subject: [PATCH 108/115] Applying version migration --- .../companyGeneration/CompanyGenerationOptions.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 6ca8a233a1..6217126a6d 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -21,6 +21,7 @@ import megamek.Version; import megamek.common.EntityWeightClass; import megamek.common.annotations.Nullable; +import mekhq.MekHQOptions; import mekhq.MekHqXmlUtil; import mekhq.campaign.RandomOriginOptions; import mekhq.campaign.personnel.enums.PersonnelRole; @@ -35,7 +36,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -import java.util.ResourceBundle; import java.util.TreeMap; /** @@ -819,7 +819,7 @@ public void writeToFile(@Nullable File file) { PrintWriter pw = new PrintWriter(osw)) { // Then save it out to that file. pw.println(""); - writeToXML(pw, 0, ResourceBundle.getBundle("mekhq.resources.MekHQ").getString("Application.version")); + writeToXML(pw, 0, MekHQOptions.VERSION); } catch (Exception ex) { LogManager.getLogger().error("", ex); } @@ -832,7 +832,7 @@ public void writeToFile(@Nullable File file) { * case they are being written to file as a part of a larger save than just these * options (e.g. saved as part of Campaign or CampaignOptions) */ - public void writeToXML(final PrintWriter pw, int indent, final @Nullable String version) { + public void writeToXML(final PrintWriter pw, int indent, final @Nullable Version version) { if (version == null) { MekHqXmlUtil.writeSimpleXMLOpenTag(pw, indent++, "companyGenerationOptions"); } else { From 0aed2c18b0658dcf63e4384d319d732cf181e8a5 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jan 2022 18:55:10 -0500 Subject: [PATCH 109/115] Fixing two spacing issues --- MekHQ/src/mekhq/campaign/CampaignPreset.java | 1 + .../universe/companyGeneration/CompanyGenerationOptions.java | 1 + 2 files changed, 2 insertions(+) diff --git a/MekHQ/src/mekhq/campaign/CampaignPreset.java b/MekHQ/src/mekhq/campaign/CampaignPreset.java index 87f7205f42..380ab8fe9d 100644 --- a/MekHQ/src/mekhq/campaign/CampaignPreset.java +++ b/MekHQ/src/mekhq/campaign/CampaignPreset.java @@ -298,6 +298,7 @@ public void writeToFile(final JFrame frame, @Nullable File file) { path += ".xml"; file = new File(path); } + try (OutputStream fos = new FileOutputStream(file); OutputStream bos = new BufferedOutputStream(fos); OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8); diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 6217126a6d..513b3a2f9b 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -813,6 +813,7 @@ public void writeToFile(@Nullable File file) { path += ".xml"; file = new File(path); } + try (OutputStream fos = new FileOutputStream(file); OutputStream bos = new BufferedOutputStream(fos); OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8); From cbd18703ddc125333687054c4e3f3a3989e1302d Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jan 2022 18:56:52 -0500 Subject: [PATCH 110/115] Fixing two exception names --- MekHQ/src/mekhq/campaign/CampaignPreset.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/CampaignPreset.java b/MekHQ/src/mekhq/campaign/CampaignPreset.java index 380ab8fe9d..02f8d7beef 100644 --- a/MekHQ/src/mekhq/campaign/CampaignPreset.java +++ b/MekHQ/src/mekhq/campaign/CampaignPreset.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2021-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -499,8 +499,8 @@ public static List loadCampaignPresetsFromDirectory(final @Nulla break; } } - } catch (Exception e) { - LogManager.getLogger().error("", e); + } catch (Exception ex) { + LogManager.getLogger().error("", ex); return null; } return preset; From 7f74234569d51e4031fd79dbfaadabbea9c317b9 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Feb 2022 17:25:40 -0500 Subject: [PATCH 111/115] Loans now default to off for Windchild's method, and added a few more future ideas --- .../universe/companyGeneration/CompanyGenerationOptions.java | 2 +- .../generators/companyGenerators/AbstractCompanyGenerator.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java index 567e6e5cae..d5480dce54 100644 --- a/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java +++ b/MekHQ/src/mekhq/campaign/universe/companyGeneration/CompanyGenerationOptions.java @@ -231,7 +231,7 @@ public CompanyGenerationOptions(final CompanyGenerationMethod method) { setRandomStartingCashDiceCount(17); setMinimumStartingFloat(method.isWindchild() ? 3500000 : 0); setIncludeInitialContractPayment(method.isWindchild()); - setStartingLoan(true); + setStartingLoan(!method.isWindchild()); setPayForSetup(true); setPayForPersonnel(true); setPayForUnits(true); diff --git a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java index 6c4d2f3efa..ddd665d51f 100644 --- a/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java +++ b/MekHQ/src/mekhq/campaign/universe/generators/companyGenerators/AbstractCompanyGenerator.java @@ -113,6 +113,9 @@ * Implement Mystery Boxes * Generate spare personnel (?) * Optional: Mercenaries may customize their 'Mechs, with clantech if enabled only post-3055 + * Think about generating custom setups for specific canon mercenary groups or factions + * - these would be surprise based, probably using a data file + * - special weapons, special units, and similar * * @author Justin "Windchild" Bowen */ From ccf7566577e3dfddee8407568c5b84816904601c Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Feb 2022 19:19:26 -0500 Subject: [PATCH 112/115] Rewriting CompleteMissionDialog --- .../CompleteMissionDialog.properties | 4 - .../resources/mekhq/resources/GUI.properties | 5 + MekHQ/src/mekhq/gui/BriefingTab.java | 11 +- .../gui/dialog/CompleteMissionDialog.java | 133 ++++++++---------- 4 files changed, 68 insertions(+), 85 deletions(-) delete mode 100644 MekHQ/resources/mekhq/resources/CompleteMissionDialog.properties diff --git a/MekHQ/resources/mekhq/resources/CompleteMissionDialog.properties b/MekHQ/resources/mekhq/resources/CompleteMissionDialog.properties deleted file mode 100644 index c13560a25c..0000000000 --- a/MekHQ/resources/mekhq/resources/CompleteMissionDialog.properties +++ /dev/null @@ -1,4 +0,0 @@ -lblOutcome.text=Outcome: -btnDone.text=OK -btnCancel.text=Cancel -title.text=Complete Mission \ No newline at end of file diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index 68ae19afc3..b4a24b4dd5 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -321,6 +321,11 @@ btnNewDecade.toolTipText=Advance to the first day of the next decade (e.g. 01-JA ### CampaignPresetSelectionDialog Class CampaignPresetSelectionDialog.title=Select Campaign Preset +### CompleteMissionDialog Class +CompleteMissionDialog.title=Complete Mission +lblOutcomeStatus.text=Outcome +lblOutcomeStatus.toolTipText=This is the mission's outcome, with Active meaning the mission has not been completed. + ### ContractMarketDialog Class ContractMarketDialog.title=Contract Market diff --git a/MekHQ/src/mekhq/gui/BriefingTab.java b/MekHQ/src/mekhq/gui/BriefingTab.java index 5b4b5754e5..1c1770b9b5 100644 --- a/MekHQ/src/mekhq/gui/BriefingTab.java +++ b/MekHQ/src/mekhq/gui/BriefingTab.java @@ -32,6 +32,7 @@ import mekhq.campaign.force.Lance; import mekhq.campaign.mission.*; import mekhq.campaign.mission.atb.AtBScenarioFactory; +import mekhq.campaign.mission.enums.MissionStatus; import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.SkillType; import mekhq.campaign.personnel.enums.PersonnelRole; @@ -342,9 +343,13 @@ private void completeMission() { return; } - CompleteMissionDialog cmd = new CompleteMissionDialog(getFrame(), true, mission); - cmd.setVisible(true); - if (cmd.getStatus().isActive()) { + final CompleteMissionDialog cmd = new CompleteMissionDialog(getFrame()); + if (!cmd.showDialog().isConfirmed()) { + return; + } + + final MissionStatus status = cmd.getStatus(); + if (status.isActive()) { return; } diff --git a/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java b/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java index f2cf1f2691..9fd52e010f 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2020 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2010-2022 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * @@ -18,63 +18,55 @@ */ package mekhq.gui.dialog; -import java.awt.*; -import java.util.ResourceBundle; +import megamek.client.ui.baseComponents.MMComboBox; +import megamek.common.annotations.Nullable; +import mekhq.campaign.mission.enums.MissionStatus; +import mekhq.gui.baseComponents.AbstractMHQButtonDialog; +import mekhq.gui.baseComponents.AbstractMHQDialog; import javax.swing.*; +import javax.swing.GroupLayout.Alignment; +import java.awt.*; -import megamek.common.util.EncodeControl; -import mekhq.MekHQ; -import mekhq.campaign.mission.Mission; -import mekhq.campaign.mission.enums.MissionStatus; -import megamek.client.ui.preferences.JWindowPreference; -import megamek.client.ui.preferences.PreferencesNode; - -public class CompleteMissionDialog extends javax.swing.JDialog { +public class CompleteMissionDialog extends AbstractMHQButtonDialog { //region Variable Declarations - private static final long serialVersionUID = 8376874926997734492L; - - private MissionStatus status; + private MMComboBox comboOutcomeStatus; //endregion Variable Declarations //region Constructors - public CompleteMissionDialog(JFrame parent, boolean modal, Mission mission) { - super(parent, modal); - this.status = mission.getStatus(); - initComponents(); - setLocationRelativeTo(parent); - setUserPreferences(); + public CompleteMissionDialog(final JFrame frame) { + super(frame, "CompleteMissionDialog", "CompleteMissionDialog.title"); + initialize(); } //endregion Constructors - //region Initialization - private void initComponents() { - final ResourceBundle resourceMap = ResourceBundle.getBundle("mekhq.resources.CompleteMissionDialog", - MekHQ.getMHQOptions().getLocale(), new EncodeControl()); - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setName("Form"); - setTitle(resourceMap.getString("title.text")); - - getContentPane().setLayout(new GridBagLayout()); + //region Getters/Setters + public MMComboBox getComboOutcomeStatus() { + return comboOutcomeStatus; + } - int gridx = 0; - int gridy = 0; + public MissionStatus getStatus() { + final MissionStatus status = getComboOutcomeStatus().getSelectedItem(); + return (status == null) ? MissionStatus.ACTIVE : status; + } - JLabel lblOutcome = new JLabel(resourceMap.getString("lblOutcome.text")); - lblOutcome.setName("lblOutcome"); - GridBagConstraints gridBagConstraints = new GridBagConstraints(); - gridBagConstraints.gridx = gridx++; - gridBagConstraints.gridy = gridy++; - gridBagConstraints.gridwidth = 1; - gridBagConstraints.anchor = GridBagConstraints.WEST; - gridBagConstraints.insets = new Insets(5, 5, 5, 5); - getContentPane().add(lblOutcome, gridBagConstraints); + public void setComboOutcomeStatus(final MMComboBox comboOutcomeStatus) { + this.comboOutcomeStatus = comboOutcomeStatus; + } + //endregion Getters/Setters - DefaultComboBoxModel outcomeModel = new DefaultComboBoxModel<>(MissionStatus.values()); - JComboBox choiceOutcome = new JComboBox<>(outcomeModel); - choiceOutcome.setName("choiceOutcome"); - choiceOutcome.setSelectedItem(getStatus()); - choiceOutcome.setRenderer(new DefaultListCellRenderer() { + //region Initialization + @Override + protected Container createCenterPane() { + // Create Panel Components + final JLabel lblOutcomeStatus = new JLabel(resources.getString("lblOutcomeStatus.text")); + lblOutcomeStatus.setToolTipText(resources.getString("lblOutcomeStatus.toolTipText")); + lblOutcomeStatus.setName("lblOutcomeStatus"); + + setComboOutcomeStatus(new MMComboBox<>("comboOutcomeStatus", MissionStatus.values())); + getComboOutcomeStatus().setToolTipText(resources.getString("lblOutcomeStatus.toolTipText")); + getComboOutcomeStatus().setSelectedItem(MissionStatus.SUCCESS); + getComboOutcomeStatus().setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, @@ -86,44 +78,29 @@ public Component getListCellRendererComponent(final JList list, final Object return this; } }); - gridBagConstraints.gridx = gridx--; - getContentPane().add(choiceOutcome, gridBagConstraints); - JButton btnDone = new JButton(resourceMap.getString("btnDone.text")); - btnDone.setName("btnDone"); - btnDone.addActionListener(evt -> { - status = (MissionStatus) choiceOutcome.getSelectedItem(); - setVisible(false); - }); - gridBagConstraints.gridy = gridy++; - gridBagConstraints.gridx = gridx++; - gridBagConstraints.anchor = GridBagConstraints.CENTER; - getContentPane().add(btnDone, gridBagConstraints); + // Layout the Panel + final JPanel panel = new JPanel(); + panel.setName("completeMissionPanel"); + final GroupLayout layout = new GroupLayout(panel); + panel.setLayout(layout); - JButton btnCancel = new JButton(resourceMap.getString("btnCancel.text")); - btnCancel.setName("btnCancel"); - btnCancel.addActionListener(evt -> { - status = MissionStatus.ACTIVE; - setVisible(false); - }); - gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = gridx; - getContentPane().add(btnCancel, gridBagConstraints); + layout.setAutoCreateGaps(true); + layout.setAutoCreateContainerGaps(true); - pack(); - } + layout.setVerticalGroup( + layout.createSequentialGroup() + .addComponent(lblOutcomeStatus) + .addComponent(getComboOutcomeStatus()) + ); - private void setUserPreferences() { - PreferencesNode preferences = MekHQ.getMHQPreferences().forClass(CompleteMissionDialog.class); + layout.setHorizontalGroup( + layout.createParallelGroup(Alignment.LEADING) + .addComponent(lblOutcomeStatus) + .addComponent(getComboOutcomeStatus()) + ); - this.setName("dialog"); - preferences.manage(new JWindowPreference(this)); + return panel; } //endregion Initialization - - //region Getters/Setters - public MissionStatus getStatus() { - return status; - } - //endregion Getters/Setters } From 0323cce5dbef2386223688c4467b6bc3bb6de88f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Feb 2022 19:50:54 -0500 Subject: [PATCH 113/115] Removing useless imports --- MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java b/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java index 9fd52e010f..46600dd43c 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java @@ -19,10 +19,8 @@ package mekhq.gui.dialog; import megamek.client.ui.baseComponents.MMComboBox; -import megamek.common.annotations.Nullable; import mekhq.campaign.mission.enums.MissionStatus; import mekhq.gui.baseComponents.AbstractMHQButtonDialog; -import mekhq.gui.baseComponents.AbstractMHQDialog; import javax.swing.*; import javax.swing.GroupLayout.Alignment; From 96aaab88ea5cbf6b3e5762e1cdb31f4ca43d1e2d Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 2 Feb 2022 12:13:18 -0500 Subject: [PATCH 114/115] Use the status value in both places... --- MekHQ/src/mekhq/gui/BriefingTab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/gui/BriefingTab.java b/MekHQ/src/mekhq/gui/BriefingTab.java index 1c1770b9b5..e4745d4fcc 100644 --- a/MekHQ/src/mekhq/gui/BriefingTab.java +++ b/MekHQ/src/mekhq/gui/BriefingTab.java @@ -391,7 +391,7 @@ && getCampaign().getFinances().getBalance().isGreaterOrEqualThan(rdd.totalPayout } } - getCampaign().completeMission(mission, cmd.getStatus()); + getCampaign().completeMission(mission, status); MekHQ.triggerEvent(new MissionCompletedEvent(mission)); if (getCampaign().getCampaignOptions().getUseAtB() && (mission instanceof AtBContract)) { From 0b8d357d7d55a713fec28126c2121663a4c39d72 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Feb 2022 13:56:50 -0500 Subject: [PATCH 115/115] Fixing merge conflicts, round 2 --- .../src/mekhq/gui/dialog/CompleteMissionDialog.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java b/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java index 524020cdbc..46600dd43c 100644 --- a/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/CompleteMissionDialog.java @@ -83,20 +83,8 @@ public Component getListCellRendererComponent(final JList list, final Object final GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); -<<<<<<< HEAD layout.setAutoCreateGaps(true); layout.setAutoCreateContainerGaps(true); -======= - JButton btnCancel = new JButton(resourceMap.getString("btnCancel.text")); - btnCancel.setName("btnCancel"); - btnCancel.addActionListener(evt -> { - status = MissionStatus.ACTIVE; - setVisible(false); - }); - gridBagConstraints = new GridBagConstraints(); - gridBagConstraints.gridx = gridx; - getContentPane().add(btnCancel, gridBagConstraints); ->>>>>>> upstream/master layout.setVerticalGroup( layout.createSequentialGroup()