diff --git a/Mage.Sets/src/mage/cards/c/CurseOfThePiercedHeart.java b/Mage.Sets/src/mage/cards/c/CurseOfThePiercedHeart.java index 5bf4973eb3..520e3992b4 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfThePiercedHeart.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfThePiercedHeart.java @@ -30,7 +30,6 @@ package mage.cards.c; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -47,6 +46,10 @@ import mage.target.TargetPlayer; import mage.target.targetpointer.FixedTarget; import java.util.UUID; +import mage.abilities.effects.OneShotEffect; +import mage.filter.common.FilterPlaneswalkerPermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.target.TargetPermanent; /** * @@ -55,7 +58,7 @@ import java.util.UUID; public class CurseOfThePiercedHeart extends CardImpl { public CurseOfThePiercedHeart(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); this.subtype.add(SubType.AURA, SubType.CURSE); // Enchant player @@ -82,7 +85,7 @@ public class CurseOfThePiercedHeart extends CardImpl { class CurseOfThePiercedHeartAbility extends TriggeredAbilityImpl { public CurseOfThePiercedHeartAbility() { - super(Zone.BATTLEFIELD, new DamageTargetEffect(1)); + super(Zone.BATTLEFIELD, new CurseOfThePiercedHeartEffect()); } public CurseOfThePiercedHeartAbility(final CurseOfThePiercedHeartAbility ability) { @@ -114,7 +117,54 @@ class CurseOfThePiercedHeartAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "At the beginning of enchanted player's upkeep, Curse of the Pierced Heart deals 1 damage to that player."; + return "At the beginning of enchanted player's upkeep, " + + "{this} deals 1 damage to that player or a planeswalker that player controls."; } } + +class CurseOfThePiercedHeartEffect extends OneShotEffect { + + public CurseOfThePiercedHeartEffect() { + super(Outcome.Damage); + this.staticText = "{this} deals 1 damage to that player or a planeswalker that player controls"; + } + + public CurseOfThePiercedHeartEffect(final CurseOfThePiercedHeartEffect effect) { + super(effect); + } + + @Override + public CurseOfThePiercedHeartEffect copy() { + return new CurseOfThePiercedHeartEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent enchantment = game.getPermanent(source.getSourceId()); + if (controller == null || enchantment == null) { + return false; + } + UUID opponentId = enchantment.getAttachedTo(); + Player opponent = game.getPlayer(opponentId); + if (opponent == null) { + return false; + } + if (game.getBattlefield().getAllActivePermanents(new FilterPlaneswalkerPermanent(), opponentId, game).size() > 0) { + if (controller.chooseUse(Outcome.Damage, "Redirect to a planeswalker controlled by " + opponent.getLogName() + "?", source, game)) { + FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("a planeswalker controlled by " + opponent.getLogName()); + filter.add(new ControllerIdPredicate(opponentId)); + TargetPermanent target = new TargetPermanent(1, 1, filter, false); + if (target.choose(Outcome.Damage, controller.getId(), source.getSourceId(), game)) { + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + return permanent.damage(1, source.getSourceId(), game, false, true) > 0; + } + } + } + } + opponent.damage(1, source.getSourceId(), game, false, true); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/t/TheFallen.java b/Mage.Sets/src/mage/cards/t/TheFallen.java index ab009381c6..9bc7445942 100644 --- a/Mage.Sets/src/mage/cards/t/TheFallen.java +++ b/Mage.Sets/src/mage/cards/t/TheFallen.java @@ -42,7 +42,6 @@ import mage.constants.WatcherScope; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.players.Player; import mage.watchers.Watcher; /** @@ -52,7 +51,7 @@ import mage.watchers.Watcher; public class TheFallen extends CardImpl { public TheFallen(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{B}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{B}{B}"); this.subtype.add(SubType.ZOMBIE); this.power = new MageInt(2); this.toughness = new MageInt(3); @@ -75,7 +74,7 @@ class TheFallenEffect extends OneShotEffect { public TheFallenEffect() { super(Outcome.Damage); - this.staticText = "{this} deals 1 damage to each opponent it has dealt damage to this game"; + this.staticText = "{this} deals 1 damage to each opponent or planeswalker it has dealt damage to this game"; } public TheFallenEffect(final TheFallenEffect effect) { @@ -90,13 +89,10 @@ class TheFallenEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { TheFallenWatcher watcher = (TheFallenWatcher) game.getState().getWatchers().get(TheFallenWatcher.class.getSimpleName()); - if (watcher != null && watcher.getPlayerDealtDamageThisGame(source.getSourceId()) != null) { - for (UUID playerId : watcher.getPlayerDealtDamageThisGame(source.getSourceId())) { + if (watcher != null && watcher.getPlayersAndWalkersDealtDamageThisGame(source.getSourceId()) != null) { + for (UUID playerId : watcher.getPlayersAndWalkersDealtDamageThisGame(source.getSourceId())) { if (!source.getControllerId().equals(playerId)) { - Player player = game.getPlayer(playerId); - if (player != null) { - player.damage(1, source.getSourceId(), game, false, true); - } + game.damagePlayerOrPlaneswalker(playerId, 1, source.getSourceId(), game, false, true); } } return true; @@ -107,7 +103,7 @@ class TheFallenEffect extends OneShotEffect { class TheFallenWatcher extends Watcher { - private Map<UUID, Set<UUID>> playersDealtDamageThisGame = new HashMap<>(); // Map<creatureId, Set<playerId>> + private Map<UUID, Set<UUID>> playersAndWalkersDealtDamageThisGame = new HashMap<>(); // Map<creatureId, Set<playerId>> public TheFallenWatcher() { super(TheFallenWatcher.class.getSimpleName(), WatcherScope.GAME); @@ -115,28 +111,29 @@ class TheFallenWatcher extends Watcher { public TheFallenWatcher(final TheFallenWatcher watcher) { super(watcher); - playersDealtDamageThisGame = new HashMap<>(watcher.playersDealtDamageThisGame); + playersAndWalkersDealtDamageThisGame = new HashMap<>(watcher.playersAndWalkersDealtDamageThisGame); } @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER) { + if (event.getType() == GameEvent.EventType.DAMAGED_PLAYER + || event.getType() == GameEvent.EventType.DAMAGED_PLANESWALKER) { Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); if (permanent != null) { Set<UUID> toAdd; - if (playersDealtDamageThisGame.get(event.getSourceId()) == null) { + if (playersAndWalkersDealtDamageThisGame.get(event.getSourceId()) == null) { toAdd = new HashSet<>(); } else { - toAdd = playersDealtDamageThisGame.get(event.getSourceId()); + toAdd = playersAndWalkersDealtDamageThisGame.get(event.getSourceId()); } toAdd.add(event.getPlayerId()); - playersDealtDamageThisGame.put(event.getSourceId(), toAdd); + playersAndWalkersDealtDamageThisGame.put(event.getSourceId(), toAdd); } } } - public Set<UUID> getPlayerDealtDamageThisGame(UUID creatureId) { - return playersDealtDamageThisGame.get(creatureId); + public Set<UUID> getPlayersAndWalkersDealtDamageThisGame(UUID creatureId) { + return playersAndWalkersDealtDamageThisGame.get(creatureId); } @Override diff --git a/Mage.Sets/src/mage/cards/v/VialSmasherTheFierce.java b/Mage.Sets/src/mage/cards/v/VialSmasherTheFierce.java index 1519c59b8b..0835369de4 100644 --- a/Mage.Sets/src/mage/cards/v/VialSmasherTheFierce.java +++ b/Mage.Sets/src/mage/cards/v/VialSmasherTheFierce.java @@ -43,10 +43,14 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Outcome; import mage.constants.SuperType; +import mage.filter.common.FilterPlaneswalkerPermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; +import mage.target.TargetPermanent; import mage.util.RandomUtil; import mage.watchers.common.SpellsCastWatcher; @@ -119,7 +123,8 @@ class VialSmasherTheFierceTriggeredAbility extends SpellCastControllerTriggeredA @Override public String getRule() { - return "Whenever you cast your first spell each turn, {this} deals damage equal to that spell's converted mana cost to an opponent chosen at random."; + return "Whenever you cast your first spell each turn, choose an opponent at random. " + + "{this} deals damage equal to that spell’s converted mana cost to that player or a planeswalker that player controls"; } } @@ -127,7 +132,7 @@ class VialSmasherTheFierceEffect extends OneShotEffect { public VialSmasherTheFierceEffect() { super(Outcome.Damage); - this.staticText = "{this} deals damage equal to that spell's converted mana cost to an opponent chosen at random"; + this.staticText = "{this} choose an opponent at random. {this} deals damage equal to that spell’s converted mana cost to that player or a planeswalker that player controls"; } public VialSmasherTheFierceEffect(final VialSmasherTheFierceEffect effect) { @@ -155,6 +160,19 @@ class VialSmasherTheFierceEffect extends OneShotEffect { Player opponent = game.getPlayer(opponentId); if (opponent != null) { game.informPlayers(opponent.getLogName() + " was chosen at random."); + if (game.getBattlefield().getAllActivePermanents(new FilterPlaneswalkerPermanent(), opponentId, game).size() > 0) { + if (controller.chooseUse(Outcome.Damage, "Redirect to a planeswalker controlled by " + opponent.getLogName() + "?", source, game)) { + FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("a planeswalker controlled by " + opponent.getLogName()); + filter.add(new ControllerIdPredicate(opponent.getId())); + TargetPermanent target = new TargetPermanent(1, 1, filter, false); + if (target.choose(Outcome.Damage, controller.getId(), source.getSourceId(), game)) { + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + return permanent.damage(damage, source.getSourceId(), game, false, true) > 0; + } + } + } + } opponent.damage(damage, source.getSourceId(), game, false, true); } }