mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +00:00
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:
@@ -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();
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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."),
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"),
|
||||
|
||||
Reference in New Issue
Block a user