diff --git a/Mage.Sets/src/mage/sets/darkascension/Seance.java b/Mage.Sets/src/mage/sets/darkascension/Seance.java index 596c5d304c..96f0dfd49f 100644 --- a/Mage.Sets/src/mage/sets/darkascension/Seance.java +++ b/Mage.Sets/src/mage/sets/darkascension/Seance.java @@ -81,7 +81,7 @@ class SeanceEffect extends OneShotEffect { public SeanceEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "put a token onto the battlefield that's a copy of that card except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step"; + this.staticText = "you may exile target creature card from your graveyard. If you do, put a token onto the battlefield that's a copy of that card except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step"; } public SeanceEffect(final SeanceEffect effect) { diff --git a/Mage.Sets/src/mage/sets/fatereforged/MapTheWastes.java b/Mage.Sets/src/mage/sets/fatereforged/MapTheWastes.java index a78a0233b4..e09e0e1395 100644 --- a/Mage.Sets/src/mage/sets/fatereforged/MapTheWastes.java +++ b/Mage.Sets/src/mage/sets/fatereforged/MapTheWastes.java @@ -49,6 +49,7 @@ public class MapTheWastes extends CardImpl { // Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. TargetCardInLibrary target = new TargetCardInLibrary(new FilterBasicLandCard()); this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(target, true)); + // Bolster 1. this.getSpellAbility().addEffect(new BolsterEffect(1)); } diff --git a/Mage.Sets/src/mage/sets/ravnika/DevouringLight.java b/Mage.Sets/src/mage/sets/ravnika/DevouringLight.java index 8619d9f922..935b6536d0 100644 --- a/Mage.Sets/src/mage/sets/ravnika/DevouringLight.java +++ b/Mage.Sets/src/mage/sets/ravnika/DevouringLight.java @@ -49,6 +49,7 @@ public class DevouringLight extends CardImpl { // Convoke this.addAbility(new ConvokeAbility()); + // Exile target attacking or blocking creature. this.getSpellAbility().addEffect(new ExileTargetEffect()); this.getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature()); diff --git a/Mage.Sets/src/mage/sets/tenth/ForbiddingWatchtower.java b/Mage.Sets/src/mage/sets/tenth/ForbiddingWatchtower.java index 4c393a96d5..af59503cd1 100644 --- a/Mage.Sets/src/mage/sets/tenth/ForbiddingWatchtower.java +++ b/Mage.Sets/src/mage/sets/tenth/ForbiddingWatchtower.java @@ -28,18 +28,16 @@ package mage.sets.tenth; import java.util.UUID; - -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Rarity; import mage.MageInt; -import mage.ObjectColor; import mage.abilities.common.EntersBattlefieldTappedAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.continious.BecomesCreatureSourceEffect; import mage.abilities.mana.WhiteManaAbility; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; import mage.constants.Zone; import mage.game.permanent.token.Token; @@ -52,8 +50,14 @@ public class ForbiddingWatchtower extends CardImpl { public ForbiddingWatchtower(UUID ownerId) { super(ownerId, 352, "Forbidding Watchtower", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, ""); this.expansionSetCode = "10E"; + + // Forbidding Watchtower enters the battlefield tapped. this.addAbility(new EntersBattlefieldTappedAbility()); + + // {T}: Add {W} to your mana pool. this.addAbility(new WhiteManaAbility()); + + // {1}{W}: Forbidding Watchtower becomes a 1/5 white Soldier creature until end of turn. It's still a land. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new ForbiddingWatchtowerToken(), "land", Duration.EndOfTurn), new ManaCostsImpl("{1}{W}"))); } diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 8200578caa..c3dcb09ffc 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -1518,62 +1518,67 @@ public abstract class GameImpl implements Game, Serializable { } } else { - Target target = perm.getSpellAbility().getTargets().get(0); - if (target instanceof TargetPermanent) { - Permanent attachedTo = getPermanent(perm.getAttachedTo()); - if (attachedTo == null || !attachedTo.getAttachments().contains(perm.getId())) { - // handle bestow unattachment - Card card = this.getCard(perm.getId()); - if (card != null && card.getCardType().contains(CardType.CREATURE)) { - UUID wasAttachedTo = perm.getAttachedTo(); - perm.attachTo(null, this); - fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId())); - } else { - if (movePermanentToGraveyardWithInfo(perm)) { - somethingHappened = true; - } - } - } - else { - Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); - if (auraFilter instanceof FilterControlledCreaturePermanent) { - if (!((FilterControlledCreaturePermanent)auraFilter).match(attachedTo, perm.getId(), perm.getControllerId(), this) - || attachedTo.cantBeEnchantedBy(perm, this)) { + if (perm.getSpellAbility().getTargets().isEmpty()) { + Permanent enchanted = this.getPermanent(perm.getAttachedTo()); + logger.error("Aura without target: " + perm.getName() + " attached to " + enchanted == null ? " null" : enchanted.getName()); + } else { + Target target = perm.getSpellAbility().getTargets().get(0); + if (target instanceof TargetPermanent) { + Permanent attachedTo = getPermanent(perm.getAttachedTo()); + if (attachedTo == null || !attachedTo.getAttachments().contains(perm.getId())) { + // handle bestow unattachment + Card card = this.getCard(perm.getId()); + if (card != null && card.getCardType().contains(CardType.CREATURE)) { + UUID wasAttachedTo = perm.getAttachedTo(); + perm.attachTo(null, this); + fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId())); + } else { if (movePermanentToGraveyardWithInfo(perm)) { somethingHappened = true; } } - } else { - if (!auraFilter.match(attachedTo, this) || attachedTo.cantBeEnchantedBy(perm, this)) { - // handle bestow unattachment - Card card = this.getCard(perm.getId()); - if (card != null && card.getCardType().contains(CardType.CREATURE)) { - UUID wasAttachedTo = perm.getAttachedTo(); - perm.attachTo(null, this); - fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId())); - } else { + } + else { + Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); + if (auraFilter instanceof FilterControlledCreaturePermanent) { + if (!((FilterControlledCreaturePermanent)auraFilter).match(attachedTo, perm.getId(), perm.getControllerId(), this) + || attachedTo.cantBeEnchantedBy(perm, this)) { if (movePermanentToGraveyardWithInfo(perm)) { somethingHappened = true; } } + } else { + if (!auraFilter.match(attachedTo, this) || attachedTo.cantBeEnchantedBy(perm, this)) { + // handle bestow unattachment + Card card = this.getCard(perm.getId()); + if (card != null && card.getCardType().contains(CardType.CREATURE)) { + UUID wasAttachedTo = perm.getAttachedTo(); + perm.attachTo(null, this); + fireEvent(new GameEvent(GameEvent.EventType.UNATTACHED, wasAttachedTo, perm.getId(), perm.getControllerId())); + } else { + if (movePermanentToGraveyardWithInfo(perm)) { + somethingHappened = true; + } + } + } } } } - } - else if (target instanceof TargetPlayer) { - Player attachedToPlayer = getPlayer(perm.getAttachedTo()); - if (attachedToPlayer == null) { - if (movePermanentToGraveyardWithInfo(perm)) { - somethingHappened = true; - } - } - else { - Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); - if (!auraFilter.match(attachedToPlayer, this) || attachedToPlayer.hasProtectionFrom(perm, this)) { + else if (target instanceof TargetPlayer) { + Player attachedToPlayer = getPlayer(perm.getAttachedTo()); + if (attachedToPlayer == null) { if (movePermanentToGraveyardWithInfo(perm)) { somethingHappened = true; } } + else { + Filter auraFilter = perm.getSpellAbility().getTargets().get(0).getFilter(); + if (!auraFilter.match(attachedToPlayer, this) || attachedToPlayer.hasProtectionFrom(perm, this)) { + if (movePermanentToGraveyardWithInfo(perm)) { + somethingHappened = true; + } + } + } } } }