From f60fc2da381250193288ca76f4ed1adf60bcc8f2 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sun, 13 Jul 2025 12:18:01 -0400 Subject: [PATCH] fix build failure --- .../src/mage/cards/c/ChoraleOfTheVoid.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ChoraleOfTheVoid.java b/Mage.Sets/src/mage/cards/c/ChoraleOfTheVoid.java index 72916b00e64..0b39cf6ad7c 100644 --- a/Mage.Sets/src/mage/cards/c/ChoraleOfTheVoid.java +++ b/Mage.Sets/src/mage/cards/c/ChoraleOfTheVoid.java @@ -8,17 +8,22 @@ import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffec import mage.abilities.effects.common.SacrificeSourceUnlessConditionEffect; import mage.abilities.keyword.EnchantAbility; import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.permanent.DefendingPlayerControlsAttachedAttackingPredicate; +import mage.filter.predicate.ObjectSourcePlayer; +import mage.filter.predicate.ObjectSourcePlayerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCardInGraveyard; import mage.target.common.TargetControlledCreaturePermanent; import mage.watchers.common.VoidWatcher; +import java.util.Optional; import java.util.UUID; /** @@ -29,7 +34,7 @@ public final class ChoraleOfTheVoid extends CardImpl { private static final FilterCard filter = new FilterCreatureCard("creature card from defending player's graveyard"); static { - filter.add(DefendingPlayerControlsAttachedAttackingPredicate.instance); + filter.add(ChoraleOfTheVoidPredicate.instance); } public ChoraleOfTheVoid(UUID ownerId, CardSetInfo setInfo) { @@ -66,3 +71,19 @@ public final class ChoraleOfTheVoid extends CardImpl { return new ChoraleOfTheVoid(this); } } + +enum ChoraleOfTheVoidPredicate implements ObjectSourcePlayerPredicate { + instance; + + @Override + public boolean apply(ObjectSourcePlayer input, Game game) { + return Optional + .ofNullable(input) + .map(ObjectSourcePlayer::getSource) + .map(source -> source.getSourcePermanentOrLKI(game)) + .map(Permanent::getAttachedTo) + .map(attachmentId -> game.getCombat().getDefendingPlayerId(attachmentId, game)) + .filter(playerId -> input.getObject().isOwnedBy(playerId)) + .isPresent(); + } +}