mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
- Added support for custom rankings for drafts (defined in the .draft files via the CustomRankings parameter specifying the name of the file to load in addition to rankings.txt).
- Custom ranking files are meant for custom cubes and should use the identifier "CUSTOM" instead of the set name (and the card is ranked in an edition-agnostic way). - Custom rankings are parsed before the default ones. If a card is not found in the custom ranking definitions, then the default rankings.txt is scanned (standard, per-edition scanning).
This commit is contained in:
@@ -73,6 +73,7 @@ public class BoosterDraft implements IBoosterDraft {
|
||||
this.product.add(s);
|
||||
}
|
||||
IBoosterDraft.LAND_SET_CODE[0] = CardEdition.Predicates.getRandomSetWithAllBasicLands(FModel.getMagicDb().getEditions());
|
||||
IBoosterDraft.CUSTOM_RANKINGS_FILE[0] = null;
|
||||
break;
|
||||
|
||||
case Block: // Draft from cards by block or set
|
||||
@@ -128,6 +129,7 @@ public class BoosterDraft implements IBoosterDraft {
|
||||
}
|
||||
|
||||
IBoosterDraft.LAND_SET_CODE[0] = block.getLandSet();
|
||||
IBoosterDraft.CUSTOM_RANKINGS_FILE[0] = null;
|
||||
break;
|
||||
|
||||
case Custom:
|
||||
@@ -160,6 +162,7 @@ public class BoosterDraft implements IBoosterDraft {
|
||||
}
|
||||
|
||||
IBoosterDraft.LAND_SET_CODE[0] = block.getLandSet();
|
||||
IBoosterDraft.CUSTOM_RANKINGS_FILE[0] = null;
|
||||
|
||||
draft.pack = draft.get8BoosterPack();
|
||||
return draft;
|
||||
@@ -196,6 +199,7 @@ public class BoosterDraft implements IBoosterDraft {
|
||||
}
|
||||
|
||||
IBoosterDraft.LAND_SET_CODE[0] = FModel.getMagicDb().getEditions().get(draft.getLandSetCode());
|
||||
IBoosterDraft.CUSTOM_RANKINGS_FILE[0] = draft.getCustomRankingsFileName();
|
||||
}
|
||||
|
||||
/** Looks for draft files, reads them, returns a list. */
|
||||
|
||||
@@ -78,7 +78,7 @@ public class BoosterDraftAI {
|
||||
final ColorSet currentChoice = deckCols.getChosenColors();
|
||||
final boolean canAddMoreColors = deckCols.canChoseMoreColors();
|
||||
|
||||
final List<Pair<PaperCard, Double>> rankedCards = rankCards(chooseFrom);
|
||||
final List<Pair<PaperCard, Double>> rankedCards = rankCards(chooseFrom, bd.CUSTOM_RANKINGS_FILE[0]);
|
||||
|
||||
for (final Pair<PaperCard, Double> p : rankedCards) {
|
||||
double valueBoost = 0;
|
||||
@@ -135,14 +135,23 @@ public class BoosterDraftAI {
|
||||
* List of cards
|
||||
* @return map of rankings
|
||||
*/
|
||||
private static List<Pair<PaperCard, Double>> rankCards(final Iterable<PaperCard> chooseFrom) {
|
||||
private static List<Pair<PaperCard, Double>> rankCards(final Iterable<PaperCard> chooseFrom, String customRankings) {
|
||||
final List<Pair<PaperCard, Double>> rankedCards = new ArrayList<Pair<PaperCard,Double>>();
|
||||
for (final PaperCard card : chooseFrom) {
|
||||
Double rank;
|
||||
if (MagicColor.Constant.BASIC_LANDS.contains(card.getName())) {
|
||||
rank = RANK_UNPICKABLE;
|
||||
} else {
|
||||
rank = DraftRankCache.getRanking(card.getName(), card.getEdition());
|
||||
if (customRankings != null) {
|
||||
rank = DraftRankCache.getCustomRanking(customRankings, card.getName());
|
||||
if (rank == null) {
|
||||
// try the default draft rankings if there's no entry in the custom rankings file
|
||||
rank = DraftRankCache.getRanking(card.getName(), card.getEdition());
|
||||
}
|
||||
} else {
|
||||
rank = DraftRankCache.getRanking(card.getName(), card.getEdition());
|
||||
}
|
||||
|
||||
if (rank == null) {
|
||||
System.out.println("Draft Rankings - Card Not Found: " + card.getName());
|
||||
rank = RANK_UNPICKABLE;
|
||||
|
||||
@@ -69,6 +69,9 @@ public class CustomLimited extends DeckBase {
|
||||
|
||||
private boolean singleton;
|
||||
|
||||
/** Name of the file containing custom card rankings. */
|
||||
private String customRankingsFile = "";
|
||||
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
@@ -110,6 +113,7 @@ public class CustomLimited extends DeckBase {
|
||||
cd.landSetCode = data.get("LandSetCode");
|
||||
cd.numPacks = data.getInt("NumPacks");
|
||||
cd.singleton = data.getBoolean("Singleton");
|
||||
cd.customRankingsFile = data.get("CustomRankings");
|
||||
final Deck deckCube = cubes.get(data.get("DeckFile"));
|
||||
cd.cardPool = deckCube == null ? ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getUniqueCards(), PaperCard.class) : deckCube.getMain();
|
||||
|
||||
@@ -175,6 +179,10 @@ public class CustomLimited extends DeckBase {
|
||||
return singleton;
|
||||
}
|
||||
|
||||
public String getCustomRankingsFileName() {
|
||||
return customRankingsFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return cardPool.isEmpty();
|
||||
|
||||
@@ -7,9 +7,11 @@ package forge.limited;
|
||||
*/
|
||||
public class DraftRankCache {
|
||||
private static ReadDraftRankings rankings = null;
|
||||
private static ReadDraftRankings customRankings = null;
|
||||
private static String customRankingsFileName = "";
|
||||
|
||||
private DraftRankCache(){
|
||||
|
||||
customRankingsFileName = "";
|
||||
}
|
||||
|
||||
public static Double getRanking(String name, String edition){
|
||||
@@ -19,4 +21,11 @@ public class DraftRankCache {
|
||||
return rankings.getRanking(name, edition);
|
||||
}
|
||||
|
||||
public static Double getCustomRanking(String customRankingsSource, String name) {
|
||||
if (customRankings == null || !customRankingsFileName.equals(customRankingsSource)) {
|
||||
customRankingsFileName = customRankingsSource;
|
||||
customRankings = new ReadDraftRankings(customRankingsFileName);
|
||||
}
|
||||
return customRankings.getRanking(name, "CUSTOM");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,6 +71,8 @@ public interface IBoosterDraft {
|
||||
/** Constant <code>LandSetCode="{}"</code>. */
|
||||
CardEdition[] LAND_SET_CODE = { null };
|
||||
|
||||
String[] CUSTOM_RANKINGS_FILE = { null };
|
||||
|
||||
boolean isPileDraft();
|
||||
|
||||
}
|
||||
|
||||
@@ -727,7 +727,19 @@ public class LimitedDeckBuilder extends DeckGeneratorBase {
|
||||
protected List<Pair<Double, PaperCard>> rankCards(final Iterable<PaperCard> cards) {
|
||||
final List<Pair<Double, PaperCard>> ranked = new ArrayList<Pair<Double, PaperCard>>();
|
||||
for (final PaperCard card : cards) {
|
||||
final Double rkg = DraftRankCache.getRanking(card.getName(), card.getEdition());
|
||||
Double rkg;
|
||||
String customRankings = IBoosterDraft.CUSTOM_RANKINGS_FILE[0];
|
||||
|
||||
if (customRankings != null) {
|
||||
rkg = DraftRankCache.getCustomRanking(customRankings, card.getName());
|
||||
if (rkg == null) {
|
||||
// try the default rankings if custom rankings contain no entry
|
||||
rkg = DraftRankCache.getRanking(card.getName(), card.getEdition());
|
||||
}
|
||||
} else {
|
||||
rkg = DraftRankCache.getRanking(card.getName(), card.getEdition());
|
||||
}
|
||||
|
||||
if (rkg != null) {
|
||||
ranked.add(Pair.of(rkg, card));
|
||||
} else {
|
||||
|
||||
@@ -30,6 +30,11 @@ public class ReadDraftRankings {
|
||||
this.draftRankings = this.readFile(FileUtil.readFile(ForgeConstants.DRAFT_RANKINGS_FILE));
|
||||
} // setup()
|
||||
|
||||
public ReadDraftRankings(String customFile) {
|
||||
this.setSizes = new HashMap<String, Integer>();
|
||||
this.draftRankings = this.readFile(FileUtil.readFile(ForgeConstants.DRAFT_DIR + customFile));
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* readFile.
|
||||
@@ -100,4 +105,8 @@ public class ReadDraftRankings {
|
||||
}
|
||||
return rank;
|
||||
}
|
||||
|
||||
public Double getCustomRanking(String cardName) {
|
||||
return getRanking(cardName, "CUSTOM");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user