diff --git a/MekHQ/build.gradle b/MekHQ/build.gradle index e35da51306..a22d53c6e8 100644 --- a/MekHQ/build.gradle +++ b/MekHQ/build.gradle @@ -11,6 +11,10 @@ plugins { id 'org.ec4j.editorconfig' version '0.1.0' } +repositories { + mavenCentral() +} + java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/MekHQ/resources/mekhq/resources/CampaignGUI.properties b/MekHQ/resources/mekhq/resources/CampaignGUI.properties index d0e434490c..16f97a10cf 100644 --- a/MekHQ/resources/mekhq/resources/CampaignGUI.properties +++ b/MekHQ/resources/mekhq/resources/CampaignGUI.properties @@ -102,6 +102,8 @@ miMassPersonnelTraining.toolTipText=This launches the Mass Personnel Training Di miScenarioEditor.text=Scenario Template Editor... miCompanyGenerator.text=Company Generator... miAutoResolveBehaviorSettings.text=Auto Resolve Behavior Settings +miAiEditor.text=AI Editor +miAiEditor.tooltip=Opens the utility AI editor # Help Menu menuHelp.text=Help diff --git a/MekHQ/resources/mekhq/resources/GUI.properties b/MekHQ/resources/mekhq/resources/GUI.properties index b9400436f6..2c3f0b19fc 100644 --- a/MekHQ/resources/mekhq/resources/GUI.properties +++ b/MekHQ/resources/mekhq/resources/GUI.properties @@ -1377,6 +1377,7 @@ RandomOriginOptionsPanel.InvalidSpecifiedPlanet.text=You must select a valid spe btnNewCampaign.text=New Campaign btnLoadCampaign.text=Load Campaign btnLoadLastCampaign.text=Load Last Save +btnAiEditor.text=AI Editor btnLoadStoryArc.text=Story Arcs diff --git a/MekHQ/src/mekhq/AtBGameThread.java b/MekHQ/src/mekhq/AtBGameThread.java index d963f007a2..dc06916a4b 100644 --- a/MekHQ/src/mekhq/AtBGameThread.java +++ b/MekHQ/src/mekhq/AtBGameThread.java @@ -24,6 +24,8 @@ import megamek.client.bot.princess.BehaviorSettings; import megamek.client.bot.princess.Princess; import megamek.client.bot.princess.PrincessException; +import megamek.client.bot.queen.Queen; +import megamek.client.bot.queen.ai.utility.tw.TWUtilityAIRepository; import megamek.client.generator.RandomCallsignGenerator; import megamek.client.ui.swing.ClientGUI; import megamek.client.ui.swing.CommanderGUI; @@ -544,7 +546,7 @@ private BotClient setupPlayerBotForAutoResolve(Player player) throws Interrupted var botName = player.getName() + "@AI"; Thread.sleep(MekHQ.getMHQOptions().getStartGameBotClientDelay()); - var botClient = new Princess(botName, client.getHost(), client.getPort()); + var botClient = new Queen(botName, client.getHost(), client.getPort(), TWUtilityAIRepository.getInstance().reloadRepository().getProfiles().get(0)); botClient.setBehaviorSettings(autoResolveBehaviorSettings.getCopy()); try { botClient.connect(); diff --git a/MekHQ/src/mekhq/gui/CampaignGUI.java b/MekHQ/src/mekhq/gui/CampaignGUI.java index e685c6bf53..ffec2ff1e7 100644 --- a/MekHQ/src/mekhq/gui/CampaignGUI.java +++ b/MekHQ/src/mekhq/gui/CampaignGUI.java @@ -29,7 +29,9 @@ import megamek.client.ui.swing.GameOptionsDialog; import megamek.client.ui.swing.MMToggleButton; import megamek.client.ui.swing.UnitLoadingDialog; +import megamek.client.ui.swing.ai.editor.AiProfileEditor; import megamek.client.ui.swing.dialog.AbstractUnitSelectorDialog; +import megamek.client.ui.swing.util.MegaMekController; import megamek.client.ui.swing.util.UIUtil; import megamek.common.*; import megamek.common.annotations.Nullable; @@ -977,6 +979,18 @@ private void initMenu() { menuManage.add(miAutoResolveBehaviorEditor); + JMenuItem miAiEditor = new JMenuItem(resourceMap.getString("miAiEditor.text")); + miAiEditor.setToolTipText(resourceMap.getString("miAiEditor.tooltip")); + miAiEditor + .addActionListener(evt -> { + SwingUtilities.invokeLater(() -> { + MegaMekController controller = new MegaMekController(); + controller.aiEditor = new AiProfileEditor(controller); + }); + }); + + menuManage.add(miAiEditor); + menuBar.add(menuManage); // endregion Manage Campaign Menu diff --git a/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java b/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java index c907b99c00..74565dc161 100644 --- a/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/DataLoadingDialog.java @@ -18,6 +18,7 @@ */ package mekhq.gui.dialog; +import megamek.client.bot.queen.ai.utility.tw.TWUtilityAIRepository; import megamek.client.generator.RandomCallsignGenerator; import megamek.client.generator.RandomNameGenerator; import megamek.client.ui.swing.util.UIUtil; @@ -262,6 +263,7 @@ public Campaign doInBackground() throws Exception { // region Progress 1 setProgress(1); Factions.setInstance(Factions.loadDefault()); + TWUtilityAIRepository.getInstance().reloadRepository(); // endregion Progress 1 // region Progress 2 diff --git a/MekHQ/src/mekhq/gui/panels/StartupScreenPanel.java b/MekHQ/src/mekhq/gui/panels/StartupScreenPanel.java index 4b9930881e..810c4372e2 100644 --- a/MekHQ/src/mekhq/gui/panels/StartupScreenPanel.java +++ b/MekHQ/src/mekhq/gui/panels/StartupScreenPanel.java @@ -18,6 +18,8 @@ */ package mekhq.gui.panels; +import megamek.client.ui.swing.ai.editor.AiProfileEditor; +import megamek.client.ui.swing.util.MegaMekController; import megamek.client.ui.swing.util.UIUtil; import megamek.client.ui.swing.widget.MegaMekButton; import megamek.client.ui.swing.widget.SkinSpecification; @@ -146,13 +148,28 @@ protected void initialize() { }); MegaMekButton btnLoadLastCampaign = new MegaMekButton(resources.getString("btnLoadLastCampaign.text"), - UIComponents.MainMenuButton.getComp(), true); + UIComponents.MainMenuButton.getComp(), true); btnLoadLastCampaign.setEnabled(lastSaveFile != null); btnLoadLastCampaign.addActionListener(evt -> { btnLoadLastCampaign.setEnabled(false); startCampaign(lastSaveFile); }); + MegaMekButton btnOpenAiEditor = new MegaMekButton(resources.getString("btnAiEditor.text"), + UIComponents.MainMenuButton.getComp(), true); + btnOpenAiEditor.addActionListener(evt -> { + btnOpenAiEditor.setEnabled(false); + + SwingUtilities.invokeLater(() -> { + try { + showAiEditor(); + } finally { + btnOpenAiEditor.setEnabled(true); + } + }); + + }); + MegaMekButton btnLoadStoryArc = new MegaMekButton(resources.getString("btnLoadStoryArc.text"), UIComponents.MainMenuButton.getComp(), true); btnLoadStoryArc.addActionListener(evt -> { @@ -195,6 +212,7 @@ protected void initialize() { btnLoadLastCampaign.setPreferredSize(minButtonDim); btnLoadStoryArc.setMinimumSize(minButtonDim); btnLoadStoryArc.setPreferredSize(minButtonDim); + btnOpenAiEditor.setMinimumSize(minButtonDim); btnQuit.setMinimumSize(minButtonDim); btnQuit.setPreferredSize(minButtonDim); @@ -234,6 +252,8 @@ protected void initialize() { c.gridy++; add(btnLoadStoryArc, c); c.gridy++; + add(btnOpenAiEditor, c); + c.gridy++; add(btnQuit, c); getFrame().setResizable(false); @@ -258,6 +278,11 @@ private void startCampaign(final @Nullable File file) { startCampaign(file, null); } + private void showAiEditor() { + MegaMekController controller = new MegaMekController(); + controller.aiEditor = new AiProfileEditor(controller); + } + private void startCampaign(final @Nullable File file, @Nullable StoryArcStub storyArcStub) { new DataLoadingDialog(getFrame(), app, file, storyArcStub, false).setVisible(true); }