diff --git a/src/main/java/forge/CardPredicates.java b/src/main/java/forge/CardPredicates.java index d742b7fb525..1731fb4f790 100644 --- a/src/main/java/forge/CardPredicates.java +++ b/src/main/java/forge/CardPredicates.java @@ -163,6 +163,14 @@ public final class CardPredicates { }; } // getColor() + public static final Predicate hasCMC(final int cmc) { + return new Predicate() { + @Override + public boolean apply(final Card c) { + return c.getCMC() == cmc; + } + }; + } public static class Presets { diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index 95c33cd25c4..b2cb5298fe9 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -35,10 +35,12 @@ import forge.CardPredicates; import forge.CardPredicates.Presets; import forge.Constant; import forge.GameEntity; +import forge.card.MagicColor; import forge.card.ability.ApiType; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.CostDiscard; import forge.card.cost.CostPart; +import forge.card.spellability.AbilityManaPart; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellPermanent; @@ -324,15 +326,39 @@ public class AiController { if (landList.isEmpty()) return null; - // play as many lands as you can - int ix = 0; - while (landList.get(ix).isReflectedLand() && ((ix + 1) < landList.size())) { - // Skip through reflected lands. Choose last if they are all - // reflected. - ix++; + //Skip reflected lands. + List unreflectedLands = new ArrayList(landList); + for (Card l : landList) { + if (l.isReflectedLand()) { + unreflectedLands.remove(l); + } } - - Card land = landList.get(ix); + + if (!unreflectedLands.isEmpty()) { + landList = unreflectedLands; + } + + // Choose first land to be able to play a one drop + if (player.getLandsInPlay().isEmpty()) { + List oneDrops = CardLists.filter(player.getCardsIn(ZoneType.Hand), CardPredicates.hasCMC(1)); + for (int i = 0; i < MagicColor.WUBRG.length; i++) { + byte color = MagicColor.WUBRG[i]; + if (!CardLists.filter(oneDrops, CardPredicates.isColor(color)).isEmpty()) { + for (Card land : landList) { + if (land.isType(Constant.Color.BASIC_LANDS.get(i))) + return land; + + for (final SpellAbility m : ComputerUtilMana.getAIPlayableMana(land)) { + AbilityManaPart mp = m.getManaPart(); + if (mp.canProduce(MagicColor.toShortString(color))) { + return land; + } + } + } + } + } + } + //play basic lands that are needed the most if (Iterables.any(landList, CardPredicates.Presets.BASIC_LANDS)) { final List combined = player.getCardsIn(ZoneType.Battlefield); @@ -363,10 +389,8 @@ public class AiController { if (minType != null) { landList = CardLists.getType(landList, minType); } - - land = landList.get(0); } - return land; + return landList.get(0); } // if return true, go to next phase diff --git a/src/main/java/forge/game/ai/ComputerUtilMana.java b/src/main/java/forge/game/ai/ComputerUtilMana.java index 3663581dad9..0fff199c236 100644 --- a/src/main/java/forge/game/ai/ComputerUtilMana.java +++ b/src/main/java/forge/game/ai/ComputerUtilMana.java @@ -697,7 +697,7 @@ public class ComputerUtilMana { * * @return a {@link java.util.ArrayList} object. */ - private static final ArrayList getAIPlayableMana(Card c) { + public static final ArrayList getAIPlayableMana(Card c) { final ArrayList res = new ArrayList(); for (final SpellAbility a : c.getManaAbility()) {