- 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:
Agetian
2016-02-01 07:30:13 +00:00
parent f248236469
commit 6d99d0e773
7 changed files with 58 additions and 5 deletions

View File

@@ -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. */

View File

@@ -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;

View File

@@ -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();

View File

@@ -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");
}
}

View File

@@ -71,6 +71,8 @@ public interface IBoosterDraft {
/** Constant <code>LandSetCode="{}"</code>. */
CardEdition[] LAND_SET_CODE = { null };
String[] CUSTOM_RANKINGS_FILE = { null };
boolean isPileDraft();
}

View File

@@ -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 {

View File

@@ -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");
}
}