From 141a4e5437d01ab45e562b39b0bd85d9fafaeba1 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sun, 18 Aug 2024 14:30:17 +0400 Subject: [PATCH] Keen-Eyed Curator - fixed game error on usage in deck (also fixed Gustha's Scepter, Eater of Virtue, Death-Mask Duplicant); --- .../src/mage/cards/d/DeathMaskDuplicant.java | 9 +++--- Mage.Sets/src/mage/cards/e/EaterOfVirtue.java | 8 ++--- .../src/mage/cards/g/GusthasScepter.java | 4 ++- .../src/mage/cards/k/KeenEyedCurator.java | 30 +++++++++---------- .../base/impl/CardTestPlayerAPIImpl.java | 2 +- 5 files changed, 27 insertions(+), 26 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DeathMaskDuplicant.java b/Mage.Sets/src/mage/cards/d/DeathMaskDuplicant.java index 78888dab97e..19e6824e411 100644 --- a/Mage.Sets/src/mage/cards/d/DeathMaskDuplicant.java +++ b/Mage.Sets/src/mage/cards/d/DeathMaskDuplicant.java @@ -30,6 +30,7 @@ import mage.constants.Outcome; import mage.constants.SubLayer; import mage.constants.Zone; import mage.filter.StaticFilters; +import mage.game.ExileZone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -91,11 +92,9 @@ public final class DeathMaskDuplicant extends CardImpl { for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { Player player = game.getPlayer(playerId); if (player != null) { - UUID exileId = CardUtil.getExileZoneId(game, source.getSourceId(), sourceObject.getZoneChangeCounter(game)); - if (exileId != null - && game.getState().getExile().getExileZone(exileId) != null - && !game.getState().getExile().getExileZone(exileId).isEmpty()) { - for (UUID cardId : game.getState().getExile().getExileZone(exileId)) { + ExileZone exileZone = game.getState().getExile().getExileZone(CardUtil.getExileZoneId(game, source.getSourceId(), sourceObject.getZoneChangeCounter(game))); + if (exileZone != null && !exileZone.isEmpty()) { + for (UUID cardId : exileZone) { Card card = game.getCard(cardId); if (card != null && card.isCreature(game)) { for (Ability ability : card.getAbilities(game)) { diff --git a/Mage.Sets/src/mage/cards/e/EaterOfVirtue.java b/Mage.Sets/src/mage/cards/e/EaterOfVirtue.java index d22fa0f8f27..9b2a9cc2bca 100644 --- a/Mage.Sets/src/mage/cards/e/EaterOfVirtue.java +++ b/Mage.Sets/src/mage/cards/e/EaterOfVirtue.java @@ -40,6 +40,7 @@ import mage.constants.SubLayer; import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; +import mage.game.ExileZone; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -135,10 +136,9 @@ class EaterOfVirtueGainAbilityAttachedEffect extends ContinuousEffectImpl { && eaterOfVirtue.getAttachedTo() != null) { Permanent permanent = game.getPermanent(eaterOfVirtue.getAttachedTo()); if (permanent != null) { - UUID exileId = CardUtil.getExileZoneId(source.getSourceId().toString() + "cards exiled by Eater of Virtue", game); - if (game.getState().getExile().getExileZone(exileId) != null - && game.getState().getExile().getExileZone(exileId).size() > 0) { - Set cardsInExile = game.getState().getExile().getExileZone(exileId).getCards(game); + ExileZone exileZone = game.getState().getExile().getExileZone(CardUtil.getExileZoneId(source.getSourceId().toString() + "cards exiled by Eater of Virtue", game)); + if (exileZone != null && !exileZone.isEmpty()) { + Set cardsInExile = exileZone.getCards(game); for (Card card : cardsInExile) { for (Ability a : card.getAbilities()) { if (a instanceof FlyingAbility) { diff --git a/Mage.Sets/src/mage/cards/g/GusthasScepter.java b/Mage.Sets/src/mage/cards/g/GusthasScepter.java index 07621059601..1597f6bfa1f 100644 --- a/Mage.Sets/src/mage/cards/g/GusthasScepter.java +++ b/Mage.Sets/src/mage/cards/g/GusthasScepter.java @@ -205,7 +205,9 @@ class GusthasScepterPutExiledCardsInOwnersGraveyardEffect extends OneShotEffect @Override public boolean apply(Game game, Ability source) { ExileZone exileZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source)); - exileZone.getCards(game).stream().forEach(card -> card.moveToZone(Zone.GRAVEYARD, source, game, false)); + if (exileZone != null) { + exileZone.getCards(game).forEach(card -> card.moveToZone(Zone.GRAVEYARD, source, game, false)); + } return true; } diff --git a/Mage.Sets/src/mage/cards/k/KeenEyedCurator.java b/Mage.Sets/src/mage/cards/k/KeenEyedCurator.java index 3d2e88d7b4c..cde48654500 100644 --- a/Mage.Sets/src/mage/cards/k/KeenEyedCurator.java +++ b/Mage.Sets/src/mage/cards/k/KeenEyedCurator.java @@ -17,10 +17,12 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; +import mage.game.ExileZone; import mage.game.Game; import mage.target.common.TargetCardInGraveyard; import mage.util.CardUtil; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.UUID; @@ -72,10 +74,8 @@ enum KeenEyedCuratorCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return game - .getExile() - .getExileZone(CardUtil.getExileZoneId(game, source)) - .getCards(game) + ExileZone exileZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source)); + return exileZone != null && exileZone.getCards(game) .stream() .map(card -> card.getCardType(game)) .flatMap(Collection::stream) @@ -89,17 +89,17 @@ enum KeenEyedCuratorHint implements Hint { @Override public String getText(Game game, Ability ability) { - List types = game - .getExile() - .getExileZone(CardUtil.getExileZoneId(game, ability)) - .getCards(game) - .stream() - .map(card -> card.getCardType(game)) - .flatMap(Collection::stream) - .distinct() - .map(CardType::toString) - .sorted() - .collect(Collectors.toList()); + List types = new ArrayList<>(); + ExileZone exileZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, ability)); + if (exileZone != null) { + types = exileZone.getCards(game).stream() + .map(card -> card.getCardType(game)) + .flatMap(Collection::stream) + .distinct() + .map(CardType::toString) + .sorted() + .collect(Collectors.toList()); + } return "Card types exiled: " + types.size() + (types.size() > 0 ? " (" + String.join(", ", types) + ')' : ""); } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index 4917f1f9a2d..bcaeb708287 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -1495,7 +1495,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement */ public void assertExileZoneCount(String exileZoneName, int count) throws AssertionError { ExileZone exileZone = currentGame.getExile().getExileZone(CardUtil.getExileZoneId(exileZoneName, currentGame)); - int actualCount = exileZone.getCards(currentGame).size(); + int actualCount = exileZone == null ? 0 : exileZone.getCards(currentGame).size(); Assert.assertEquals("(Exile \"" + exileZoneName + "\") Card counts are not equal.", count, actualCount); }