Added options to disable card based deck generation and to ensure it fails gracefully if .dat data and/or decks folder is missing

This commit is contained in:
austinio7116
2018-02-26 23:54:27 +00:00
committed by maustin
parent 9cb1f2787c
commit aaf27f2d60
11 changed files with 87 additions and 34 deletions

View File

@@ -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();

View File

@@ -86,7 +86,7 @@ public enum VSubmenuGauntletQuick implements IVSubmenu<CSubmenuGauntletQuick> {
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<CSubmenuGauntletQuick> {
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");
}

View File

@@ -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));

View File

@@ -55,6 +55,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
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<CSubmenuPreferences> {
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<CSubmenuPreferences> {
return cbRemoveSmall;
}
/** @return {@link javax.swing.JCheckBox} */
public final JCheckBox getCbCardBased() {
return cbCardBased;
}
/** @return {@link javax.swing.JCheckBox} */
public final JCheckBox getCbSingletons() {
return cbSingletons;

View File

@@ -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<DeckType> 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,

View File

@@ -155,6 +155,10 @@ public class SettingsPage extends TabPage<SettingsScreen> {
"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."),

View File

@@ -27,28 +27,38 @@ public final class CardRelationMatrixGenerator {
public static HashMap<String,HashMap<String,List<Map.Entry<PaperCard,Integer>>>> cardPools = new HashMap<>();
public static void initialize(){
HashMap<String,List<Map.Entry<PaperCard,Integer>>> standardMap = CardThemedMatrixIO.loadMatrix(FModel.getFormats().getStandard().getName());
HashMap<String,List<Map.Entry<PaperCard,Integer>>> modernMap = CardThemedMatrixIO.loadMatrix(FModel.getFormats().getModern().getName());
HashMap<String,List<Map.Entry<PaperCard,Integer>>> 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<String,List<Map.Entry<PaperCard,Integer>>> 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<String,List<Map.Entry<PaperCard,Integer>>> map = cardPools.get(format);
CardThemedMatrixIO.saveMatrix(format,map);
format=FModel.getFormats().getModern().getName();
HashMap<String,List<Map.Entry<PaperCard,Integer>>> 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<String,List<Map.Entry<PaperCard,Integer>>> 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<String,List<Map.Entry<PaperCard,Integer>>> initializeFormat(GameFormat format){

View File

@@ -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,

View File

@@ -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());
}

View File

@@ -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;
}

View File

@@ -156,6 +156,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
DECKGEN_SINGLETONS ("false"),
DECKGEN_ARTIFACTS ("false"),
DECKGEN_NOSMALL ("false"),
DECKGEN_CARDBASED ("true"),
PHASE_AI_UPKEEP ("false"),
PHASE_AI_DRAW ("false"),