From ff4bd9b4302d50ce20edfe19c3d3c058a6feafce Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Thu, 25 Apr 2024 12:16:37 +0200 Subject: [PATCH] fix Obeka, Splitter of Seconds' extra phase calling beginning of turn method --- .../otj/ObekaSplitterOfSecondsTest.java | 27 +++++++++++++++++++ .../java/mage/game/turn/BeginningPhase.java | 17 +++++++++--- Mage/src/main/java/mage/game/turn/Turn.java | 2 +- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/otj/ObekaSplitterOfSecondsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/otj/ObekaSplitterOfSecondsTest.java index 7956543c0d5..2f9951dc41d 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/otj/ObekaSplitterOfSecondsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/otj/ObekaSplitterOfSecondsTest.java @@ -37,4 +37,31 @@ public class ObekaSplitterOfSecondsTest extends CardTestPlayerBase { assertTapped(obeka, true); // checks that no extra untap happened assertHandCount(playerA, 0); // checks that no draw step happened } + + // Bug: Extra upkeep is wrongly changing summoning sickness status + @Test + public void test_ExtraUpkeep_TapAbility() { + setStrictChooseMode(true); + + addCard(Zone.BATTLEFIELD, playerA, obeka); + // At the beginning of your upkeep, you gain 1 life. + addCard(Zone.BATTLEFIELD, playerA, "Fountain of Renewal"); + addCard(Zone.HAND, playerA, "Soulmender"); // "{T}: You gain 1 life + addCard(Zone.BATTLEFIELD, playerA, "Plains"); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Soulmender", true); + checkPlayableAbility("Soulmender summoning sick pre-combat", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: You gain 1 life", false); + + attack(1, playerA, obeka, playerB); + checkLife("Extra upkeeps are in extra phases after combat", 1, PhaseStep.END_COMBAT, playerA, 20 + 1); + checkPlayableAbility("Soulmender summoning sick after extra upkeep", 1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{T}: You gain 1 life", false); + + checkPlayableAbility("Soulmender no longer summoning sick turn 3", 3, PhaseStep.UPKEEP, playerA, "{T}: You gain 1 life", true); + activateAbility(3, PhaseStep.UPKEEP, playerA, "{T}: You gain 1 life"); + + setStopAt(3, PhaseStep.PRECOMBAT_MAIN); + execute(); + + assertLife(playerA, 20 + 2 + 2 + 1); // 2 regular upkeep + 2 obeka ones + 1 Soulmender activation + } } diff --git a/Mage/src/main/java/mage/game/turn/BeginningPhase.java b/Mage/src/main/java/mage/game/turn/BeginningPhase.java index d284b8a1655..432de4f0ca3 100644 --- a/Mage/src/main/java/mage/game/turn/BeginningPhase.java +++ b/Mage/src/main/java/mage/game/turn/BeginningPhase.java @@ -2,18 +2,24 @@ package mage.game.turn; -import java.util.UUID; - import mage.constants.TurnPhase; import mage.game.Game; import mage.game.events.GameEvent.EventType; +import java.util.UUID; + /** * @author BetaSteward_at_googlemail.com */ public class BeginningPhase extends Phase { + private final boolean isExtra; + public BeginningPhase() { + this(false); + } + + public BeginningPhase(boolean isExtra) { this.type = TurnPhase.BEGINNING; this.event = EventType.BEGINNING_PHASE; this.preEvent = EventType.BEGINNING_PHASE_PRE; @@ -21,17 +27,20 @@ public class BeginningPhase extends Phase { this.steps.add(new UntapStep()); this.steps.add(new UpkeepStep()); this.steps.add(new DrawStep()); + this.isExtra = isExtra; } @Override public boolean beginPhase(Game game, UUID activePlayerId) { - game.getBattlefield().beginningOfTurn(game); + if (!isExtra) { + game.getBattlefield().beginningOfTurn(game); + } return super.beginPhase(game, activePlayerId); } - protected BeginningPhase(final BeginningPhase phase) { super(phase); + this.isExtra = phase.isExtra; } @Override diff --git a/Mage/src/main/java/mage/game/turn/Turn.java b/Mage/src/main/java/mage/game/turn/Turn.java index e57964bb93e..3a5985e1b49 100644 --- a/Mage/src/main/java/mage/game/turn/Turn.java +++ b/Mage/src/main/java/mage/game/turn/Turn.java @@ -246,7 +246,7 @@ public class Turn implements Serializable { Phase phase; switch (extraPhase) { case BEGINNING: - phase = new BeginningPhase(); + phase = new BeginningPhase(true); break; case PRECOMBAT_MAIN: phase = new PreCombatMainPhase();