From 0e64a326c68b7677932185d0b98536bad962fde1 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sat, 25 May 2024 15:40:35 +0200 Subject: [PATCH] implement [MH3] Kami of Jealous Thirst --- .../src/mage/cards/k/KamiOfJealousThirst.java | 69 +++++++++++++++++++ Mage.Sets/src/mage/sets/ModernHorizons3.java | 1 + .../single/mh3/KamiOfJealousThirstTest.java | 57 +++++++++++++++ Mage/src/main/java/mage/util/CardUtil.java | 12 ++-- 4 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/k/KamiOfJealousThirst.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/KamiOfJealousThirstTest.java diff --git a/Mage.Sets/src/mage/cards/k/KamiOfJealousThirst.java b/Mage.Sets/src/mage/cards/k/KamiOfJealousThirst.java new file mode 100644 index 00000000000..6cf51019c8f --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KamiOfJealousThirst.java @@ -0,0 +1,69 @@ +package mage.cards.k; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.ActivatedAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.CostAdjuster; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.CardsDrawnThisTurnDynamicValue; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.game.Game; +import mage.util.CardUtil; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class KamiOfJealousThirst extends CardImpl { + + public KamiOfJealousThirst(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.SPIRIT); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // {4}{B}: Each opponent loses 2 life and you gain 2 life. This ability costs {4}{B} less to activate if you've drawn three or more cards this turn. Activate only once each turn. + ActivatedAbility ability = new SimpleActivatedAbility( + new LoseLifeOpponentsEffect(2), new ManaCostsImpl<>("{4}{B}") + ); + ability.addEffect(new GainLifeEffect(2).concatBy("and")); + ability.setMaxActivationsPerTurn(1); + ability.addEffect(new InfoEffect("This ability costs {4}{B} less to activate if you've drawn three or more cards this turn.")); + ability.setCostAdjuster(KamiOfJealousThirstAdjuster.instance); + this.addAbility(ability.addHint(CardsDrawnThisTurnDynamicValue.getHint())); + } + + private KamiOfJealousThirst(final KamiOfJealousThirst card) { + super(card); + } + + @Override + public KamiOfJealousThirst copy() { + return new KamiOfJealousThirst(this); + } +} + +enum KamiOfJealousThirstAdjuster implements CostAdjuster { + instance; + + @Override + public void adjustCosts(Ability ability, Game game) { + int amount = CardsDrawnThisTurnDynamicValue.instance.calculate(game, ability, null); + if (amount >= 3) { + CardUtil.adjustCost(ability, new ManaCostsImpl<>("{4}{B}"), false); + } + } +} diff --git a/Mage.Sets/src/mage/sets/ModernHorizons3.java b/Mage.Sets/src/mage/sets/ModernHorizons3.java index cb29e78fd60..5cd091384e2 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons3.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons3.java @@ -80,6 +80,7 @@ public final class ModernHorizons3 extends ExpansionSet { cards.add(new SetCardInfo("Jet Medallion", 292, Rarity.RARE, mage.cards.j.JetMedallion.class)); cards.add(new SetCardInfo("K'rrik, Son of Yawgmoth", 274, Rarity.RARE, mage.cards.k.KrrikSonOfYawgmoth.class)); cards.add(new SetCardInfo("Kaalia of the Vast", 290, Rarity.MYTHIC, mage.cards.k.KaaliaOfTheVast.class)); + cards.add(new SetCardInfo("Kami of Jealous Thirst", 98, Rarity.COMMON, mage.cards.k.KamiOfJealousThirst.class)); cards.add(new SetCardInfo("Kappa Cannoneer", 270, Rarity.RARE, mage.cards.k.KappaCannoneer.class)); cards.add(new SetCardInfo("Kozilek's Unsealing", 65, Rarity.UNCOMMON, mage.cards.k.KozileksUnsealing.class)); cards.add(new SetCardInfo("Kudo, King Among Bears", 192, Rarity.RARE, mage.cards.k.KudoKingAmongBears.class)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/KamiOfJealousThirstTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/KamiOfJealousThirstTest.java new file mode 100644 index 00000000000..6c986f47c44 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/KamiOfJealousThirstTest.java @@ -0,0 +1,57 @@ +package org.mage.test.cards.single.mh3; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author Susucr + */ +public class KamiOfJealousThirstTest extends CardTestPlayerBase { + + /** + * {@link mage.cards.k.KamiOfJealousThirst Kami of Jealous Thirst} {2}{B} + * Creature — Spirit + * Deathtouch + * {4}{B}: Each opponent loses 2 life and you gain 2 life. This ability costs {4}{B} less to activate if you’ve drawn three or more cards this turn. Activate only once each turn. + * 1/3 + */ + private static final String kami = "Kami of Jealous Thirst"; + + @Test + public void test_Activate_NoReduction() { + setStrictChooseMode(true); + + addCard(Zone.BATTLEFIELD, playerA, kami); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{4}{B}"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTappedCount("Swamp", true, 5); + assertLife(playerA, 20 + 2); + assertLife(playerB, 20 - 2); + } + + @Test + public void test_Activate_Reduction() { + setStrictChooseMode(true); + + addCard(Zone.BATTLEFIELD, playerA, kami); + addCard(Zone.BATTLEFIELD, playerA, "Island", 4); + addCard(Zone.HAND, playerA, "Concentrate"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Concentrate", true); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{4}{B}"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertTappedCount("Island", true, 4); + assertLife(playerA, 20 + 2); + assertLife(playerB, 20 - 2); + } +} diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index de6f86b36e7..f978f420ef5 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -317,14 +317,14 @@ public final class CardUtil { /** * Adjusts spell or ability cost to be paid by colored and generic mana. * - * @param spellAbility - * @param manaCostsToReduce costs to reduce + * @param ability spell or ability to reduce the cost of + * @param manaCostsToReduce reduces the spell or ability cost by that much * @param convertToGeneric colored mana does reduce generic mana if no * appropriate colored mana is in the costs * included */ - public static void adjustCost(SpellAbility spellAbility, ManaCosts manaCostsToReduce, boolean convertToGeneric) { - ManaCosts previousCost = spellAbility.getManaCostsToPay(); + public static void adjustCost(Ability ability, ManaCosts manaCostsToReduce, boolean convertToGeneric) { + ManaCosts previousCost = ability.getManaCostsToPay(); ManaCosts adjustedCost = new ManaCostsImpl<>(); // save X value (e.g. convoke ability) for (VariableCost vCost : previousCost.getVariableCosts()) { @@ -474,8 +474,8 @@ public final class CardUtil { adjustedCost.add(new GenericManaCost(0)); // neede to check if cost was reduced to 0 } adjustedCost.setSourceFilter(previousCost.getSourceFilter()); // keep mana source restrictions - spellAbility.clearManaCostsToPay(); - spellAbility.addManaCostsToPay(adjustedCost); + ability.clearManaCostsToPay(); + ability.addManaCostsToPay(adjustedCost); } /**