diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/FelhideSpiritbinderTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/FelhideSpiritbinderTest.java new file mode 100644 index 00000000000..341d497d74a --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/FelhideSpiritbinderTest.java @@ -0,0 +1,97 @@ +/* + * 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.copy; + +import mage.abilities.keyword.HasteAbility; +import mage.constants.CardType; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.game.permanent.Permanent; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class FelhideSpiritbinderTest extends CardTestPlayerBase { + + /** + * http://www.slightlymagic.net/forum/viewtopic.php?f=70&t=17295&p=181417#p181440 + * Felhide Spiritbinder does not seem to be giving haste or the enchantment + * subtype to tokens it creates.. + * + */ + @Test + public void testTokenCopy() { + // Inspired - Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}. + // If you do, put a token onto the battlefield that's a copy of another target creature + // except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step. + addCard(Zone.BATTLEFIELD, playerB, "Felhide Spiritbinder", 1); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2); + + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); + + attack(2, playerB, "Felhide Spiritbinder"); + + setStopAt(4, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPermanentCount(playerB, "Silvercoat Lion", 1); + Permanent lion = getPermanent("Silvercoat Lion", playerB); + assertAbility(playerB, "Silvercoat Lion", HasteAbility.getInstance(), true); + Assert.assertEquals("token has to have card type enchantment", true, lion.getCardType().contains(CardType.ENCHANTMENT)); + + assertLife(playerA, 17); + assertLife(playerB, 20); + + } + + @Test + public void testTokenCopyExiled() { + // Inspired - Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}. + // If you do, put a token onto the battlefield that's a copy of another target creature + // except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step. + addCard(Zone.BATTLEFIELD, playerB, "Felhide Spiritbinder", 1); + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2); + + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); + + attack(2, playerB, "Felhide Spiritbinder"); + + setStopAt(5, PhaseStep.UPKEEP); + execute(); + + assertPermanentCount(playerB, "Silvercoat Lion", 0); + + assertLife(playerA, 17); + assertLife(playerB, 20); + + } +} diff --git a/Mage/src/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java b/Mage/src/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java index 7ad7b28d653..43fd5f71205 100644 --- a/Mage/src/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java @@ -31,14 +31,19 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; +import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.Outcome; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.EmptyToken; +import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil; import mage.util.functions.ApplyToPermanent; import mage.util.functions.EmptyApplyToPermanent; @@ -47,25 +52,24 @@ import mage.util.functions.EmptyApplyToPermanent; * * @author LevelX2 */ - public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { private final UUID playerId; private final CardType additionalCardType; private boolean gainsHaste; private Permanent addedTokenPermanent; - + public PutTokenOntoBattlefieldCopyTargetEffect() { super(Outcome.PutCreatureInPlay); this.playerId = null; this.additionalCardType = null; this.addedTokenPermanent = null; } - + public PutTokenOntoBattlefieldCopyTargetEffect(UUID playerId) { this(playerId, null, false); } - + public PutTokenOntoBattlefieldCopyTargetEffect(UUID playerId, CardType additionalCardType, boolean gainsHaste) { super(Outcome.PutCreatureInPlay); this.playerId = playerId; @@ -95,16 +99,16 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { // there is another copy effect that our targetPermanent copies stats from if (copyEffect.getSourceId().equals(permanent.getId())) { MageObject object = ((CopyEffect) effect).getTarget(); - if (object instanceof Permanent) { - copyFromPermanent = (Permanent)object; + if (object instanceof Permanent) { + copyFromPermanent = (Permanent) object; if (copyEffect.getApplier() != null) { applier = copyEffect.getApplier(); - } + } } } } } - + EmptyToken token = new EmptyToken(); CardUtil.copyTo(token).from(copyFromPermanent); // needed so that entersBattlefied triggered abilities see the attributes (e.g. Master Biomancer) if (additionalCardType != null && !token.getCardType().contains(additionalCardType)) { @@ -113,10 +117,20 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { if (gainsHaste) { token.addAbility(HasteAbility.getInstance()); } - token.putOntoBattlefield(1, game, source.getSourceId(), playerId == null ? source.getControllerId(): playerId); + token.putOntoBattlefield(1, game, source.getSourceId(), playerId == null ? source.getControllerId() : playerId); addedTokenPermanent = game.getPermanent(token.getLastAddedToken()); if (addedTokenPermanent != null) { game.copyPermanent(copyFromPermanent, addedTokenPermanent, source, applier); + if (additionalCardType != null) { + ContinuousEffect effect = new AddCardTypeTargetEffect(additionalCardType, Duration.Custom); + effect.setTargetPointer(new FixedTarget(addedTokenPermanent.getId())); + game.addEffect(effect, source); + } + if (gainsHaste) { + ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom); + effect.setTargetPointer(new FixedTarget(addedTokenPermanent.getId())); + game.addEffect(effect, source); + } return true; } } @@ -127,7 +141,7 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { public PutTokenOntoBattlefieldCopyTargetEffect copy() { return new PutTokenOntoBattlefieldCopyTargetEffect(this); } - + @Override public String getText(Mode mode) { StringBuilder sb = new StringBuilder(); @@ -137,11 +151,9 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect { } return sb.toString(); - } - + } + public Permanent getAddedPermanent() { return addedTokenPermanent; } } - -