diff --git a/src/main/java/forge/card/ability/effects/DiscardEffect.java b/src/main/java/forge/card/ability/effects/DiscardEffect.java index 2f1e216e781..b9453d61a93 100644 --- a/src/main/java/forge/card/ability/effects/DiscardEffect.java +++ b/src/main/java/forge/card/ability/effects/DiscardEffect.java @@ -201,12 +201,12 @@ public class DiscardEffect extends RevealEffectBase { } if (mode.startsWith("Reveal") && p != chooser) - chooser.getController().reveal("Revealed " + p + " hand", dPHand, ZoneType.Hand, p); + chooser.getGame().getAction().reveal(dPHand, p); - int minDiscardAmount = sa.hasParam("AnyNumber") || sa.hasParam("Optional") ? 0 : numCards; - int max = Math.min(validCards.size(), minDiscardAmount); + int min = sa.hasParam("AnyNumber") || sa.hasParam("Optional") ? 0 : numCards; + int max = Math.min(validCards.size(), numCards); - List toBeDiscarded = validCards.isEmpty() ? CardLists.emptyList : chooser.getController().chooseCardsToDiscardFrom(p, sa, validCards, max); + List toBeDiscarded = validCards.isEmpty() ? CardLists.emptyList : chooser.getController().chooseCardsToDiscardFrom(p, sa, validCards, min, max); if (mode.startsWith("Reveal") ) { p.getController().reveal(chooser + " has chosen", toBeDiscarded, ZoneType.Hand, p); diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index 4b36151e2dd..31715f92cde 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -467,7 +467,14 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private boolean canPlayAndPayFor(final SpellAbility sa) { - return sa.canPlay() && sa.canPlayAI() && ComputerUtilCost.canPayCost(sa, player); + boolean canPlay = sa.canPlay(); + if (!canPlay) + return false; + //System.out.printf("Ai thinks of %s @ %s >>> ", sa, sa.getActivatingPlayer().getGame().getPhaseHandler().debugPrintState()); + boolean aiWouldPlay = sa.canPlayAI(); + boolean canPay = ComputerUtilCost.canPayCost(sa, player); + //System.out.printf("wouldPlay: %s, canPay: %s%n", aiWouldPlay, canPay); + return aiWouldPlay && canPay; } // not sure "playing biggest spell" matters? @@ -534,12 +541,12 @@ public class AiController { if ((uTypes != null) && (sa != null)) { hand = CardLists.getValidCards(hand, uTypes, sa.getActivatingPlayer(), sa.getSourceCard()); } - return getCardsToDiscard(numDiscard, hand, sa); + return getCardsToDiscard(numDiscard, numDiscard, hand, sa); } - public List getCardsToDiscard(final int numDiscard, final List validCards, final SpellAbility sa) { + public List getCardsToDiscard(final int min, final int max, final List validCards, final SpellAbility sa) { - if (validCards.size() < numDiscard) { + if (validCards.size() < min) { return null; } @@ -551,7 +558,7 @@ public class AiController { } // look for good discards - while (count < numDiscard) { + while (count < min) { Card prefCard = null; if (sa != null && sa.getActivatingPlayer() != null && sa.getActivatingPlayer().isOpponentOf(player)) { for (Card c : validCards) { @@ -574,7 +581,7 @@ public class AiController { } } - final int discardsLeft = numDiscard - count; + final int discardsLeft = min - count; // choose rest for (int i = 0; i < discardsLeft; i++) { @@ -778,9 +785,11 @@ public class AiController { if (!player.isUnlimitedHandSize()) { int max = Math.min(player.getZone(ZoneType.Hand).size(), size - player.getMaxHandSize()); - final List toDiscard = player.getAi().getCardsToDiscard(max, (String[])null, null); - for (int i = 0; i < toDiscard.size(); i++) { - player.discard(toDiscard.get(i), null); + if( max > 0) { + final List toDiscard = player.getAi().getCardsToDiscard(max, (String[])null, null); + for (int i = 0; i < toDiscard.size(); i++) { + player.discard(toDiscard.get(i), null); + } } game.getStack().chooseOrderOfSimultaneousStackEntryAll(); } diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index 5b218e2d817..995e551a74b 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -1217,7 +1217,7 @@ public class ComputerUtil { * @param min * @return */ - public static List getCardsToDiscardFromOpponent(AIPlayer chooser, Player discarder, SpellAbility sa, List validCards, int min) { + public static List getCardsToDiscardFromOpponent(AIPlayer chooser, Player discarder, SpellAbility sa, List validCards, int min, int max) { List goodChoices = CardLists.filter(validCards, new Predicate() { @Override public boolean apply(final Card c) { @@ -1258,11 +1258,11 @@ public class ComputerUtil { * @param min * @return */ - public static List getCardsToDiscardFromFriend(AIPlayer aiChooser, Player p, SpellAbility sa, List validCards, int min) { + public static List getCardsToDiscardFromFriend(AIPlayer aiChooser, Player p, SpellAbility sa, List validCards, int min, int max) { if (p instanceof AIPlayer) { // ask that ai player what he would like to discard - return ((AIPlayer) p).getAi().getCardsToDiscard(min, validCards, sa); + return ((AIPlayer) p).getAi().getCardsToDiscard(min, max, validCards, sa); } // no special options for human or remote friends - return getCardsToDiscardFromOpponent(aiChooser, p, sa, validCards, min); + return getCardsToDiscardFromOpponent(aiChooser, p, sa, validCards, min, max); } } diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 5c34f535821..34b605fb24b 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -113,7 +113,7 @@ public abstract class PlayerController { public abstract boolean willPutCardOnTop(Card c); /** p = target player, validCards - possible discards, min cards to discard */ - public abstract List chooseCardsToDiscardFrom(Player p, SpellAbility sa, List validCards, int min); + public abstract List chooseCardsToDiscardFrom(Player playerDiscard, SpellAbility sa, List validCards, int min, int max); public abstract Card chooseCardToDredge(List dredgers); public abstract void playMiracle(SpellAbility miracle, Card card); diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index f405302cec1..dc1c246c42d 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -220,12 +220,12 @@ public class PlayerControllerAi extends PlayerController { } @Override - public List chooseCardsToDiscardFrom(Player p, SpellAbility sa, List validCards, int min) { + public List chooseCardsToDiscardFrom(Player p, SpellAbility sa, List validCards, int min, int max) { boolean isTargetFriendly = !p.isOpponentOf(getPlayer()); return isTargetFriendly - ? ComputerUtil.getCardsToDiscardFromFriend(player, p, sa, validCards, min) - : ComputerUtil.getCardsToDiscardFromOpponent(player, p, sa, validCards, min); + ? ComputerUtil.getCardsToDiscardFromFriend(player, p, sa, validCards, min, max) + : ComputerUtil.getCardsToDiscardFromOpponent(player, p, sa, validCards, min, max); } @Override diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index d6a5825d9bb..32fc4b4da69 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -324,14 +324,13 @@ public class PlayerControllerHuman extends PlayerController { } @Override - public List chooseCardsToDiscardFrom(Player p, SpellAbility sa, List valid, int minDiscard) { + public List chooseCardsToDiscardFrom(Player p, SpellAbility sa, List valid, int min, int max) { if ( p != getPlayer() ) { - int cntToKeepInHand = minDiscard == 0 ? -1 : valid.size() - minDiscard; + int cntToKeepInHand = min == 0 ? -1 : valid.size() - min; return GuiChoose.order("Choose cards to Discard", "Discarded", cntToKeepInHand, valid, null, null); } - int max = minDiscard == 0 ? Integer.MAX_VALUE : minDiscard; - InputSelectCards inp = new InputSelectCardsFromList(minDiscard, max, valid); + InputSelectCards inp = new InputSelectCardsFromList(min, max, valid); inp.setMessage("Discard %d cards"); FThreads.setInputAndWait(inp); return inp.getSelected();