From 6c6376d87835a4713e18fdd55536122a07bdd3b1 Mon Sep 17 00:00:00 2001 From: xenohedron Date: Mon, 17 Jul 2023 00:27:16 -0400 Subject: [PATCH] Fix #9273 (#10637) (process game state for two-part effects with zone change in first part) --- Mage.Sets/src/mage/cards/c/ChaosMutation.java | 3 +- .../src/mage/cards/c/CoercedConfession.java | 1 + .../src/mage/cards/c/ColossalBadger.java | 1 + .../src/mage/cards/c/CurseOfTheSwine.java | 1 + Mage.Sets/src/mage/cards/d/DecreeOfPain.java | 2 +- .../src/mage/cards/d/DescentOfTheDragons.java | 2 +- Mage.Sets/src/mage/cards/d/DreadSummons.java | 1 + Mage.Sets/src/mage/cards/f/Froghemoth.java | 1 + Mage.Sets/src/mage/cards/f/Fumigate.java | 2 +- .../mage/cards/g/GlyphOfReincarnation.java | 1 + .../src/mage/cards/g/GorgingVulture.java | 8 +++-- .../src/mage/cards/g/GraveyardTrespasser.java | 1 + Mage.Sets/src/mage/cards/h/HourOfNeed.java | 31 ++++++++++++------- .../src/mage/cards/l/LilianasIndignation.java | 1 + Mage.Sets/src/mage/cards/m/Malanthrope.java | 3 +- Mage.Sets/src/mage/cards/m/MarchOfSouls.java | 1 + Mage.Sets/src/mage/cards/m/MartyrsCry.java | 1 + .../src/mage/cards/m/MidnightRitual.java | 1 + .../src/mage/cards/m/MoggInfestation.java | 2 +- .../src/mage/cards/n/NecronMonolith.java | 6 +++- Mage.Sets/src/mage/cards/o/OutOfTime.java | 1 + .../src/mage/cards/o/OverwhelmingForces.java | 1 + Mage.Sets/src/mage/cards/r/RainOfDaggers.java | 1 + Mage.Sets/src/mage/cards/r/ReignOfTerror.java | 7 ++++- .../src/mage/cards/r/ReleaseToMemory.java | 1 + Mage.Sets/src/mage/cards/r/RighteousFury.java | 1 + .../src/mage/cards/t/ThePhasingOfZhalfir.java | 2 +- .../mage/cards/t/TymaretChosenFromDeath.java | 7 +++-- .../src/mage/cards/v/VoraciousFellBeast.java | 3 +- .../src/mage/cards/w/WasteManagement.java | 1 + .../src/mage/cards/w/WhiptongueHydra.java | 3 +- .../cards/single/scg/DecreeOfPainTest.java | 1 - 32 files changed, 71 insertions(+), 28 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ChaosMutation.java b/Mage.Sets/src/mage/cards/c/ChaosMutation.java index 3fdbc94e7e5..4134e752403 100644 --- a/Mage.Sets/src/mage/cards/c/ChaosMutation.java +++ b/Mage.Sets/src/mage/cards/c/ChaosMutation.java @@ -82,9 +82,10 @@ class ChaosMutationEffect extends OneShotEffect { .filter(Objects::nonNull) .collect(Collectors.toList()); controller.moveCards(permanents, Zone.EXILED, source, game); + game.getState().processAction(game); for (Player player : players) { Cards cards = new CardsImpl(); - Card card = this.getCreatureCard(player, cards, game); + Card card = getCreatureCard(player, cards, game); player.revealCards(source, cards, game); player.moveCards(card, Zone.BATTLEFIELD, source, game); cards.retainZone(Zone.LIBRARY, game); diff --git a/Mage.Sets/src/mage/cards/c/CoercedConfession.java b/Mage.Sets/src/mage/cards/c/CoercedConfession.java index 15a7b0478b7..2a19647e98c 100644 --- a/Mage.Sets/src/mage/cards/c/CoercedConfession.java +++ b/Mage.Sets/src/mage/cards/c/CoercedConfession.java @@ -75,6 +75,7 @@ class CoercedConfessionMillEffect extends OneShotEffect { if (controller == null) { return true; } + game.getState().processAction(game); controller.drawCards(creaturesMilled, source, game); return true; } diff --git a/Mage.Sets/src/mage/cards/c/ColossalBadger.java b/Mage.Sets/src/mage/cards/c/ColossalBadger.java index 1cedf4684f6..21226fe126d 100644 --- a/Mage.Sets/src/mage/cards/c/ColossalBadger.java +++ b/Mage.Sets/src/mage/cards/c/ColossalBadger.java @@ -76,6 +76,7 @@ class ColossalBadgerEffect extends OneShotEffect { int amount = player.millCards(4, source, game).count(StaticFilters.FILTER_CARD_CREATURE, game); Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); if (amount > 0 && permanent != null) { + game.getState().processAction(game); permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game); } return true; diff --git a/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java b/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java index a2e0db13c77..4956ff273db 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfTheSwine.java @@ -107,6 +107,7 @@ class CurseOfTheSwineEffect extends OneShotEffect { playersWithTargets.getOrDefault(lkiP.getControllerId(), 0) + 1); } } + game.getState().processAction(game); Boar2Token swineToken = new Boar2Token(); for (Map.Entry exiledByController : playersWithTargets.entrySet()) { swineToken.putOntoBattlefield(exiledByController.getValue(), game, source, exiledByController.getKey()); diff --git a/Mage.Sets/src/mage/cards/d/DecreeOfPain.java b/Mage.Sets/src/mage/cards/d/DecreeOfPain.java index 95aac9954d1..685b301958f 100644 --- a/Mage.Sets/src/mage/cards/d/DecreeOfPain.java +++ b/Mage.Sets/src/mage/cards/d/DecreeOfPain.java @@ -1,4 +1,3 @@ - package mage.cards.d; import java.util.UUID; @@ -73,6 +72,7 @@ class DecreeOfPainEffect extends OneShotEffect { } } if (destroyedCreature > 0) { + game.getState().processAction(game); controller.drawCards(destroyedCreature, source, game); } return true; diff --git a/Mage.Sets/src/mage/cards/d/DescentOfTheDragons.java b/Mage.Sets/src/mage/cards/d/DescentOfTheDragons.java index acedc251feb..f9dfcdc6664 100644 --- a/Mage.Sets/src/mage/cards/d/DescentOfTheDragons.java +++ b/Mage.Sets/src/mage/cards/d/DescentOfTheDragons.java @@ -71,11 +71,11 @@ class DescentOfTheDragonsEffect extends OneShotEffect { if (permanent.destroy(source, game, false)) { int count = playersWithTargets.getOrDefault(controllerOfTargetId, 0); playersWithTargets.put(controllerOfTargetId, count + 1); - } } } } + game.getState().processAction(game); DragonToken dragonToken = new DragonToken(); for (Map.Entry amountTokensPerPlayer : playersWithTargets.entrySet()) { dragonToken.putOntoBattlefield(amountTokensPerPlayer.getValue(), game, source, amountTokensPerPlayer.getKey()); diff --git a/Mage.Sets/src/mage/cards/d/DreadSummons.java b/Mage.Sets/src/mage/cards/d/DreadSummons.java index 80f6d20e78a..ecb6f79b5f1 100644 --- a/Mage.Sets/src/mage/cards/d/DreadSummons.java +++ b/Mage.Sets/src/mage/cards/d/DreadSummons.java @@ -74,6 +74,7 @@ class DreadSummonsEffect extends OneShotEffect { .count(); } if (creatureCount > 0) { + game.getState().processAction(game); token.putOntoBattlefield(creatureCount, game, source, source.getControllerId(), true, false); } return true; diff --git a/Mage.Sets/src/mage/cards/f/Froghemoth.java b/Mage.Sets/src/mage/cards/f/Froghemoth.java index 6227afd5a05..5b8d412d0a3 100644 --- a/Mage.Sets/src/mage/cards/f/Froghemoth.java +++ b/Mage.Sets/src/mage/cards/f/Froghemoth.java @@ -125,6 +125,7 @@ class FroghemothEffect extends OneShotEffect { } if (!cardsToExile.isEmpty()) { controller.moveCards(cardsToExile, Zone.EXILED, source, game); + game.getState().processAction(game); if (numCounters > 0) { Permanent permanent = source.getSourcePermanentIfItStillExists(game); if (permanent != null) { diff --git a/Mage.Sets/src/mage/cards/f/Fumigate.java b/Mage.Sets/src/mage/cards/f/Fumigate.java index 71ca97c6332..02a3c024b96 100644 --- a/Mage.Sets/src/mage/cards/f/Fumigate.java +++ b/Mage.Sets/src/mage/cards/f/Fumigate.java @@ -62,8 +62,8 @@ class FumigateEffect extends OneShotEffect { destroyedCreature++; } } - game.getState().processAction(game); if (destroyedCreature > 0) { + game.getState().processAction(game); controller.gainLife(destroyedCreature, game, source); } return true; diff --git a/Mage.Sets/src/mage/cards/g/GlyphOfReincarnation.java b/Mage.Sets/src/mage/cards/g/GlyphOfReincarnation.java index cc59afba816..8d9cf0cc156 100644 --- a/Mage.Sets/src/mage/cards/g/GlyphOfReincarnation.java +++ b/Mage.Sets/src/mage/cards/g/GlyphOfReincarnation.java @@ -98,6 +98,7 @@ class GlyphOfReincarnationEffect extends OneShotEffect { } } } + game.getState().processAction(game); // For each creature that died this way, put a creature card from the graveyard of the player who controlled that creature the last time it became blocked by that Wall // onto the battlefield under its owner’s control for (Map.Entry entry : destroyed.entrySet()) { diff --git a/Mage.Sets/src/mage/cards/g/GorgingVulture.java b/Mage.Sets/src/mage/cards/g/GorgingVulture.java index 263917dbd53..e2a473348d9 100644 --- a/Mage.Sets/src/mage/cards/g/GorgingVulture.java +++ b/Mage.Sets/src/mage/cards/g/GorgingVulture.java @@ -74,6 +74,10 @@ class GorgingVultureEffect extends OneShotEffect { .filter(card1 -> card1.isCreature(game)) .mapToInt(card -> game.getState().getZone(card.getId()) == Zone.GRAVEYARD ? 1 : 0) .sum(); - return player.gainLife(lifeToGain, game, source) > 0; + if (lifeToGain > 0) { + game.getState().processAction(game); + player.gainLife(lifeToGain, game, source); + } + return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java b/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java index da157163818..9eb3e7f42e5 100644 --- a/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java +++ b/Mage.Sets/src/mage/cards/g/GraveyardTrespasser.java @@ -87,6 +87,7 @@ class GraveyardTrespasserEffect extends OneShotEffect { if (amount < 1) { return true; } + game.getState().processAction(game); player.gainLife(amount, game, source); for (UUID opponentId : game.getOpponents(source.getControllerId())) { Player opponent = game.getPlayer(opponentId); diff --git a/Mage.Sets/src/mage/cards/h/HourOfNeed.java b/Mage.Sets/src/mage/cards/h/HourOfNeed.java index 366efa5c3d5..bf2fca7e7d6 100644 --- a/Mage.Sets/src/mage/cards/h/HourOfNeed.java +++ b/Mage.Sets/src/mage/cards/h/HourOfNeed.java @@ -15,7 +15,7 @@ import mage.game.permanent.token.Token; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; -import java.util.UUID; +import java.util.*; /** * @author LevelX2 @@ -62,17 +62,24 @@ class HourOfNeedExileEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - for (UUID creatureId : getTargetPointer().getTargets(game, source)) { - Permanent creature = game.getPermanent(creatureId); - if (creature != null) { - controller.moveCardToExileWithInfo(creature, null, null, source, game, Zone.BATTLEFIELD, true); - Token token = new HourOfNeedSphinxToken(); - token.putOntoBattlefield(1, game, source, creature.getControllerId()); - } - } - return true; + if (controller == null) { + return false; } - return false; + Map tokenCounts = new HashMap<>(); // For each player, count the number of creatures exiled + for (UUID creatureId : getTargetPointer().getTargets(game, source)) { + Permanent creature = game.getPermanent(creatureId); + if (creature != null && controller.moveCards(creature, Zone.EXILED, source, game)) { + tokenCounts.put(creature.getControllerId(), tokenCounts.getOrDefault(creature.getControllerId(), 0) + 1); + } + } + if (tokenCounts.values().stream().noneMatch(i -> (i > 0))) { + return false; + } + game.getState().processAction(game); + Token token = new HourOfNeedSphinxToken(); + for (Map.Entry playerTokenCount : tokenCounts.entrySet()) { + token.putOntoBattlefield(playerTokenCount.getValue(), game, source, playerTokenCount.getKey()); + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/l/LilianasIndignation.java b/Mage.Sets/src/mage/cards/l/LilianasIndignation.java index bfdf23caead..2209df27ca1 100644 --- a/Mage.Sets/src/mage/cards/l/LilianasIndignation.java +++ b/Mage.Sets/src/mage/cards/l/LilianasIndignation.java @@ -75,6 +75,7 @@ class LilianasIndignationEffect extends OneShotEffect { if (creatures > 0) { Player targetPlayer = game.getPlayer(source.getFirstTarget()); if (targetPlayer != null) { + game.getState().processAction(game); targetPlayer.loseLife(creatures, game, source, false); } } diff --git a/Mage.Sets/src/mage/cards/m/Malanthrope.java b/Mage.Sets/src/mage/cards/m/Malanthrope.java index 0189861940f..70c6a1bb8b9 100644 --- a/Mage.Sets/src/mage/cards/m/Malanthrope.java +++ b/Mage.Sets/src/mage/cards/m/Malanthrope.java @@ -77,7 +77,8 @@ class MalanthropeEffect extends OneShotEffect { int count = player.getGraveyard().count(StaticFilters.FILTER_CARD_CREATURE, game); player.moveCards(player.getGraveyard(), Zone.EXILED, source, game); Permanent permanent = source.getSourcePermanentIfItStillExists(game); - if (permanent != null) { + if (permanent != null && count > 0) { + game.getState().processAction(game); permanent.addCounters(CounterType.P1P1.createInstance(count), source, game); } return true; diff --git a/Mage.Sets/src/mage/cards/m/MarchOfSouls.java b/Mage.Sets/src/mage/cards/m/MarchOfSouls.java index 183ed39b85b..d41bae1befe 100644 --- a/Mage.Sets/src/mage/cards/m/MarchOfSouls.java +++ b/Mage.Sets/src/mage/cards/m/MarchOfSouls.java @@ -66,6 +66,7 @@ class MarchOfSoulsEffect extends OneShotEffect { playersWithCreatures.put(controllerId, playersWithCreatures.getOrDefault(controllerId, 0) + 1); } } + game.getState().processAction(game); SpiritWhiteToken token = new SpiritWhiteToken(); for (Map.Entry destroyedCreaturePerPlayer : playersWithCreatures.entrySet()) { token.putOntoBattlefield(destroyedCreaturePerPlayer.getValue(), game, source, destroyedCreaturePerPlayer.getKey()); diff --git a/Mage.Sets/src/mage/cards/m/MartyrsCry.java b/Mage.Sets/src/mage/cards/m/MartyrsCry.java index b5928415c93..dab4e8177f0 100644 --- a/Mage.Sets/src/mage/cards/m/MartyrsCry.java +++ b/Mage.Sets/src/mage/cards/m/MartyrsCry.java @@ -87,6 +87,7 @@ class MartyrsCryEffect extends OneShotEffect { Integer::sum )); controller.moveCards(new CardsImpl(permanents), Zone.EXILED, source, game); + game.getState().processAction(game); for (Map.Entry entry : playerMap.entrySet()) { Player player = game.getPlayer(entry.getKey()); if (player == null) { diff --git a/Mage.Sets/src/mage/cards/m/MidnightRitual.java b/Mage.Sets/src/mage/cards/m/MidnightRitual.java index 1eea63ccb86..65f5463b2f8 100644 --- a/Mage.Sets/src/mage/cards/m/MidnightRitual.java +++ b/Mage.Sets/src/mage/cards/m/MidnightRitual.java @@ -77,6 +77,7 @@ class MidnightRitualEffect extends OneShotEffect { Cards cardsToExile = new CardsImpl(getTargetPointer().getTargets(game, source)); controller.moveCards(cardsToExile, Zone.EXILED, source, game); if (!cardsToExile.isEmpty()) { + game.getState().processAction(game); new ZombieToken().putOntoBattlefield(cardsToExile.size(), game, source, controller.getId()); } return true; diff --git a/Mage.Sets/src/mage/cards/m/MoggInfestation.java b/Mage.Sets/src/mage/cards/m/MoggInfestation.java index 26665315aef..2d6c57e7115 100644 --- a/Mage.Sets/src/mage/cards/m/MoggInfestation.java +++ b/Mage.Sets/src/mage/cards/m/MoggInfestation.java @@ -74,10 +74,10 @@ class MoggInfestationEffect extends OneShotEffect { } } } - game.getState().processAction(game); // Bug #8548 if (creaturesDied.isEmpty()) { return true; } + game.getState().processAction(game); // Bug #8548 for (Card c : creaturesDied.getCards(game)) { if (game.getState().getZone(c.getId()) == Zone.GRAVEYARD) { Effect effect = new CreateTokenTargetEffect(new GoblinToken(), 2); diff --git a/Mage.Sets/src/mage/cards/n/NecronMonolith.java b/Mage.Sets/src/mage/cards/n/NecronMonolith.java index 825934ae1a7..901fad0b1f2 100644 --- a/Mage.Sets/src/mage/cards/n/NecronMonolith.java +++ b/Mage.Sets/src/mage/cards/n/NecronMonolith.java @@ -80,6 +80,10 @@ class NecronMonolithEffect extends OneShotEffect { int count = player .millCards(3, source, game) .count(StaticFilters.FILTER_CARD_CREATURE, game); - return count > 0 && new NecronWarriorToken().putOntoBattlefield(count, game, source); + if (count > 0) { + game.getState().processAction(game); + new NecronWarriorToken().putOntoBattlefield(count, game, source); + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/o/OutOfTime.java b/Mage.Sets/src/mage/cards/o/OutOfTime.java index d9fdc7a6a73..34dc4540538 100644 --- a/Mage.Sets/src/mage/cards/o/OutOfTime.java +++ b/Mage.Sets/src/mage/cards/o/OutOfTime.java @@ -85,6 +85,7 @@ class OutOfTimePhaseOutEffect extends OneShotEffect { Permanent outOfTime = game.getPermanent(source.getSourceId()); if (outOfTime != null) { new PhaseOutAllEffect(new ArrayList<>(creatureIds)).apply(game, source); + game.getState().processAction(game); new AddCountersSourceEffect(CounterType.TIME.createInstance(numCreatures)).apply(game, source); game.getState().setValue("phasedOutCreatures" + source.getId().toString(), creatureIds); diff --git a/Mage.Sets/src/mage/cards/o/OverwhelmingForces.java b/Mage.Sets/src/mage/cards/o/OverwhelmingForces.java index 12883357bb2..ac163a9b299 100644 --- a/Mage.Sets/src/mage/cards/o/OverwhelmingForces.java +++ b/Mage.Sets/src/mage/cards/o/OverwhelmingForces.java @@ -66,6 +66,7 @@ class OverwhelmingForcesEffect extends OneShotEffect { } } if (destroyedCreature > 0) { + game.getState().processAction(game); new DrawCardSourceControllerEffect(destroyedCreature).apply(game, source); } return true; diff --git a/Mage.Sets/src/mage/cards/r/RainOfDaggers.java b/Mage.Sets/src/mage/cards/r/RainOfDaggers.java index a085f4e63c8..5eed12cf99e 100644 --- a/Mage.Sets/src/mage/cards/r/RainOfDaggers.java +++ b/Mage.Sets/src/mage/cards/r/RainOfDaggers.java @@ -66,6 +66,7 @@ class RainOfDaggersEffect extends OneShotEffect { } } if (destroyedCreature > 0) { + game.getState().processAction(game); new LoseLifeSourceControllerEffect(destroyedCreature * 2).apply(game, source); } return true; diff --git a/Mage.Sets/src/mage/cards/r/ReignOfTerror.java b/Mage.Sets/src/mage/cards/r/ReignOfTerror.java index 620f7a8a33c..ed82d7158a8 100644 --- a/Mage.Sets/src/mage/cards/r/ReignOfTerror.java +++ b/Mage.Sets/src/mage/cards/r/ReignOfTerror.java @@ -77,6 +77,11 @@ class ReignOfTerrorEffect extends OneShotEffect { .stream() .mapToInt(permanent -> permanent.destroy(source, game, true) ? 1 : 0) .sum(); - return player.loseLife(2 * died, game, source, false) > 0; + if (died > 0) { + game.getState().processAction(game); + player.loseLife(2 * died, game, source, false); + return true; + } + return false; } } diff --git a/Mage.Sets/src/mage/cards/r/ReleaseToMemory.java b/Mage.Sets/src/mage/cards/r/ReleaseToMemory.java index c323affd7a2..b1dbc495e31 100644 --- a/Mage.Sets/src/mage/cards/r/ReleaseToMemory.java +++ b/Mage.Sets/src/mage/cards/r/ReleaseToMemory.java @@ -64,6 +64,7 @@ class ReleaseToMemoryEffect extends OneShotEffect { int creatures = player.getGraveyard().count(StaticFilters.FILTER_CARD_CREATURE, game); player.moveCards(player.getGraveyard(), Zone.EXILED, source, game); if (creatures > 0) { + game.getState().processAction(game); new SpiritToken().putOntoBattlefield(creatures, game, source); } return true; diff --git a/Mage.Sets/src/mage/cards/r/RighteousFury.java b/Mage.Sets/src/mage/cards/r/RighteousFury.java index 4cf5c10736e..604bc93a09f 100644 --- a/Mage.Sets/src/mage/cards/r/RighteousFury.java +++ b/Mage.Sets/src/mage/cards/r/RighteousFury.java @@ -67,6 +67,7 @@ class RighteousFuryEffect extends OneShotEffect { } } if (destroyedCreature > 0) { + game.getState().processAction(game); new GainLifeEffect(destroyedCreature * 2).apply(game, source); } return true; diff --git a/Mage.Sets/src/mage/cards/t/ThePhasingOfZhalfir.java b/Mage.Sets/src/mage/cards/t/ThePhasingOfZhalfir.java index 0aa4e011a9c..bba81b5c8a1 100644 --- a/Mage.Sets/src/mage/cards/t/ThePhasingOfZhalfir.java +++ b/Mage.Sets/src/mage/cards/t/ThePhasingOfZhalfir.java @@ -124,11 +124,11 @@ class ThePhasingOfZhalfirDestroyEffect extends OneShotEffect { StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source, game )) { - UUID controllerId = permanent.getControllerId(); if (permanent.destroy(source, game, false)) { playerMap.compute(permanent.getControllerId(), CardUtil::setOrIncrementValue); } } + game.getState().processAction(game); Token token = new PhyrexianToken(); for (Map.Entry entry : playerMap.entrySet()) { token.putOntoBattlefield(entry.getValue(), game, source, entry.getKey()); diff --git a/Mage.Sets/src/mage/cards/t/TymaretChosenFromDeath.java b/Mage.Sets/src/mage/cards/t/TymaretChosenFromDeath.java index d3671501615..89974103860 100644 --- a/Mage.Sets/src/mage/cards/t/TymaretChosenFromDeath.java +++ b/Mage.Sets/src/mage/cards/t/TymaretChosenFromDeath.java @@ -96,7 +96,10 @@ class TymaretChosenFromDeathEffect extends OneShotEffect { .filter(Zone.EXILED::equals) .mapToInt(x -> 1) .sum(); - player.gainLife(lifeGain, game, source); + if (lifeGain > 0) { + game.getState().processAction(game); + player.gainLife(lifeGain, game, source); + } return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/v/VoraciousFellBeast.java b/Mage.Sets/src/mage/cards/v/VoraciousFellBeast.java index e760d991d60..7927f262811 100644 --- a/Mage.Sets/src/mage/cards/v/VoraciousFellBeast.java +++ b/Mage.Sets/src/mage/cards/v/VoraciousFellBeast.java @@ -106,7 +106,8 @@ class VoraciousFellBeastEffect extends OneShotEffect { sacrificeCount += 1; } } - if(sacrificeCount > 0) { + if (sacrificeCount > 0) { + game.getState().processAction(game); new CreateTokenEffect(new FoodToken(), sacrificeCount).apply(game, source); } return true; diff --git a/Mage.Sets/src/mage/cards/w/WasteManagement.java b/Mage.Sets/src/mage/cards/w/WasteManagement.java index 877ca20c252..b147f60ab21 100644 --- a/Mage.Sets/src/mage/cards/w/WasteManagement.java +++ b/Mage.Sets/src/mage/cards/w/WasteManagement.java @@ -101,6 +101,7 @@ class WasteManagementEffect extends OneShotEffect { cards.retainZone(Zone.EXILED, game); int count = cards.count(StaticFilters.FILTER_CARD_CREATURE, game); if (count > 0) { + game.getState().processAction(game); new RogueToken().putOntoBattlefield(count, game, source); } return true; diff --git a/Mage.Sets/src/mage/cards/w/WhiptongueHydra.java b/Mage.Sets/src/mage/cards/w/WhiptongueHydra.java index 656371315c7..5a60b9c7838 100644 --- a/Mage.Sets/src/mage/cards/w/WhiptongueHydra.java +++ b/Mage.Sets/src/mage/cards/w/WhiptongueHydra.java @@ -81,7 +81,8 @@ class WhiptongueHydraEffect extends OneShotEffect { (permanent) -> (permanent.destroy(source, game, false)) ).map((_item) -> 1).reduce(destroyedPermanents, Integer::sum); if (destroyedPermanents > 0) { - return new AddCountersSourceEffect( + game.getState().processAction(game); + new AddCountersSourceEffect( CounterType.P1P1.createInstance(destroyedPermanents), true ).apply(game, source); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/scg/DecreeOfPainTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/scg/DecreeOfPainTest.java index 79bafd1d4e6..ee6f89ccf72 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/scg/DecreeOfPainTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/scg/DecreeOfPainTest.java @@ -25,7 +25,6 @@ public class DecreeOfPainTest extends CardTestPlayerBase { * This is wrong since the draws occur after the creatures have been destroyed. */ @Test - @Ignore public void testDrawHappensAfterDestruction(){ // Destroy all creatures. They can’t be regenerated. Draw a card for each creature destroyed this way. addCard(Zone.HAND, playerA, "Decree of Pain");