From b0ee19d78215b7ec0e5272164c033ba6a6e96572 Mon Sep 17 00:00:00 2001 From: jmlundeen Date: Sun, 17 Aug 2025 12:26:23 -0500 Subject: [PATCH] fix Stalwart Successor checking permanents entering --- .../src/mage/cards/s/StalwartSuccessor.java | 12 ++++- .../single/tdm/StalwartSuccessorTest.java | 48 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/single/tdm/StalwartSuccessorTest.java diff --git a/Mage.Sets/src/mage/cards/s/StalwartSuccessor.java b/Mage.Sets/src/mage/cards/s/StalwartSuccessor.java index ae0fbeacb18..5497da547fb 100644 --- a/Mage.Sets/src/mage/cards/s/StalwartSuccessor.java +++ b/Mage.Sets/src/mage/cards/s/StalwartSuccessor.java @@ -78,14 +78,19 @@ class StalwartSuccessorTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { + int zccOffset = 0; Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent == null) { + permanent = game.getPermanentEntering(event.getTargetId()); + zccOffset = 1; + } if (permanent == null || !permanent.isCreature(game) || !permanent.isControlledBy(getControllerId()) || !StalwartSuccessorWatcher.checkCreature(permanent, event, game)) { return false; } - this.getEffects().setTargetPointer(new FixedTarget(permanent, game)); + this.getEffects().setTargetPointer(new FixedTarget(permanent.getId(), permanent.getZoneChangeCounter(game) + zccOffset)); return true; } } @@ -101,6 +106,11 @@ class StalwartSuccessorWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.COUNTERS_ADDED) { + if (game.getPermanent(event.getTargetId()) == null) { + // permanent entering + Permanent permanent = game.getPermanentEntering(event.getTargetId()); + map.putIfAbsent(new MageObjectReference(event.getTargetId(), permanent.getZoneChangeCounter(game) + 1, game), event.getId()); + } map.putIfAbsent(new MageObjectReference(event.getTargetId(), game), event.getId()); } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/tdm/StalwartSuccessorTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/tdm/StalwartSuccessorTest.java new file mode 100644 index 00000000000..343dcf899fc --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/tdm/StalwartSuccessorTest.java @@ -0,0 +1,48 @@ +package org.mage.test.cards.single.tdm; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +public class StalwartSuccessorTest extends CardTestPlayerBase { + + /* + Stalwart Successor + {1}{B}{G} + Creature — Human Warrior + + Menace (This creature can’t be blocked except by two or more creatures.) + + Whenever one or more counters are put on a creature you control, if it’s the first time counters have been put on that creature this turn, put a +1/+1 counter on that creature. + + 3/2 + */ + private static final String stalwartSuccessor = "Stalwart Successor"; + /* + Purestrain Genestealer + {2}{G} + Creature — Tyranid + + This creature enters with two +1/+1 counters on it. + + Vanguard Species — Whenever this creature attacks, you may remove a +1/+1 counter from it. If you do, search your library for a basic land card, put it onto the battlefield tapped, then shuffle. + + 1/1 + */ + private static final String purestrainGenestealer = "Purestrain Genestealer"; + @Test + public void testStalwartSuccessor() { + + addCard(Zone.BATTLEFIELD, playerA, stalwartSuccessor); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 3); + addCard(Zone.HAND, playerA, purestrainGenestealer); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, purestrainGenestealer); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertCounterCount(playerA, purestrainGenestealer, CounterType.P1P1, 2 + 1); + } +}