diff --git a/res/cardsfolder/p/possibility_storm.txt b/res/cardsfolder/p/possibility_storm.txt index c1f6d3f371f..9e58ffbc15e 100644 --- a/res/cardsfolder/p/possibility_storm.txt +++ b/res/cardsfolder/p/possibility_storm.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.wasCastFromHand | Execute$ TrigExileSpell | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a spell from his or her hand, that player exiles it, then exiles cards from the top of his or her library until he or she exiles a card that shares a card type with it. That player may cast that card without paying its mana cost. Then he or she puts all cards exiled with CARDNAME on the bottom of his or her library in a random order. SVar:TrigExileSpell:AB$ ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Stack | Destination$ Exile | Fizzle$ True | SubAbility$ DBDig | Imprint$ True SVar:DBDig:DB$ DigUntil | Defined$ TriggeredCardController | Valid$ Card.sharesTypeWith FirstImprinted | ValidDescription$ shares a card type with exiled card | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintRevealed$ True | SubAbility$ DBPlay -SVar:DBPlay:DB$ Play | Defined$ Remembered | Controller$ RememberedController | WithoutManaCost$ True | Optional$ True | SubAbility$ DBChangeZone +SVar:DBPlay:DB$ Play | Defined$ Remembered | Controller$ TriggeredCardController | WithoutManaCost$ True | Optional$ True | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZoneAll | Origin$ Exile | ChangeType$ Card.IsRemembered,Card.IsImprinted | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBPossibilityCleanup SVar:DBPossibilityCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/possibility_storm.jpg diff --git a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java index 53655287910..15733ffda3c 100644 --- a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java +++ b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java @@ -524,7 +524,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect { for (SpellAbility spell : spells) { if (tgtC.isInZone(ZoneType.Exile)) { final SpellAbilityStackInstance si = game.getStack().getInstanceFromSpellAbility(spell); - game.getStack().remove(si); + if (si != null) { + game.getStack().remove(si); + } } } } diff --git a/src/main/java/forge/card/ability/effects/PlayEffect.java b/src/main/java/forge/card/ability/effects/PlayEffect.java index c28daffb976..74d7ca98727 100644 --- a/src/main/java/forge/card/ability/effects/PlayEffect.java +++ b/src/main/java/forge/card/ability/effects/PlayEffect.java @@ -206,7 +206,7 @@ public class PlayEffect extends SpellAbilityEffect { // get basic spells (no flashback, etc.) ArrayList sas = new ArrayList(); for (SpellAbility s : tgtCard.getBasicSpells()) { - final SpellAbility newSA = s.copy(); + final Spell newSA = (Spell) s.copy(); newSA.setActivatingPlayer(controller); SpellAbilityRestriction res = new SpellAbilityRestriction(); // timing restrictions still apply @@ -216,7 +216,7 @@ public class PlayEffect extends SpellAbilityEffect { res.setZone(null); newSA.setRestrictions(res); // timing restrictions still apply - if (res.checkTimingRestrictions(tgtCard, newSA)) { + if (res.checkTimingRestrictions(tgtCard, newSA) && newSA.checkOtherRestrictions()) { sas.add(newSA); } } diff --git a/src/main/java/forge/card/spellability/Spell.java b/src/main/java/forge/card/spellability/Spell.java index 27dc1e6655c..4483a02f3d8 100644 --- a/src/main/java/forge/card/spellability/Spell.java +++ b/src/main/java/forge/card/spellability/Spell.java @@ -101,20 +101,26 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } } + return checkOtherRestrictions(); + } // canPlay() + + public boolean checkOtherRestrictions() { + final Card source = this.getSourceCard(); + Player activator = getActivatingPlayer(); + final Game game = activator.getGame(); // CantBeCast static abilities final List allp = new ArrayList(game.getCardsIn(ZoneType.listValueOf("Battlefield,Command"))); - allp.add(card); + allp.add(source); for (final Card ca : allp) { final ArrayList staticAbilities = ca.getStaticAbilities(); for (final StaticAbility stAb : staticAbilities) { - if (stAb.applyAbility("CantBeCast", card, activator)) { + if (stAb.applyAbility("CantBeCast", source, activator)) { return false; } } } - return true; - } // canPlay() + } /** {@inheritDoc} */ @Override diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index e0e4d0fa158..0631faed0f6 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -316,10 +316,9 @@ public class MagicStack /* extends MyObservable */ implements Iterable