From 3d322e47ee04c8f01a69aac33106e6dbe5b783c7 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 16 Aug 2021 12:06:20 +0800 Subject: [PATCH] Support Set lookup for J21 and other future sets. Forge loads all files found on the setlookup folder. Example J21.txt (J21 set code) contains a list of set codes (sorted from Newest to Oldest beforehand) to lookup for images on other sets. --- forge-core/src/main/java/forge/ImageKeys.java | 17 +++++ .../src/main/java/forge/StaticData.java | 24 ++++-- .../util/CardDatabaseHelper.java | 2 +- forge-gui/res/setlookup/J21.txt | 73 +++++++++++++++++++ .../properties/ForgeConstants.java | 1 + .../src/main/java/forge/model/FModel.java | 2 +- 6 files changed, 112 insertions(+), 7 deletions(-) create mode 100644 forge-gui/res/setlookup/J21.txt diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java index 9881668aac8..bf2016a3d32 100644 --- a/forge-core/src/main/java/forge/ImageKeys.java +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -129,6 +129,23 @@ public final class ImageKeys { // if there's a 1st art variant try with it for .full images file = findFile(dir, filename.replaceAll("[0-9]*.full", "1.full")); if (file != null) { return file; } + //setlookup + if (!StaticData.instance().getSetLookup().isEmpty()) { + for (String setKey : StaticData.instance().getSetLookup().keySet()) { + for (String setLookup : StaticData.instance().getSetLookup().get(setKey)) { + //.fullborder lookup + file = findFile(dir, TextUtil.fastReplace(fullborderFile, setKey, getSetFolder(setLookup))); + if (file != null) { return file; } + file = findFile(dir, TextUtil.fastReplace(fullborderFile, setKey, getSetFolder(setLookup)).replaceAll("[0-9]*.fullborder", "1.fullborder")); + if (file != null) { return file; } + //.full lookup + file = findFile(dir, TextUtil.fastReplace(filename, setKey, getSetFolder(setLookup))); + if (file != null) { return file; } + file = findFile(dir, TextUtil.fastReplace(filename, setKey, getSetFolder(setLookup)).replaceAll("[0-9]*.fullborder", "1.fullborder")); + if (file != null) { return file; } + } + } + } } //if an image, like phenomenon or planes is missing .full in their filenames but you have an existing images that have .full/.fullborder if (!filename.contains(".full")) { diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 2131906c00d..3dab9de13b1 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -10,6 +10,7 @@ import forge.item.FatPack; import forge.item.PaperCard; import forge.item.SealedProduct; import forge.token.TokenDb; +import forge.util.FileUtil; import forge.util.TextUtil; import forge.util.storage.IStorage; import forge.util.storage.StorageBase; @@ -57,18 +58,19 @@ public class StaticData { private IStorage fatPacks; private IStorage boosterBoxes; private IStorage printSheets; + private final Map> setLookup = new HashMap<>(); private static StaticData lastInstance = null; - public StaticData(CardStorageReader cardReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards) { - this(cardReader, null, customCardReader, editionFolder, customEditionsFolder, blockDataFolder, cardArtPreference, enableUnknownCards, loadNonLegalCards, false, false); + public StaticData(CardStorageReader cardReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String setLookupFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards) { + this(cardReader, null, customCardReader, editionFolder, customEditionsFolder, blockDataFolder, setLookupFolder, cardArtPreference, enableUnknownCards, loadNonLegalCards, false, false); } - public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards, boolean allowCustomCardsInDecksConformance){ - this(cardReader, tokenReader, customCardReader, editionFolder, customEditionsFolder, blockDataFolder, cardArtPreference, enableUnknownCards, loadNonLegalCards, allowCustomCardsInDecksConformance, false); + public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String setLookupFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards, boolean allowCustomCardsInDecksConformance){ + this(cardReader, tokenReader, customCardReader, editionFolder, customEditionsFolder, blockDataFolder, setLookupFolder, cardArtPreference, enableUnknownCards, loadNonLegalCards, allowCustomCardsInDecksConformance, false); } - public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards, boolean allowCustomCardsInDecksConformance, boolean enableSmartCardArtSelection) { + public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, String setLookupFolder, String cardArtPreference, boolean enableUnknownCards, boolean loadNonLegalCards, boolean allowCustomCardsInDecksConformance, boolean enableSmartCardArtSelection) { this.cardReader = cardReader; this.tokenReader = tokenReader; this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder))); @@ -143,12 +145,24 @@ public class StaticData { } else { allTokens = null; } + //initialize setLookup + if (FileUtil.isDirectoryWithFiles(setLookupFolder)){ + for (File f : Objects.requireNonNull(new File(setLookupFolder).listFiles())){ + if (f.isFile()) { + setLookup.put(f.getName().replace(".txt",""), FileUtil.readFile(f)); + } + } + } } public static StaticData instance() { return lastInstance; } + public Map> getSetLookup() { + return setLookup; + } + public final CardEdition.Collection getEditions() { return this.editions; } 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 121b6ca6b49..2dc04f45e02 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 @@ -36,7 +36,7 @@ public class CardDatabaseHelper { customReader = null; } staticData = new StaticData(reader, customReader, ForgeConstants.EDITIONS_DIR, - ForgeConstants.USER_CUSTOM_EDITIONS_DIR ,ForgeConstants.BLOCK_DATA_DIR, + ForgeConstants.USER_CUSTOM_EDITIONS_DIR ,ForgeConstants.BLOCK_DATA_DIR, ForgeConstants.SETLOOKUP_DIR, "Latest Art All Editions", true, false); diff --git a/forge-gui/res/setlookup/J21.txt b/forge-gui/res/setlookup/J21.txt new file mode 100644 index 00000000000..ad3856aeda1 --- /dev/null +++ b/forge-gui/res/setlookup/J21.txt @@ -0,0 +1,73 @@ +AFR +MH2 +STX +TSR +KHM +CMR +KLR +ZNC +ZNR +AKR +ANB +2XM +JMP +M21 +IKO +C20 +THB +SLD +GN2 +ELD +C19 +M20 +MH1 +WAR +GK2 +RNA +UMA +GK1 +GRN +C18 +M19 +BBD +CM2 +DOM +A25 +RIX +IMA +DDT +XLN +HOU +AKH +MM3 +AER +PCA +DDR +CN2 +SOI +W16 +DDQ +OGW +BFZ +ORI +MM2 +DTK +FRF +KTK +EMN +M15 +VMA +THS +M14 +DGM +GTC +ISD +MBS +MOR +LRW +10E +LGN +ONS +PCY +P02 +WTH 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 1d132e63076..522ae934dda 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -32,6 +32,7 @@ public final class ForgeConstants { public static final String RES_DIR = ASSETS_DIR + "res" + PATH_SEPARATOR; public static final String LISTS_DIR = RES_DIR + "lists" + PATH_SEPARATOR; + public static final String SETLOOKUP_DIR = RES_DIR + "setlookup" + PATH_SEPARATOR; public static final String KEYWORD_LIST_FILE = LISTS_DIR + "NonStackingKWList.txt"; public static final String TYPE_LIST_FILE = LISTS_DIR + "TypeLists.txt"; public static final String PLANESWALKER_ACHIEVEMENT_LIST_FILE = LISTS_DIR + "planeswalker-achievements.txt"; diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index ca12ddbb99b..ca2731ff7b9 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -179,7 +179,7 @@ public final class FModel { customReader = null; } magicDb = new StaticData(reader, tokenReader, customReader, ForgeConstants.EDITIONS_DIR, - ForgeConstants.USER_CUSTOM_EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR, + ForgeConstants.USER_CUSTOM_EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR, ForgeConstants.SETLOOKUP_DIR, FModel.getPreferences().getPref(FPref.UI_PREFERRED_ART), FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS), FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_NONLEGAL_CARDS),