From 4dd97b41fc80dfce3912901d382a40646ec4823d Mon Sep 17 00:00:00 2001 From: xenohedron Date: Wed, 31 Jan 2024 19:39:27 -0500 Subject: [PATCH] refactor: fully replace PermanentInListPredicate with PermanentReferenceInCollectionPredicate related to #10639, #11471, the existence of this was misleading devs to use it incorrectly --- .../src/mage/cards/b/BalduvianWarlord.java | 4 +- Mage.Sets/src/mage/cards/c/Camouflage.java | 5 +-- Mage.Sets/src/mage/cards/d/DrainPower.java | 5 +-- Mage.Sets/src/mage/cards/f/FalseOrders.java | 4 +- .../src/mage/cards/f/FellBeastsShriek.java | 42 +++++++++---------- .../permanent/PermanentInListPredicate.java | 25 ----------- ...rmanentReferenceInCollectionPredicate.java | 4 +- 7 files changed, 30 insertions(+), 59 deletions(-) delete mode 100644 Mage/src/main/java/mage/filter/predicate/permanent/PermanentInListPredicate.java diff --git a/Mage.Sets/src/mage/cards/b/BalduvianWarlord.java b/Mage.Sets/src/mage/cards/b/BalduvianWarlord.java index 377e76535b1..3d82c25bfd4 100644 --- a/Mage.Sets/src/mage/cards/b/BalduvianWarlord.java +++ b/Mage.Sets/src/mage/cards/b/BalduvianWarlord.java @@ -14,7 +14,7 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.common.FilterAttackingCreature; import mage.filter.common.FilterBlockingCreature; -import mage.filter.predicate.permanent.PermanentInListPredicate; +import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate; import mage.game.Game; import mage.game.combat.CombatGroup; import mage.game.events.BlockerDeclaredEvent; @@ -111,7 +111,7 @@ class BalduvianWarlordUnblockEffect extends OneShotEffect { Player targetsController = game.getPlayer(permanent.getControllerId()); if (targetsController != null) { FilterAttackingCreature filter = new FilterAttackingCreature("creature attacking " + targetsController.getLogName()); - filter.add(new PermanentInListPredicate(list)); + filter.add(new PermanentReferenceInCollectionPredicate(list, game)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); if (target.canChoose(controller.getId(), source, game)) { diff --git a/Mage.Sets/src/mage/cards/c/Camouflage.java b/Mage.Sets/src/mage/cards/c/Camouflage.java index 91fb8397724..5444e3fcd1a 100644 --- a/Mage.Sets/src/mage/cards/c/Camouflage.java +++ b/Mage.Sets/src/mage/cards/c/Camouflage.java @@ -1,4 +1,3 @@ - package mage.cards.c; import java.util.ArrayList; @@ -19,9 +18,9 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.PhaseStep; import mage.filter.predicate.Predicates; -import mage.filter.predicate.permanent.PermanentInListPredicate; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate; import mage.game.Game; import mage.game.combat.CombatGroup; import mage.game.events.BlockerDeclaredEvent; @@ -119,7 +118,7 @@ class CamouflageEffect extends ContinuousRuleModifyingEffectImpl { spentBlockers.add(possibleBlocker); } } - filter.add(Predicates.not(new PermanentInListPredicate(spentBlockers))); + filter.add(Predicates.not(new PermanentReferenceInCollectionPredicate(spentBlockers, game))); } if (defender.chooseUse(Outcome.Neutral, "Make a new blocker pile? If not, all remaining piles stay empty. (remaining piles: " + (attackerCount - masterList.size()) + ')', source, game)) { Target target = new TargetControlledCreaturePermanent(0, Integer.MAX_VALUE, filter, true); diff --git a/Mage.Sets/src/mage/cards/d/DrainPower.java b/Mage.Sets/src/mage/cards/d/DrainPower.java index 1c1d5920d8d..131d222efdf 100644 --- a/Mage.Sets/src/mage/cards/d/DrainPower.java +++ b/Mage.Sets/src/mage/cards/d/DrainPower.java @@ -1,4 +1,3 @@ - package mage.cards.d; import java.util.ArrayList; @@ -18,7 +17,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.filter.common.FilterLandPermanent; -import mage.filter.predicate.permanent.PermanentInListPredicate; +import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.ManaPoolItem; @@ -112,7 +111,7 @@ class DrainPowerEffect extends OneShotEffect { Permanent permanent; if (permList.size() > 1 || target != null) { FilterLandPermanent filter2 = new FilterLandPermanent("land you control to tap for mana (remaining: " + permList.size() + ')'); - filter2.add(new PermanentInListPredicate(permList)); + filter2.add(new PermanentReferenceInCollectionPredicate(permList, game)); target = new TargetPermanent(1, 1, filter2, true); while (!target.isChosen() && target.canChoose(targetPlayer.getId(), source, game) && targetPlayer.canRespond()) { targetPlayer.chooseTarget(Outcome.Neutral, target, source, game); diff --git a/Mage.Sets/src/mage/cards/f/FalseOrders.java b/Mage.Sets/src/mage/cards/f/FalseOrders.java index f189e992428..587edda9082 100644 --- a/Mage.Sets/src/mage/cards/f/FalseOrders.java +++ b/Mage.Sets/src/mage/cards/f/FalseOrders.java @@ -14,7 +14,7 @@ import mage.constants.PhaseStep; import mage.filter.FilterPermanent; import mage.filter.common.FilterAttackingCreature; import mage.filter.predicate.permanent.DefendingPlayerControlsNoSourcePredicate; -import mage.filter.predicate.permanent.PermanentInListPredicate; +import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate; import mage.game.Game; import mage.game.combat.CombatGroup; import mage.game.events.BlockerDeclaredEvent; @@ -125,7 +125,7 @@ class FalseOrdersUnblockEffect extends OneShotEffect { return false; } FilterAttackingCreature filter = new FilterAttackingCreature("creature attacking " + targetsController.getLogName()); - filter.add(new PermanentInListPredicate(list)); + filter.add(new PermanentReferenceInCollectionPredicate(list, game)); TargetPermanent target = new TargetPermanent(filter); target.withNotTarget(true); if (target.canChoose(controller.getId(), source, game)) { diff --git a/Mage.Sets/src/mage/cards/f/FellBeastsShriek.java b/Mage.Sets/src/mage/cards/f/FellBeastsShriek.java index 331dabf1d8b..f6f3441c349 100644 --- a/Mage.Sets/src/mage/cards/f/FellBeastsShriek.java +++ b/Mage.Sets/src/mage/cards/f/FellBeastsShriek.java @@ -12,7 +12,7 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.PermanentInListPredicate; +import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -66,30 +66,26 @@ class FellBeastsShriekEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - List creaturesChosen = new ArrayList<>(); - - // For each opponent, get the creature to tap+goad - for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { - if (controller.hasOpponent(playerId, game)) { - Player opponent = game.getPlayer(playerId); - if (opponent != null) { - TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent(); - target.withNotTarget(true); - if (opponent.choose(Outcome.Detriment, target, source, game)) { - creaturesChosen.add(game.getPermanent(target.getTargets().get(0))); - } - } + if (controller == null) { + return false; + } + List creaturesChosen = new ArrayList<>(); + // For each opponent, get the creature to tap+goad + for (UUID playerId : game.getOpponents(controller.getId())) { + Player opponent = game.getPlayer(playerId); + if (opponent != null) { + TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent(); + target.withNotTarget(true); + if (opponent.choose(Outcome.Detriment, target, source, game)) { + creaturesChosen.add(game.getPermanent(target.getTargets().get(0))); } } - - FilterPermanent filter = new FilterCreaturePermanent(); - filter.add(new PermanentInListPredicate(creaturesChosen)); - new TapAllEffect(filter).apply(game, source); - ContinuousEffect goadEffect = new GoadAllEffect(filter); - game.addEffect(goadEffect, source); - return true; } - return false; + FilterPermanent filter = new FilterCreaturePermanent(); + filter.add(new PermanentReferenceInCollectionPredicate(creaturesChosen, game)); + new TapAllEffect(filter).apply(game, source); + ContinuousEffect goadEffect = new GoadAllEffect(filter); + game.addEffect(goadEffect, source); + return true; } } diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/PermanentInListPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/PermanentInListPredicate.java deleted file mode 100644 index b1ee4511e2d..00000000000 --- a/Mage/src/main/java/mage/filter/predicate/permanent/PermanentInListPredicate.java +++ /dev/null @@ -1,25 +0,0 @@ - -package mage.filter.predicate.permanent; - -import java.util.List; -import mage.filter.predicate.Predicate; -import mage.game.Game; -import mage.game.permanent.Permanent; - -/** - * - * @author L_J - */ -public class PermanentInListPredicate implements Predicate { - - private final List permanents; - - public PermanentInListPredicate(List permanents) { - this.permanents = permanents; - } - - @Override - public boolean apply(Permanent input, Game game) { - return (permanents.contains(input)); - } -} diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/PermanentReferenceInCollectionPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/PermanentReferenceInCollectionPredicate.java index cf80e66c40b..920fb75c90f 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/PermanentReferenceInCollectionPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/PermanentReferenceInCollectionPredicate.java @@ -21,7 +21,9 @@ public class PermanentReferenceInCollectionPredicate implements Predicate permanents, Game game) { - this.references = permanents.stream().map((p) -> new MageObjectReference(p, game)) + this.references = permanents + .stream() + .map(p -> new MageObjectReference(p, game)) .collect(Collectors.toSet()); }