diff --git a/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java b/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java index 0d4a25c057e..f64067b6bf0 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/AddLandDialog.java @@ -37,6 +37,7 @@ package mage.client.dialog; import java.util.LinkedList; import java.util.List; import java.util.Random; +import java.util.Set; import javax.swing.JLayeredPane; import mage.Constants; import mage.cards.Card; @@ -55,7 +56,7 @@ import mage.client.MageFrame; public class AddLandDialog extends MageDialog { private Deck deck; - private List setCodesland; + private Set setCodesland; /** Creates new form AddLandDialog */ public AddLandDialog() { @@ -65,33 +66,7 @@ public class AddLandDialog extends MageDialog { public void showDialog(Deck deck) { this.deck = deck; - - // find setCodes with basic lands from cards of the deck - List setCodes = new LinkedList(); - for (Card card: this.deck.getCards()) { - if (!setCodes.contains(card.getExpansionSetCode())) { - setCodes.add(card.getExpansionSetCode()); - } - } - for (Card card: this.deck.getSideboard()) { - if (!setCodes.contains(card.getExpansionSetCode())) { - setCodes.add(card.getExpansionSetCode()); - } - } - List landSets = new LinkedList(); - if (!setCodes.isEmpty()) { - // Add parent sets with the basic lands if the setlist don't include them - for (String setCode: setCodes) { - ExpansionSet expansionSet = Sets.findSet(setCode); - if (expansionSet.hasBasicLands()) { - landSets.add(setCode); - } else if (expansionSet.getParentSet() != null && !landSets.contains(expansionSet.getParentSet().getCode())) { - landSets.add(expansionSet.getParentSet().getCode()); - } - } - } - this.setCodesland = landSets; - + this.setCodesland = Sets.getSetsWithBasicLandsAsCodes(deck.getExpansionSetCodes()); MageFrame.getDesktop().add(this, JLayeredPane.PALETTE_LAYER); this.setVisible(true); 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 ab1a24dd636..cd3e549ce91 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 @@ -84,6 +84,8 @@ import java.io.IOException; import java.io.Serializable; import java.util.*; import java.util.Map.Entry; +import mage.cards.Sets; +import mage.cards.repository.CardCriteria; /** * @@ -1170,7 +1172,15 @@ public class ComputerPlayer> extends PlayerImpl i private static void addBasicLands(Deck deck, String landName, int number) { Random random = new Random(); - List cards = CardRepository.instance.findCards(landName); + Set landSets = Sets.getSetsWithBasicLandsAsCodes(deck.getExpansionSetCodes()); + + CardCriteria criteria = new CardCriteria(); + if (!landSets.isEmpty()) { + criteria.setCodes(landSets.toArray(new String[landSets.size()])); + } + criteria.rarities(Constants.Rarity.LAND).name(landName); + List cards = CardRepository.instance.findCards(criteria); + if (cards.isEmpty()) { return; } @@ -1208,29 +1218,46 @@ public class ComputerPlayer> extends PlayerImpl i mana.add(card.getManaCost().getMana()); } double total = mana.getBlack() + mana.getBlue() + mana.getGreen() + mana.getRed() + mana.getWhite(); + int mostLand = 0; + String mostLandName = "Forest"; if (mana.getGreen() > 0) { int number = (int) Math.round(mana.getGreen() / total * 17); addBasicLands(deck, "Forest", number); + mostLand = number; } if (mana.getBlack() > 0) { int number = (int) Math.round(mana.getBlack() / total * 17); addBasicLands(deck, "Swamp", number); + if (number > mostLand) { + mostLand = number; + mostLandName = "Swamp"; + } } if (mana.getBlue() > 0) { int number = (int) Math.round(mana.getBlue() / total * 17); addBasicLands(deck, "Island", number); + if (number > mostLand) { + mostLand = number; + mostLandName = "Island"; + } } if (mana.getWhite() > 0) { int number = (int) Math.round(mana.getWhite() / total * 17); addBasicLands(deck, "Plains", number); + if (number > mostLand) { + mostLand = number; + mostLandName = "Plains"; + } } if (mana.getRed() > 0) { int number = (int) Math.round(mana.getRed() / total * 17); addBasicLands(deck, "Mountain", number); + if (number > mostLand) { + mostLandName = "Plains"; + } } - //TODO: improve this - addBasicLands(deck, "Forest", 40 - deck.getCards().size()); + addBasicLands(deck, mostLandName, 40 - deck.getCards().size()); return deck; } diff --git a/Mage/src/mage/cards/Sets.java b/Mage/src/mage/cards/Sets.java index 655294a7bb0..0c6c0181e53 100644 --- a/Mage/src/mage/cards/Sets.java +++ b/Mage/src/mage/cards/Sets.java @@ -194,5 +194,28 @@ public class Sets extends HashMap { return boosterSets.toArray(new ExpansionSet[0]); } + /** + * Gives back the set codes from the sets that include basic lands. + * If the input set itself does not incluse basic lands, but it has a parent set, + * only this parent set code is added to the return sets. + * + * @param setCodes + * @return - setCodes that have basic lands + */ + public static Set getSetsWithBasicLandsAsCodes(Set setCodes) { + Set landSets = new LinkedHashSet(); + if (setCodes != null && !setCodes.isEmpty()) { + // Add parent sets with the basic lands if the setlist don't include them + for (String setCode: setCodes) { + ExpansionSet expansionSet = Sets.findSet(setCode); + if (expansionSet.hasBasicLands()) { + landSets.add(setCode); + } else if (expansionSet.getParentSet() != null && !landSets.contains(expansionSet.getParentSet().getCode())) { + landSets.add(expansionSet.getParentSet().getCode()); + } + } + } + return landSets; + } } diff --git a/Mage/src/mage/cards/decks/Deck.java b/Mage/src/mage/cards/decks/Deck.java index fb9578273e2..4a108f05814 100644 --- a/Mage/src/mage/cards/decks/Deck.java +++ b/Mage/src/mage/cards/decks/Deck.java @@ -28,10 +28,12 @@ package mage.cards.decks; -import mage.cards.*; import java.io.Serializable; import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; import java.util.Set; +import mage.cards.*; import mage.game.GameException; public class Deck implements Serializable { @@ -49,20 +51,24 @@ public class Deck implements Serializable { deck.setName(deckCardLists.getName()); for (String cardName: deckCardLists.getCards()) { Card card = CardImpl.createCard(cardName); - if (card != null) + if (card != null) { deck.cards.add(CardImpl.createCard(cardName)); + } else { - if (!ignoreErrors) + if (!ignoreErrors) { throw new GameException("Error loading card - " + cardName + " for deck - " + deck.getName()); + } } } for (String cardName: deckCardLists.getSideboard()) { Card card = CardImpl.createCard(cardName); - if (card != null) + if (card != null) { deck.sideboard.add(CardImpl.createCard(cardName)); + } else { - if (!ignoreErrors) + if (!ignoreErrors) { throw new GameException("Error loading card - " + cardName + " for deck - " + deck.getName()); + } } } @@ -83,6 +89,21 @@ public class Deck implements Serializable { return deckCardLists; } + public Set getExpansionSetCodes() { + Set sets = new LinkedHashSet(); + for (Card card : getCards()) { + if (!sets.contains(card.getExpansionSetCode())) { + sets.add(card.getExpansionSetCode()); + } + } + for (Card card : getSideboard()) { + if (!sets.contains(card.getExpansionSetCode())) { + sets.add(card.getExpansionSetCode()); + } + } + return sets; + } + /** * @return the name */