From 79ceae999a72151e2fadd1e15ddd37ec76c3f205 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 17 Jan 2015 15:30:00 +0100 Subject: [PATCH] [FRF] Fixed ETB replacement and triggered abilities for manifested cards. --- .../abilities/keywords/ManifestTest.java | 74 +++++++++++++++++++ .../base/impl/CardTestPlayerAPIImpl.java | 2 +- .../abilities/effects/ContinuousEffects.java | 7 ++ .../BecomesFaceDownCreatureEffect.java | 6 +- .../effects/keyword/ManifestEffect.java | 1 + 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java new file mode 100644 index 00000000000..9055fc57637 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java @@ -0,0 +1,74 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.abilities.keywords; + +import mage.abilities.keyword.HexproofAbility; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.permanent.Permanent; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ + +public class ManifestTest extends CardTestPlayerBase { + + /** + * Tests that ETB triggered abilities did not trigger for manifested cards + */ + @Test + public void testETBTriggeredAbilities() { + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + // Manifest the top card of your library {1}{W} + addCard(Zone.HAND, playerA, "Soul Summons"); + + // Tranquil Cove enters the battlefield tapped. + // When Tranquil Cove enters the battlefield, you gain 1 life. + // {T}: Add {W} or {U} to your mana pool. + addCard(Zone.LIBRARY, playerA, "Tranquil Cove"); + skipInitShuffling(); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Soul Summons"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + // no life gain + assertLife(playerA, 20); + assertLife(playerB, 20); + // a facedown creature is on the battlefield + assertPermanentCount(playerA, "face down creature", 1); + assertPowerToughness(playerA, "face down creature", 2, 2); + // not tapped + assertTapped("face down creature", false); + } + +} diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 8614aeb60fa..28b75a0588f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -538,7 +538,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement public void assertTapped(String cardName, boolean tapped) throws AssertionError { Permanent found = null; for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents()) { - if (permanent.getName().equals(cardName)) { + if (permanent.getLogName().equals(cardName)) { found = permanent; } } diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index 0800d65801c..d769ef989a4 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -410,6 +410,13 @@ public class ContinuousEffects implements Serializable { exists = permanent.getCard().getAbilities().contains(ability); } } + } else { + if (object instanceof PermanentCard) { + PermanentCard permanent = (PermanentCard)object; + if (permanent.isFaceDown() && !ability.getWorksFaceDown()) { + return false; + } + } } return exists; } diff --git a/Mage/src/mage/abilities/effects/common/continious/BecomesFaceDownCreatureEffect.java b/Mage/src/mage/abilities/effects/common/continious/BecomesFaceDownCreatureEffect.java index 07e69e3631c..5f9f9e2ca55 100644 --- a/Mage/src/mage/abilities/effects/common/continious/BecomesFaceDownCreatureEffect.java +++ b/Mage/src/mage/abilities/effects/common/continious/BecomesFaceDownCreatureEffect.java @@ -62,6 +62,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen protected int zoneChangeCounter; protected Ability turnFaceUpAbility = null; protected boolean useTargetPointer; + protected boolean foundPermanent; public BecomesFaceDownCreatureEffect(Costs morphCosts) { @@ -84,6 +85,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen this.turnFaceUpAbility = new TurnFaceUpAbility(morphCosts); } staticText = "{this} becomes a 2/2 face-down creature, with no text, no name, no subtypes, and no mana cost"; + foundPermanent = false; } @@ -94,6 +96,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen this.turnFaceUpAbility = effect.turnFaceUpAbility.copy(); } this.useTargetPointer = effect.useTargetPointer; + this.foundPermanent = effect.foundPermanent; } @Override @@ -120,6 +123,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen } if (permanent != null && permanent.isFaceDown()) { + foundPermanent = true; switch (layer) { case TypeChangingEffects_4: permanent.setName(""); @@ -164,7 +168,7 @@ public class BecomesFaceDownCreatureEffect extends ContinuousEffectImpl implemen } } } else { - if (duration.equals(Duration.Custom)) { + if (duration.equals(Duration.Custom) && foundPermanent == true) { discard(); } } diff --git a/Mage/src/mage/abilities/effects/keyword/ManifestEffect.java b/Mage/src/mage/abilities/effects/keyword/ManifestEffect.java index 753c224a647..4ac634ce942 100644 --- a/Mage/src/mage/abilities/effects/keyword/ManifestEffect.java +++ b/Mage/src/mage/abilities/effects/keyword/ManifestEffect.java @@ -86,6 +86,7 @@ public class ManifestEffect extends OneShotEffect { ContinuousEffect effect = new BecomesFaceDownCreatureEffect(manaCosts, true, Duration.Custom); effect.setTargetPointer(new FixedTarget(card.getId())); game.addEffect(effect, source); + game.applyEffects(); // to apply nefore ETB triggered or replace Effects are executed } return true; }