From b386f5f9d72c14e7d2ac43b1c2537c577ec93611 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 2 Jan 2017 05:16:54 +0000 Subject: [PATCH] - Refactored limited deck evaluation into a new class LimitedDeckEvaluator to avoid code duplication. --- .gitattributes | 1 + .../forge/limited/LimitedDeckEvaluator.java | 73 +++++++++++++++++++ .../limited/SealedCardPoolGenerator.java | 45 +----------- .../java/forge/quest/QuestDraftUtils.java | 27 +------ 4 files changed, 77 insertions(+), 69 deletions(-) create mode 100644 forge-gui/src/main/java/forge/limited/LimitedDeckEvaluator.java diff --git a/.gitattributes b/.gitattributes index 393144d9adb..6d3a1ebf60d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -20324,6 +20324,7 @@ forge-gui/src/main/java/forge/limited/DraftRankCache.java -text forge-gui/src/main/java/forge/limited/GauntletMini.java -text forge-gui/src/main/java/forge/limited/IBoosterDraft.java svneol=native#text/plain forge-gui/src/main/java/forge/limited/LimitedDeckBuilder.java -text +forge-gui/src/main/java/forge/limited/LimitedDeckEvaluator.java -text forge-gui/src/main/java/forge/limited/LimitedPlayer.java -text forge-gui/src/main/java/forge/limited/LimitedPlayerAI.java -text forge-gui/src/main/java/forge/limited/LimitedPoolType.java -text diff --git a/forge-gui/src/main/java/forge/limited/LimitedDeckEvaluator.java b/forge-gui/src/main/java/forge/limited/LimitedDeckEvaluator.java new file mode 100644 index 00000000000..bedf6e15592 --- /dev/null +++ b/forge-gui/src/main/java/forge/limited/LimitedDeckEvaluator.java @@ -0,0 +1,73 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.limited; + +import forge.deck.Deck; +import forge.item.PaperCard; + +import java.util.Map.Entry; + +/** + * + * @author agetian + */ +public class LimitedDeckEvaluator { + + public static double getDeckDraftValue(Deck d) { + double value = 0; + double divider = 0; + + if (d.getMain().isEmpty()) { + return 0; + } + + double best = 1.0; + + for (Entry kv : d.getMain()) { + PaperCard evalCard = kv.getKey(); + int count = kv.getValue(); + if (DraftRankCache.getRanking(evalCard.getName(), evalCard.getEdition()) != null) { + double add = DraftRankCache.getRanking(evalCard.getName(), evalCard.getEdition()); + // System.out.println(evalCard.getName() + " is worth " + add); + value += add * count; + divider += count; + if (best > add) { + best = add; + } + } + } + + if (divider == 0 || value == 0) { + return 0; + } + + value /= divider; + + return (20.0 / (best + (2 * value))); + } + + public static class LimitedDeckComparer implements java.util.Comparator { + @Override + public int compare(Deck o1, Deck o2) { + double delta = getDeckDraftValue(o1) - getDeckDraftValue(o2); + if ( delta > 0 ) return 1; + if ( delta < 0 ) return -1; + return 0; + } + } +} diff --git a/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java b/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java index 9d530ab4f10..5b1d0bc2717 100644 --- a/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java +++ b/forge-gui/src/main/java/forge/limited/SealedCardPoolGenerator.java @@ -136,7 +136,7 @@ public class SealedCardPoolGenerator { } // Rank the AI decks - sealed.rankAiDecks(new SealedDeckComparer()); + sealed.rankAiDecks(new LimitedDeckEvaluator.LimitedDeckComparer()); FModel.getDecks().getSealed().add(sealed); return sealed; @@ -465,47 +465,4 @@ public class SealedCardPoolGenerator { public boolean isEmpty() { return product.isEmpty(); } - - private static class SealedDeckComparer implements java.util.Comparator { - public double getDraftValue(Deck d) { - double value = 0; - double divider = 0; - - if (d.getMain().isEmpty()) { - return 0; - } - - double best = 1.0; - - for (Entry kv : d.getMain()) { - PaperCard evalCard = kv.getKey(); - int count = kv.getValue(); - if (DraftRankCache.getRanking(evalCard.getName(), evalCard.getEdition()) != null) { - double add = DraftRankCache.getRanking(evalCard.getName(), evalCard.getEdition()); - // System.out.println(evalCard.getName() + " is worth " + add); - value += add * count; - divider += count; - if (best > add) { - best = add; - } - } - } - - if (divider == 0 || value == 0) { - return 0; - } - - value /= divider; - - return (20.0 / (best + (2 * value))); - } - - @Override - public int compare(Deck o1, Deck o2) { - double delta = getDraftValue(o1) - getDraftValue(o2); - if ( delta > 0 ) return 1; - if ( delta < 0 ) return -1; - return 0; - } - } } diff --git a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java index 396f19b7a30..16b8237d944 100644 --- a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java +++ b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java @@ -14,6 +14,7 @@ import forge.game.player.RegisteredPlayer; import forge.interfaces.IGuiGame; import forge.item.PaperCard; import forge.limited.DraftRankCache; +import forge.limited.LimitedDeckEvaluator; import forge.match.HostedMatch; import forge.model.FModel; import forge.player.GamePlayerUtil; @@ -421,31 +422,7 @@ public class QuestDraftUtils { DeckGroup draftDecks = FModel.getQuest().getDraftDecks().get(QuestEventDraft.DECK_NAME); Deck d = sid.equals(QuestEventDraft.HUMAN) ? draftDecks.getHumanDeck() : draftDecks.getAiDecks().get(Integer.parseInt(sid) - 1); - double value = 0; - double divider = 0; - - double best = 1.0; - - for (Entry kv : d.getMain()) { - PaperCard evalCard = kv.getKey(); - int count = kv.getValue(); - if (DraftRankCache.getRanking(evalCard.getName(), evalCard.getEdition()) != null) { - double add = DraftRankCache.getRanking(evalCard.getName(), evalCard.getEdition()); - value += add * count; - divider += count; - if (best > add) { - best = add; - } - } - } - - if (divider == 0 || value == 0) { - return 0; - } - - value /= divider; - - return (20.0 / (best + (2 * value))); + return LimitedDeckEvaluator.getDeckDraftValue(d); } public static boolean injectRandomMatchOutcome(boolean simHumanMatches) {