From fda43021a4520a19013ac3a7b58c2529b5c9d773 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sun, 22 Jun 2025 16:48:28 -0400 Subject: [PATCH] add helper method for creating filters which only select from a collection of permanents --- .../src/mage/cards/b/BenthicAnomaly.java | 11 +---------- Mage.Sets/src/mage/cards/c/ChangeOfPlans.java | 10 +--------- Mage.Sets/src/mage/cards/e/ExoticPets.java | 8 +------- .../src/mage/cards/f/FrontlineHeroism.java | 10 +--------- .../mage/cards/g/GilgameshMasterAtArms.java | 10 +--------- Mage.Sets/src/mage/cards/h/HelmOfKaldra.java | 9 +-------- .../mage/cards/n/NahiriHeirOfTheAncients.java | 8 +------- Mage.Sets/src/mage/cards/r/Retribution.java | 9 +-------- Mage.Sets/src/mage/cards/w/WickedSlumber.java | 10 +--------- Mage.Sets/src/mage/cards/z/ZackFair.java | 9 +-------- .../common/CreateTokenAttachSourceEffect.java | 10 +--------- .../permanent/PermanentIdPredicate.java | 19 ++++++++++++++++--- 12 files changed, 27 insertions(+), 96 deletions(-) diff --git a/Mage.Sets/src/mage/cards/b/BenthicAnomaly.java b/Mage.Sets/src/mage/cards/b/BenthicAnomaly.java index cb20790df48..790d3d61e0f 100644 --- a/Mage.Sets/src/mage/cards/b/BenthicAnomaly.java +++ b/Mage.Sets/src/mage/cards/b/BenthicAnomaly.java @@ -1,7 +1,6 @@ package mage.cards.b; import mage.MageInt; -import mage.MageItem; import mage.MageObject; import mage.ObjectColor; import mage.abilities.Ability; @@ -16,7 +15,6 @@ import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; @@ -28,7 +26,6 @@ import mage.util.RandomUtil; import java.util.HashSet; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; /** * @author TheElk801 @@ -114,13 +111,7 @@ class BenthicAnomalyEffect extends OneShotEffect { break; default: FilterPermanent filter = new FilterPermanent("a creature to create a copy of"); - filter.add(Predicates.or( - permanents - .stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toSet()) - )); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); player.choose(outcome, target, source, game); diff --git a/Mage.Sets/src/mage/cards/c/ChangeOfPlans.java b/Mage.Sets/src/mage/cards/c/ChangeOfPlans.java index 6288c217a69..3b61b5745ff 100644 --- a/Mage.Sets/src/mage/cards/c/ChangeOfPlans.java +++ b/Mage.Sets/src/mage/cards/c/ChangeOfPlans.java @@ -1,6 +1,5 @@ package mage.cards.c; -import mage.MageItem; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.keyword.ConniveSourceEffect; @@ -9,7 +8,6 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.filter.FilterPermanent; -import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -83,13 +81,7 @@ class ChangeOfPlansEffect extends OneShotEffect { return true; } FilterPermanent filter = new FilterPermanent("creatures"); - filter.add(Predicates.or( - permanents - .stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toSet()) - )); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); TargetPermanent target = new TargetPermanent(0, Integer.MAX_VALUE, filter, true); player.choose(outcome, target.withChooseHint("to phase out"), source, game); for (UUID targetId : target.getTargets()) { diff --git a/Mage.Sets/src/mage/cards/e/ExoticPets.java b/Mage.Sets/src/mage/cards/e/ExoticPets.java index 441ed8c7749..b3d13c4a8a2 100644 --- a/Mage.Sets/src/mage/cards/e/ExoticPets.java +++ b/Mage.Sets/src/mage/cards/e/ExoticPets.java @@ -1,6 +1,5 @@ package mage.cards.e; -import mage.MageItem; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -10,7 +9,6 @@ import mage.constants.Outcome; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -102,11 +100,7 @@ class ExoticPetsEffect extends OneShotEffect { return true; } FilterPermanent filter = new FilterPermanent("creature"); - filter.add(Predicates.or(permanents - .stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toSet()))); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); for (CounterType counterType : counterTypes) { diff --git a/Mage.Sets/src/mage/cards/f/FrontlineHeroism.java b/Mage.Sets/src/mage/cards/f/FrontlineHeroism.java index ae262c06221..06c317d1f5e 100644 --- a/Mage.Sets/src/mage/cards/f/FrontlineHeroism.java +++ b/Mage.Sets/src/mage/cards/f/FrontlineHeroism.java @@ -1,6 +1,5 @@ package mage.cards.f; -import mage.MageItem; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; @@ -13,7 +12,6 @@ import mage.constants.Outcome; import mage.filter.FilterPermanent; import mage.filter.FilterSpell; import mage.filter.StaticFilters; -import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.MageObjectReferencePredicate; import mage.filter.predicate.other.HasOnlySingleTargetPermanentPredicate; import mage.filter.predicate.permanent.PermanentIdPredicate; @@ -125,13 +123,7 @@ class FrontlineHeroismEffect extends OneShotEffect { break; default: FilterPermanent filter = new FilterPermanent("token to target with the copied spell"); - filter.add(Predicates.or( - permanents - .stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toSet()) - )); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); player.choose(outcome, target, source, game); diff --git a/Mage.Sets/src/mage/cards/g/GilgameshMasterAtArms.java b/Mage.Sets/src/mage/cards/g/GilgameshMasterAtArms.java index 3deb2f77af6..53b0a27536e 100644 --- a/Mage.Sets/src/mage/cards/g/GilgameshMasterAtArms.java +++ b/Mage.Sets/src/mage/cards/g/GilgameshMasterAtArms.java @@ -1,7 +1,6 @@ package mage.cards.g; import mage.MageInt; -import mage.MageItem; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; import mage.abilities.common.delayed.ReflexiveTriggeredAbility; @@ -14,7 +13,6 @@ import mage.constants.*; import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -165,13 +163,7 @@ class GilgameshMasterAtArmsAttachEffect extends OneShotEffect { break; } FilterPermanent filterPermanent = new FilterPermanent("Equipment"); - Predicates.or( - permanents - .stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toSet()) - ); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); return Optional .of(new TargetPermanent(0, 1, filterPermanent, true)) .map(t -> { diff --git a/Mage.Sets/src/mage/cards/h/HelmOfKaldra.java b/Mage.Sets/src/mage/cards/h/HelmOfKaldra.java index 0fe28d12ef3..3d39582420d 100644 --- a/Mage.Sets/src/mage/cards/h/HelmOfKaldra.java +++ b/Mage.Sets/src/mage/cards/h/HelmOfKaldra.java @@ -1,6 +1,5 @@ package mage.cards.h; -import mage.MageItem; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; @@ -16,7 +15,6 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.NamePredicate; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Controllable; @@ -120,12 +118,7 @@ class HelmOfKaldraEffect extends OneShotEffect { break; default: FilterPermanent filter = new FilterPermanent(); - filter.add(Predicates.or( - permanents.stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toSet()) - )); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); target.withChooseHint("to equip"); diff --git a/Mage.Sets/src/mage/cards/n/NahiriHeirOfTheAncients.java b/Mage.Sets/src/mage/cards/n/NahiriHeirOfTheAncients.java index a3971466c9f..56df09f584f 100644 --- a/Mage.Sets/src/mage/cards/n/NahiriHeirOfTheAncients.java +++ b/Mage.Sets/src/mage/cards/n/NahiriHeirOfTheAncients.java @@ -1,6 +1,5 @@ package mage.cards.n; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.dynamicvalue.DynamicValue; @@ -119,12 +118,7 @@ class NahiriHeirOfTheAncientsEffect extends OneShotEffect { Permanent tokenCreature = tokens.get(0); if (tokens.size() > 1) { FilterPermanent tokenFilter = new FilterPermanent("token"); - tokenFilter.add(Predicates.or( - tokens.stream() - .map(MageObject::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toSet()) - )); + tokenFilter.add(PermanentIdPredicate.makeCompoundPredicate(tokens)); TargetPermanent target = new TargetPermanent(tokenFilter); target.withNotTarget(true); player.choose(outcome, target, source, game); diff --git a/Mage.Sets/src/mage/cards/r/Retribution.java b/Mage.Sets/src/mage/cards/r/Retribution.java index 93205e96129..9b1ccdc50fa 100644 --- a/Mage.Sets/src/mage/cards/r/Retribution.java +++ b/Mage.Sets/src/mage/cards/r/Retribution.java @@ -1,6 +1,5 @@ package mage.cards.r; -import mage.MageItem; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.cards.CardImpl; @@ -10,7 +9,6 @@ import mage.constants.Outcome; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -90,12 +88,7 @@ class RetributionEffect extends OneShotEffect { .map(game::getPlayer) .map(player -> { FilterPermanent filter = new FilterPermanent(); - filter.add(Predicates.or( - canSac.stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toList()) - )); + filter.add(PermanentIdPredicate.makeCompoundPredicate(canSac)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); player.choose(Outcome.Sacrifice, target, source, game); diff --git a/Mage.Sets/src/mage/cards/w/WickedSlumber.java b/Mage.Sets/src/mage/cards/w/WickedSlumber.java index 3e94e9849f8..b874f60b871 100644 --- a/Mage.Sets/src/mage/cards/w/WickedSlumber.java +++ b/Mage.Sets/src/mage/cards/w/WickedSlumber.java @@ -1,6 +1,5 @@ package mage.cards.w; -import mage.MageItem; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.TapTargetEffect; @@ -12,7 +11,6 @@ import mage.constants.Outcome; import mage.counters.CounterType; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -87,13 +85,7 @@ class WickedSlumberEffect extends OneShotEffect { return true; } FilterPermanent filter = new FilterCreaturePermanent(); - filter.add(Predicates.or( - permanents - .stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toList()) - )); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); for (int i = 0; i < 2; i++) { TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); diff --git a/Mage.Sets/src/mage/cards/z/ZackFair.java b/Mage.Sets/src/mage/cards/z/ZackFair.java index 96ee7515874..a8babd0b54b 100644 --- a/Mage.Sets/src/mage/cards/z/ZackFair.java +++ b/Mage.Sets/src/mage/cards/z/ZackFair.java @@ -20,7 +20,6 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.counters.CounterType; import mage.filter.FilterPermanent; -import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Controllable; import mage.game.Game; @@ -117,13 +116,7 @@ class ZackFairEffect extends OneShotEffect { FilterPermanent filter = new FilterPermanent( SubType.EQUIPMENT, "Equipment to attach to " + creature.getIdName() ); - filter.add(Predicates.or( - permanents - .stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toList()) - )); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); Optional.ofNullable(source) diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java index 03bb35f6cff..e4a66ddbcad 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java @@ -1,10 +1,8 @@ package mage.abilities.effects.common; -import mage.MageItem; import mage.abilities.Ability; import mage.constants.Outcome; import mage.filter.FilterPermanent; -import mage.filter.predicate.Predicates; import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; @@ -76,13 +74,7 @@ public class CreateTokenAttachSourceEffect extends CreateTokenEffect { break; default: FilterPermanent filter = new FilterPermanent("token"); - filter.add(Predicates.or( - permanents - .stream() - .map(MageItem::getId) - .map(PermanentIdPredicate::new) - .collect(Collectors.toSet()) - )); + filter.add(PermanentIdPredicate.makeCompoundPredicate(permanents)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); target.withChooseHint("to attach to"); diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/PermanentIdPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/PermanentIdPredicate.java index c387ee3bcf3..a36030d3830 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/PermanentIdPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/PermanentIdPredicate.java @@ -1,13 +1,16 @@ - package mage.filter.predicate.permanent; -import java.util.UUID; +import mage.MageItem; import mage.filter.predicate.Predicate; +import mage.filter.predicate.Predicates; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.Collection; +import java.util.UUID; +import java.util.stream.Collectors; + /** - * * @author LevelX2 */ public class PermanentIdPredicate implements Predicate { @@ -27,4 +30,14 @@ public class PermanentIdPredicate implements Predicate { public String toString() { return "PermanentId(" + permanentId + ')'; } + + public static Predicate makeCompoundPredicate(Collection permanents) { + return Predicates.or( + permanents + .stream() + .map(MageItem::getId) + .map(PermanentIdPredicate::new) + .collect(Collectors.toSet()) + ); + } }