Support loading Custom Cards & Editions from User Folder

This commit is contained in:
Anthony Calosa
2021-03-20 00:01:15 +08:00
parent ef3e91e8a8
commit 41b9bd3e06
5 changed files with 60 additions and 6 deletions

View File

@@ -2,6 +2,7 @@ package forge;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@@ -32,12 +33,15 @@ import forge.util.storage.StorageBase;
public class StaticData { public class StaticData {
private final CardStorageReader cardReader; private final CardStorageReader cardReader;
private final CardStorageReader tokenReader; private final CardStorageReader tokenReader;
private final CardStorageReader customCardReader;
private final String blockDataFolder; private final String blockDataFolder;
private final CardDb commonCards; private final CardDb commonCards;
private final CardDb variantCards; private final CardDb variantCards;
private final CardDb customCards;
private final TokenDb allTokens; private final TokenDb allTokens;
private final CardEdition.Collection editions; private final CardEdition.Collection editions;
private final CardEdition.Collection customEditions;
private Predicate<PaperCard> standardPredicate; private Predicate<PaperCard> standardPredicate;
private Predicate<PaperCard> brawlPredicate; private Predicate<PaperCard> brawlPredicate;
@@ -60,20 +64,23 @@ public class StaticData {
private static StaticData lastInstance = null; private static StaticData lastInstance = null;
public StaticData(CardStorageReader cardReader, String editionFolder, String blockDataFolder, boolean enableUnknownCards, boolean loadNonLegalCards) { public StaticData(CardStorageReader cardReader, CardStorageReader customCardReader, String editionFolder, String customEditionsFolder, String blockDataFolder, boolean enableUnknownCards, boolean loadNonLegalCards) {
this(cardReader, null, editionFolder, blockDataFolder, enableUnknownCards, 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.cardReader = cardReader;
this.tokenReader = tokenReader; this.tokenReader = tokenReader;
this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder))); this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder)));
this.blockDataFolder = blockDataFolder; this.blockDataFolder = blockDataFolder;
this.customCardReader = customCardReader;
this.customEditions = new CardEdition.Collection(new CardEdition.Reader(new File(customEditionsFolder)));
lastInstance = this; lastInstance = this;
{ {
final Map<String, CardRules> regularCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); final Map<String, CardRules> regularCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
final Map<String, CardRules> variantsCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); final Map<String, CardRules> variantsCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
final Map<String, CardRules> customizedCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for (CardRules card : cardReader.loadCards()) { for (CardRules card : cardReader.loadCards()) {
if (null == card) continue; if (null == card) continue;
@@ -85,13 +92,24 @@ public class StaticData {
regularCards.put(cardName, card); 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); commonCards = new CardDb(regularCards, editions);
variantCards = new CardDb(variantsCards, editions); variantCards = new CardDb(variantsCards, editions);
customCards = new CardDb(customizedCards, customEditions);
//must initialize after establish field values for the sake of card image logic //must initialize after establish field values for the sake of card image logic
commonCards.initialize(false, false, enableUnknownCards, loadNonLegalCards); commonCards.initialize(false, false, enableUnknownCards, loadNonLegalCards);
variantCards.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); allTokens = new TokenDb(tokens, editions);
} }
{
if (customCards.getAllCards().size() > 0) {
Collection<PaperCard> paperCards = customCards.getAllCards();
for(PaperCard p: paperCards)
commonCards.addCard(p);
}
}
} }
public static StaticData instance() { public static StaticData instance() {
@@ -129,6 +155,7 @@ public class StaticData {
public PaperCard getOrLoadCommonCard(String cardName, String setCode, int artIndex, boolean foil) { public PaperCard getOrLoadCommonCard(String cardName, String setCode, int artIndex, boolean foil) {
PaperCard card = commonCards.getCard(cardName, setCode, artIndex); PaperCard card = commonCards.getCard(cardName, setCode, artIndex);
boolean isCustom = false;
if (card == null) { if (card == null) {
attemptToLoadCard(cardName, setCode); attemptToLoadCard(cardName, setCode);
card = commonCards.getCard(cardName, setCode, artIndex); card = commonCards.getCard(cardName, setCode, artIndex);
@@ -136,9 +163,21 @@ public class StaticData {
if (card == null) { if (card == null) {
card = commonCards.getCard(cardName, setCode, -1); 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) { if (card == null) {
return null; return null;
} }
if (isCustom)
return foil ? customCards.getFoiled(card) : card;
return foil ? commonCards.getFoiled(card) : card; return foil ? commonCards.getFoiled(card) : card;
} }
@@ -146,6 +185,7 @@ public class StaticData {
CardDb.CardRequest r = CardRequest.fromString(encodedCardName); CardDb.CardRequest r = CardRequest.fromString(encodedCardName);
String cardName = r.cardName; String cardName = r.cardName;
CardRules rules = cardReader.attemptToLoadCard(cardName, setCode); CardRules rules = cardReader.attemptToLoadCard(cardName, setCode);
CardRules customRules = customCardReader.attemptToLoadCard(cardName, setCode);
if (rules != null) { if (rules != null) {
if (rules.isVariant()) { if (rules.isVariant()) {
variantCards.loadCard(cardName, rules); variantCards.loadCard(cardName, rules);
@@ -153,6 +193,9 @@ public class StaticData {
commonCards.loadCard(cardName, rules); commonCards.loadCard(cardName, rules);
} }
} }
if (customRules != null) {
customCards.loadCard(cardName, customRules);
}
} }
// TODO Remove these in favor of them being associated to the Edition // TODO Remove these in favor of them being associated to the Edition

View File

@@ -253,7 +253,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
reIndex(); reIndex();
} }
private void addCard(PaperCard paperCard) { public void addCard(PaperCard paperCard) {
allCardsByName.put(paperCard.getName(), paperCard); allCardsByName.put(paperCard.getName(), paperCard);
if (paperCard.getRules().getSplitType() == CardSplitType.None) { return; } if (paperCard.getRules().getSplitType() == CardSplitType.None) { return; }

View File

@@ -29,7 +29,8 @@ public class CardDatabaseHelper {
private static void initialize() { private static void initialize() {
final CardStorageReader reader = new CardStorageReader(ForgeConstants.CARD_DATA_DIR, null, FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); 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() { private static boolean hasBeenInitialized() {

View File

@@ -232,6 +232,9 @@ public final class ForgeConstants {
public static final String USER_PUZZLE_DIR = USER_DIR + "puzzle" + PATH_SEPARATOR; 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 LOG_FILE = USER_DIR + "forge.log";
public static final String ACHIEVEMENTS_DIR = USER_DIR + "achievements" + PATH_SEPARATOR; 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_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_WINSTON_DIR = DECK_BASE_DIR + "winston" + PATH_SEPARATOR;
public static final String DECK_SEALED_DIR = DECK_BASE_DIR + "sealed" + PATH_SEPARATOR; public static final String DECK_SEALED_DIR = DECK_BASE_DIR + "sealed" + PATH_SEPARATOR;

View File

@@ -176,7 +176,14 @@ public final class FModel {
FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY));
final CardStorageReader tokenReader = new CardStorageReader(ForgeConstants.TOKEN_DATA_DIR, progressBarBridge, final CardStorageReader tokenReader = new CardStorageReader(ForgeConstants.TOKEN_DATA_DIR, progressBarBridge,
FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY)); 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); CardTranslation.preloadTranslation(preferences.getPref(FPref.UI_LANGUAGE), ForgeConstants.LANG_DIR);
//create profile dirs if they don't already exist //create profile dirs if they don't already exist