mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +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)
|
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 min = sa.hasParam("AnyNumber") || sa.hasParam("Optional") ? 0 : numCards;
|
||||||
int max = Math.min(validCards.size(), minDiscardAmount);
|
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") ) {
|
if (mode.startsWith("Reveal") ) {
|
||||||
p.getController().reveal(chooser + " has chosen", toBeDiscarded, ZoneType.Hand, p);
|
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.)
|
// This is for playing spells regularly (no Cascade/Ripple etc.)
|
||||||
private boolean canPlayAndPayFor(final SpellAbility sa) {
|
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?
|
// not sure "playing biggest spell" matters?
|
||||||
@@ -534,12 +541,12 @@ public class AiController {
|
|||||||
if ((uTypes != null) && (sa != null)) {
|
if ((uTypes != null) && (sa != null)) {
|
||||||
hand = CardLists.getValidCards(hand, uTypes, sa.getActivatingPlayer(), sa.getSourceCard());
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -551,7 +558,7 @@ public class AiController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// look for good discards
|
// look for good discards
|
||||||
while (count < numDiscard) {
|
while (count < min) {
|
||||||
Card prefCard = null;
|
Card prefCard = null;
|
||||||
if (sa != null && sa.getActivatingPlayer() != null && sa.getActivatingPlayer().isOpponentOf(player)) {
|
if (sa != null && sa.getActivatingPlayer() != null && sa.getActivatingPlayer().isOpponentOf(player)) {
|
||||||
for (Card c : validCards) {
|
for (Card c : validCards) {
|
||||||
@@ -574,7 +581,7 @@ public class AiController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final int discardsLeft = numDiscard - count;
|
final int discardsLeft = min - count;
|
||||||
|
|
||||||
// choose rest
|
// choose rest
|
||||||
for (int i = 0; i < discardsLeft; i++) {
|
for (int i = 0; i < discardsLeft; i++) {
|
||||||
@@ -778,10 +785,12 @@ public class AiController {
|
|||||||
|
|
||||||
if (!player.isUnlimitedHandSize()) {
|
if (!player.isUnlimitedHandSize()) {
|
||||||
int max = Math.min(player.getZone(ZoneType.Hand).size(), size - player.getMaxHandSize());
|
int max = Math.min(player.getZone(ZoneType.Hand).size(), size - player.getMaxHandSize());
|
||||||
|
if( max > 0) {
|
||||||
final List<Card> toDiscard = player.getAi().getCardsToDiscard(max, (String[])null, null);
|
final List<Card> toDiscard = player.getAi().getCardsToDiscard(max, (String[])null, null);
|
||||||
for (int i = 0; i < toDiscard.size(); i++) {
|
for (int i = 0; i < toDiscard.size(); i++) {
|
||||||
player.discard(toDiscard.get(i), null);
|
player.discard(toDiscard.get(i), null);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
game.getStack().chooseOrderOfSimultaneousStackEntryAll();
|
game.getStack().chooseOrderOfSimultaneousStackEntryAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1217,7 +1217,7 @@ public class ComputerUtil {
|
|||||||
* @param min
|
* @param min
|
||||||
* @return
|
* @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>() {
|
List<Card> goodChoices = CardLists.filter(validCards, new Predicate<Card>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(final Card c) {
|
public boolean apply(final Card c) {
|
||||||
@@ -1258,11 +1258,11 @@ public class ComputerUtil {
|
|||||||
* @param min
|
* @param min
|
||||||
* @return
|
* @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
|
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
|
// 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);
|
public abstract boolean willPutCardOnTop(Card c);
|
||||||
|
|
||||||
/** p = target player, validCards - possible discards, min cards to discard */
|
/** 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 Card chooseCardToDredge(List<Card> dredgers);
|
||||||
|
|
||||||
public abstract void playMiracle(SpellAbility miracle, Card card);
|
public abstract void playMiracle(SpellAbility miracle, Card card);
|
||||||
|
|||||||
@@ -220,12 +220,12 @@ public class PlayerControllerAi extends PlayerController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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());
|
boolean isTargetFriendly = !p.isOpponentOf(getPlayer());
|
||||||
|
|
||||||
return isTargetFriendly
|
return isTargetFriendly
|
||||||
? ComputerUtil.getCardsToDiscardFromFriend(player, p, sa, validCards, min)
|
? ComputerUtil.getCardsToDiscardFromFriend(player, p, sa, validCards, min, max)
|
||||||
: ComputerUtil.getCardsToDiscardFromOpponent(player, p, sa, validCards, min);
|
: ComputerUtil.getCardsToDiscardFromOpponent(player, p, sa, validCards, min, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -324,14 +324,13 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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() ) {
|
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);
|
return GuiChoose.order("Choose cards to Discard", "Discarded", cntToKeepInHand, valid, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
int max = minDiscard == 0 ? Integer.MAX_VALUE : minDiscard;
|
InputSelectCards inp = new InputSelectCardsFromList(min, max, valid);
|
||||||
InputSelectCards inp = new InputSelectCardsFromList(minDiscard, max, valid);
|
|
||||||
inp.setMessage("Discard %d cards");
|
inp.setMessage("Discard %d cards");
|
||||||
FThreads.setInputAndWait(inp);
|
FThreads.setInputAndWait(inp);
|
||||||
return inp.getSelected();
|
return inp.getSelected();
|
||||||
|
|||||||
Reference in New Issue
Block a user