diff --git a/src/main/java/forge/card/ability/effects/SacrificeEffect.java b/src/main/java/forge/card/ability/effects/SacrificeEffect.java index d53745f49a8..e9a8eaf28d9 100644 --- a/src/main/java/forge/card/ability/effects/SacrificeEffect.java +++ b/src/main/java/forge/card/ability/effects/SacrificeEffect.java @@ -61,7 +61,9 @@ public class SacrificeEffect extends SpellAbilityEffect { choosenToSacrifice = Aggregates.random(validTargets, Math.min(amount, validTargets.size())); } else { boolean isOptional = sa.hasParam("Optional"); - choosenToSacrifice = p.getController().choosePermanentsToSacrifice(validTargets, valid, amount, sa, destroy, isOptional, false); + choosenToSacrifice = destroy ? + p.getController().choosePermanentsToDestroy(sa, isOptional ? 0 : amount, amount, validTargets, valid) : + p.getController().choosePermanentsToSacrifice(sa, isOptional ? 0 : amount, amount, validTargets, valid); } for(Card sac : choosenToSacrifice) { diff --git a/src/main/java/forge/card/mana/ManaCostBeingPaid.java b/src/main/java/forge/card/mana/ManaCostBeingPaid.java index 4d90a2fbd7a..74abb4dd35a 100644 --- a/src/main/java/forge/card/mana/ManaCostBeingPaid.java +++ b/src/main/java/forge/card/mana/ManaCostBeingPaid.java @@ -665,8 +665,9 @@ public class ManaCostBeingPaid { List canOffer = CardLists.filter(spell.getActivatingPlayer().getCardsIn(ZoneType.Battlefield), CardPredicates.isType(offeringType)); - final List toSacList = sa.getSourceCard().getController().getController().choosePermanentsToSacrifice(canOffer, - offeringType, 1, spell, false, false, true); + final List toSacList = sa.getSourceCard().getController().getController().choosePermanentsToSacrifice(spell, 0, 1, canOffer, + offeringType); + if (!toSacList.isEmpty()) { toSac = toSacList.get(0); } else { diff --git a/src/main/java/forge/game/Game.java b/src/main/java/forge/game/Game.java index efe7973f811..c8bcf28f64e 100644 --- a/src/main/java/forge/game/Game.java +++ b/src/main/java/forge/game/Game.java @@ -19,7 +19,6 @@ package forge.game; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index 4c03795dec5..063dd5fdd1e 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -1048,7 +1048,7 @@ public class CombatUtil { final Player opponent = game.getCombat().getDefendingPlayerRelatedTo(c).get(0); //List list = AbilityUtils.filterListByType(opponent.getCardsIn(ZoneType.Battlefield), "Permanent", this); final List list = opponent.getCardsIn(ZoneType.Battlefield); - List toSac = opponent.getController().choosePermanentsToSacrifice(list, "Card", a, this, false, false, false); + List toSac = opponent.getController().choosePermanentsToSacrifice(this, a, a, list, "Card"); for(Card sacd : toSac) { game.getAction().sacrifice(sacd, this); diff --git a/src/main/java/forge/game/phase/Upkeep.java b/src/main/java/forge/game/phase/Upkeep.java index 80f4c12c43e..6db1a4b1828 100644 --- a/src/main/java/forge/game/phase/Upkeep.java +++ b/src/main/java/forge/game/phase/Upkeep.java @@ -455,7 +455,7 @@ public class Upkeep extends Phase { lowest.add(c); } - List toSac = player.getController().choosePermanentsToSacrifice(lowest, "Select creature with power: " + power + " to destroy.", 1, this, true, false, false); + List toSac = player.getController().choosePermanentsToDestroy(this, 1, 1, lowest, "Select creature with power: " + power + " to destroy."); game.getAction().destroyNoRegeneration(toSac.get(0), this); } } // resolve diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index 50de157d8ef..3f7607ab1d4 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -90,7 +90,8 @@ public abstract class PlayerController { public abstract Map assignCombatDamage(Card attacker, List blockers, int damageDealt, GameEntity defender); public abstract Integer announceRequirements(SpellAbility ability, String announce, boolean allowZero); - public abstract List choosePermanentsToSacrifice(List validTargets, String validMessage, int amount, SpellAbility sa, boolean destroy, boolean isOptional, boolean canCancel); + public abstract List choosePermanentsToSacrifice(SpellAbility sa, int min, int max, List validTargets, String message); + public abstract List choosePermanentsToDestroy(SpellAbility sa, int min, int max, List validTargets, String message); public abstract Target chooseTargets(SpellAbility ability); public Card chooseSingleCardForEffect(List sourceList, SpellAbility sa, String title) { return chooseSingleCardForEffect(sourceList, sa, title, false); } diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index 66fcb6da1c1..594f3341ca0 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -118,10 +118,16 @@ public class PlayerControllerAi extends PlayerController { } @Override - public List choosePermanentsToSacrifice(List validTargets, String validMessage, int amount, SpellAbility sa, boolean destroy, boolean isOptional, boolean canCancel) { - return ComputerUtil.choosePermanentsToSacrifice(player, validTargets, amount, sa, destroy, isOptional); + public List choosePermanentsToSacrifice(SpellAbility sa, int min, int max, List validTargets, String message) { + return ComputerUtil.choosePermanentsToSacrifice(player, validTargets, max, sa, false, min == 0); } + @Override + public List choosePermanentsToDestroy(SpellAbility sa, int min, int max, List validTargets, String message) { + return ComputerUtil.choosePermanentsToSacrifice(player, validTargets, max, sa, true, min == 0); + } + + @Override public Card chooseSingleCardForEffect(List options, SpellAbility sa, String title, boolean isOptional) { return getAi().chooseSingleCardForEffect(options, sa, title, isOptional); diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 1cbf18b4c98..ea373e217ea 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -11,6 +11,8 @@ import javax.swing.JOptionPane; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import com.google.common.collect.Lists; + import forge.Card; import forge.GameEntity; import forge.Singletons; @@ -202,34 +204,33 @@ public class PlayerControllerHuman extends PlayerController { if (val == 0 && canChooseZero || val > 0) return val; } - JOptionPane.showMessageDialog(null, "You have to enter a valid number", "Announce value", JOptionPane.WARNING_MESSAGE); + GuiDialog.message("You have to enter a valid number", "Announce value"); } } - /* (non-Javadoc) - * @see forge.game.player.PlayerController#choosePermanentsToSacrifice(java.util.List, int, forge.card.spellability.SpellAbility, boolean, boolean) - */ + @Override - public List choosePermanentsToSacrifice(List validTargets, String validMessage, int amount, SpellAbility sa, boolean destroy, boolean isOptional, boolean canCancel) { - int max = Math.min(amount, validTargets.size()); + public List choosePermanentsToSacrifice(SpellAbility sa, int min, int max, List valid, String message) { + String outerMessage = "Select %d " + message + "(s) to sacrifice"; + return choosePermanentsTo(min, max, valid, outerMessage); + } + + @Override + public List choosePermanentsToDestroy(SpellAbility sa, int min, int max, List valid, String message) { + String outerMessage = "Select %d " + message + "(s) to be destroyed"; + return choosePermanentsTo(min, max, valid, outerMessage); + } + + private List choosePermanentsTo(int min, int max, List valid, String outerMessage) { + max = Math.min(max, valid.size()); if (max <= 0) return new ArrayList(); - - int min = isOptional ? 0 : amount; - if (min > max) { - min = max; - } - InputSelectCards inp = new InputSelectCardsFromList(min, max, validTargets); - // TODO: Either compose a message here, or pass it as parameter from caller. - inp.setMessage("Select %d " + validMessage + "(s) to sacrifice"); - inp.setCancelAllowed(canCancel); - + InputSelectCards inp = new InputSelectCardsFromList(min == 0 ? 1 : min, max, valid); + inp.setMessage(outerMessage); + inp.setCancelAllowed(min == 0); Singletons.getControl().getInputQueue().setInputAndWait(inp); - if (inp.hasCancelled()) { - return new ArrayList(); - } - else return inp.getSelected(); + return inp.hasCancelled() ? Lists.newArrayList() : inp.getSelected(); } @Override