From a9c97aac2cd9ca808372c90ad5671f047334b135 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 25 Apr 2024 14:19:47 +0300 Subject: [PATCH] AI Sideboarding Mode toggle as a Preferences option (#5136) * - Initial commit for the AI sideboarding mode toggle. * - Tweak the parameter value to correspond to the enum. * - Consistency. --- .../src/main/java/forge/ai/AiProfileUtil.java | 20 ++++++++++++++++ .../java/forge/ai/PlayerControllerAi.java | 2 +- .../src/main/java/forge/game/GameRules.java | 9 ++++++++ .../home/settings/CSubmenuPreferences.java | 23 ++++++++++++++++--- .../home/settings/VSubmenuPreferences.java | 14 +++++------ .../forge/screens/settings/SettingsPage.java | 19 ++++++++++----- forge-gui/res/ai/Cautious.ai | 2 -- forge-gui/res/ai/Default.ai | 2 -- forge-gui/res/ai/Experimental.ai | 2 -- forge-gui/res/ai/Reckless.ai | 2 -- forge-gui/res/languages/de-DE.properties | 4 ++-- forge-gui/res/languages/en-US.properties | 4 ++-- forge-gui/res/languages/es-ES.properties | 4 ++-- forge-gui/res/languages/fr-FR.properties | 4 ++-- forge-gui/res/languages/it-IT.properties | 4 ++-- forge-gui/res/languages/ja-JP.properties | 4 ++-- forge-gui/res/languages/pt-BR.properties | 4 ++-- forge-gui/res/languages/zh-CN.properties | 4 ++-- .../forge/gamemodes/match/HostedMatch.java | 17 +++++++++++++- .../properties/ForgePreferences.java | 2 +- 20 files changed, 103 insertions(+), 43 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java index a1848a9b558..d95456f46cf 100644 --- a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java +++ b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java @@ -47,6 +47,26 @@ public class AiProfileUtil { public static final String AI_PROFILE_RANDOM_MATCH = "Random (Every Match)"; public static final String AI_PROFILE_RANDOM_DUEL = "Random (Every Game)"; + public enum AISideboardingMode { + Off, + AI, + HumanForAI; + + public static AISideboardingMode normalizedValueOf(String value) { + return valueOf(value.replace(" ", "")); + } + } + + private static AISideboardingMode aiSideboardingMode = AISideboardingMode.Off; + + public static AISideboardingMode getAISideboardingMode() { + return aiSideboardingMode; + } + + public static void setAiSideboardingMode(AISideboardingMode mode) { + aiSideboardingMode = mode; + } + /** Builds an AI profile file name with full relative * path based on the profile name. * @param profileName the name of the profile. diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index a60e25b450b..723669d51de 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -102,7 +102,7 @@ public class PlayerControllerAi extends PlayerController { @Override public List sideboard(Deck deck, GameType gameType, String message) { - if (!getAi().getBooleanProperty(AiProps.SIDEBOARDING_ENABLE) + if (!brains.getGame().getRules().getAISideboardingEnabled() || !deck.has(DeckSection.Sideboard)) { return null; } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index 84414d17f73..1a0216d09a8 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -11,6 +11,7 @@ public class GameRules { private int gamesToWinMatch = 2; private boolean playForAnte = false; private boolean matchAnteRarity = false; + private boolean AISideboardingEnabled = false; private boolean sideboardForAI = false; private final Set appliedVariants = EnumSet.noneOf(GameType.class); @@ -77,6 +78,14 @@ public class GameRules { sideboardForAI = sideboard; } + public boolean getAISideboardingEnabled() { + return AISideboardingEnabled; + } + + public void setAISideboardingEnabled(final boolean aiSideboarding) { + AISideboardingEnabled = aiSideboarding; + } + public int getGamesToWinMatch() { return gamesToWinMatch; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 03941d4e7da..513bb2bb00a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -21,7 +21,10 @@ import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.controllers.CEditorTokenViewer; import forge.sound.MusicPlaylist; import forge.sound.SoundSystem; -import forge.toolbox.*; +import forge.toolbox.FComboBox; +import forge.toolbox.FComboBoxPanel; +import forge.toolbox.FLabel; +import forge.toolbox.FOptionPane; import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -123,8 +126,6 @@ public enum CSubmenuPreferences implements ICDoc { lstControls.add(Pair.of(view.getCbRandomArtInPools(), FPref.UI_RANDOM_ART_IN_POOLS)); lstControls.add(Pair.of(view.getCbEnforceDeckLegality(), FPref.ENFORCE_DECK_LEGALITY)); lstControls.add(Pair.of(view.getCbPerformanceMode(), FPref.PERFORMANCE_MODE)); - lstControls.add(Pair.of(view.getCbSideboardForAI(), FPref.MATCH_SIDEBOARD_FOR_AI)); - lstControls.add(Pair.of(view.getCbExperimentalRestore(), FPref.MATCH_EXPERIMENTAL_RESTORE)); lstControls.add(Pair.of(view.getCbFilteredHands(), FPref.FILTERED_HANDS)); lstControls.add(Pair.of(view.getCbCloneImgSource(), FPref.UI_CLONE_MODE_SOURCE)); lstControls.add(Pair.of(view.getCbRemoveSmall(), FPref.DECKGEN_NOSMALL)); @@ -267,6 +268,7 @@ public enum CSubmenuPreferences implements ICDoc { initializeAutoUpdaterComboBox(); initializeMulliganRuleComboBox(); initializeAiProfilesComboBox(); + initializeAiSideboardingModeComboBox(); initializeSoundSetsComboBox(); initializeMusicSetsComboBox(); initializeStackAdditionsComboBox(); @@ -474,6 +476,21 @@ public enum CSubmenuPreferences implements ICDoc { panel.setComboBox(comboBox, selectedItem); } + private void initializeAiSideboardingModeComboBox() { + final FPref userSetting = FPref.MATCH_AI_SIDEBOARDING_MODE; + final FComboBoxPanel panel = this.view.getAiSideboardingModeComboBoxPanel(); + final FComboBox comboBox = createComboBox(new String[] {"Off", "AI", "Human For AI"}, userSetting); + final String selectedItem = this.prefs.getPref(userSetting); + panel.setComboBox(comboBox, selectedItem); + comboBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent actionEvent) { + AiProfileUtil.setAiSideboardingMode(AiProfileUtil.AISideboardingMode.normalizedValueOf(comboBox.getSelectedItem())); + System.out.println(AiProfileUtil.getAISideboardingMode()); + } + }); + } + private void initializeSoundSetsComboBox() { final FPref userSetting = FPref.UI_CURRENT_SOUND_SET; final FComboBoxPanel panel = this.view.getSoundSetsComboBoxPanel(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index a0853c0f618..1bc10b0a959 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -75,7 +75,6 @@ public enum VSubmenuPreferences implements IVSubmenu { private final JCheckBox cbLoadArchivedFormats = new OptionsCheckBox(localizer.getMessage("cbLoadArchivedFormats")); private final JCheckBox cbWorkshopSyntax = new OptionsCheckBox(localizer.getMessage("cbWorkshopSyntax")); private final JCheckBox cbEnforceDeckLegality = new OptionsCheckBox(localizer.getMessage("cbEnforceDeckLegality")); - private final JCheckBox cbSideboardForAI = new OptionsCheckBox(localizer.getMessage("cbSideboardForAI")); private final JCheckBox cbExperimentalRestore = new OptionsCheckBox(localizer.getMessage("cbExperimentalRestore")); private final JCheckBox cbPerformanceMode = new OptionsCheckBox(localizer.getMessage("cbPerformanceMode")); private final JCheckBox cbSROptimize = new OptionsCheckBox(localizer.getMessage("cbSROptimize")); @@ -133,6 +132,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final FComboBoxPanel cbpSoundSets = new FComboBoxPanel<>(localizer.getMessage("cbpSoundSets")+":"); private final FComboBoxPanel cbpMusicSets = new FComboBoxPanel<>(localizer.getMessage("cbpMusicSets")+":"); private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":"); + private final FComboBoxPanel cbpAiSideboardingMode = new FComboBoxPanel<>(localizer.getMessage("cbpAiSideboardingMode")+":"); private final FComboBoxPanel cbpStackAdditions = new FComboBoxPanel<>(localizer.getMessage("cbpStackAdditions")+":"); private final FComboBoxPanel cbpLandPlayed = new FComboBoxPanel<>(localizer.getMessage("cbpLandPlayed")+":"); private final FComboBoxPanel cbpDisplayCurrentCardColors = new FComboBoxPanel<>(localizer.getMessage("cbpDisplayCurrentCardColors")+":"); @@ -231,8 +231,8 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbPerformanceMode, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPerformanceMode")), descriptionConstraints); - pnlPrefs.add(cbSideboardForAI, titleConstraints); - pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSideboardForAI")), descriptionConstraints); + pnlPrefs.add(cbpAiSideboardingMode, titleConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpAiSideboardingMode")), descriptionConstraints); pnlPrefs.add(cbExperimentalRestore, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlExperimentalRestore")), descriptionConstraints); @@ -769,6 +769,10 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbpAiProfiles; } + public FComboBoxPanel getAiSideboardingModeComboBoxPanel() { + return cbpAiSideboardingMode; + } + public FComboBoxPanel getCbpStackAdditionsComboBoxPanel() { return cbpStackAdditions; } @@ -841,10 +845,6 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbPerformanceMode; } - public JCheckBox getCbSideboardForAI() { - return cbSideboardForAI; - } - public JCheckBox getCbExperimentalRestore() { return cbExperimentalRestore; } diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index cc65d8d6233..6311f4ee6fb 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -1,6 +1,7 @@ package forge.screens.settings; import com.badlogic.gdx.utils.Align; +import com.google.common.collect.Lists; import forge.Forge; import forge.Graphics; import forge.MulliganDefs; @@ -225,13 +226,19 @@ public class SettingsPage extends TabPage { Forge.getLocalizer().getMessage("cbPerformanceMode"), Forge.getLocalizer().getMessage("nlPerformanceMode")), 1); - lstSettings.addItem(new BooleanSetting(FPref.MATCH_SIDEBOARD_FOR_AI, - Forge.getLocalizer().getMessage("cbSideboardForAI"), - Forge.getLocalizer().getMessage("nlSideboardForAI")), - 1); + lstSettings.addItem(new CustomSelectSetting(FPref.MATCH_AI_SIDEBOARDING_MODE, Forge.getLocalizer().getMessage("cbpAiSideboardingMode"), + Forge.getLocalizer().getMessage("nlpAiSideboardingMode"), + Lists.newArrayList("Off", "AI", "Human For AI")) { + @Override + public void valueChanged(String newValue) { + super.valueChanged(newValue); + AiProfileUtil.setAiSideboardingMode(AiProfileUtil.AISideboardingMode.normalizedValueOf(newValue)); + System.out.println(AiProfileUtil.getAISideboardingMode()); + } + }, 1); lstSettings.addItem(new BooleanSetting(FPref.MATCH_EXPERIMENTAL_RESTORE, - Forge.getLocalizer().getMessage("cbExperimentalRestore"), - Forge.getLocalizer().getMessage("nlExperimentalRestore")), + Forge.getLocalizer().getMessage("cbExperimentalRestore"), + Forge.getLocalizer().getMessage("nlExperimentalRestore")), 1); lstSettings.addItem(new BooleanSetting(FPref.FILTERED_HANDS, Forge.getLocalizer().getMessage("cbFilteredHands"), diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index aab608a66b0..fef2af92a6b 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -313,8 +313,6 @@ SACRIFICE_DEFAULT_PREF_ALLOW_TOKENS=true # A creature should evaluate to no more than this much to be considered for default SacCost preference SACRIFICE_DEFAULT_PREF_MAX_CREATURE_EVAL=135 -# Master toggle enabling AI sideboarding -SIDEBOARDING_ENABLE=true # Enable sideboarding in limited formats (e.g. Sealed, Draft) SIDEBOARDING_IN_LIMITED_FORMATS=false # Chance to proceed with sideboarding any given pair of cards in the devised sideboarding plan diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index 8415bd2c29c..a134ce3f67a 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -314,8 +314,6 @@ SACRIFICE_DEFAULT_PREF_ALLOW_TOKENS=true # A creature should evaluate to no more than this much to be considered for default SacCost preference SACRIFICE_DEFAULT_PREF_MAX_CREATURE_EVAL=135 -# Master toggle enabling AI sideboarding -SIDEBOARDING_ENABLE=true # Enable sideboarding in limited formats (e.g. Sealed, Draft) SIDEBOARDING_IN_LIMITED_FORMATS=false # Chance to proceed with sideboarding any given pair of cards in the devised sideboarding plan diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index 286f9d345f6..39843bad94d 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -314,8 +314,6 @@ SACRIFICE_DEFAULT_PREF_ALLOW_TOKENS=true # A creature should evaluate to no more than this much to be considered for default SacCost preference SACRIFICE_DEFAULT_PREF_MAX_CREATURE_EVAL=135 -# Master toggle enabling AI sideboarding -SIDEBOARDING_ENABLE=true # Enable sideboarding in limited formats (e.g. Sealed, Draft) SIDEBOARDING_IN_LIMITED_FORMATS=false # Chance to proceed with sideboarding any given pair of cards in the devised sideboarding plan diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index fd398fb8506..ee3a8200719 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -314,8 +314,6 @@ SACRIFICE_DEFAULT_PREF_ALLOW_TOKENS=true # A creature should evaluate to no more than this much to be considered for default SacCost preference SACRIFICE_DEFAULT_PREF_MAX_CREATURE_EVAL=135 -# Master toggle enabling AI sideboarding -SIDEBOARDING_ENABLE=true # Enable sideboarding in limited formats (e.g. Sealed, Draft) SIDEBOARDING_IN_LIMITED_FORMATS=false # Chance to proceed with sideboarding any given pair of cards in the devised sideboarding plan diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 3caf2555c74..691729e6bf5 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -70,7 +70,7 @@ cbLoadCardsLazily=Lade Kartenskripte verzögert cbLoadArchivedFormats=Aktiviere archivierte Formate cbWorkshopSyntax=Workshop Syntax-Checker cbEnforceDeckLegality=Deckkonformität -cbSideboardForAI=Sideboard für Mensch/KI +cbpAiSideboardingMode=AI Sideboarding Mode cbPerformanceMode=Performance-Modus cbFilteredHands=Alternative Starthand cbImageFetcher=Lade automatisch fehlende Kartenbilder @@ -156,7 +156,7 @@ nlEnableAICheats=Erlaubt es der KI zu betrügen um Vorteile zu erlangen. Sofern nlManaBurn=Spiele mit Manabrand (wurde mit M10 aus den Regeln entfernt). nlManaLostPrompt=Aktiviere, um vor Leerung des Manapools eine Warnung zu erhalten. nlEnforceDeckLegality=Erzwingt eine Deck-Konformität zum gewählten Format (minimale Deckgröße, Anzahl pro Karte im Deck, usw.). -nlSideboardForAI=Erlaubt Spielern das Nutzen des Sideboards von KI-Decks und in Constructed-Formaten. +nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). nlPerformanceMode=Schalten zusätzlich Prüfungen auf statische Fähigkeiten ab, um das Spiel zu beschleunigen. Warnung: Kann Probleme mit 'Aufblitzen' bei Karten von KI-Gegner verursachen! nlFilteredHands=Erzeugt zwei Starthände, und behält die, welche am nächsten an der durchschnittlichen Länderanzahl im Deck ist. (Erfordert Neustart) nlCloneImgSource=Zeige das originale Kartenbild des Klones statt der geklonten Karte. diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index aa2baab3dc7..1553a332cb1 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -70,7 +70,7 @@ cbLoadCardsLazily=Load Card Scripts Lazily cbLoadArchivedFormats=Load Archived Formats cbWorkshopSyntax=Workshop Syntax Checker cbEnforceDeckLegality=Deck Conformance -cbSideboardForAI=Human Sideboard for AI +cbpAiSideboardingMode=AI Sideboarding Mode cbExperimentalRestore=EXPERIMENTAL Undo restore cbPerformanceMode=Performance Mode cbFilteredHands=Filtered Hands @@ -157,7 +157,7 @@ nlEnableAICheats=Allow the AI to cheat to gain advantage (for personalities that nlManaBurn=Play with mana burn (from pre-Magic 2010 rules). nlManaLostPrompt=When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool. nlEnforceDeckLegality=Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc). -nlSideboardForAI=Allows users to sideboard with the AIs deck and sideboard in constructed game formats. +nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). nlExperimentalRestore=EXPERIMENTAL - Stores a snapshot to be used for undoing spells or abilities nlPerformanceMode=Disables additional static abilities checks to speed up the game engine. (Warning: breaks some ''as if had flash'' scenarios when casting cards owned by opponents). nlFilteredHands=Generates two starting hands and keeps the one with the closest to average land count for the deck. (REQUIRES RESTART) diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 438782babc5..d8682093458 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -70,7 +70,7 @@ cbLoadCardsLazily=Cargar scripts de cartas modo perezoso cbLoadArchivedFormats=Load Archived Formats cbWorkshopSyntax=Verificador de sintaxis del Taller cbEnforceDeckLegality=Conformidad del mazo -cbSideboardForAI=Banquillo humano para la IA +cbpAiSideboardingMode=AI Sideboarding Mode cbPerformanceMode=Modo de desempeño cbFilteredHands=Manos filtradas cbImageFetcher=Descargar automáticamente el arte de la carta si no existe @@ -156,7 +156,7 @@ nlEnableAICheats=Permita que la IA haga trampa para obtener ventaja (para person nlManaBurn=Jugar con quemadura de maná (reglas previas a Magic 2010). nlManaLostPrompt=Cuando está habilitado, recibes una advertencia si la prioridad de pase te haría perder maná en tu reserva de maná. nlEnforceDeckLegality=Aplica la legalidad del mazo correspondiente a cada entorno (tamaño mínimo de mazo, número máximo de cartas, etc.). -nlSideboardForAI=Permite a los usuarios sideboard con el mazo de la IA y el sideboard en formatos de juego construidos. +nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). nlPerformanceMode=Desactiva las comprobaciones de habilidades estáticas adicionales para acelerar el motor del juego. (Advertencia: rompe algunos escenarios ''como si tuviera flash'' cuando se lanzan cartas de propiedad de los oponentes). nlFilteredHands=Genera dos manos iniciales y mantiene la que tiene el recuento de tierras más cercano al promedio del mazo (Requiere reinicio) nlCloneImgSource=Cuando se habilita, los clones usarán su arte original en lugar del arte de la carta clonada. diff --git a/forge-gui/res/languages/fr-FR.properties b/forge-gui/res/languages/fr-FR.properties index 2858c349d35..c8b20d40ff4 100644 --- a/forge-gui/res/languages/fr-FR.properties +++ b/forge-gui/res/languages/fr-FR.properties @@ -70,7 +70,7 @@ cbLoadCardsLazily=Charger les scripts de carte paresseusement cbLoadArchivedFormats=Charger les formats archivés cbWorkshopSyntax=Vérificateur de syntaxe de l''atelier cbEnforceDeckLegality=Conformité du deck -cbSideboardForAI=Réserve humain pour l''IA +cbpAiSideboardingMode=AI Sideboarding Mode cbPerformanceMode=Mode Performances cbFilteredHands=Mains filtrées cbImageFetcher=Télécharger automatiquement l''illustration de la carte manquante @@ -156,7 +156,7 @@ nlEnableAICheats=Autoriser l''IA à tricher pour obtenir un avantage (pour les p nlManaBurn=Jouez avec la brûlure de mana (à partir des règles d''avant Magic 2010). nlManaLostPrompt=Lorsqu''il est activé, vous recevez un avertissement si le fait de passer la priorité vous ferait perdre du mana dans votre pool de mana. nlEnforceDeckLegality=Applique la légalité du deck en fonction de chaque environnement (taille minimale du deck, nombre maximum de cartes, etc.). -nlSideboardForAI=Permet aux utilisateurs de se sideboarder avec le deck IA et le sideboard dans des formats de jeu construits. +nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). nlPerformanceMode=Désactive les vérifications supplémentaires des capacités statiques pour accélérer le moteur de jeu. (Attention : casse certains scénarios ''comme si c''était flash'' lors du lancement de cartes appartenant à des adversaires). nlFilteredHands=Génère deux mains de départ et conserve celle dont le nombre de terrains est le plus proche de la moyenne pour le deck. (NÉCESSITE UN REDÉMARRAGE) nlCloneImgSource=Lorsqu''il est activé, les clones utiliseront leur art original au lieu de l''art de la carte clonée. diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index f3b6b129fec..84cdc2e92cb 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -69,7 +69,7 @@ cbLoadCardsLazily=Carica gli script delle carte lentamente cbLoadArchivedFormats=Load Archived Formats cbWorkshopSyntax=Controllo sintassi per Officina cbEnforceDeckLegality=Conformità del mazzo -cbSideboardForAI=Sideboard umana per IA +cbpAiSideboardingMode=AI Sideboarding Mode cbPerformanceMode=Modalità alte prestazioni cbFilteredHands=Mani Filtrate cbImageFetcher=Scarica automaticamente l''arte delle carte mancanti @@ -155,7 +155,7 @@ nlEnableAICheats=Consentire all''intelligenza artificiale di imbrogliare per ott nlManaBurn=Gioca con mana burn (dalle regole pre-Magic 2010). nlManaLostPrompt=Quando abilitato, viene visualizzato un avviso se passare la priorità potrebbe causare la perdita di mana nella riserva di mana. nlEnforceDeckLegality=Fa rispettare la legalità del mazzo relativa a ciascun ambiente (dimensioni minime del mazzo, numero massimo di carte ecc.). -nlSideboardForAI=Consente agli utenti di gestire la sideboard con il mazzo dell''IA e la propria nei formati di gioco constructed. +nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). nlPerformanceMode=Disabilita delle verifiche aggiuntive delle abilità statiche per velocizzare il motore di gioco. (Attenzione: non fa funzionare correttamente il giocare carte di proprietà di un avversario in contesti "come se avesse lampo"). nlFilteredHands=Genera due mani iniziali e mantiene quella con il numero di terre più vicino alla media del mazzo. (RIAVVIO NECESSARIO) nlCloneImgSource=Se abilitato, i cloni useranno la loro arte originale invece di quella della carta clonata. diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index c2c85d2fe0f..6f46e31d649 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -70,7 +70,7 @@ cbLoadCardsLazily=カードスクリプトを動的ロードする cbLoadArchivedFormats=Load Archived Formats cbWorkshopSyntax=ワークショップ構文チェッカー cbEnforceDeckLegality=デッキの適正チェック -cbSideboardForAI=人間が AI の代わりにサイドボードする +cbpAiSideboardingMode=AI Sideboarding Mode cbPerformanceMode=パフォーマンスモード cbFilteredHands=初期ハンド補正 cbImageFetcher=欠落したカード画像を自動的にダウンロードする @@ -156,7 +156,7 @@ nlEnableAICheats=AI がチートしてアドバンテージを獲得できるよ nlManaBurn=マナバーンでプレイ。(基本セット2010 以前のマジックルール) nlManaLostPrompt=有効にすると、優先権を放棄するとマナプールのマナが失われる場合に警告が表示されます。 nlEnforceDeckLegality=各環境に使えるデッキの合法性を強制します。(最小デッキサイズ、最大カード数など) -nlSideboardForAI=人間が構築戦の時、AI の替わりに AI のデッキのサイドボードをします。 +nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). nlPerformanceMode=常在型能力の追加チェックを無効にして、ゲームエンジンを高速化します。 (警告:対戦相手が所有するカードをキャストするときに、「あたかもフラッシュがあるかのように」の能力が無効になるかもしれません。) nlFilteredHands=2つのハンドを生成し、デッキの平均土地数に最も近いハンドをキープします。 nlCloneImgSource=有効にすると、クローンはクローン先のカードのアートの代わりに元のアートを使用します。 diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index 649d9bd7db4..6f1640f6478 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -71,7 +71,7 @@ cbLoadCardsLazily=Carregar Scripts de Cartas sob Demanda cbLoadArchivedFormats=Load Archived Formats cbWorkshopSyntax=Verificador de Sintaxe no Workshop cbEnforceDeckLegality=Conformidade do Deck -cbSideboardForAI=Humano e a Reserva de IA +cbpAiSideboardingMode=AI Sideboarding Mode cbPerformanceMode=Modo de Desempenho cbFilteredHands=Mãos Filtradas cbImageFetcher=Baixar Automaticamente a Arte de Cartas Ausentes @@ -157,7 +157,7 @@ nlEnableAICheats=Permita que a trapaça IA obtenha vantagem (para personalidades nlManaBurn=Jogar com queima de mana (das regras do Magic anteriores a 2010). nlManaLostPrompt=Quando ativado, você recebe um aviso se a prioridade de passar fizer com que você perca mana na reserva de mana. nlEnforceDeckLegality=Força a legalidade do deck relevante para cada ambiente (tamanho mínimo, número máximo de cartas etc). -nlSideboardForAI=Permite os usuários trocarem cartas com decks IA e a reserva em formatos de jogo construídos. +nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). nlPerformanceMode=Desabilita verificações adicionais de habilidades estáticas para acelerar o jogo. (Aviso\: quebra alguns cenários 'como se tivesse lampejo' ao conjurar cartas pertencentes a adversários). nlFilteredHands=Gera duas mãos iniciais e mantém a mão mais próxima da média da contagem de terreno do deck. (REQUER REINÍCIO) nlCloneImgSource=Quando ativado os clones usarão sua arte original em vez da arte da carta clonada. diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 22b9cfb8a33..9ab882819cd 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -70,7 +70,7 @@ cbLoadCardsLazily=惰性加载卡牌脚本 cbLoadArchivedFormats=加载旧赛制 cbWorkshopSyntax=作坊语法检查 cbEnforceDeckLegality=套牌一致性 -cbSideboardForAI=玩家为AI换备 +cbpAiSideboardingMode=AI Sideboarding Mode cbPerformanceMode=性能模式 cbFilteredHands=手牌过滤 cbImageFetcher=自动下载缺失的图片 @@ -156,7 +156,7 @@ nlEnableAICheats=允许AI进行作弊以获得优势(对于已经设置了作 nlManaBurn=使用法术力灼烧(M10之前的规则) nlManaLostPrompt=启用后,如果让过优先权会导致法术力池清空,你将收到一个警告提示。 nlEnforceDeckLegality=强制每个与环境相关的套牌合法性(最小单卡数,最大单卡数等)。 -nlSideboardForAI=允许用户在构筑赛制中为AI换备牌。 +nlpAiSideboardingMode=Choose the way the AI sideboards: Off (the AI doesn't sideboard), AI (the AI sideboards for itself, currently mostly random), Human For AI (the human player sideboards for the AI in Constructed formats). nlPerformanceMode=禁止其他静态能力检查以加速游戏引擎(警告:对手手牌有闪现单卡能使用时可能会跳过)。 nlFilteredHands=生成两个起手并发给你最接近套牌地比例的起手(需要重启) nlCloneImgSource=启用克隆的时候将使用原画而不是克隆牌的画 diff --git a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java index e172713b38f..8326e13b2ac 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java @@ -9,6 +9,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import forge.ai.AiProfileUtil; import forge.gui.control.PlaybackSpeed; import org.apache.commons.lang3.StringUtils; @@ -89,9 +90,23 @@ public class HostedMatch { gameRules.setPlayForAnte(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE)); gameRules.setMatchAnteRarity(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE_MATCH_RARITY)); gameRules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); - gameRules.setSideboardForAI(FModel.getPreferences().getPrefBoolean(FPref.MATCH_SIDEBOARD_FOR_AI)); gameRules.setUseGrayText(FModel.getPreferences().getPrefBoolean(FPref.UI_GRAY_INACTIVE_TEXT)); gameRules.setGamesPerMatch(FModel.getPreferences().getPrefInt(FPref.UI_MATCHES_PER_GAME)); + // AI specific sideboarding rules + switch (AiProfileUtil.getAISideboardingMode()) { + case Off: + gameRules.setAISideboardingEnabled(false); + gameRules.setSideboardForAI(false); + break; + case AI: + gameRules.setAISideboardingEnabled(true); + gameRules.setSideboardForAI(false); + break; + case HumanForAI: + gameRules.setAISideboardingEnabled(true); + gameRules.setSideboardForAI(true); + break; + } return gameRules; } diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java index 7974c7a1dac..c398fa71096 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -205,7 +205,7 @@ public class ForgePreferences extends PreferencesStore { SUBMENU_SETTINGS ("false"), SUBMENU_UTILITIES ("false"), - MATCH_SIDEBOARD_FOR_AI("true"), // TODO What do when AI knows how to SIdeboard? + MATCH_AI_SIDEBOARDING_MODE("Human For AI"), MATCH_EXPERIMENTAL_RESTORE("false"), ENFORCE_DECK_LEGALITY ("true"), PERFORMANCE_MODE ("false"),