diff --git a/Mage.Sets/src/mage/cards/o/ObekaSplitterOfSeconds.java b/Mage.Sets/src/mage/cards/o/ObekaSplitterOfSeconds.java index 09f191a0bca..81c49b9fad5 100644 --- a/Mage.Sets/src/mage/cards/o/ObekaSplitterOfSeconds.java +++ b/Mage.Sets/src/mage/cards/o/ObekaSplitterOfSeconds.java @@ -8,13 +8,9 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.keyword.MenaceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Outcome; -import mage.constants.SubType; -import mage.constants.SuperType; +import mage.constants.*; import mage.game.Game; import mage.game.turn.TurnMod; -import mage.game.turn.UpkeepStep; import java.util.UUID; @@ -76,7 +72,10 @@ class ObekaSplitterOfSecondsEffect extends OneShotEffect { return false; } for (int i = 0; i < extraSteps; ++i) { - game.getState().getTurnMods().add(new TurnMod(source.getControllerId()).withExtraStep(new UpkeepStep())); + game.getState().getTurnMods().add( + new TurnMod(source.getControllerId()) + .withExtraStepInExtraPhase(PhaseStep.UPKEEP, TurnPhase.BEGINNING) + ); } return true; } 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 8179c506464..7956543c0d5 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 @@ -28,6 +28,8 @@ public class ObekaSplitterOfSecondsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Fountain of Renewal"); attack(1, playerA, obeka, playerB); + checkLife("Extra upkeeps are in extra phases after combat", 1, PhaseStep.END_COMBAT, playerA, 20 + 1); + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); execute(); diff --git a/Mage/src/main/java/mage/game/turn/Phase.java b/Mage/src/main/java/mage/game/turn/Phase.java index d0550342950..89863a8397d 100644 --- a/Mage/src/main/java/mage/game/turn/Phase.java +++ b/Mage/src/main/java/mage/game/turn/Phase.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; /** * @author BetaSteward_at_googlemail.com @@ -258,4 +259,20 @@ public abstract class Phase implements Serializable { } } + /** + * One card [[Okea, Splitter of Seconds]], adds extra beginning phases with + * all but upkeep steps skipped. + * To achieve that, this function is called right after creating the extra Phase, + * before running it. + */ + public void keepOnlyStep(PhaseStep step) { + if (count != 0) { + throw new IllegalStateException("Wrong code usage: illegal Phase modification once it started running"); + } + this.steps = this.steps.stream().filter(s -> s.getType().equals(step)).collect(Collectors.toList()); + if (this.steps.isEmpty()) { + throw new IllegalStateException("Wrong code usage: keepOnlyStep should not remove all the steps in a phase - " + step); + } + } + } diff --git a/Mage/src/main/java/mage/game/turn/Turn.java b/Mage/src/main/java/mage/game/turn/Turn.java index 0f41bb2ac11..e57964bb93e 100644 --- a/Mage/src/main/java/mage/game/turn/Turn.java +++ b/Mage/src/main/java/mage/game/turn/Turn.java @@ -263,6 +263,10 @@ public class Turn implements Serializable { default: throw new IllegalArgumentException("Unknown phase type: " + extraPhase); } + PhaseStep skipAllButExtraStep = extraPhaseMod.getSkipAllButExtraStep(); + if (skipAllButExtraStep != null) { + phase.keepOnlyStep(skipAllButExtraStep); + } currentPhase = phase; game.fireEvent(new PhaseChangedEvent(activePlayerId, extraPhaseMod)); Player activePlayer = game.getPlayer(activePlayerId); diff --git a/Mage/src/main/java/mage/game/turn/TurnMod.java b/Mage/src/main/java/mage/game/turn/TurnMod.java index 62b30a1ab03..bd123c431a1 100644 --- a/Mage/src/main/java/mage/game/turn/TurnMod.java +++ b/Mage/src/main/java/mage/game/turn/TurnMod.java @@ -42,7 +42,7 @@ public class TurnMod implements Serializable, Copyable { private Step extraStep; private PhaseStep skipStep; - + private PhaseStep skipAllButExtraStep; // for extra phase skipping all but a specific step. private TurnPhase afterPhase; private PhaseStep afterStep; @@ -66,6 +66,7 @@ public class TurnMod implements Serializable, Copyable { this.extraStep = mod.extraStep.copy(); } this.skipStep = mod.skipStep; + this.skipAllButExtraStep = mod.skipAllButExtraStep; this.afterPhase = mod.afterPhase; this.afterStep = mod.afterStep; if (mod.subsequentTurnMod != null) { @@ -126,6 +127,18 @@ public class TurnMod implements Serializable, Copyable { return withExtraPhase(extraPhase, null); } + /** + * Adds an extra step in a new extra phase after this one. + * All steps that are not the right one are skipped in the extra phase. + * e.g. [[Obeka, Splitter of Seconds]] + */ + public TurnMod withExtraStepInExtraPhase(PhaseStep extraStep, TurnPhase extraPhase) { + this.extraPhase = extraPhase; + this.skipAllButExtraStep = extraStep; + lock(); + return this; + } + public TurnMod withExtraPhase(TurnPhase extraPhase, TurnPhase addAfterPhase) { this.extraPhase = extraPhase; this.afterPhase = addAfterPhase; @@ -192,6 +205,10 @@ public class TurnMod implements Serializable, Copyable { return skipPhase; } + public PhaseStep getSkipAllButExtraStep() { + return skipAllButExtraStep; + } + public PhaseStep getSkipStep() { return skipStep; }