From 41b9bd3e06b102ff512329bf14b37284cd0eb76e Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 20 Mar 2021 00:01:15 +0800 Subject: [PATCH] Support loading Custom Cards & Editions from User Folder --- .../src/main/java/forge/StaticData.java | 49 +++++++++++++++++-- .../src/main/java/forge/card/CardDb.java | 2 +- .../util/CardDatabaseHelper.java | 3 +- .../properties/ForgeConstants.java | 3 ++ .../src/main/java/forge/model/FModel.java | 9 +++- 5 files changed, 60 insertions(+), 6 deletions(-) diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index ac20072e2a9..d21e37192c6 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -2,6 +2,7 @@ package forge; import java.io.File; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; @@ -32,12 +33,15 @@ import forge.util.storage.StorageBase; public class StaticData { private final CardStorageReader cardReader; private final CardStorageReader tokenReader; + private final CardStorageReader customCardReader; private final String blockDataFolder; private final CardDb commonCards; private final CardDb variantCards; + private final CardDb customCards; private final TokenDb allTokens; private final CardEdition.Collection editions; + private final CardEdition.Collection customEditions; private Predicate standardPredicate; private Predicate brawlPredicate; @@ -60,20 +64,23 @@ public class StaticData { private static StaticData lastInstance = null; - public StaticData(CardStorageReader cardReader, String editionFolder, String blockDataFolder, boolean enableUnknownCards, boolean loadNonLegalCards) { - this(cardReader, null, editionFolder, blockDataFolder, enableUnknownCards, loadNonLegalCards); + public StaticData(CardStorageReader cardReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, boolean enableUnknownCards, boolean loadNonLegalCards) { + this(cardReader, null, customCardReader, editionFolder, customEditionsFolder, blockDataFolder, enableUnknownCards, loadNonLegalCards); } - public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, String editionFolder, String blockDataFolder, boolean enableUnknownCards, boolean loadNonLegalCards) { + public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, boolean enableUnknownCards, boolean loadNonLegalCards) { this.cardReader = cardReader; this.tokenReader = tokenReader; this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder))); this.blockDataFolder = blockDataFolder; + this.customCardReader = customCardReader; + this.customEditions = new CardEdition.Collection(new CardEdition.Reader(new File(customEditionsFolder))); lastInstance = this; { final Map regularCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); final Map variantsCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + final Map customizedCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (CardRules card : cardReader.loadCards()) { if (null == card) continue; @@ -85,13 +92,24 @@ public class StaticData { regularCards.put(cardName, card); } } + if (customCardReader != null) { + for (CardRules card : customCardReader.loadCards()) { + if (null == card) continue; + + final String cardName = card.getName(); + customizedCards.put(cardName, card); + } + } + commonCards = new CardDb(regularCards, editions); variantCards = new CardDb(variantsCards, editions); + customCards = new CardDb(customizedCards, customEditions); //must initialize after establish field values for the sake of card image logic commonCards.initialize(false, false, enableUnknownCards, loadNonLegalCards); variantCards.initialize(false, false, enableUnknownCards, loadNonLegalCards); + customCards.initialize(false, false, enableUnknownCards, loadNonLegalCards); } { @@ -104,6 +122,14 @@ public class StaticData { } allTokens = new TokenDb(tokens, editions); } + + { + if (customCards.getAllCards().size() > 0) { + Collection paperCards = customCards.getAllCards(); + for(PaperCard p: paperCards) + commonCards.addCard(p); + } + } } public static StaticData instance() { @@ -129,6 +155,7 @@ public class StaticData { public PaperCard getOrLoadCommonCard(String cardName, String setCode, int artIndex, boolean foil) { PaperCard card = commonCards.getCard(cardName, setCode, artIndex); + boolean isCustom = false; if (card == null) { attemptToLoadCard(cardName, setCode); card = commonCards.getCard(cardName, setCode, artIndex); @@ -136,9 +163,21 @@ public class StaticData { if (card == null) { card = commonCards.getCard(cardName, setCode, -1); } + if (card == null) { + card = customCards.getCard(cardName, setCode, artIndex); + if (card != null) + isCustom = true; + } + if (card == null) { + card = customCards.getCard(cardName, setCode, -1); + if (card != null) + isCustom = true; + } if (card == null) { return null; } + if (isCustom) + return foil ? customCards.getFoiled(card) : card; return foil ? commonCards.getFoiled(card) : card; } @@ -146,6 +185,7 @@ public class StaticData { CardDb.CardRequest r = CardRequest.fromString(encodedCardName); String cardName = r.cardName; CardRules rules = cardReader.attemptToLoadCard(cardName, setCode); + CardRules customRules = customCardReader.attemptToLoadCard(cardName, setCode); if (rules != null) { if (rules.isVariant()) { variantCards.loadCard(cardName, rules); @@ -153,6 +193,9 @@ public class StaticData { commonCards.loadCard(cardName, rules); } } + if (customRules != null) { + customCards.loadCard(cardName, customRules); + } } // TODO Remove these in favor of them being associated to the Edition diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index f0bead576bd..40f00762d1a 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -253,7 +253,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { reIndex(); } - private void addCard(PaperCard paperCard) { + public void addCard(PaperCard paperCard) { allCardsByName.put(paperCard.getName(), paperCard); if (paperCard.getRules().getSplitType() == CardSplitType.None) { return; } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java index 3d6db3a3a84..56dc162d039 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/CardDatabaseHelper.java @@ -29,7 +29,8 @@ public class CardDatabaseHelper { private static void initialize() { final CardStorageReader reader = new CardStorageReader(ForgeConstants.CARD_DATA_DIR, null, FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); - staticData = new StaticData(reader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR, FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS), FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_NONLEGAL_CARDS)); + final CardStorageReader customReader = new CardStorageReader(ForgeConstants.USER_CUSTOM_CARDS_DIR, null, FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); + staticData = new StaticData(reader, customReader, ForgeConstants.EDITIONS_DIR, ForgeConstants.USER_CUSTOM_EDITIONS_DIR ,ForgeConstants.BLOCK_DATA_DIR, FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS), FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_NONLEGAL_CARDS)); } private static boolean hasBeenInitialized() { diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java index b9059238ae0..3d771509799 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -232,6 +232,9 @@ public final class ForgeConstants { public static final String USER_PUZZLE_DIR = USER_DIR + "puzzle" + PATH_SEPARATOR; public static final String LOG_FILE = USER_DIR + "forge.log"; public static final String ACHIEVEMENTS_DIR = USER_DIR + "achievements" + PATH_SEPARATOR; + public static final String USER_CUSTOM_DIR = USER_DIR + "custom" + PATH_SEPARATOR; + public static final String USER_CUSTOM_EDITIONS_DIR = USER_CUSTOM_DIR + "editions" + PATH_SEPARATOR; + public static final String USER_CUSTOM_CARDS_DIR = USER_CUSTOM_DIR + "cards" + PATH_SEPARATOR; public static final String DECK_DRAFT_DIR = DECK_BASE_DIR + "draft" + PATH_SEPARATOR; public static final String DECK_WINSTON_DIR = DECK_BASE_DIR + "winston" + PATH_SEPARATOR; public static final String DECK_SEALED_DIR = DECK_BASE_DIR + "sealed" + PATH_SEPARATOR; diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index bdc34ae7985..fbbdcf1cc18 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -176,7 +176,14 @@ public final class FModel { FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); final CardStorageReader tokenReader = new CardStorageReader(ForgeConstants.TOKEN_DATA_DIR, progressBarBridge, FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); - magicDb = new StaticData(reader, tokenReader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR, FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS), FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_NONLEGAL_CARDS)); + CardStorageReader customReader; + try { + customReader = new CardStorageReader(ForgeConstants.USER_CUSTOM_CARDS_DIR, progressBarBridge, + FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); + } catch (Exception e) { + customReader = null; + } + magicDb = new StaticData(reader, tokenReader, customReader, ForgeConstants.EDITIONS_DIR, ForgeConstants.USER_CUSTOM_EDITIONS_DIR,ForgeConstants.BLOCK_DATA_DIR, FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS), FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_NONLEGAL_CARDS)); CardTranslation.preloadTranslation(preferences.getPref(FPref.UI_LANGUAGE), ForgeConstants.LANG_DIR); //create profile dirs if they don't already exist