From c9b5d5ad98f8b8136398056ab2ea3dcab42fea39 Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Thu, 23 May 2024 13:07:05 +0200 Subject: [PATCH] implement [MH3] Marionette Apprentice --- .../mage/cards/m/MarionetteApprentice.java | 56 +++++++++++++++++++ .../src/mage/cards/m/MarionetteMaster.java | 16 ++++-- Mage.Sets/src/mage/sets/ModernHorizons3.java | 1 + .../single/mh3/MarionetteApprenticeTest.java | 45 +++++++++++++++ 4 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/m/MarionetteApprentice.java create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/MarionetteApprenticeTest.java diff --git a/Mage.Sets/src/mage/cards/m/MarionetteApprentice.java b/Mage.Sets/src/mage/cards/m/MarionetteApprentice.java new file mode 100644 index 00000000000..b06a62bcb4f --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MarionetteApprentice.java @@ -0,0 +1,56 @@ + +package mage.cards.m; + +import mage.MageInt; +import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility; +import mage.abilities.effects.common.LoseLifeOpponentsEffect; +import mage.abilities.keyword.FabricateAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AnotherPredicate; + +import java.util.UUID; + +/** + * @author Susucr + */ +public final class MarionetteApprentice extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent("another creature or artifact you control"); + + static { + filter.add(AnotherPredicate.instance); + filter.add(Predicates.or(CardType.CREATURE.getPredicate(), CardType.ARTIFACT.getPredicate())); + } + + public MarionetteApprentice(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ARTIFICER); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Fabricate 1 + this.addAbility(new FabricateAbility(1)); + + // Whenever another creature or artifact you control is put into a graveyard from the battlefield, each opponent loses 1 life. + this.addAbility(new PutIntoGraveFromBattlefieldAllTriggeredAbility( + new LoseLifeOpponentsEffect(1), false, + filter, false + )); + } + + private MarionetteApprentice(final MarionetteApprentice card) { + super(card); + } + + @Override + public MarionetteApprentice copy() { + return new MarionetteApprentice(this); + } +} diff --git a/Mage.Sets/src/mage/cards/m/MarionetteMaster.java b/Mage.Sets/src/mage/cards/m/MarionetteMaster.java index ad31ce3e66e..c7ecc25daec 100644 --- a/Mage.Sets/src/mage/cards/m/MarionetteMaster.java +++ b/Mage.Sets/src/mage/cards/m/MarionetteMaster.java @@ -1,27 +1,29 @@ package mage.cards.m; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.PutIntoGraveFromBattlefieldAllTriggeredAbility; import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.LoseLifeTargetEffect; import mage.abilities.keyword.FabricateAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; +import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledArtifactPermanent; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** - * * @author fireshoes */ public final class MarionetteMaster extends CardImpl { + private static final FilterPermanent filter = new FilterControlledArtifactPermanent("an artifact you control"); + public MarionetteMaster(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}"); this.subtype.add(SubType.HUMAN); @@ -33,9 +35,11 @@ public final class MarionetteMaster extends CardImpl { this.addAbility(new FabricateAbility(3)); // Whenever an artifact you control is put into a graveyard from the battlefield, target opponent loses life equal to Marionette Master's power. - Effect effect = new LoseLifeTargetEffect(new SourcePermanentPowerCount(false)); - effect.setText("target opponent loses life equal to Marionette Master's power"); - Ability ability = new PutIntoGraveFromBattlefieldAllTriggeredAbility(effect, false, new FilterControlledArtifactPermanent("an artifact you control"), false); + Ability ability = new PutIntoGraveFromBattlefieldAllTriggeredAbility( + new LoseLifeTargetEffect(new SourcePermanentPowerCount(false)) + .setText("target opponent loses life equal to {this}'s power"), + false, filter, false + ); ability.addTarget(new TargetOpponent()); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/sets/ModernHorizons3.java b/Mage.Sets/src/mage/sets/ModernHorizons3.java index c55000b382e..49fe9d349dd 100644 --- a/Mage.Sets/src/mage/sets/ModernHorizons3.java +++ b/Mage.Sets/src/mage/sets/ModernHorizons3.java @@ -60,6 +60,7 @@ public final class ModernHorizons3 extends ExpansionSet { 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)); cards.add(new SetCardInfo("Laelia, the Blade Reforged", 281, Rarity.RARE, mage.cards.l.LaeliaTheBladeReforged.class)); + cards.add(new SetCardInfo("Marionette Apprentice", 100, Rarity.UNCOMMON, mage.cards.m.MarionetteApprentice.class)); cards.add(new SetCardInfo("Meltdown", 282, Rarity.UNCOMMON, mage.cards.m.Meltdown.class)); cards.add(new SetCardInfo("Mogg Mob", 127, Rarity.UNCOMMON, mage.cards.m.MoggMob.class)); cards.add(new SetCardInfo("Mountain", 307, Rarity.LAND, mage.cards.basiclands.Mountain.class, FULL_ART_BFZ_VARIOUS)); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/MarionetteApprenticeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/MarionetteApprenticeTest.java new file mode 100644 index 00000000000..2c7302511c4 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/mh3/MarionetteApprenticeTest.java @@ -0,0 +1,45 @@ +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 MarionetteApprenticeTest extends CardTestPlayerBase { + + /** + * {@link mage.cards.m.MarionetteApprentice} {1}{B} + * Creature — Human Artificer + * Fabricate 1 + * Whenever another creature or artifact you control is put into a graveyard from the battlefield, each opponent loses 1 life. + */ + private static final String apprentice = "Marionette Apprentice"; + + @Test + public void test_Trigger() { + setStrictChooseMode(true); + + addCard(Zone.BATTLEFIELD, playerA, apprentice); + addCard(Zone.BATTLEFIELD, playerA, "Grizzly Bears", 2); + addCard(Zone.BATTLEFIELD, playerB, "Grizzly Bears", 2); + addCard(Zone.BATTLEFIELD, playerA, "Mox Ruby", 2); + addCard(Zone.BATTLEFIELD, playerB, "Mox Ruby", 2); + addCard(Zone.BATTLEFIELD, playerA, "Sylvan Library", 2); + addCard(Zone.BATTLEFIELD, playerB, "Sylvan Library", 2); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 6); + addCard(Zone.HAND, playerA, "Akroma's Vengeance"); // Destroy all artifacts, creatures, and enchantments. + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Akroma's Vengeance"); + setChoice(playerA, "Whenever", 3); // stack triggers, there are 4 total. + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, 8); + assertGraveyardCount(playerB, 6); + assertLife(playerB, 20 - 4); + } +}