From d3b41c076ddc87cda2f7597edbd60224bf7bf445 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 25 May 2015 15:49:51 +0200 Subject: [PATCH] * Added DealsDamageAttachedTriggeredAbility and used in some cards. --- .../mage/sets/invasion/ArmadilloCloak.java | 90 ++----------------- .../mage/sets/seventhedition/SpiritLink.java | 84 +---------------- .../src/mage/sets/timespiral/SpiritLoop.java | 84 +---------------- .../NumericSetToEffectValueTest.java | 72 +++++++++++++++ .../DealsDamageAttachedTriggeredAbility.java | 62 +++++++++++++ ...sDamageGainLifeSourceTriggeredAbility.java | 1 - ...geToACreatureAttachedTriggeredAbility.java | 1 - .../common/NumericSetToEffectValues.java | 58 ++++++++++++ .../common/SignInversionDynamicValue.java | 2 +- .../effects/common/GainLifeEffect.java | 6 +- 10 files changed, 214 insertions(+), 246 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/dynamicvalue/NumericSetToEffectValueTest.java create mode 100644 Mage/src/mage/abilities/common/DealsDamageAttachedTriggeredAbility.java create mode 100644 Mage/src/mage/abilities/dynamicvalue/common/NumericSetToEffectValues.java diff --git a/Mage.Sets/src/mage/sets/invasion/ArmadilloCloak.java b/Mage.Sets/src/mage/sets/invasion/ArmadilloCloak.java index c517f2bb14..87596dd3e2 100644 --- a/Mage.Sets/src/mage/sets/invasion/ArmadilloCloak.java +++ b/Mage.Sets/src/mage/sets/invasion/ArmadilloCloak.java @@ -29,11 +29,12 @@ package mage.sets.invasion; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.DealsDamageAttachedTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.continuous.BoostEnchantedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EnchantAbility; @@ -45,10 +46,6 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -63,7 +60,6 @@ public class ArmadilloCloak extends CardImpl { this.expansionSetCode = "INV"; this.subtype.add("Aura"); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); @@ -72,11 +68,14 @@ public class ArmadilloCloak extends CardImpl { this.addAbility(ability); // Enchanted creature gets +2/+2 and has trample. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield))); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA))); + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield)); + Effect effect = new GainAbilityAttachedEffect(TrampleAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has trample"); + ability.addEffect(effect); + this.addAbility(ability); // Whenever enchanted creature deals damage, you gain that much life. - this.addAbility(new ArmadilloCloakTriggeredAbility()); + this.addAbility(new DealsDamageAttachedTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(new NumericSetToEffectValues("that much", "damage")), false)); } @@ -89,74 +88,3 @@ public class ArmadilloCloak extends CardImpl { return new ArmadilloCloak(this); } } - -class ArmadilloCloakTriggeredAbility extends TriggeredAbilityImpl { - - public ArmadilloCloakTriggeredAbility() { - super(Zone.BATTLEFIELD, new ArmadilloCloakEffect(), false); - } - - public ArmadilloCloakTriggeredAbility(final ArmadilloCloakTriggeredAbility ability) { - super(ability); - } - - @Override - public ArmadilloCloakTriggeredAbility copy() { - return new ArmadilloCloakTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType().equals(GameEvent.EventType.DAMAGED_CREATURE) - || event.getType().equals(GameEvent.EventType.DAMAGED_PLAYER) - || event.getType().equals(GameEvent.EventType.DAMAGED_PLANESWALKER)) { - Permanent enchantment = game.getPermanent(this.getSourceId()); - if (enchantment == null || enchantment.getAttachedTo() == null) { - return false; - } - Permanent enchanted = game.getPermanent(enchantment.getAttachedTo()); - if (enchanted != null && event.getSourceId().equals(enchanted.getId())) { - for (Effect effect : this.getEffects()) { - effect.setValue("damage", event.getAmount()); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature deals damage, " + super.getRule(); - } -} - -class ArmadilloCloakEffect extends OneShotEffect { - - public ArmadilloCloakEffect() { - super(Outcome.GainLife); - this.staticText = "you gain that much life"; - } - - public ArmadilloCloakEffect(final ArmadilloCloakEffect effect) { - super(effect); - } - - @Override - public ArmadilloCloakEffect copy() { - return new ArmadilloCloakEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - int amount = (Integer) getValue("damage"); - if (amount > 0) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.gainLife(amount, game); - return true; - } - } - return false; - } -} diff --git a/Mage.Sets/src/mage/sets/seventhedition/SpiritLink.java b/Mage.Sets/src/mage/sets/seventhedition/SpiritLink.java index 9845f487f6..f973d97ec8 100644 --- a/Mage.Sets/src/mage/sets/seventhedition/SpiritLink.java +++ b/Mage.Sets/src/mage/sets/seventhedition/SpiritLink.java @@ -29,20 +29,16 @@ package mage.sets.seventhedition; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.DealsDamageAttachedTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.keyword.EnchantAbility; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Rarity; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; @@ -57,7 +53,6 @@ public class SpiritLink extends CardImpl { this.expansionSetCode = "7ED"; this.subtype.add("Aura"); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); @@ -66,7 +61,7 @@ public class SpiritLink extends CardImpl { this.addAbility(ability); // Whenever enchanted creature deals damage, you gain that much life. - this.addAbility(new SpiritLinkTriggeredAbility()); + this.addAbility(new DealsDamageAttachedTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(new NumericSetToEffectValues("that much", "damage")), false)); } public SpiritLink(final SpiritLink card) { @@ -78,74 +73,3 @@ public class SpiritLink extends CardImpl { return new SpiritLink(this); } } - -class SpiritLinkTriggeredAbility extends TriggeredAbilityImpl { - - public SpiritLinkTriggeredAbility() { - super(Zone.BATTLEFIELD, new SpiritLinkEffect(), false); - } - - public SpiritLinkTriggeredAbility(final SpiritLinkTriggeredAbility ability) { - super(ability); - } - - @Override - public SpiritLinkTriggeredAbility copy() { - return new SpiritLinkTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType().equals(GameEvent.EventType.DAMAGED_CREATURE) - || event.getType().equals(GameEvent.EventType.DAMAGED_PLAYER) - || event.getType().equals(GameEvent.EventType.DAMAGED_PLANESWALKER)) { - Permanent enchantment = game.getPermanent(this.getSourceId()); - if (enchantment == null || enchantment.getAttachedTo() == null) { - return false; - } - Permanent enchanted = game.getPermanent(enchantment.getAttachedTo()); - if (enchanted != null && event.getSourceId().equals(enchanted.getId())) { - for (Effect effect : this.getEffects()) { - effect.setValue("damage", event.getAmount()); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature deals damage, " + super.getRule(); - } -} - -class SpiritLinkEffect extends OneShotEffect { - - public SpiritLinkEffect() { - super(Outcome.GainLife); - this.staticText = "you gain that much life"; - } - - public SpiritLinkEffect(final SpiritLinkEffect effect) { - super(effect); - } - - @Override - public SpiritLinkEffect copy() { - return new SpiritLinkEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - int amount = (Integer) getValue("damage"); - if (amount > 0) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.gainLife(amount, game); - return true; - } - } - return false; - } -} diff --git a/Mage.Sets/src/mage/sets/timespiral/SpiritLoop.java b/Mage.Sets/src/mage/sets/timespiral/SpiritLoop.java index 3760226eb7..3c8a325682 100644 --- a/Mage.Sets/src/mage/sets/timespiral/SpiritLoop.java +++ b/Mage.Sets/src/mage/sets/timespiral/SpiritLoop.java @@ -32,19 +32,15 @@ import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; import mage.abilities.Ability; -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.common.DealsDamageAttachedTriggeredAbility; import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; +import mage.abilities.dynamicvalue.common.NumericSetToEffectValues; import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.ReturnToHandSourceEffect; import mage.abilities.keyword.EnchantAbility; import mage.constants.Outcome; import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; -import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetControlledCreaturePermanent; /** @@ -58,7 +54,6 @@ public class SpiritLoop extends CardImpl { this.expansionSetCode = "TSP"; this.subtype.add("Aura"); - // Enchant creature you control TargetPermanent auraTarget = new TargetControlledCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); @@ -67,7 +62,7 @@ public class SpiritLoop extends CardImpl { this.addAbility(ability); // Whenever enchanted creature deals damage, you gain that much life. - this.addAbility(new SpiritLoopTriggeredAbility()); + this.addAbility(new DealsDamageAttachedTriggeredAbility(Zone.BATTLEFIELD, new GainLifeEffect(new NumericSetToEffectValues("that much", "damage")), false)); // When Spirit Loop is put into a graveyard from the battlefield, return Spirit Loop to its owner's hand. this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new ReturnToHandSourceEffect())); @@ -82,75 +77,4 @@ public class SpiritLoop extends CardImpl { public SpiritLoop copy() { return new SpiritLoop(this); } -} - -class SpiritLoopTriggeredAbility extends TriggeredAbilityImpl { - - public SpiritLoopTriggeredAbility() { - super(Zone.BATTLEFIELD, new SpiritLoopEffect(), false); - } - - public SpiritLoopTriggeredAbility(final SpiritLoopTriggeredAbility ability) { - super(ability); - } - - @Override - public SpiritLoopTriggeredAbility copy() { - return new SpiritLoopTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType().equals(GameEvent.EventType.DAMAGED_CREATURE) - || event.getType().equals(GameEvent.EventType.DAMAGED_PLAYER) - || event.getType().equals(GameEvent.EventType.DAMAGED_PLANESWALKER)) { - Permanent enchantment = game.getPermanent(this.getSourceId()); - if (enchantment == null || enchantment.getAttachedTo() == null) { - return false; - } - Permanent enchanted = game.getPermanent(enchantment.getAttachedTo()); - if (enchanted != null && event.getSourceId().equals(enchanted.getId())) { - for (Effect effect : this.getEffects()) { - effect.setValue("damage", event.getAmount()); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever enchanted creature deals damage, " + super.getRule(); - } -} - -class SpiritLoopEffect extends OneShotEffect { - - public SpiritLoopEffect() { - super(Outcome.GainLife); - this.staticText = "you gain that much life"; - } - - public SpiritLoopEffect(final SpiritLoopEffect effect) { - super(effect); - } - - @Override - public SpiritLoopEffect copy() { - return new SpiritLoopEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - int amount = (Integer) getValue("damage"); - if (amount > 0) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - controller.gainLife(amount, game); - return true; - } - } - return false; - } } \ No newline at end of file diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/dynamicvalue/NumericSetToEffectValueTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/dynamicvalue/NumericSetToEffectValueTest.java new file mode 100644 index 0000000000..e4656134b2 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/dynamicvalue/NumericSetToEffectValueTest.java @@ -0,0 +1,72 @@ +/* + * 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.dynamicvalue; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ + +public class NumericSetToEffectValueTest extends CardTestPlayerBase { + + + /** + * Check that the dealt damage is added to life + * + */ + @Test + public void ArmadilloCloakTest() { + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + // Enchant creature + // Enchanted creature gets +2/+2 and has trample. + // Whenever enchanted creature deals damage, you gain that much life. + addCard(Zone.HAND, playerA, "Armadillo Cloak"); + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Armadillo Cloak", "Silvercoat Lion"); + + attack(3, playerA, "Silvercoat Lion"); + + setStopAt(3, PhaseStep.POSTCOMBAT_MAIN); + execute(); + + assertPermanentCount(playerA,"Armadillo Cloak", 1); + assertPowerToughness(playerA, "Silvercoat Lion", 4, 4); + + assertLife(playerA, 24); + assertLife(playerB, 16); + + } + +} \ No newline at end of file diff --git a/Mage/src/mage/abilities/common/DealsDamageAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageAttachedTriggeredAbility.java new file mode 100644 index 0000000000..dd7e55a5aa --- /dev/null +++ b/Mage/src/mage/abilities/common/DealsDamageAttachedTriggeredAbility.java @@ -0,0 +1,62 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ + +public class DealsDamageAttachedTriggeredAbility extends TriggeredAbilityImpl { + + public DealsDamageAttachedTriggeredAbility(Zone zone, Effect effect, boolean optional) { + super(zone, effect, optional); + } + + public DealsDamageAttachedTriggeredAbility(final DealsDamageAttachedTriggeredAbility ability) { + super(ability); + } + + @Override + public DealsDamageAttachedTriggeredAbility copy() { + return new DealsDamageAttachedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType().equals(GameEvent.EventType.DAMAGED_CREATURE) + || event.getType().equals(GameEvent.EventType.DAMAGED_PLAYER) + || event.getType().equals(GameEvent.EventType.DAMAGED_PLANESWALKER); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Permanent enchantment = game.getPermanent(this.getSourceId()); + if (enchantment == null || enchantment.getAttachedTo() == null) { + return false; + } + Permanent enchanted = game.getPermanent(enchantment.getAttachedTo()); + if (enchanted != null && event.getSourceId().equals(enchanted.getId())) { + for (Effect effect : this.getEffects()) { + effect.setValue("damage", event.getAmount()); + } + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever enchanted creature deals damage, " + super.getRule(); + } +} diff --git a/Mage/src/mage/abilities/common/DealsDamageGainLifeSourceTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageGainLifeSourceTriggeredAbility.java index 5da95952af..026276a1f7 100644 --- a/Mage/src/mage/abilities/common/DealsDamageGainLifeSourceTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageGainLifeSourceTriggeredAbility.java @@ -28,7 +28,6 @@ package mage.abilities.common; -import static javax.xml.bind.JAXBIntrospector.getValue; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.Effect; diff --git a/Mage/src/mage/abilities/common/DealsDamageToACreatureAttachedTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToACreatureAttachedTriggeredAbility.java index 9405da194e..816cee3d4f 100644 --- a/Mage/src/mage/abilities/common/DealsDamageToACreatureAttachedTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsDamageToACreatureAttachedTriggeredAbility.java @@ -34,7 +34,6 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.DamagedCreatureEvent; import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.target.targetpointer.FixedTarget; diff --git a/Mage/src/mage/abilities/dynamicvalue/common/NumericSetToEffectValues.java b/Mage/src/mage/abilities/dynamicvalue/common/NumericSetToEffectValues.java new file mode 100644 index 0000000000..b9ab0d6d72 --- /dev/null +++ b/Mage/src/mage/abilities/dynamicvalue/common/NumericSetToEffectValues.java @@ -0,0 +1,58 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.dynamicvalue.common; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.game.Game; + +/** + * + * @author LevelX2 + */ + +public class NumericSetToEffectValues implements DynamicValue { + + private final String message; + private final String valueKey; + + + public NumericSetToEffectValues(String message, String valueKey) { + this.message = message; + this.valueKey = valueKey; + } + + public NumericSetToEffectValues(final NumericSetToEffectValues dynamicValue) { + super(); + this.message = dynamicValue.message; + this.valueKey = dynamicValue.valueKey; + } + + @Override + public int calculate(Game game, Ability source, Effect effect) { + Object object = effect.getValue(valueKey); + if (object instanceof Integer) { + return (Integer) object; + } + return 0; + } + + @Override + public NumericSetToEffectValues copy() { + return new NumericSetToEffectValues(this); + } + + @Override + public String toString() { + return "X"; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/Mage/src/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java b/Mage/src/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java index 3e927496ed..2b50242ec4 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/SignInversionDynamicValue.java @@ -6,7 +6,7 @@ import mage.abilities.effects.Effect; import mage.game.Game; public class SignInversionDynamicValue implements DynamicValue { - private DynamicValue value; + private final DynamicValue value; public SignInversionDynamicValue(DynamicValue value) { this.value = value.copy(); diff --git a/Mage/src/mage/abilities/effects/common/GainLifeEffect.java b/Mage/src/mage/abilities/effects/common/GainLifeEffect.java index 064edd652a..c01b6923cf 100644 --- a/Mage/src/mage/abilities/effects/common/GainLifeEffect.java +++ b/Mage/src/mage/abilities/effects/common/GainLifeEffect.java @@ -86,11 +86,13 @@ public class GainLifeEffect extends OneShotEffect { StringBuilder sb = new StringBuilder(); String message = life.getMessage(); sb.append("you gain "); - if (message.isEmpty() || !message.equals("1")) { + if (message.startsWith("that")) { + sb.append(message).append(" "); + } else if (message.isEmpty() || !message.equals("1")) { sb.append(life).append(" "); } sb.append("life"); - if (message.length() > 0) { + if (message.length() > 0 && !message.startsWith("that")) { sb.append(message.equals("1") ? " equal to the number of " : " for each "); sb.append(message); }