diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index b8f453128c8..9c2e29a01e7 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -30,21 +30,12 @@ package mage.player.ai; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; -import java.util.TreeMap; -import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; + +import mage.Constants; import mage.Constants.CardType; import mage.Constants.Outcome; import mage.Constants.RangeOfInfluence; @@ -118,6 +109,8 @@ public class ComputerPlayer> extends PlayerImpl i private transient List playableNonInstant = new ArrayList(); private transient List playableInstant = new ArrayList(); private transient List playableAbilities = new ArrayList(); + private transient List pickedCards; + private transient List chosenColors; public ComputerPlayer(String name, RangeOfInfluence range) { super(name, range); @@ -797,19 +790,108 @@ public class ComputerPlayer> extends PlayerImpl i Card bestCard = null; int maxScore = 0; for (Card card : cards) { - int score = RateCard.rateCard(card, null); + int score = RateCard.rateCard(card, chosenColors); if (bestCard == null || score > maxScore) { maxScore = score; bestCard = card; } } - System.out.println("[DEBUG] AI picked: " + bestCard.getName() + ", score=" + maxScore); + String colors = "not chosen yet"; + // remember card if colors are not chosen yet + if (chosenColors == null) { + rememberPick(bestCard, maxScore); + chosenColors = chooseDeckColorsIfPossible(); + } + if (chosenColors != null) { + colors = ""; + for (Constants.ColoredManaSymbol symbol : chosenColors) { + colors += symbol.toString(); + } + } + System.out.println("[DEBUG] AI picked: " + bestCard.getName() + ", score=" + maxScore + ", deck colors=" + colors); draft.addPick(playerId, bestCard.getId()); } catch (Exception e) { + e.printStackTrace(); draft.addPick(playerId, cards.get(0).getId()); } } + /** + * Remember picked card with its score. + * + * @param card + * @param score + */ + protected void rememberPick(Card card, int score) { + if (pickedCards == null) { + pickedCards = new ArrayList(); + } + pickedCards.add(new PickedCard(card, score)); + } + + /** + * Choose 2 deck colors for draft: + * 1. there should be at least 3 cards in card pool + * 2. at least 2 cards should have different colors + * 3. get card colors as chosen starting from most rated card + */ + protected List chooseDeckColorsIfPossible() { + if (pickedCards.size() > 2) { + // sort by score and color mana symbol count in descending order + Collections.sort(pickedCards, new Comparator() { + @Override + public int compare(PickedCard o1, PickedCard o2) { + if (o1.score.equals(o2.score)) { + Integer i1 = RateCard.getColorManaCount(o1.card); + Integer i2 = RateCard.getColorManaCount(o2.card); + return -i1.compareTo(i2); + } + return -o1.score.compareTo(o2.score); + } + }); + Set chosenSymbols = new HashSet(); + for (PickedCard picked : pickedCards) { + int differentColorsInCost = RateCard.getDifferentColorManaCount(picked.card); + // choose only color card, but only if they are not too gold + if (differentColorsInCost > 0 && differentColorsInCost < 3) { + // if some colors were already chosen, total amount shouldn't be more than 3 + if (chosenSymbols.size() + differentColorsInCost < 4) { + for (String symbol : picked.card.getManaCost().getSymbols()) { + symbol = symbol.replace("{", "").replace("}", ""); + if (RateCard.isColoredMana(symbol)) { + chosenSymbols.add(symbol); + } + } + } + } + // only two or three color decks are allowed + if (chosenSymbols.size() > 1 && chosenSymbols.size() < 4) { + List chosenColors = new ArrayList(); + for (String symbol : chosenSymbols) { + Constants.ColoredManaSymbol manaSymbol = Constants.ColoredManaSymbol.lookup(symbol.charAt(0)); + if (manaSymbol != null) { + chosenColors.add(manaSymbol); + } + } + if (chosenColors.size() > 1) { + // no need to remember picks anymore + pickedCards = null; + return chosenColors; + } + } + } + } + return null; + } + + private class PickedCard { + public Card card; + public Integer score; + public PickedCard(Card card, int score) { + this.card = card; this.score = score; + } + } + protected Attackers getPotentialAttackers(Game game) { logger.fine("getAvailableAttackers"); Attackers attackers = new Attackers(); diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/utils/RateCard.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/utils/RateCard.java index 1e44bdece4b..9c40724eb0d 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/utils/RateCard.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/utils/RateCard.java @@ -4,10 +4,7 @@ import mage.Constants; import mage.cards.Card; import java.io.InputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Scanner; +import java.util.*; /** * Class responsible for reading ratings from resources and rating gived cards. @@ -162,8 +159,45 @@ public class RateCard { * @param symbol * @return */ - private static boolean isColoredMana(String symbol) { - return symbol.equals("W") || symbol.equals("G") || symbol.equals("U") || symbol.equals("B") || symbol.equals("R"); + public static boolean isColoredMana(String symbol) { + String s = symbol; + if (s.length() > 1) { + s = s.replace("{","").replace("}",""); + } + if (s.length() > 1) { + return false; + } + return s.equals("W") || s.equals("G") || s.equals("U") || s.equals("B") || s.equals("R"); } + /** + * Return number of color mana symbols in manacost. + * @param card + * @return + */ + public static int getColorManaCount(Card card) { + int count = 0; + for (String symbol : card.getManaCost().getSymbols()) { + if (isColoredMana(symbol)) { + count++; + } + } + return count; + } + + /** + * Return number of different color mana symbols in manacost. + * @param card + * @return + */ + public static int getDifferentColorManaCount(Card card) { + Set symbols = new HashSet(); + for (String symbol : card.getManaCost().getSymbols()) { + if (isColoredMana(symbol)) { + symbols.add(symbol); + } + } + return symbols.size(); + } + } diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index ae4028c3bac..7a6e68eb731 100644 Binary files a/Mage.Server/plugins/mage-player-ai.jar and b/Mage.Server/plugins/mage-player-ai.jar differ