From 6e5a1fa82678be00ea4a99ab58d6a05c591b30c7 Mon Sep 17 00:00:00 2001 From: LevelX2 <ludwig.hirth@online.de> Date: Wed, 6 Apr 2016 00:34:55 +0200 Subject: [PATCH] * Archangel Avacyn - Fixed that she damages herself when she transforms (fixes #1745). --- .../shadowsoverinnistrad/ArchangelAvacyn.java | 92 ------------------ .../AvacynThePurifier.java | 97 ++++++++++++++++++- .../cards/single/soi/ArchangelAvacynTest.java | 34 ++++--- 3 files changed, 111 insertions(+), 112 deletions(-) diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ArchangelAvacyn.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ArchangelAvacyn.java index e93a9654b4..4a6bae9cd8 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ArchangelAvacyn.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/ArchangelAvacyn.java @@ -27,12 +27,9 @@ */ package mage.sets.shadowsoverinnistrad; -import java.util.List; import java.util.UUID; import mage.MageInt; -import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility; @@ -50,17 +47,12 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.TargetController; -import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.SubtypePredicate; -import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.players.Player; /** * @@ -105,8 +97,6 @@ public class ArchangelAvacyn extends CardImpl { this.addAbility(new TransformAbility()); this.addAbility(new DiesCreatureTriggeredAbility(new ArchangelAvacynEffect(), false, filter)); - // When this creature transforms into Avacyn, the Purifier, it deals 3 damage to each other creature and each opponent. - this.addAbility(new AvacynThePurifierAbility()); } public ArchangelAvacyn(final ArchangelAvacyn card) { @@ -145,85 +135,3 @@ class ArchangelAvacynEffect extends OneShotEffect { return new ArchangelAvacynEffect(this); } } - -class AvacynThePurifierAbility extends TriggeredAbilityImpl { - - public AvacynThePurifierAbility() { - super(Zone.BATTLEFIELD, new AvacynThePurifierEffect(), false); - // Rule only shown on the night side - this.setRuleVisible(false); - } - - public AvacynThePurifierAbility(final AvacynThePurifierAbility ability) { - super(ability); - } - - @Override - public AvacynThePurifierAbility copy() { - return new AvacynThePurifierAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.TRANSFORMED; - } - - @Override - public boolean isInUseableZone(Game game, MageObject source, GameEvent event) { - Permanent currentSourceObject = (Permanent) getSourceObjectIfItStillExists(game); - if (currentSourceObject != null && currentSourceObject.isNightCard()) { - return true; - } - return super.isInUseableZone(game, source, event); - } - - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getTargetId().equals(sourceId)) { - Permanent permanent = game.getPermanent(sourceId); - if (permanent != null && permanent.isTransformed()) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever this creature transforms into Avacyn, the Purifier, it deals 3 damage to each other creature and each opponent."; - } -} - -class AvacynThePurifierEffect extends OneShotEffect { - - public AvacynThePurifierEffect() { - super(Outcome.Damage); - } - - public AvacynThePurifierEffect(final AvacynThePurifierEffect effect) { - super(effect); - } - - @Override - public AvacynThePurifierEffect copy() { - return new AvacynThePurifierEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - FilterCreaturePermanent filter = new FilterCreaturePermanent("each other creature"); - filter.add(new AnotherPredicate()); - List<Permanent> permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game); - for (Permanent permanent: permanents) { - permanent.damage(3, source.getSourceId(), game, false, true); - } - for(UUID opponentId : game.getOpponents(source.getControllerId())) { - Player opponent = game.getPlayer(opponentId); - if (opponent != null) { - opponent.damage(3, source.getSourceId(), game, false, true); - } - } - return true; - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/AvacynThePurifier.java b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/AvacynThePurifier.java index c09542d473..f386060079 100644 --- a/Mage.Sets/src/mage/sets/shadowsoverinnistrad/AvacynThePurifier.java +++ b/Mage.Sets/src/mage/sets/shadowsoverinnistrad/AvacynThePurifier.java @@ -27,15 +27,25 @@ */ package mage.sets.shadowsoverinnistrad; +import java.util.List; import java.util.UUID; import mage.MageInt; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.InfoEffect; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.constants.CardType; +import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; /** * @@ -43,8 +53,6 @@ import mage.constants.Zone; */ public class AvacynThePurifier extends CardImpl { - private static final String rule = "Whenever this creature transforms into {this}, it deals 3 damage to each other creature and each opponent"; - public AvacynThePurifier(UUID ownerId) { super(ownerId, 5, "Avacyn, the Purifier", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, ""); this.expansionSetCode = "SOI"; @@ -61,7 +69,7 @@ public class AvacynThePurifier extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // When this creature transforms into Avacyn, the Purifier, it deals 3 damage to each other creature and each opponent. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new InfoEffect(rule))); + this.addAbility(new AvacynThePurifierAbility()); } public AvacynThePurifier(final AvacynThePurifier card) { @@ -73,3 +81,82 @@ public class AvacynThePurifier extends CardImpl { return new AvacynThePurifier(this); } } + +class AvacynThePurifierAbility extends TriggeredAbilityImpl { + + public AvacynThePurifierAbility() { + super(Zone.BATTLEFIELD, new AvacynThePurifierEffect(), false); + } + + public AvacynThePurifierAbility(final AvacynThePurifierAbility ability) { + super(ability); + } + + @Override + public AvacynThePurifierAbility copy() { + return new AvacynThePurifierAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.TRANSFORMED; + } + + @Override + public boolean isInUseableZone(Game game, MageObject source, GameEvent event) { + Permanent currentSourceObject = (Permanent) getSourceObjectIfItStillExists(game); + if (currentSourceObject != null && currentSourceObject.isNightCard()) { + return true; + } + return super.isInUseableZone(game, source, event); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getTargetId().equals(sourceId)) { + Permanent permanent = game.getPermanent(sourceId); + if (permanent != null && permanent.isTransformed()) { + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever this creature transforms into Avacyn, the Purifier, it deals 3 damage to each other creature and each opponent."; + } +} + +class AvacynThePurifierEffect extends OneShotEffect { + + public AvacynThePurifierEffect() { + super(Outcome.Damage); + } + + public AvacynThePurifierEffect(final AvacynThePurifierEffect effect) { + super(effect); + } + + @Override + public AvacynThePurifierEffect copy() { + return new AvacynThePurifierEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + FilterCreaturePermanent filter = new FilterCreaturePermanent("each other creature"); + filter.add(new AnotherPredicate()); + List<Permanent> permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game); + for (Permanent permanent : permanents) { + permanent.damage(3, source.getSourceId(), game, false, true); + } + for (UUID opponentId : game.getOpponents(source.getControllerId())) { + Player opponent = game.getPlayer(opponentId); + if (opponent != null) { + opponent.damage(3, source.getSourceId(), game, false, true); + } + } + return true; + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/soi/ArchangelAvacynTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/soi/ArchangelAvacynTest.java index 17c87cac19..5dcfc479d8 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/soi/ArchangelAvacynTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/soi/ArchangelAvacynTest.java @@ -9,25 +9,29 @@ import org.mage.test.serverside.base.CardTestPlayerBase; /** * {3}{W}{W} Angel - day - * - Flash - Flying, vigilance - When Archangel Avacyn enters the battlefield, creatures you control gain indestructible until end of turn. - * When a non-Angel creature you control dies, transform Archangel Avacyn at the beginning of the next upkeep. - * - * (Night) - red card - * When this creature transforms into Avacyn, the Purifier, it deals 3 damage to each other creature and each opponent. - * + * + * Flash Flying, vigilance When Archangel Avacyn enters the battlefield, + * creatures you control gain indestructible until end of turn. When a non-Angel + * creature you control dies, transform Archangel Avacyn at the beginning of the + * next upkeep. + * + * (Night) - red card When this creature transforms into Avacyn, the Purifier, + * it deals 3 damage to each other creature and each opponent. + * * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com) */ public class ArchangelAvacynTest extends CardTestPlayerBase { - + /** - * Reported bug: "Archangel Avacyn damages herself when she transforms" + * Reported bug: "Archangel Avacyn damages herself when she transforms" */ @Test public void basicTransformTest() { - + // Flash + // Flying + // Vigilance + // When Archangel Avacyn enters the battlefield, creatures you control gain indestructible until end of turn. + // When a non-Angel creature you control dies, transform Archangel Avacyn at the beginning of the next upkeep. addCard(Zone.BATTLEFIELD, playerA, "Archangel Avacyn"); addCard(Zone.BATTLEFIELD, playerA, "Wall of Omens"); // 0/4 addCard(Zone.HAND, playerA, "Elite Vanguard"); // 2/1 @@ -36,20 +40,20 @@ public class ArchangelAvacynTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Wall of Roots"); // 0/5 addCard(Zone.HAND, playerB, "Shock"); addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2); - + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Elite Vanguard"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Shock"); addTarget(playerB, "Elite Vanguard"); setStopAt(3, PhaseStep.DRAW); execute(); - + assertPermanentCount(playerA, "Avacyn, the Purifier", 1); assertPermanentCount(playerA, "Wall of Omens", 1); assertGraveyardCount(playerA, "Elite Vanguard", 1); assertPermanentCount(playerB, "Wall of Roots", 1); assertGraveyardCount(playerB, "Hill Giant", 1); assertGraveyardCount(playerB, "Shock", 1); - + Permanent avacyn = getPermanent("Avacyn, the Purifier", playerA); Assert.assertEquals("Damage to Avacyn, the Purifier should be 0 not 3", 0, avacyn.getDamage()); }