diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraft.java b/forge-gui/src/main/java/forge/limited/BoosterDraft.java index 5e1923f91a2..4f8211907c7 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraft.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraft.java @@ -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. */ diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java b/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java index d3309bff9f4..27a4cb9d235 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraftAI.java @@ -78,7 +78,7 @@ public class BoosterDraftAI { final ColorSet currentChoice = deckCols.getChosenColors(); final boolean canAddMoreColors = deckCols.canChoseMoreColors(); - final List> rankedCards = rankCards(chooseFrom); + final List> rankedCards = rankCards(chooseFrom, bd.CUSTOM_RANKINGS_FILE[0]); for (final Pair p : rankedCards) { double valueBoost = 0; @@ -135,14 +135,23 @@ public class BoosterDraftAI { * List of cards * @return map of rankings */ - private static List> rankCards(final Iterable chooseFrom) { + private static List> rankCards(final Iterable chooseFrom, String customRankings) { final List> rankedCards = new ArrayList>(); 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; diff --git a/forge-gui/src/main/java/forge/limited/CustomLimited.java b/forge-gui/src/main/java/forge/limited/CustomLimited.java index 50cab1921eb..68a6c326c99 100644 --- a/forge-gui/src/main/java/forge/limited/CustomLimited.java +++ b/forge-gui/src/main/java/forge/limited/CustomLimited.java @@ -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(); diff --git a/forge-gui/src/main/java/forge/limited/DraftRankCache.java b/forge-gui/src/main/java/forge/limited/DraftRankCache.java index 0667ded617a..e08bfea4640 100644 --- a/forge-gui/src/main/java/forge/limited/DraftRankCache.java +++ b/forge-gui/src/main/java/forge/limited/DraftRankCache.java @@ -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"); + } } diff --git a/forge-gui/src/main/java/forge/limited/IBoosterDraft.java b/forge-gui/src/main/java/forge/limited/IBoosterDraft.java index ad01e15f73d..6b252fdf3e0 100644 --- a/forge-gui/src/main/java/forge/limited/IBoosterDraft.java +++ b/forge-gui/src/main/java/forge/limited/IBoosterDraft.java @@ -71,6 +71,8 @@ public interface IBoosterDraft { /** Constant LandSetCode="{}". */ CardEdition[] LAND_SET_CODE = { null }; + String[] CUSTOM_RANKINGS_FILE = { null }; + boolean isPileDraft(); } diff --git a/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java index add9897b2eb..5ecaf515d12 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java @@ -727,7 +727,19 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { protected List> rankCards(final Iterable cards) { final List> ranked = new ArrayList>(); 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 { diff --git a/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java b/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java index b53dcd47370..1501a0914bd 100644 --- a/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java +++ b/forge-gui/src/main/java/forge/limited/ReadDraftRankings.java @@ -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(); + this.draftRankings = this.readFile(FileUtil.readFile(ForgeConstants.DRAFT_DIR + customFile)); + } + /** *

* readFile. @@ -100,4 +105,8 @@ public class ReadDraftRankings { } return rank; } + + public Double getCustomRanking(String cardName) { + return getRanking(cardName, "CUSTOM"); + } }