mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Discard will accept both min and max parameters
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user