diff --git a/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java b/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java index b80e183f71f..7a4ec43cd8a 100644 --- a/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java +++ b/src/main/java/forge/card/spellability/SpellAbilityStackInstance.java @@ -264,4 +264,11 @@ public class SpellAbilityStackInstance { this.stackDescription = this.ability.getStackDescription(); } } + + public boolean compareToSpellAbility(SpellAbility sa) { + // Compare my target choices to the SA passed in + // TODO? Compare other data points in the SI to the passed SpellAbility for confirmation + TargetChoices choices = sa.getTarget() != null ? sa.getTarget().getTargetChoices() : null; + return (sa.equals(this.ability) && (choices == null || choices.equals(this.tc))); + } } diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 7fd381cefe7..841aa3737a9 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -592,9 +592,8 @@ public class MagicStack extends MyObservable { this.freezeStack(); this.setResolving(true); - final SpellAbility sa = this.pop(); - // Sol(2012/04/06) Temporarily changed to fix multiple activation bug - //final SpellAbility sa = this.top(); + // The SpellAbility isn't removed from the Stack until it finishes resolving + final SpellAbility sa = this.top(); // ActivePlayer gains priority first after Resolve game.getPhaseHandler().resetPriority(); @@ -723,8 +722,8 @@ public class MagicStack extends MyObservable { // remove SA and card from the stack this.removeCardFromStack(sa, fizzle); - // Sol(2012/04/06) Temporarily removed to fix multiple activation bug - //this.remove(sa); + // SpellAbility is removed from the stack here + this.remove(sa); // After SA resolves we have to do a handful of things this.setResolving(false); @@ -950,7 +949,17 @@ public class MagicStack extends MyObservable { public final SpellAbilityStackInstance getInstanceFromSpellAbility(final SpellAbility sa) { // TODO: Confirm this works! for (final SpellAbilityStackInstance si : this.getStack()) { - if (si.getSpellAbility().equals(sa)) { + if (si.compareToSpellAbility(sa)) { + return si; + } + } + return null; + } + + public final SpellAbilityStackInstance getInstanceFromAbilityAndTarget(final SpellAbility sa, final Target tgt) { + // TODO: Confirm this works! + for (final SpellAbilityStackInstance si : this.getStack()) { + if (si.getSpellAbility().equals(sa) && tgt.equals(sa.getTarget())) { return si; } }