Discard will accept both min and max parameters

This commit is contained in:
Maxmtg
2013-03-31 18:22:24 +00:00
parent 0c62ffa4ce
commit a221a820d0
6 changed files with 33 additions and 25 deletions

View File

@@ -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<Card> toBeDiscarded = validCards.isEmpty() ? CardLists.emptyList : chooser.getController().chooseCardsToDiscardFrom(p, sa, validCards, max);
List<Card> 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);

View File

@@ -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<Card> getCardsToDiscard(final int numDiscard, final List<Card> validCards, final SpellAbility sa) {
public List<Card> getCardsToDiscard(final int min, final int max, final List<Card> 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<Card> 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<Card> 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();
}

View File

@@ -1217,7 +1217,7 @@ public class ComputerUtil {
* @param min
* @return
*/
public static List<Card> getCardsToDiscardFromOpponent(AIPlayer chooser, Player discarder, SpellAbility sa, List<Card> validCards, int min) {
public static List<Card> getCardsToDiscardFromOpponent(AIPlayer chooser, Player discarder, SpellAbility sa, List<Card> validCards, int min, int max) {
List<Card> goodChoices = CardLists.filter(validCards, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
@@ -1258,11 +1258,11 @@ public class ComputerUtil {
* @param min
* @return
*/
public static List<Card> getCardsToDiscardFromFriend(AIPlayer aiChooser, Player p, SpellAbility sa, List<Card> validCards, int min) {
public static List<Card> getCardsToDiscardFromFriend(AIPlayer aiChooser, Player p, SpellAbility sa, List<Card> 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);
}
}

View File

@@ -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<Card> chooseCardsToDiscardFrom(Player p, SpellAbility sa, List<Card> validCards, int min);
public abstract List<Card> chooseCardsToDiscardFrom(Player playerDiscard, SpellAbility sa, List<Card> validCards, int min, int max);
public abstract Card chooseCardToDredge(List<Card> dredgers);
public abstract void playMiracle(SpellAbility miracle, Card card);

View File

@@ -220,12 +220,12 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public List<Card> chooseCardsToDiscardFrom(Player p, SpellAbility sa, List<Card> validCards, int min) {
public List<Card> chooseCardsToDiscardFrom(Player p, SpellAbility sa, List<Card> 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

View File

@@ -324,14 +324,13 @@ public class PlayerControllerHuman extends PlayerController {
}
@Override
public List<Card> chooseCardsToDiscardFrom(Player p, SpellAbility sa, List<Card> valid, int minDiscard) {
public List<Card> chooseCardsToDiscardFrom(Player p, SpellAbility sa, List<Card> 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();