mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Support loading Custom Cards & Editions from User Folder
This commit is contained in:
@@ -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<PaperCard> standardPredicate;
|
||||
private Predicate<PaperCard> 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<String, CardRules> regularCards = 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()) {
|
||||
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<PaperCard> 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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user