diff --git a/Mage.Sets/src/mage/sets/Sets.java b/Mage.Sets/src/mage/sets/Sets.java index df3c0afa8b2..0c402de5b0f 100644 --- a/Mage.Sets/src/mage/sets/Sets.java +++ b/Mage.Sets/src/mage/sets/Sets.java @@ -38,9 +38,13 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import mage.Constants.CardType; +import mage.Constants.ColoredManaSymbol; +import mage.Mana; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.ExpansionSet; +import mage.cards.decks.Deck; import mage.cards.decks.DeckCardLists; import mage.util.Logging; @@ -53,6 +57,7 @@ public class Sets extends HashMap { private final static Logger logger = Logging.getLogger(Sets.class.getName()); private static final Sets fINSTANCE = new Sets(); private static Set names; + private static List cards; protected static Random rnd = new Random(); public static Sets getInstance() { @@ -61,6 +66,7 @@ public class Sets extends HashMap { private Sets() { names = new TreeSet(); + cards = new ArrayList(); this.addSet(AlaraReborn.getInstance()); this.addSet(Conflux.getInstance()); this.addSet(Dissension.getInstance()); @@ -83,6 +89,7 @@ public class Sets extends HashMap { private void addSet(ExpansionSet set) { this.put(set.getCode(), set); for (Card card: set.getCards()) { + cards.add(card); names.add(card.getName()); } } @@ -91,6 +98,97 @@ public class Sets extends HashMap { return names; } + public static Card getRandomCard() { + return cards.get(rnd.nextInt(cards.size())); + } + + /** + * Generates card pool of cardsCount cards that have manacost of allowed colors. + * + * @param cardsCount + * @param allowedColors + * @return + */ + public static List generateRandomCardPool(int cardsCount, List allowedColors) { + List cardPool = new ArrayList(); + + int count = 0; + int tries = 0; + while (count < cardsCount) { + Card card = getRandomCard(); + if (!card.getCardType().contains(CardType.LAND)) { + if (cardFitsChosenColors(card, allowedColors)) { + cardPool.add(card); + count++; + } + } + tries++; + if (tries > 4096) { // to avoid infinite loop + throw new IllegalStateException("Not enough cards for chosen colors to generate deck: " + allowedColors); + } + } + + return cardPool; + } + + /** + * Check that card can be played using chosen (allowed) colors. + * + * @param card + * @param allowedColors + * @return + */ + private static boolean cardFitsChosenColors(Card card, List allowedColors) { + if (card.getCardType().contains(CardType.LAND)) { + if (!card.getSupertype().contains("Basic")) { + int score = 0; + for (Mana mana : card.getMana()) { + for (ColoredManaSymbol color : allowedColors) { + score += mana.getColor(color); + } + } + if (score > 1) { + return true; + } + } + } + else { + for (String symbol : card.getManaCost().getSymbols()) { + boolean found = false; + symbol = symbol.replace("{", "").replace("}", ""); + if (isColoredMana(symbol)) { + for (ColoredManaSymbol allowed : allowedColors) { + if (allowed.toString().equals(symbol)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + } + return true; + } + return false; + } + + protected static boolean isColoredMana(String symbol) { + return symbol.equals("W") || symbol.equals("G") || symbol.equals("U") || symbol.equals("B") || symbol.equals("R"); + } + + public static Deck generateDeck() { + List allowedColors = new ArrayList(); + int numColors = rnd.nextInt(2) + 1; + int cardPoolSize = 60; + if (numColors > 2) { + cardPoolSize += 20; + } + Deck deck = new Deck(); + + return deck; + } + public static Card findCard(String name) { for (ExpansionSet set: fINSTANCE.values()) { Card card = set.findCard(name); diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java index 9cf3cf72c26..776ddd692c7 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/PlayGameTest.java @@ -1,36 +1,40 @@ package org.mage.test.serverside; import mage.Constants; -import mage.cards.Card; import mage.cards.decks.Deck; import mage.game.Game; import mage.game.GameException; import mage.game.GameOptions; import mage.game.TwoPlayerDuel; -import mage.game.permanent.PermanentCard; import mage.players.Player; -import mage.server.game.PlayerFactory; import mage.sets.Sets; import org.junit.Test; import org.mage.test.serverside.base.MageTestBase; -import java.io.File; import java.io.FileNotFoundException; -import java.util.*; -import java.util.regex.Matcher; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import mage.Constants.ColoredManaSymbol; +import mage.cards.Card; +import mage.player.ai.ComputerPlayer; /** * @author ayratn */ public class PlayGameTest extends MageTestBase { + private static List colorChoices = Arrays.asList("bu","bg","br","bw","ug","ur","uw","gr","gw","rw","bur","buw","bug","brg","brw","bgw","wur","wug","wrg","rgu"); + @Test public void playOneGame() throws GameException, FileNotFoundException, IllegalArgumentException { Game game = new TwoPlayerDuel(Constants.MultiplayerAttackOption.LEFT, Constants.RangeOfInfluence.ALL); Player computerA = createPlayer("ComputerA", "Computer - minimax hybrid"); // Player computerA = createPlayer("ComputerA", "Computer - mad"); - Deck deck = Deck.load(Sets.loadDeck("RB Aggro.dck")); +// Deck deck = Deck.load(Sets.loadDeck("RB Aggro.dck")); + Deck deck = generateRandomDeck(); if (deck.getCards().size() < 40) { throw new IllegalArgumentException("Couldn't load deck, deck size=" + deck.getCards().size()); @@ -40,18 +44,19 @@ public class PlayGameTest extends MageTestBase { Player computerB = createPlayer("ComputerB", "Computer - minimax hybrid"); // Player computerB = createPlayer("ComputerB", "Computer - mad"); - Deck deck2 = Deck.load(Sets.loadDeck("RB Aggro.dck")); +// Deck deck2 = Deck.load(Sets.loadDeck("RB Aggro.dck")); + Deck deck2 = generateRandomDeck(); if (deck2.getCards().size() < 40) { throw new IllegalArgumentException("Couldn't load deck, deck size=" + deck2.getCards().size()); } game.addPlayer(computerB, deck2); game.loadCards(deck2.getCards(), computerB.getId()); - parseScenario("scenario8.txt"); - game.cheat(computerA.getId(), commandsA); - game.cheat(computerA.getId(), libraryCardsA, handCardsA, battlefieldCardsA, graveyardCardsA); - game.cheat(computerB.getId(), commandsB); - game.cheat(computerB.getId(), libraryCardsB, handCardsB, battlefieldCardsB, graveyardCardsB); +// parseScenario("scenario1.txt"); +// game.cheat(computerA.getId(), commandsA); +// game.cheat(computerA.getId(), libraryCardsA, handCardsA, battlefieldCardsA, graveyardCardsA); +// game.cheat(computerB.getId(), commandsB); +// game.cheat(computerB.getId(), libraryCardsB, handCardsB, battlefieldCardsB, graveyardCardsB); //boolean testMode = false; boolean testMode = true; @@ -68,4 +73,16 @@ public class PlayGameTest extends MageTestBase { throw new RuntimeException("Lost :("); }*/ } + + private Deck generateRandomDeck() { + String selectedColors = colorChoices.get(new Random().nextInt(colorChoices.size())).toUpperCase(); + List allowedColors = new ArrayList(); + logger.info("Building deck with colors: " + selectedColors); + for (int i = 0; i < selectedColors.length(); i++) { + char c = selectedColors.charAt(i); + allowedColors.add(ColoredManaSymbol.lookup(c)); + } + List cardPool = Sets.generateRandomCardPool(45, allowedColors); + return ComputerPlayer.buildDeck(cardPool, allowedColors); + } }