From aaf27f2d603a23cacfba2f3203a8cea63ae57fb1 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Mon, 26 Feb 2018 23:54:27 +0000 Subject: [PATCH] Added options to disable card based deck generation and to ensure it fails gracefully if .dat data and/or decks folder is missing --- .../java/forge/deckchooser/FDeckChooser.java | 12 +++-- .../home/gauntlet/VSubmenuGauntletQuick.java | 4 +- .../home/settings/CSubmenuPreferences.java | 1 + .../home/settings/VSubmenuPreferences.java | 9 ++++ .../src/forge/deck/FDeckChooser.java | 21 +++++--- .../forge/screens/settings/SettingsPage.java | 4 ++ .../deck/CardRelationMatrixGenerator.java | 48 +++++++++++-------- .../src/main/java/forge/deck/DeckType.java | 4 +- .../forge/deck/io/CardThemedMatrixIO.java | 4 ++ .../src/main/java/forge/model/FModel.java | 13 ++++- .../forge/properties/ForgePreferences.java | 1 + 11 files changed, 87 insertions(+), 34 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index 08c43c5e05f..e54f444b9bf 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -356,16 +356,22 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { updateColors(FModel.getFormats().getModern().getFilterPrinted()); break; case STANDARD_CARDGEN_DECK: - updateMatrix(FModel.getFormats().getStandard()); + if(FModel.isdeckGenMatrixLoaded()) { + updateMatrix(FModel.getFormats().getStandard()); + } break; case MODERN_CARDGEN_DECK: - updateMatrix(FModel.getFormats().getModern()); + if(FModel.isdeckGenMatrixLoaded()) { + updateMatrix(FModel.getFormats().getModern()); + } break; case RANDOM_COMMANDER_DECK: updateRandomCommander(); break; case RANDOM_CARDGEN_COMMANDER_DECK: - updateRandomCardGenCommander(); + if(FModel.isdeckGenMatrixLoaded()) { + updateRandomCardGenCommander(); + } break; case THEME_DECK: updateThemes(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletQuick.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletQuick.java index 3726dbea68e..ec6aaa2879c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletQuick.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletQuick.java @@ -86,7 +86,7 @@ public enum VSubmenuGauntletQuick implements IVSubmenu { boxThemeDecks.setSelected(true); boxColorDecks.setSelected(true); boxStandardColorDecks.setSelected(true); - if(!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.LOAD_CARD_SCRIPTS_LAZILY)) { + if(FModel.isdeckGenMatrixLoaded()) { boxStandardCardgenDecks.setSelected(true); boxModernCardgenDecks.setSelected(true); }else{ @@ -115,7 +115,7 @@ public enum VSubmenuGauntletQuick implements IVSubmenu { pnlOptions.add(boxQuestDecks, "w 96%!, h 30px!, gap 2% 0 0 5px"); pnlOptions.add(boxThemeDecks, "w 96%!, h 30px!, gap 2% 0 0 5px"); pnlOptions.add(boxColorDecks, "w 96%!, h 30px!, gap 2% 0 0 5px"); - if(!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.LOAD_CARD_SCRIPTS_LAZILY)) { + if(FModel.isdeckGenMatrixLoaded()) { pnlOptions.add(boxStandardCardgenDecks, "w 96%!, h 30px!, gap 2% 0 0 5px"); pnlOptions.add(boxModernCardgenDecks, "w 96%!, h 30px!, gap 2% 0 0 5px"); } 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 8e676b99abe..883c5843003 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 @@ -96,6 +96,7 @@ public enum CSubmenuPreferences implements ICDoc { lstControls.add(Pair.of(view.getCbEnforceDeckLegality(), FPref.ENFORCE_DECK_LEGALITY)); lstControls.add(Pair.of(view.getCbCloneImgSource(), FPref.UI_CLONE_MODE_SOURCE)); lstControls.add(Pair.of(view.getCbRemoveSmall(), FPref.DECKGEN_NOSMALL)); + lstControls.add(Pair.of(view.getCbCardBased(), FPref.DECKGEN_CARDBASED)); lstControls.add(Pair.of(view.getCbRemoveArtifacts(), FPref.DECKGEN_ARTIFACTS)); lstControls.add(Pair.of(view.getCbSingletons(), FPref.DECKGEN_SINGLETONS)); lstControls.add(Pair.of(view.getCbEnableAICheats(), FPref.UI_ENABLE_AI_CHEATS)); 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 10014f2bdb3..5c5052c4d7b 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 @@ -55,6 +55,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final FLabel btnPlayerName = new FLabel.Builder().opaque(true).hoverable(true).text("").build(); private final JCheckBox cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures"); + private final JCheckBox cbCardBased = new OptionsCheckBox("Include Card-based Deck Generation"); private final JCheckBox cbSingletons = new OptionsCheckBox("Singleton Mode"); private final JCheckBox cbRemoveArtifacts = new OptionsCheckBox("Remove Artifacts"); private final JCheckBox cbAnte = new OptionsCheckBox("Play for Ante"); @@ -211,6 +212,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbRemoveArtifacts, titleConstraints); pnlPrefs.add(new NoteLabel("Disables artifact cards in generated decks."), descriptionConstraints); + pnlPrefs.add(cbCardBased, titleConstraints); + pnlPrefs.add(new NoteLabel("Builds more synergistic random decks (requires restart)."), descriptionConstraints); + // Deck building options pnlPrefs.add(new SectionLabel("Deck Editor Options"), sectionConstraints); @@ -492,6 +496,11 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbRemoveSmall; } + /** @return {@link javax.swing.JCheckBox} */ + public final JCheckBox getCbCardBased() { + return cbCardBased; + } + /** @return {@link javax.swing.JCheckBox} */ public final JCheckBox getCbSingletons() { return cbSingletons; diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 68231957cb6..ff0a5a5d5c9 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -443,7 +443,7 @@ public class FDeckChooser extends FScreen { cmbDeckTypes.addItem(DeckType.QUEST_OPPONENT_DECK); cmbDeckTypes.addItem(DeckType.COLOR_DECK); cmbDeckTypes.addItem(DeckType.STANDARD_COLOR_DECK); - if(!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.LOAD_CARD_SCRIPTS_LAZILY)) { + if(FModel.isdeckGenMatrixLoaded()) { cmbDeckTypes.addItem(DeckType.STANDARD_CARDGEN_DECK); cmbDeckTypes.addItem(DeckType.MODERN_CARDGEN_DECK); } @@ -456,7 +456,7 @@ public class FDeckChooser extends FScreen { case TinyLeaders: cmbDeckTypes.addItem(DeckType.CUSTOM_DECK); cmbDeckTypes.addItem(DeckType.RANDOM_DECK); - if(!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.LOAD_CARD_SCRIPTS_LAZILY)) { + if(FModel.isdeckGenMatrixLoaded()) { cmbDeckTypes.addItem(DeckType.RANDOM_CARDGEN_COMMANDER_DECK); } cmbDeckTypes.addItem(DeckType.RANDOM_COMMANDER_DECK); @@ -587,7 +587,10 @@ public class FDeckChooser extends FScreen { config = ItemManagerConfig.STRING_ONLY; break; case RANDOM_CARDGEN_COMMANDER_DECK: - pool = CommanderDeckGenerator.getCommanderDecks(lstDecks.getGameType().getDeckFormat(),isAi, true); + pool= new ArrayList<>(); + if(FModel.isdeckGenMatrixLoaded()) { + pool = CommanderDeckGenerator.getCommanderDecks(lstDecks.getGameType().getDeckFormat(), isAi, true); + } config = ItemManagerConfig.STRING_ONLY; break; case SCHEME_DECKS: @@ -618,12 +621,18 @@ public class FDeckChooser extends FScreen { break; case STANDARD_CARDGEN_DECK: maxSelections = 1; - pool = CardThemedDeckGenerator.getMatrixDecks(FModel.getFormats().getStandard(), isAi); + pool= new ArrayList<>(); + if(FModel.isdeckGenMatrixLoaded()) { + pool = CardThemedDeckGenerator.getMatrixDecks(FModel.getFormats().getStandard(), isAi); + } config = ItemManagerConfig.STRING_ONLY; break; case MODERN_CARDGEN_DECK: maxSelections = 1; - pool = CardThemedDeckGenerator.getMatrixDecks(FModel.getFormats().getModern(), isAi); + pool= new ArrayList<>(); + if(FModel.isdeckGenMatrixLoaded()) { + pool = CardThemedDeckGenerator.getMatrixDecks(FModel.getFormats().getModern(), isAi); + } config = ItemManagerConfig.STRING_ONLY; break; case MODERN_COLOR_DECK: @@ -955,7 +964,7 @@ public class FDeckChooser extends FScreen { public void run(final Integer numOpponents) { if (numOpponents == null) { return; } List deckTypes=null; - if(!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.LOAD_CARD_SCRIPTS_LAZILY)) { + if(!FModel.isdeckGenMatrixLoaded()) { deckTypes=Arrays.asList(new DeckType[] { DeckType.CUSTOM_DECK, DeckType.PRECONSTRUCTED_DECK, diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index e1328ac1893..de4d2714c4f 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -155,6 +155,10 @@ public class SettingsPage extends TabPage { "Remove Small Creatures", "Disables 1/1 and 0/X creatures in generated decks."), 2); + lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_CARDBASED, + "Include Card-based Deck Generation", + "Builds more synergistic random decks"), + 2); lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_SINGLETONS, "Singleton Mode", "Disables non-land duplicates in generated decks."), diff --git a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java index b3b44f78aa9..d0d969b76f9 100644 --- a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java @@ -27,28 +27,38 @@ public final class CardRelationMatrixGenerator { public static HashMap>>> cardPools = new HashMap<>(); - - public static void initialize(){ - HashMap>> standardMap = CardThemedMatrixIO.loadMatrix(FModel.getFormats().getStandard().getName()); - HashMap>> modernMap = CardThemedMatrixIO.loadMatrix(FModel.getFormats().getModern().getName()); - HashMap>> commanderMap = CardThemedMatrixIO.loadMatrix(DeckFormat.Commander.toString()); - if(standardMap==null || modernMap==null || commanderMap==null){ - reInitialize(); - return; + /** Try to load matrix .dat files, otherwise check for deck folders and build .dat, otherwise return false **/ + public static boolean initialize(){ + String format=FModel.getFormats().getStandard().getName(); + HashMap>> standardMap = CardThemedMatrixIO.loadMatrix(format); + if(standardMap==null&&CardThemedMatrixIO.getMatrixFolder(format).exists()){ + standardMap=initializeFormat(FModel.getFormats().getStandard()); + CardThemedMatrixIO.saveMatrix(format,standardMap); + }else if(standardMap==null && !CardThemedMatrixIO.getMatrixFolder(format).exists()){ + return false; } - cardPools.put(FModel.getFormats().getStandard().getName(),standardMap); - cardPools.put(FModel.getFormats().getModern().getName(),modernMap); - cardPools.put(DeckFormat.Commander.toString(),commanderMap); - } + cardPools.put(format,standardMap); - public static void reInitialize(){ - cardPools.put(FModel.getFormats().getStandard().getName(),initializeFormat(FModel.getFormats().getStandard())); - cardPools.put(FModel.getFormats().getModern().getName(),initializeFormat(FModel.getFormats().getModern())); - cardPools.put(DeckFormat.Commander.toString(),initializeCommanderFormat()); - for(String format:cardPools.keySet()){ - HashMap>> map = cardPools.get(format); - CardThemedMatrixIO.saveMatrix(format,map); + format=FModel.getFormats().getModern().getName(); + HashMap>> modernMap = CardThemedMatrixIO.loadMatrix(format); + if(modernMap==null&&CardThemedMatrixIO.getMatrixFolder(format).exists()){ + modernMap=initializeFormat(FModel.getFormats().getModern()); + CardThemedMatrixIO.saveMatrix(format,modernMap); + }else if (standardMap==null && !CardThemedMatrixIO.getMatrixFolder(format).exists()){ + return false; } + cardPools.put(format,modernMap); + + format=DeckFormat.Commander.toString(); + HashMap>> commanderMap = CardThemedMatrixIO.loadMatrix(format); + if(commanderMap==null&&CardThemedMatrixIO.getMatrixFolder(format).exists()){ + commanderMap=initializeCommanderFormat(); + CardThemedMatrixIO.saveMatrix(format,commanderMap); + }else if(standardMap==null && !CardThemedMatrixIO.getMatrixFolder(format).exists()){ + return false; + } + cardPools.put(format,commanderMap); + return true; } public static HashMap>> initializeFormat(GameFormat format){ diff --git a/forge-gui/src/main/java/forge/deck/DeckType.java b/forge-gui/src/main/java/forge/deck/DeckType.java index 91ce25d9792..5eabef8f923 100644 --- a/forge-gui/src/main/java/forge/deck/DeckType.java +++ b/forge-gui/src/main/java/forge/deck/DeckType.java @@ -30,7 +30,7 @@ public enum DeckType { public static DeckType[] CommanderOptions; static { - if (!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.LOAD_CARD_SCRIPTS_LAZILY)) { + if (FModel.isdeckGenMatrixLoaded()) { ConstructedOptions = new DeckType[]{ DeckType.CUSTOM_DECK, DeckType.PRECONSTRUCTED_DECK, @@ -59,7 +59,7 @@ public enum DeckType { } } static { - if (!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.LOAD_CARD_SCRIPTS_LAZILY)) { + if (FModel.isdeckGenMatrixLoaded()) { CommanderOptions = new DeckType[]{ DeckType.COMMANDER_DECK, DeckType.RANDOM_COMMANDER_DECK, diff --git a/forge-gui/src/main/java/forge/deck/io/CardThemedMatrixIO.java b/forge-gui/src/main/java/forge/deck/io/CardThemedMatrixIO.java index d226ffe4566..29253b5f0f6 100644 --- a/forge-gui/src/main/java/forge/deck/io/CardThemedMatrixIO.java +++ b/forge-gui/src/main/java/forge/deck/io/CardThemedMatrixIO.java @@ -61,6 +61,10 @@ public class CardThemedMatrixIO { return new File(ForgeConstants.DECK_GEN_DIR, name + SUFFIX_DATA); } + public static File getMatrixFolder(final String name) { + return new File(ForgeConstants.DECK_GEN_DIR, name); + } + public static File getMatrixFile(final GameFormat gf) { return getMatrixFile(gf.getName()); } diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 434a06a857f..4cefc415343 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -27,6 +27,8 @@ import forge.ai.AiProfileUtil; import forge.card.CardPreferences; import forge.card.CardType; import forge.deck.CardRelationMatrixGenerator; +import forge.deck.DeckFormat; +import forge.deck.io.CardThemedMatrixIO; import forge.deck.io.DeckPreferences; import forge.game.GameFormat; import forge.game.GameType; @@ -216,11 +218,18 @@ public final class FModel { AiProfileUtil.loadAllProfiles(ForgeConstants.AI_PROFILE_DIR); //generate Deck Gen matrix - if(!FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)) { - CardRelationMatrixGenerator.initialize(); + if(!FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY) + &&FModel.getPreferences().getPrefBoolean(FPref.DECKGEN_CARDBASED)) { + deckGenMatrixLoaded=CardRelationMatrixGenerator.initialize(); } } + private static boolean deckGenMatrixLoaded=false; + + public static boolean isdeckGenMatrixLoaded(){ + return deckGenMatrixLoaded; + } + public static QuestController getQuest() { return quest; } diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index 66d8c590151..c5258999e0e 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -156,6 +156,7 @@ public class ForgePreferences extends PreferencesStore { DECKGEN_SINGLETONS ("false"), DECKGEN_ARTIFACTS ("false"), DECKGEN_NOSMALL ("false"), + DECKGEN_CARDBASED ("true"), PHASE_AI_UPKEEP ("false"), PHASE_AI_DRAW ("false"),