diff --git a/src/main/java/forge/card/spellability/TargetChoices.java b/src/main/java/forge/card/spellability/TargetChoices.java index 204acf3c88e..4099b8804ba 100644 --- a/src/main/java/forge/card/spellability/TargetChoices.java +++ b/src/main/java/forge/card/spellability/TargetChoices.java @@ -124,6 +124,63 @@ public class TargetChoices { return false; } + /** + *
+ * removeTarget. + *
+ * + * @param card + * a {@link forge.Card} object. + * @return a boolean. + */ + public final boolean removeTarget(final Card card) { + // Do I decrement numTargeted for fizzling targets? + if (!this.targetCards.contains(card)) { + this.targetCards.remove(card); + //this.numTargeted--; + return true; + } + return false; + } + + /** + *+ * removeTarget. + *
+ * + * @param pl + * a {@link forge.game.player.Player} object. + * @return a boolean. + */ + public final boolean removeTarget(final Player pl) { + // Do I decrement numTargeted for fizzling targets? + if (!this.targetPlayers.contains(pl)) { + this.targetPlayers.remove(pl); + //this.numTargeted--; + return true; + } + return false; + } + + /** + *+ * removeTarget. + *
+ * + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + public final boolean removeTarget(final SpellAbility sa) { + // Do I decrement numTargeted for fizzling targets? + if (!this.targetSAs.contains(sa)) { + this.targetSAs.remove(sa); + //this.numTargeted--; + return true; + } + return false; + } + /** *
* Getter for the field targetCards.
diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java
index 84429d6330a..7a0936d6ee4 100644
--- a/src/main/java/forge/game/zone/MagicStack.java
+++ b/src/main/java/forge/game/zone/MagicStack.java
@@ -1171,61 +1171,68 @@ public class MagicStack extends MyObservable {
* @return a boolean.
*/
public final boolean hasFizzled(final SpellAbility sa, final Card source) {
- // By default this has not fizzled
+ // Can't fizzle unless there are some targets
boolean fizzle = false;
-
- boolean firstTarget = true;
-
- SpellAbility fizzSA = sa;
-
- while (true) {
- final Target tgt = fizzSA.getTarget();
- if ((tgt != null) && (tgt.getMinTargets(source, fizzSA) == 0) && (tgt.getNumTargeted() == 0)) {
- // Don't assume fizzled for minTargets == 0 and nothing is
- // targeted
- } else if (firstTarget
- && ((tgt != null) || (fizzSA.getTargetCard() != null) || (fizzSA.getTargetPlayer() != null))) {
- // If there is at least 1 target, fizzle switches because ALL
- // targets need to be invalid
- fizzle = true;
- firstTarget = false;
+
+ Target tgt = sa.getTarget();
+ if (tgt != null) {
+ if (tgt.getMinTargets(source, sa) == 0 && tgt.getNumTargeted() == 0) {
+ // Nothing targeted, and nothing needs to be targeted.
}
-
- if (tgt != null) {
+ else {
+ // Some targets were chosen, fizzling for this subability is now possible
+ fizzle = true;
// With multi-targets, as long as one target is still legal,
// we'll try to go through as much as possible
final ArrayList