From bb15176a84f9790e8c450f7e9a686ef357e0214a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 7 May 2018 00:44:32 +0200 Subject: [PATCH] * Fixed token ability (id handling) and token cardType (reset was not correctly done) handling (this fixed problems with copying Planeswalker with Helm of the Host). --- .../test/cards/copy/HelmOfTheHostTest.java | 80 +++++++++++++++++++ .../BecomesCreatureSourceEffect.java | 5 +- .../mage/game/permanent/PermanentToken.java | 5 +- .../mage/game/permanent/token/TokenImpl.java | 4 - .../util/functions/CopyTokenFunction.java | 5 +- 5 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/copy/HelmOfTheHostTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/HelmOfTheHostTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/HelmOfTheHostTest.java new file mode 100644 index 00000000000..16530d72d31 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/HelmOfTheHostTest.java @@ -0,0 +1,80 @@ +/* + * 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.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class HelmOfTheHostTest extends CardTestPlayerBase { + + /** + * If you animate Gideon of the Trials and equip it with Helm of the Host + * the nonlegendary copies can't become creatures with the 0 ability. You + * can activate it just fine (and it gets put on the stack) but nothing + * happens and you can't use another ability. + */ + @Test + public void testCopyPlaneswalker() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5); + //Starting Loyalty: 3 + // +1: Until your next turn, prevent all damage target permanent would deal. + // 0: Until end of turn, Gideon of the Trials becomes a 4/4 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. + // 0: You get an emblem with "As long as you control a Gideon planeswalker, you can't lose the game and your opponent can't win the game." + addCard(Zone.BATTLEFIELD, playerA, "Gideon of the Trials", 1); + // At the beginning of combat on your turn, create a token that’s a copy of equipped creature, except the token isn’t legendary if equipped creature is legendary. That token gains haste. + // Equip {5} + addCard(Zone.BATTLEFIELD, playerA, "Helm of the Host", 1); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn"); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip"); + + activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn"); + activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn"); + + attack(3, playerA, "Gideon of the Trials"); + attack(3, playerA, "Gideon of the Trials"); + + setStopAt(4, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA, "Gideon of the Trials", 2); + + assertCounterCount("Gideon of the Trials", CounterType.LOYALTY, 3); + + assertLife(playerB, 12); + assertLife(playerA, 20); + } + +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java index 72e0ccf17c9..377f649a94e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesCreatureSourceEffect.java @@ -34,7 +34,6 @@ import mage.abilities.effects.ContinuousEffectImpl; import mage.constants.*; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; /** @@ -108,8 +107,8 @@ public class BecomesCreatureSourceEffect extends ContinuousEffectImpl implements if (losePreviousTypes) { permanent.getCardType().clear(); } - for (CardType t : token.getCardType()) { - permanent.addCardType(t); + for (CardType cardType : token.getCardType()) { + permanent.addCardType(cardType); } if (type != null && type.isEmpty() || type == null && permanent.isLand()) { permanent.getSubtype(game).retainAll(SubType.getLandTypes(false)); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentToken.java b/Mage/src/main/java/mage/game/permanent/PermanentToken.java index c005bef4294..ba625cc5582 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentToken.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentToken.java @@ -46,7 +46,7 @@ public class PermanentToken extends PermanentImpl { super(controllerId, controllerId, token.getName()); this.expansionSetCode = expansionSetCode; this.token = token.copy(); - this.token.getAbilities().newId(); // neccessary if token has ability like DevourAbility() + this.token.getAbilities().newOriginalId(); // neccessary if token has ability like DevourAbility() this.token.getAbilities().setSourceId(objectId); this.power.modifyBaseValue(token.getPower().getBaseValueModified()); this.toughness.modifyBaseValue(token.getToughness().getBaseValueModified()); @@ -84,7 +84,8 @@ public class PermanentToken extends PermanentImpl { for (ManaCost cost : token.getManaCost()) { this.getManaCost().add(cost.copy()); } - this.cardType = token.getCardType(); + this.cardType.clear(); + this.cardType.addAll(token.getCardType()); this.color = token.getColor(game).copy(); this.frameColor = token.getFrameColor(game); this.frameStyle = token.getFrameStyle(); diff --git a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java index b817f3f714a..20a58ded3e3 100644 --- a/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java +++ b/Mage/src/main/java/mage/game/permanent/token/TokenImpl.java @@ -33,11 +33,8 @@ import java.util.Locale; import java.util.UUID; import mage.MageObject; import mage.MageObjectImpl; -import mage.ObjectColor; -import mage.abilities.Abilities; import mage.abilities.Ability; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; @@ -47,7 +44,6 @@ import mage.game.permanent.Permanent; import mage.game.permanent.PermanentToken; import mage.players.Player; import mage.util.RandomUtil; -import mage.util.SubTypeList; public abstract class TokenImpl extends MageObjectImpl implements Token { diff --git a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java index 1c9f57fc6a6..c39fcf50b74 100644 --- a/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java +++ b/Mage/src/main/java/mage/util/functions/CopyTokenFunction.java @@ -36,7 +36,6 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.game.permanent.PermanentCard; import mage.game.permanent.PermanentToken; -import mage.game.permanent.token.TokenImpl; import mage.game.permanent.token.Token; /** @@ -110,8 +109,8 @@ public class CopyTokenFunction implements Function { for (Ability ability0 : sourceObj.getAbilities()) { Ability ability = ability0.copy(); - ability.newId(); - ability.setSourceId(target.getId()); + ability.newOriginalId(); // The token is independant from the copy from object so it need a new original Id, otherwise there are problems to check for created continuous effects to check if the source (the Token) has still this ability + target.addAbility(ability); }