From a8f0a545b94e6d61b4fe9d4c512b77e7041aa314 Mon Sep 17 00:00:00 2001 From: xenohedron <12538125+xenohedron@users.noreply.github.com> Date: Sun, 22 Jun 2025 14:50:48 -0400 Subject: [PATCH] rework Homicidal Brute to common classes --- .../src/mage/cards/h/HomicidalBrute.java | 79 ++++--------------- .../cards/single/isd/HomicidalBruteTest.java | 30 +++++++ 2 files changed, 45 insertions(+), 64 deletions(-) diff --git a/Mage.Sets/src/mage/cards/h/HomicidalBrute.java b/Mage.Sets/src/mage/cards/h/HomicidalBrute.java index 8fbe94b9423..e9a45b2582c 100644 --- a/Mage.Sets/src/mage/cards/h/HomicidalBrute.java +++ b/Mage.Sets/src/mage/cards/h/HomicidalBrute.java @@ -1,28 +1,32 @@ package mage.cards.h; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.TriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.condition.InvertCondition; +import mage.abilities.condition.common.AttackedThisTurnSourceCondition; import mage.abilities.effects.common.TapSourceEffect; import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; -import mage.constants.WatcherScope; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.watchers.Watcher; + +import java.util.UUID; /** * @author nantuko */ public final class HomicidalBrute extends CardImpl { + private static final Condition condition = new InvertCondition( + AttackedThisTurnSourceCondition.instance, "{this} didn't attack this turn" + ); + public HomicidalBrute(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},""); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.MUTANT); @@ -34,7 +38,9 @@ public final class HomicidalBrute extends CardImpl { this.toughness = new MageInt(1); // At the beginning of your end step, if Homicidal Brute didn't attack this turn, tap Homicidal Brute, then transform it. - this.addAbility(new HomicidalBruteTriggeredAbility(), new HomicidalBruteWatcher()); + TriggeredAbility ability = new BeginningOfEndStepTriggeredAbility(new TapSourceEffect()); + ability.addEffect(new TransformSourceEffect().setText(", then transform it")); + this.addAbility(ability.withInterveningIf(condition)); } private HomicidalBrute(final HomicidalBrute card) { @@ -47,58 +53,3 @@ public final class HomicidalBrute extends CardImpl { } } - -class HomicidalBruteTriggeredAbility extends TriggeredAbilityImpl { - - public HomicidalBruteTriggeredAbility() { - super(Zone.BATTLEFIELD, new TapSourceEffect(), false); - addEffect(new TransformSourceEffect()); - } - - private HomicidalBruteTriggeredAbility(final HomicidalBruteTriggeredAbility ability) { - super(ability); - } - - @Override - public HomicidalBruteTriggeredAbility copy() { - return new HomicidalBruteTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.END_TURN_STEP_PRE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (event.getPlayerId().equals(this.controllerId)) { - Watcher watcher = game.getState().getWatcher(HomicidalBruteWatcher.class, sourceId); - if (watcher == null || !watcher.conditionMet()) { - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "At the beginning of your end step, if {this} didn't attack this turn, tap {this}, then transform it."; - } -} - -class HomicidalBruteWatcher extends Watcher { - - public HomicidalBruteWatcher() { - super(WatcherScope.CARD); - } - - @Override - public void watch(GameEvent event, Game game) { - if (condition) { - return; - } - if (event.getType() == GameEvent.EventType.ATTACKER_DECLARED && event.getSourceId().equals(sourceId)) { - condition = true; - } - } -} diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/isd/HomicidalBruteTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/isd/HomicidalBruteTest.java index 165999433bb..0bfb2decd72 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/isd/HomicidalBruteTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/isd/HomicidalBruteTest.java @@ -84,4 +84,34 @@ public class HomicidalBruteTest extends CardTestPlayerBase { assertTapped("Homicidal Brute", true); } + @Test + public void testCardBlinkNotTransform() { + addCard(Zone.BATTLEFIELD, playerA, "Civilized Scholar"); + addCard(Zone.HAND, playerA, "Sejiri Merfolk"); + addCard(Zone.HAND, playerA, "Moonmist"); // transform all + addCard(Zone.HAND, playerA, "Cloudshift"); // blink + addCard(Zone.BATTLEFIELD, playerA, "Savannah", 3); + + activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Draw a card, then discard a card."); + setChoice(playerA, "Sejiri Merfolk"); // discard creature + + attack(3, playerA, "Homicidal Brute", playerB); + castSpell(3, PhaseStep.COMBAT_DAMAGE, playerA, "Cloudshift", "Homicidal Brute"); + castSpell(3, PhaseStep.END_COMBAT, playerA, "Moonmist"); + + checkPermanentTapped("after transform", 3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Homicidal Brute", false, 1); + + setStrictChooseMode(true); + setStopAt(4, PhaseStep.UPKEEP); + execute(); + + assertGraveyardCount(playerA, "Cloudshift", 1); + assertGraveyardCount(playerA, "Moonmist", 1); + assertLife(playerA, 20); + assertLife(playerB, 15); + assertPermanentCount(playerA, "Civilized Scholar", 1); + assertPermanentCount(playerA, "Homicidal Brute", 0); + assertTapped("Civilized Scholar", true); + } + }