From c73cee90a5e16aeba26ea12754d9cb6a30a72ef1 Mon Sep 17 00:00:00 2001 From: Quercitron Date: Wed, 30 Dec 2015 02:03:44 +0300 Subject: [PATCH] * Laquatus's Champion - Fix that player didn't get life when Laquatus's Champion left the battlefield --- .../mage/sets/torment/LaquatussChampion.java | 72 ++++++++-------- .../single/tor/LaquatussChampionTest.java | 82 +++++++++++++++++++ 2 files changed, 119 insertions(+), 35 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/tor/LaquatussChampionTest.java diff --git a/Mage.Sets/src/mage/sets/torment/LaquatussChampion.java b/Mage.Sets/src/mage/sets/torment/LaquatussChampion.java index 028eb831fea..d0412805e0b 100644 --- a/Mage.Sets/src/mage/sets/torment/LaquatussChampion.java +++ b/Mage.Sets/src/mage/sets/torment/LaquatussChampion.java @@ -33,17 +33,21 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.LeavesBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.AdjustingSourceCosts; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.GainLifeTargetEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.effects.common.RegenerateSourceEffect; 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.players.Player; import mage.target.TargetPlayer; +import mage.target.targetpointer.FixedTarget; import mage.util.CardUtil; /** @@ -62,11 +66,11 @@ public class LaquatussChampion extends CardImpl { this.toughness = new MageInt(3); // When Laquatus's Champion enters the battlefield, target player loses 6 life. - Ability ability = new EntersBattlefieldTriggeredAbility(new LaquatussChampionEntersEffect(), false); + Ability ability = new LaquatussChampionEntersBattlefieldTriggeredAbility(); ability.addTarget(new TargetPlayer()); this.addAbility(ability); // When Laquatus's Champion leaves the battlefield, that player gains 6 life. - this.addAbility(new LeavesBattlefieldTriggeredAbility(new LaquatussChampionLeavesEffect(), false)); + this.addAbility(new LaquatussChampionLeavesBattlefieldTriggeredAbility()); // {B}: Regenerate Laquatus's Champion. this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{B}"))); } @@ -81,60 +85,58 @@ public class LaquatussChampion extends CardImpl { } } -class LaquatussChampionEntersEffect extends OneShotEffect { +class LaquatussChampionEntersBattlefieldTriggeredAbility extends EntersBattlefieldTriggeredAbility implements AdjustingSourceCosts { - public LaquatussChampionEntersEffect() { - super(Outcome.LoseLife); - this.staticText = "target player loses 6 life"; + public LaquatussChampionEntersBattlefieldTriggeredAbility() { + super(new LoseLifeTargetEffect(6), false); } - public LaquatussChampionEntersEffect(final LaquatussChampionEntersEffect effect) { - super(effect); + public LaquatussChampionEntersBattlefieldTriggeredAbility(LaquatussChampionEntersBattlefieldTriggeredAbility ability) { + super(ability); } @Override - public LaquatussChampionEntersEffect copy() { - return new LaquatussChampionEntersEffect(this); + public LaquatussChampionEntersBattlefieldTriggeredAbility copy() { + return new LaquatussChampionEntersBattlefieldTriggeredAbility(this); } @Override - public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + public void adjustCosts(Ability ability, Game game) { + Player player = game.getPlayer(ability.getFirstTarget()); if (player != null) { - player.loseLife(6, game); - game.getState().setValue(CardUtil.getCardZoneString("targetPlayer", source.getSourceId(), game), player.getId()); - return true; + String key = CardUtil.getCardZoneString("targetPlayer", this.getSourceId(), game); + game.getState().setValue(key, player.getId()); } - return false; } } -class LaquatussChampionLeavesEffect extends OneShotEffect { +class LaquatussChampionLeavesBattlefieldTriggeredAbility extends LeavesBattlefieldTriggeredAbility { - public LaquatussChampionLeavesEffect() { - super(Outcome.Benefit); - this.staticText = "that player gains 6 life"; + public LaquatussChampionLeavesBattlefieldTriggeredAbility() { + super(new GainLifeTargetEffect(6), false); } - public LaquatussChampionLeavesEffect(final LaquatussChampionLeavesEffect effect) { - super(effect); + public LaquatussChampionLeavesBattlefieldTriggeredAbility(LaquatussChampionLeavesBattlefieldTriggeredAbility ability) { + super(ability); } @Override - public LaquatussChampionLeavesEffect copy() { - return new LaquatussChampionLeavesEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Object object = game.getState().getValue(CardUtil.getCardZoneString("targetPlayer", source.getSourceId(), game)); - if (object instanceof UUID) { - Player player = game.getPlayer((UUID) object); - if (player != null) { - player.gainLife(6, game); + public boolean checkTrigger(GameEvent event, Game game) { + if (super.checkTrigger(event, game)) { + String key = CardUtil.getCardZoneString("targetPlayer", this.getSourceId(), game, true); + Object object = game.getState().getValue(key); + if (object instanceof UUID) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget((UUID) object)); + } return true; } } return false; } + + @Override + public LaquatussChampionLeavesBattlefieldTriggeredAbility copy() { + return new LaquatussChampionLeavesBattlefieldTriggeredAbility(this); + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/tor/LaquatussChampionTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/tor/LaquatussChampionTest.java new file mode 100644 index 00000000000..1c7bbed6a3a --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/tor/LaquatussChampionTest.java @@ -0,0 +1,82 @@ +package org.mage.test.cards.single.tor; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author Quercitron + */ +public class LaquatussChampionTest extends CardTestPlayerBase { + + @Test + public void testEntersBattlefieldTriggeredAbility() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6); + addCard(Zone.HAND, playerA, "Laquatus's Champion"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Laquatus's Champion"); + addTarget(playerA, playerB); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerB, 14); + } + + @Test + public void testLeavesBattlefieldTriggeredAbility() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 7); + addCard(Zone.HAND, playerA, "Laquatus's Champion"); + addCard(Zone.HAND, playerA, "Terminate"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Laquatus's Champion"); + addTarget(playerA, playerB); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Terminate", "Laquatus's Champion"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerB, 20); + } + + @Test + public void testDoubleZoneChange() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + addCard(Zone.HAND, playerA, "Laquatus's Champion"); + addCard(Zone.HAND, playerA, "Cloudshift"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Laquatus's Champion"); + addTarget(playerA, playerB); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Cloudshift", "Laquatus's Champion"); + addTarget(playerA, playerB); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerB, 14); + } + + @Test + public void testLeavesBattlefieldWhenFirstAbilityInStack() { + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7); + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 7); + addCard(Zone.HAND, playerA, "Laquatus's Champion"); + addCard(Zone.HAND, playerA, "Terminate"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Laquatus's Champion"); + addTarget(playerA, playerB); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Terminate", "Laquatus's Champion", "enters the battlefield", StackClause.WHILE_ON_STACK); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertLife(playerB, 20); + } + +}