diff --git a/Mage.Sets/src/mage/cards/a/AltairIbnLaAhad.java b/Mage.Sets/src/mage/cards/a/AltairIbnLaAhad.java index cd64eedaa1b..7aef812ebd2 100644 --- a/Mage.Sets/src/mage/cards/a/AltairIbnLaAhad.java +++ b/Mage.Sets/src/mage/cards/a/AltairIbnLaAhad.java @@ -117,7 +117,7 @@ class AltairIbnLaAhadTokenEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Set cards = game .getExile() - .getAllCards(game, source.getControllerId()) + .getCardsOwned(game, source.getControllerId()) .stream() .filter(card -> card.getCounters(game).containsKey(CounterType.MEMORY)) .filter(card -> card.isCreature(game)) diff --git a/Mage.Sets/src/mage/cards/a/AshiokNightmareMuse.java b/Mage.Sets/src/mage/cards/a/AshiokNightmareMuse.java index 88d6668ca6c..3a24468a040 100644 --- a/Mage.Sets/src/mage/cards/a/AshiokNightmareMuse.java +++ b/Mage.Sets/src/mage/cards/a/AshiokNightmareMuse.java @@ -11,6 +11,7 @@ import mage.constants.*; import mage.filter.FilterCard; import mage.filter.StaticFilters; import mage.filter.predicate.Predicates; +import mage.filter.predicate.card.FaceDownPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.AshiokNightmareMuseToken; @@ -20,8 +21,6 @@ import mage.target.common.TargetNonlandPermanent; import mage.util.CardUtil; import java.util.UUID; -import mage.filter.predicate.card.FaceDownPredicate; -import mage.filter.predicate.card.OwnerIdPredicate; /** * @author TheElk801 @@ -96,6 +95,10 @@ class AshiokNightmareMuseBounceEffect extends OneShotEffect { class AshiokNightmareMuseCastEffect extends OneShotEffect { private static final FilterCard filter = new FilterCard("face-up cards your opponents own from exile"); + static { + filter.add(TargetController.OPPONENT.getOwnerPredicate()); + filter.add(Predicates.not(FaceDownPredicate.instance)); + } AshiokNightmareMuseCastEffect() { super(Outcome.Benefit); @@ -117,11 +120,10 @@ class AshiokNightmareMuseCastEffect extends OneShotEffect { if (controller == null) { return false; } - // card is owned by an opponent and is face up - filter.add(Predicates.not(new OwnerIdPredicate(controller.getId()))); - filter.add(Predicates.not(FaceDownPredicate.instance)); CardUtil.castMultipleWithAttributeForFree( - controller, source, game, new CardsImpl(game.getExile().getCards(filter, game)), + controller, source, game, new CardsImpl( + game.getExile().getCardsInRange(filter, controller.getId(), source, game) + ), StaticFilters.FILTER_CARD, 3 ); return true; diff --git a/Mage.Sets/src/mage/cards/b/Biotransference.java b/Mage.Sets/src/mage/cards/b/Biotransference.java index 5f13df83656..7c1abf38f4e 100644 --- a/Mage.Sets/src/mage/cards/b/Biotransference.java +++ b/Mage.Sets/src/mage/cards/b/Biotransference.java @@ -88,7 +88,7 @@ class BiotransferenceEffect extends ContinuousEffectImpl { } } // in Exile - for (Card card : game.getState().getExile().getAllCards(game, source.getControllerId())) { + for (Card card : game.getState().getExile().getCardsOwned(game, source.getControllerId())) { if (card.isCreature(game) && !card.isArtifact(game)) { card.addCardType(game, CardType.ARTIFACT); } diff --git a/Mage.Sets/src/mage/cards/c/CandlekeepInspiration.java b/Mage.Sets/src/mage/cards/c/CandlekeepInspiration.java index 88514dd0d89..6fedd940d9e 100644 --- a/Mage.Sets/src/mage/cards/c/CandlekeepInspiration.java +++ b/Mage.Sets/src/mage/cards/c/CandlekeepInspiration.java @@ -65,7 +65,7 @@ enum CandlekeepInspirationValue implements DynamicValue { .getCards(game) .stream(), game.getExile() - .getAllCards(game, sourceAbility.getControllerId()) + .getCardsOwned(game, sourceAbility.getControllerId()) .stream() ) .filter(Objects::nonNull) diff --git a/Mage.Sets/src/mage/cards/c/CelestialDawn.java b/Mage.Sets/src/mage/cards/c/CelestialDawn.java index 123db6fa2e1..a7a7db29db7 100644 --- a/Mage.Sets/src/mage/cards/c/CelestialDawn.java +++ b/Mage.Sets/src/mage/cards/c/CelestialDawn.java @@ -128,7 +128,7 @@ class CelestialDawnToWhiteEffect extends ContinuousEffectImpl { } } // Exile - for (Card card : game.getExile().getAllCardsByRange(game, controller.getId())) { + for (Card card : game.getExile().getCardsInRange(game, controller.getId())) { if (card.isOwnedBy(controller.getId())) { setColor(card.getColor(game), game); } diff --git a/Mage.Sets/src/mage/cards/c/ChissGoriaForgeTyrant.java b/Mage.Sets/src/mage/cards/c/ChissGoriaForgeTyrant.java index 6eca6368d9e..c66f3b52b4c 100644 --- a/Mage.Sets/src/mage/cards/c/ChissGoriaForgeTyrant.java +++ b/Mage.Sets/src/mage/cards/c/ChissGoriaForgeTyrant.java @@ -164,7 +164,7 @@ class ChissGoriaForgeTyrantAffinityEffect extends ContinuousEffectImpl { return false; } - for (Card card : game.getExile().getAllCardsByRange(game, source.getControllerId())) { + for (Card card : game.getExile().getCardsInRange(game, source.getControllerId())) { if (morSet.contains(new MageObjectReference(card, game)) && card.isArtifact(game)) { game.getState().addOtherAbility(card, new AffinityForArtifactsAbility()); } diff --git a/Mage.Sets/src/mage/cards/c/Conspiracy.java b/Mage.Sets/src/mage/cards/c/Conspiracy.java index c05affa5d3b..f7577401d22 100644 --- a/Mage.Sets/src/mage/cards/c/Conspiracy.java +++ b/Mage.Sets/src/mage/cards/c/Conspiracy.java @@ -92,14 +92,14 @@ public final class Conspiracy extends CardImpl { } } // in Exile - for (Card card : game.getState().getExile().getAllCards(game)) { - if (card.isOwnedBy(controller.getId()) && card.isCreature(game)) { + for (Card card : game.getState().getExile().getCardsOwned(game, controller.getId())) { + if (card.isCreature(game)) { setCreatureSubtype(card, subType, game); } } // in Library (e.g. for Mystical Teachings) for (Card card : controller.getLibrary().getCards(game)) { - if (card.isOwnedBy(controller.getId()) && card.isCreature(game)) { + if (card.isCreature(game)) { setCreatureSubtype(card, subType, game); } } diff --git a/Mage.Sets/src/mage/cards/c/Cosmogoyf.java b/Mage.Sets/src/mage/cards/c/Cosmogoyf.java index ac336b28f9d..0d3d326a7ef 100644 --- a/Mage.Sets/src/mage/cards/c/Cosmogoyf.java +++ b/Mage.Sets/src/mage/cards/c/Cosmogoyf.java @@ -56,7 +56,7 @@ enum CosmogoyfValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return game.getState().getExile().getAllCards(game, sourceAbility.getControllerId()).size(); + return game.getState().getExile().getCardsOwned(game, sourceAbility.getControllerId()).size(); } @Override diff --git a/Mage.Sets/src/mage/cards/d/DesperateGambit.java b/Mage.Sets/src/mage/cards/d/DesperateGambit.java index 719077d465c..d51e7d978d6 100644 --- a/Mage.Sets/src/mage/cards/d/DesperateGambit.java +++ b/Mage.Sets/src/mage/cards/d/DesperateGambit.java @@ -161,7 +161,7 @@ class TargetControlledSource extends TargetSource { possibleTargets.add(card.getId()); } // 108.4a If anything asks for the controller of a card that doesn't have one (because it's not a permanent or spell), use its owner instead. - for (Card card : game.getExile().getAllCards(game)) { + for (Card card : game.getExile().getCardsInRange(game, sourceControllerId)) { if (Objects.equals(card.getOwnerId(), sourceControllerId)) { possibleTargets.add(card.getId()); } diff --git a/Mage.Sets/src/mage/cards/d/DragonKamisEgg.java b/Mage.Sets/src/mage/cards/d/DragonKamisEgg.java index 6e6b8c2d588..3def1f2d789 100644 --- a/Mage.Sets/src/mage/cards/d/DragonKamisEgg.java +++ b/Mage.Sets/src/mage/cards/d/DragonKamisEgg.java @@ -79,7 +79,7 @@ class DragonKamisEggEffect extends OneShotEffect { } Cards cards = new CardsImpl(); game.getExile() - .getAllCards(game, player.getId()) + .getCardsOwned(game, player.getId()) .stream() .filter(Objects::nonNull) .filter(card -> card.getCounters(game).containsKey(CounterType.HATCHLING)) diff --git a/Mage.Sets/src/mage/cards/d/DuneChanter.java b/Mage.Sets/src/mage/cards/d/DuneChanter.java index 2cd68f54296..bbc688657cf 100644 --- a/Mage.Sets/src/mage/cards/d/DuneChanter.java +++ b/Mage.Sets/src/mage/cards/d/DuneChanter.java @@ -115,7 +115,7 @@ class DuneChanterContinuousEffect extends ContinuousEffectImpl { } } // in exile - for (Card card : game.getState().getExile().getAllCards(game, controllerId)) { + for (Card card : game.getState().getExile().getCardsOwned(game, controllerId)) { if (filterCard.match(card, controllerId, source, game) && !card.hasSubtype(subType, game)) { game.getState().getCreateMageObjectAttribute(card, game).getSubtype().add(subType); } @@ -174,5 +174,3 @@ class DuneChanterEffect extends OneShotEffect { return true; } } - - diff --git a/Mage.Sets/src/mage/cards/d/DustOfMoments.java b/Mage.Sets/src/mage/cards/d/DustOfMoments.java index d9d6231ee85..86f5c33ac31 100644 --- a/Mage.Sets/src/mage/cards/d/DustOfMoments.java +++ b/Mage.Sets/src/mage/cards/d/DustOfMoments.java @@ -83,7 +83,7 @@ class DustOfMomentsEffect extends OneShotEffect { permanent.addCounters(CounterType.TIME.createInstance(2), source, game); } } - for (Card card : game.getExile().getCards(filter.getCardFilter(), game)) { + for (Card card : game.getExile().getCardsInRange(filter.getCardFilter(), source.getControllerId(), source, game)) { if (remove) { card.removeCounters(CounterType.TIME.createInstance(2), source, game); } else { diff --git a/Mage.Sets/src/mage/cards/e/EncroachingMycosynth.java b/Mage.Sets/src/mage/cards/e/EncroachingMycosynth.java index 0e88261963a..ec5af61315b 100644 --- a/Mage.Sets/src/mage/cards/e/EncroachingMycosynth.java +++ b/Mage.Sets/src/mage/cards/e/EncroachingMycosynth.java @@ -80,7 +80,7 @@ class EncroachingMycosynthEffect extends ContinuousEffectImpl { } } // in Exile - for (Card card : game.getState().getExile().getAllCards(game, source.getControllerId())) { + for (Card card : game.getState().getExile().getCardsOwned(game, source.getControllerId())) { if (card.isPermanent(game) && !card.isLand(game) && !card.isArtifact(game)) { card.addCardType(game, CardType.ARTIFACT); } diff --git a/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java b/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java index 58f5cad072c..310065dfa11 100644 --- a/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java +++ b/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java @@ -96,8 +96,8 @@ class EtrataTheSilencerEffect extends OneShotEffect { if (card != null) { card.addCounters(CounterType.HIT.createInstance(), source.getControllerId(), source, game); } - int cardsFound = game.getExile().getAllCards(game).stream() - .filter(c -> c.getOwnerId().equals(player.getId())) + int cardsFound = game.getExile().getCardsOwned(game, player.getId()) + .stream() .filter(c -> c.getCounters(game).getCount(CounterType.HIT) > 0) .mapToInt(x -> 1) .sum(); diff --git a/Mage.Sets/src/mage/cards/f/FalkenrathGorger.java b/Mage.Sets/src/mage/cards/f/FalkenrathGorger.java index e4156ea35e1..e01d796163e 100644 --- a/Mage.Sets/src/mage/cards/f/FalkenrathGorger.java +++ b/Mage.Sets/src/mage/cards/f/FalkenrathGorger.java @@ -85,30 +85,26 @@ class FalkenrathGorgerEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Map usedMadnessAbilities = new HashMap<>(); - // hand - for (Card card : controller.getHand().getCards(filter, game)) { - addMadnessToCard(game, card, usedMadnessAbilities); - } - // graveyard - for (Card card : controller.getGraveyard().getCards(filter, game)) { - addMadnessToCard(game, card, usedMadnessAbilities); - } - // Exile - for (Card card : game.getExile().getAllCards(game)) { - if (filter.match(card, controller.getId(), source, game)) { - if (card.isOwnedBy(controller.getId())) { - addMadnessToCard(game, card, usedMadnessAbilities); - } - } - } - madnessAbilities.clear(); - madnessAbilities.putAll(usedMadnessAbilities); - return true; + if (controller == null) { + return false; } + Map usedMadnessAbilities = new HashMap<>(); + // hand + for (Card card : controller.getHand().getCards(filter, game)) { + addMadnessToCard(game, card, usedMadnessAbilities); + } + // graveyard + for (Card card : controller.getGraveyard().getCards(filter, game)) { + addMadnessToCard(game, card, usedMadnessAbilities); + } + // Exile + for (Card card : game.getExile().getCardsOwned(filter, controller.getId(), source, game)) { + addMadnessToCard(game, card, usedMadnessAbilities); + } + madnessAbilities.clear(); + madnessAbilities.putAll(usedMadnessAbilities); + return true; - return false; } private void addMadnessToCard(Game game, Card card, Map usedMadnessAbilities) { diff --git a/Mage.Sets/src/mage/cards/f/FlamewarBrashVeteran.java b/Mage.Sets/src/mage/cards/f/FlamewarBrashVeteran.java index c948082d996..167a48fc486 100644 --- a/Mage.Sets/src/mage/cards/f/FlamewarBrashVeteran.java +++ b/Mage.Sets/src/mage/cards/f/FlamewarBrashVeteran.java @@ -97,7 +97,7 @@ class FlamewarBrashVeteranEffect extends OneShotEffect { } Set cards = game .getExile() - .getAllCards(game, source.getControllerId()) + .getCardsOwned(game, source.getControllerId()) .stream() .filter(card -> card.getCounters(game).containsKey(CounterType.INTEL)) .collect(Collectors.toSet()); diff --git a/Mage.Sets/src/mage/cards/h/HedronAlignment.java b/Mage.Sets/src/mage/cards/h/HedronAlignment.java index bb0339d9e31..b84cd9b539e 100644 --- a/Mage.Sets/src/mage/cards/h/HedronAlignment.java +++ b/Mage.Sets/src/mage/cards/h/HedronAlignment.java @@ -2,12 +2,12 @@ package mage.cards.h; import mage.MageObject; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.keyword.ScryEffect; import mage.abilities.keyword.HexproofAbility; +import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; @@ -15,7 +15,6 @@ import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; -import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.NamePredicate; @@ -93,9 +92,7 @@ class HedronAlignmentEffect extends OneShotEffect { if (controller.getGraveyard().getCards(filterCard, controller.getId(), source, game).isEmpty()) { return true; } - Cards cardsToCheck = new CardsImpl(); - cardsToCheck.addAllCards(game.getExile().getAllCards(game)); - if (cardsToCheck.count(filterCard, controller.getId(), source, game) == 0) { + if (game.getExile().getCardsOwned(filterCard, controller.getId(), source, game).isEmpty()) { return true; } controller.won(game); diff --git a/Mage.Sets/src/mage/cards/h/HenzieToolboxTorre.java b/Mage.Sets/src/mage/cards/h/HenzieToolboxTorre.java index fa81d19c614..6b7e136be49 100644 --- a/Mage.Sets/src/mage/cards/h/HenzieToolboxTorre.java +++ b/Mage.Sets/src/mage/cards/h/HenzieToolboxTorre.java @@ -87,7 +87,7 @@ class HenzieToolboxTorreGainBlitzEffect extends ContinuousEffectImpl { controller.getLibrary().getCards(game).stream() .filter(c -> filter.match(c, game)) .forEach(cardsToGainBlitz::add); - game.getExile().getAllCardsByRange(game, controller.getId()).stream() + game.getExile().getCardsInRange(game, controller.getId()).stream() .filter(c -> filter.match(c, game)) .forEach(cardsToGainBlitz::add); game.getCommanderCardsFromCommandZone(controller, CommanderCardType.ANY) diff --git a/Mage.Sets/src/mage/cards/h/HerigastEruptingNullkite.java b/Mage.Sets/src/mage/cards/h/HerigastEruptingNullkite.java index 4fdba0df37c..59b0c78edb0 100644 --- a/Mage.Sets/src/mage/cards/h/HerigastEruptingNullkite.java +++ b/Mage.Sets/src/mage/cards/h/HerigastEruptingNullkite.java @@ -87,7 +87,7 @@ class HerigastEruptingNullkiteEffect extends ContinuousEffectImpl { controller.getLibrary().getCards(game).stream() .filter(c -> StaticFilters.FILTER_CARD_CREATURE.match(c, game)) .forEach(cardsToGainEmerge::add); - game.getExile().getAllCardsByRange(game, controller.getId()).stream() + game.getExile().getCardsInRange(game, controller.getId()).stream() .filter(c -> StaticFilters.FILTER_CARD_CREATURE.match(c, game)) .forEach(cardsToGainEmerge::add); game.getCommanderCardsFromCommandZone(controller, CommanderCardType.ANY) diff --git a/Mage.Sets/src/mage/cards/h/HowlingGalefang.java b/Mage.Sets/src/mage/cards/h/HowlingGalefang.java index 6a4634a1715..57b49fe5903 100644 --- a/Mage.Sets/src/mage/cards/h/HowlingGalefang.java +++ b/Mage.Sets/src/mage/cards/h/HowlingGalefang.java @@ -59,7 +59,7 @@ enum HowlingGalefangCondition implements Condition { public boolean apply(Game game, Ability source) { return game .getExile() - .getAllCards(game, source.getControllerId()) + .getCardsOwned(game, source.getControllerId()) .stream() .anyMatch(AdventureCard.class::isInstance); } @@ -67,4 +67,4 @@ enum HowlingGalefangCondition implements Condition { public static Hint getHint() { return hint; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/h/HuskbursterSwarm.java b/Mage.Sets/src/mage/cards/h/HuskbursterSwarm.java index 494ed2bf251..6fa31d69b4b 100644 --- a/Mage.Sets/src/mage/cards/h/HuskbursterSwarm.java +++ b/Mage.Sets/src/mage/cards/h/HuskbursterSwarm.java @@ -77,13 +77,8 @@ enum HuskbursterSwarmValue implements DynamicValue { } return game .getExile() - .getAllCards(game) - .stream() - .filter(card -> card.isCreature(game)) - .map(Ownerable::getOwnerId) - .filter(sourceAbility::isControlledBy) - .mapToInt(x -> 1) - .sum() + .getCardsOwned(StaticFilters.FILTER_CARD_CREATURE, player.getId(), sourceAbility, game) + .size() + player .getGraveyard() .count(StaticFilters.FILTER_CARD_CREATURE, game); diff --git a/Mage.Sets/src/mage/cards/k/KarnScionOfUrza.java b/Mage.Sets/src/mage/cards/k/KarnScionOfUrza.java index e825da2fab5..0e3fd6882af 100644 --- a/Mage.Sets/src/mage/cards/k/KarnScionOfUrza.java +++ b/Mage.Sets/src/mage/cards/k/KarnScionOfUrza.java @@ -18,10 +18,8 @@ import mage.target.TargetCard; import mage.target.common.TargetCardInExile; import mage.target.common.TargetOpponent; -import java.util.Objects; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; /** * @author spjspj @@ -150,13 +148,7 @@ class KarnMinus1Effect extends OneShotEffect { if (controller == null) { return false; } - Cards cards = new CardsImpl(game - .getExile() - .getCards(filter, game) - .stream() - .filter(Objects::nonNull) - .filter(card -> card.isOwnedBy(source.getControllerId())) - .collect(Collectors.toList())); + Cards cards = new CardsImpl(game.getExile().getCardsOwned(filter, controller.getId(), source, game)); Card card; switch (cards.size()) { case 0: @@ -173,6 +165,6 @@ class KarnMinus1Effect extends OneShotEffect { if (card == null) { return false; } - return card != null && controller.moveCards(card, Zone.HAND, source, game); + return controller.moveCards(card, Zone.HAND, source, game); } } diff --git a/Mage.Sets/src/mage/cards/k/KayaOrzhovUsurper.java b/Mage.Sets/src/mage/cards/k/KayaOrzhovUsurper.java index a5fd8a8d4a0..ce6f917024a 100644 --- a/Mage.Sets/src/mage/cards/k/KayaOrzhovUsurper.java +++ b/Mage.Sets/src/mage/cards/k/KayaOrzhovUsurper.java @@ -131,14 +131,9 @@ class KayaOrzhovUsurperDamageEffect extends OneShotEffect { if (controller == null || player == null) { return false; } - int count = 0; - for (Card card : game.getExile().getAllCards(game)) { - if (card != null && card.getOwnerId().equals(player.getId())) { - count += 1; - } - } + int count = game.getExile().getCardsOwned(game, player.getId()).size(); player.damage(count, source.getSourceId(), source, game); controller.gainLife(count, game, source); return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/k/KianneDeanOfSubstance.java b/Mage.Sets/src/mage/cards/k/KianneDeanOfSubstance.java index 9989529f7f5..d8cca3683de 100644 --- a/Mage.Sets/src/mage/cards/k/KianneDeanOfSubstance.java +++ b/Mage.Sets/src/mage/cards/k/KianneDeanOfSubstance.java @@ -127,10 +127,8 @@ enum KianneDeanOfSubstanceValue implements DynamicValue { public int calculate(Game game, Ability sourceAbility, Effect effect) { return game .getExile() - .getAllCards(game) + .getCardsOwned(game, sourceAbility.getControllerId()) .stream() - .filter(Objects::nonNull) - .filter(card -> card.isOwnedBy(sourceAbility.getControllerId())) .filter(card -> card.getCounters(game).containsKey(CounterType.STUDY)) .map(MageObject::getManaValue) .distinct() @@ -155,10 +153,8 @@ enum KianneDeanOfSubstanceHint implements Hint { @Override public String getText(Game game, Ability ability) { List values = game.getExile() - .getAllCards(game) + .getCardsOwned(game, ability.getControllerId()) .stream() - .filter(Objects::nonNull) - .filter(card -> card.isOwnedBy(ability.getControllerId())) .filter(card -> card.getCounters(game).containsKey(CounterType.STUDY)) .mapToInt(MageObject::getManaValue) .distinct() @@ -166,7 +162,7 @@ enum KianneDeanOfSubstanceHint implements Hint { .mapToObj(String::valueOf) .collect(Collectors.toList()); return "Mana values of cards exiled with study counters: " + values.size() - + (values.size() > 0 ? " (" + String.join(", ", values) + ')' : ""); + + (values.isEmpty() ? "" : " (" + String.join(", ", values) + ')'); } @Override diff --git a/Mage.Sets/src/mage/cards/l/LivioOathswornSentinel.java b/Mage.Sets/src/mage/cards/l/LivioOathswornSentinel.java index 3d0196f39fb..d32f957d3ac 100644 --- a/Mage.Sets/src/mage/cards/l/LivioOathswornSentinel.java +++ b/Mage.Sets/src/mage/cards/l/LivioOathswornSentinel.java @@ -125,7 +125,7 @@ class LivioOathswornSentinelReturnEffect extends OneShotEffect { } Set cards = game .getExile() - .getAllCards(game) + .getCardsInRange(game, player.getId()) .stream() .filter(Objects::nonNull) .filter(card -> card.getCounters(game).containsKey(CounterType.AEGIS)) diff --git a/Mage.Sets/src/mage/cards/m/MairsilThePretender.java b/Mage.Sets/src/mage/cards/m/MairsilThePretender.java index 1df506dee92..59853dba53b 100644 --- a/Mage.Sets/src/mage/cards/m/MairsilThePretender.java +++ b/Mage.Sets/src/mage/cards/m/MairsilThePretender.java @@ -135,14 +135,12 @@ class MairsilThePretenderGainAbilitiesEffect extends ContinuousEffectImpl { if (perm == null) { return false; } - for (Card card : game.getExile().getAllCards(game)) { - if (filter.match(card, game) && Objects.equals(card.getOwnerId(), perm.getControllerId())) { - for (Ability ability : card.getAbilities(game)) { - if (ability.isActivatedAbility()) { - ActivatedAbility copyAbility = (ActivatedAbility) ability.copy(); - copyAbility.setMaxActivationsPerTurn(1); - perm.addAbility(copyAbility, source.getSourceId(), game, true); - } + for (Card card : game.getExile().getCardsOwned(filter, perm.getControllerId(), source, game)) { + for (Ability ability : card.getAbilities(game)) { + if (ability.isActivatedAbility()) { + ActivatedAbility copyAbility = (ActivatedAbility) ability.copy(); + copyAbility.setMaxActivationsPerTurn(1); + perm.addAbility(copyAbility, source.getSourceId(), game, true); } } } diff --git a/Mage.Sets/src/mage/cards/m/MaskwoodNexus.java b/Mage.Sets/src/mage/cards/m/MaskwoodNexus.java index eb4110d319d..d11db30b5ca 100644 --- a/Mage.Sets/src/mage/cards/m/MaskwoodNexus.java +++ b/Mage.Sets/src/mage/cards/m/MaskwoodNexus.java @@ -96,7 +96,7 @@ class MaskwoodNexusEffect extends ContinuousEffectImpl { .forEach(affectedCards::add); // in Exile - game.getState().getExile().getAllCards(game, controller.getId()).stream() + game.getState().getExile().getCardsOwned(game, controller.getId()).stream() .filter(card -> card.isOwnedBy(controller.getId())) .forEach(affectedCards::add); diff --git a/Mage.Sets/src/mage/cards/m/MycosynthLattice.java b/Mage.Sets/src/mage/cards/m/MycosynthLattice.java index f9980c60f77..cbefd32b853 100644 --- a/Mage.Sets/src/mage/cards/m/MycosynthLattice.java +++ b/Mage.Sets/src/mage/cards/m/MycosynthLattice.java @@ -107,7 +107,7 @@ class EverythingIsColorlessEffect extends ContinuousEffectImpl { } // exile - affectedCards.addAll(game.getExile().getAllCardsByRange(game, controller.getId())); + affectedCards.addAll(game.getExile().getCardsInRange(game, controller.getId())); for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { diff --git a/Mage.Sets/src/mage/cards/o/OblivionSower.java b/Mage.Sets/src/mage/cards/o/OblivionSower.java index 6cdeecf3533..ac10cdf7b5d 100644 --- a/Mage.Sets/src/mage/cards/o/OblivionSower.java +++ b/Mage.Sets/src/mage/cards/o/OblivionSower.java @@ -1,7 +1,5 @@ - package mage.cards.o; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; @@ -12,19 +10,20 @@ import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.common.FilterLandCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.card.FaceDownPredicate; -import mage.filter.predicate.card.OwnerIdPredicate; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** * * @author LevelX2 @@ -56,6 +55,11 @@ public final class OblivionSower extends CardImpl { class OblivionSowerEffect extends OneShotEffect { + private static final FilterCard filter = new FilterLandCard(); + static { + filter.add(Predicates.not(FaceDownPredicate.instance)); + } + OblivionSowerEffect() { super(Outcome.PutLandInPlay); this.staticText = ", then you may put any number of land cards that player owns from exile onto the battlefield under your control"; @@ -78,25 +82,21 @@ class OblivionSowerEffect extends OneShotEffect { */ Player controller = game.getPlayer(source.getControllerId()); Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); - if (controller != null && targetPlayer != null) { - FilterLandCard filter = new FilterLandCard(); - filter.add(new OwnerIdPredicate(targetPlayer.getId())); - filter.add(Predicates.not(FaceDownPredicate.instance)); - Cards exiledCards = new CardsImpl(); - exiledCards.addAllCards(game.getExile().getAllCards(game)); - Cards exiledLands = new CardsImpl(); - exiledLands.addAllCards(exiledCards.getCards(filter, controller.getId(), source, game)); - if (!exiledLands.isEmpty() && controller.chooseUse(outcome, "Put lands into play?", source, game)) { - FilterCard filterToPlay = new FilterCard("land" - + (exiledLands.size() > 1 ? "s" : "") + " from exile owned by " - + targetPlayer.getName() + " to put into play under your control"); - TargetCard targetCards = new TargetCard(0, exiledLands.size(), Zone.EXILED, filterToPlay); - if (controller.chooseTarget(outcome, exiledLands, targetCards, source, game)) { - controller.moveCards(new CardsImpl(targetCards.getTargets()), Zone.BATTLEFIELD, source, game); - } - } - return true; + if (controller == null || targetPlayer == null) { + return false; } - return false; + Cards exiledLands = new CardsImpl(game.getExile() + .getCardsOwned(filter, targetPlayer.getId(), source, game) + ); + if (!exiledLands.isEmpty() && controller.chooseUse(outcome, "Put lands into play?", source, game)) { + FilterCard filterToPlay = new FilterCard("land" + + (exiledLands.size() > 1 ? "s" : "") + " from exile owned by " + + targetPlayer.getName() + " to put into play under your control"); + TargetCard targetCards = new TargetCard(0, exiledLands.size(), Zone.EXILED, filterToPlay); + if (controller.chooseTarget(outcome, exiledLands, targetCards, source, game)) { + controller.moveCards(new CardsImpl(targetCards.getTargets()), Zone.BATTLEFIELD, source, game); + } + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/p/PaintersServant.java b/Mage.Sets/src/mage/cards/p/PaintersServant.java index b61327c63c6..bdffc476a83 100644 --- a/Mage.Sets/src/mage/cards/p/PaintersServant.java +++ b/Mage.Sets/src/mage/cards/p/PaintersServant.java @@ -82,7 +82,7 @@ class PaintersServantEffect extends ContinuousEffectImpl { } // exile - affectedCards.addAll(game.getExile().getAllCardsByRange(game, controller.getId())); + affectedCards.addAll(game.getExile().getCardsInRange(game, controller.getId())); for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); diff --git a/Mage.Sets/src/mage/cards/p/PeterParker.java b/Mage.Sets/src/mage/cards/p/PeterParker.java index 05522c22f56..12be2293b5b 100644 --- a/Mage.Sets/src/mage/cards/p/PeterParker.java +++ b/Mage.Sets/src/mage/cards/p/PeterParker.java @@ -106,7 +106,7 @@ class AmazingSpiderManEffect extends ContinuousEffectImpl { controller.getLibrary().getCards(game).stream() .filter(c -> filter.match(c, game)) .forEach(cardsToGainAbility::add); - game.getExile().getAllCardsByRange(game, controller.getId()).stream() + game.getExile().getCardsInRange(game, controller.getId()).stream() .filter(c -> filter.match(c, game)) .forEach(cardsToGainAbility::add); game.getCommanderCardsFromCommandZone(controller, CommanderCardType.ANY).stream() @@ -127,4 +127,4 @@ class AmazingSpiderManEffect extends ContinuousEffectImpl { } return true; } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java b/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java index 089f9f62d12..82a912082b6 100644 --- a/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java +++ b/Mage.Sets/src/mage/cards/r/RavenloftAdventurer.java @@ -124,7 +124,7 @@ class RavenloftAdventurerLifeEffect extends OneShotEffect { } int count = game .getExile() - .getAllCards(game, player.getId()) + .getCardsOwned(game, player.getId()) .stream() .filter(card -> card.getCounters(game).containsKey(CounterType.HIT)) .mapToInt(x -> 1) diff --git a/Mage.Sets/src/mage/cards/r/RayamiFirstOfTheFallen.java b/Mage.Sets/src/mage/cards/r/RayamiFirstOfTheFallen.java index c15123ec60a..488fdfe54fc 100644 --- a/Mage.Sets/src/mage/cards/r/RayamiFirstOfTheFallen.java +++ b/Mage.Sets/src/mage/cards/r/RayamiFirstOfTheFallen.java @@ -74,7 +74,7 @@ class RayamiFirstOfTheFallenEffect extends ContinuousEffectImpl { return false; } game.getExile() - .getAllCards(game) + .getCardsInRange(game, sourcePermanent.getControllerId()) .stream() .filter(card1 -> card1.isCreature(game)) .filter(card -> card.getCounters(game).getCount(CounterType.BLOOD) > 0) diff --git a/Mage.Sets/src/mage/cards/r/RexCyberHound.java b/Mage.Sets/src/mage/cards/r/RexCyberHound.java index 90f7f61121b..dbab4a5c875 100644 --- a/Mage.Sets/src/mage/cards/r/RexCyberHound.java +++ b/Mage.Sets/src/mage/cards/r/RexCyberHound.java @@ -104,7 +104,7 @@ class RexCyberhoundContinuousEffect extends ContinuousEffectImpl { filter.add(CounterType.BRAIN.getPredicate()); } - public RexCyberhoundContinuousEffect() { + RexCyberhoundContinuousEffect() { super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); staticText = "{this} has all activated abilities of all cards in exile with brain counters on them"; addDependencyType(DependencyType.AddingAbility); @@ -125,7 +125,7 @@ class RexCyberhoundContinuousEffect extends ContinuousEffectImpl { if (perm == null) { return false; } - for (Card card : game.getExile().getCards(filter, game)) { + for (Card card : game.getExile().getCardsInRange(filter, source.getControllerId(), source, game)) { for (Ability ability : card.getAbilities(game)) { if (ability.isActivatedAbility()) { ActivatedAbility copyAbility = (ActivatedAbility) ability.copy(); diff --git a/Mage.Sets/src/mage/cards/r/RoseTyler.java b/Mage.Sets/src/mage/cards/r/RoseTyler.java index c823881322f..ef2b90dd4d6 100644 --- a/Mage.Sets/src/mage/cards/r/RoseTyler.java +++ b/Mage.Sets/src/mage/cards/r/RoseTyler.java @@ -85,7 +85,7 @@ enum RoseTylerValue implements DynamicValue { .count(filter.getPermanentFilter(), sourceAbility.getControllerId(), sourceAbility, game) + game .getExile() - .getAllCards(game, sourceAbility.getControllerId()) + .getCardsOwned(game, sourceAbility.getControllerId()) .stream() .filter(card -> card.isOwnedBy(sourceAbility.getControllerId())) .mapToInt(card -> filter.getCardFilter().match(card, game) ? 1 : 0) diff --git a/Mage.Sets/src/mage/cards/s/SailorsBane.java b/Mage.Sets/src/mage/cards/s/SailorsBane.java index cdaf2b0da51..a2e70263ee7 100644 --- a/Mage.Sets/src/mage/cards/s/SailorsBane.java +++ b/Mage.Sets/src/mage/cards/s/SailorsBane.java @@ -23,7 +23,6 @@ import mage.filter.predicate.Predicates; import mage.game.Game; import mage.players.Player; -import java.util.Optional; import java.util.UUID; /** @@ -69,7 +68,6 @@ enum SailorsBaneValue implements DynamicValue { private static final FilterCard filter = new FilterCard(); static { - filter.add(TargetController.YOU.getOwnerPredicate()); filter.add(Predicates.or( CardType.INSTANT.getPredicate(), CardType.SORCERY.getPredicate(), @@ -79,15 +77,12 @@ enum SailorsBaneValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - return Optional - .ofNullable(game.getPlayer(sourceAbility.getControllerId())) - .map(Player::getGraveyard) - .map(graveyard -> graveyard.count(filter, game)) - .orElse(0) - + game - .getExile() - .getCards(filter, game) - .size(); + Player player = game.getPlayer(sourceAbility.getControllerId()); + if (player == null) { + return 0; + } + return game.getExile().getCardsOwned(filter, player.getId(), sourceAbility, game).size() + + player.getGraveyard().count(filter, player.getId(), sourceAbility, game); } @Override @@ -100,7 +95,7 @@ enum SailorsBaneValue implements DynamicValue { return ""; } - private static final boolean checkAdventure(Card input, Game game) { + private static boolean checkAdventure(Card input, Game game) { return input instanceof AdventureCard; } } diff --git a/Mage.Sets/src/mage/cards/s/SeizeTheStorm.java b/Mage.Sets/src/mage/cards/s/SeizeTheStorm.java index eef63c29577..6dca07f59a8 100644 --- a/Mage.Sets/src/mage/cards/s/SeizeTheStorm.java +++ b/Mage.Sets/src/mage/cards/s/SeizeTheStorm.java @@ -62,7 +62,7 @@ enum SeizeTheStormValue implements DynamicValue { return player.getGraveyard().count( StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game ) + game.getExile() - .getAllCards(game, sourceAbility.getControllerId()) + .getCardsOwned(game, sourceAbility.getControllerId()) .stream() .filter(card -> card.getAbilities(game).containsClass(FlashbackAbility.class)) .mapToInt(x -> 1).sum(); diff --git a/Mage.Sets/src/mage/cards/s/SlimeAgainstHumanity.java b/Mage.Sets/src/mage/cards/s/SlimeAgainstHumanity.java index 37ec3901463..2438d4056ab 100644 --- a/Mage.Sets/src/mage/cards/s/SlimeAgainstHumanity.java +++ b/Mage.Sets/src/mage/cards/s/SlimeAgainstHumanity.java @@ -87,7 +87,7 @@ class SlimeAgainstHumanityEffect extends OneShotEffect { int exileCount = game .getState() .getExile() - .getAllCards(game, source.getControllerId()) + .getCardsOwned(game, source.getControllerId()) .stream() .filter(card -> filter.match(card, game)) .mapToInt(x -> 1) diff --git a/Mage.Sets/src/mage/cards/t/TashaTheWitchQueen.java b/Mage.Sets/src/mage/cards/t/TashaTheWitchQueen.java index 41142ca3a90..438e7ddd491 100644 --- a/Mage.Sets/src/mage/cards/t/TashaTheWitchQueen.java +++ b/Mage.Sets/src/mage/cards/t/TashaTheWitchQueen.java @@ -132,7 +132,7 @@ class TashaTheWitchQueenCastEffect extends OneShotEffect { if (player == null) { return false; } - Cards cards = new CardsImpl(game.getExile().getCards(filter, game)); + Cards cards = new CardsImpl(game.getExile().getCardsInRange(filter, source.getControllerId(), source, game)); return !cards.isEmpty() && CardUtil.castSpellWithAttributesForFree(player, source, game, cards, StaticFilters.FILTER_CARD); } } diff --git a/Mage.Sets/src/mage/cards/t/TeferiMageOfZhalfir.java b/Mage.Sets/src/mage/cards/t/TeferiMageOfZhalfir.java index 283a6df888f..898f1e27b30 100644 --- a/Mage.Sets/src/mage/cards/t/TeferiMageOfZhalfir.java +++ b/Mage.Sets/src/mage/cards/t/TeferiMageOfZhalfir.java @@ -87,14 +87,14 @@ class TeferiMageOfZhalfirAddFlashEffect extends ContinuousEffectImpl { } } // in Exile - for (Card card : game.getState().getExile().getAllCards(game)) { - if (card.isOwnedBy(controller.getId()) && card.isCreature(game)) { + for (Card card : game.getState().getExile().getCardsOwned(game, controller.getId())) { + if (card.isCreature(game)) { game.getState().addOtherAbility(card, FlashAbility.getInstance()); } } // in Library (e.g. for Mystical Teachings) for (Card card : controller.getLibrary().getCards(game)) { - if (card.isOwnedBy(controller.getId()) && card.isCreature(game)) { + if (card.isCreature(game)) { game.getState().addOtherAbility(card, FlashAbility.getInstance()); } } diff --git a/Mage.Sets/src/mage/cards/u/UlamogTheDefiler.java b/Mage.Sets/src/mage/cards/u/UlamogTheDefiler.java index 48af2ecb999..3702aa12fc9 100644 --- a/Mage.Sets/src/mage/cards/u/UlamogTheDefiler.java +++ b/Mage.Sets/src/mage/cards/u/UlamogTheDefiler.java @@ -116,7 +116,7 @@ enum UlamogTheDefilerValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { return game.getExile() - .getAllCardsByRange(game, sourceAbility.getControllerId()) + .getCardsInRange(game, sourceAbility.getControllerId()) .stream() .mapToInt(Card::getManaValue) .max() diff --git a/Mage.Sets/src/mage/cards/w/WardenOfTheBeyond.java b/Mage.Sets/src/mage/cards/w/WardenOfTheBeyond.java index a630c707c76..99b6c464a24 100644 --- a/Mage.Sets/src/mage/cards/w/WardenOfTheBeyond.java +++ b/Mage.Sets/src/mage/cards/w/WardenOfTheBeyond.java @@ -1,7 +1,5 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; @@ -13,12 +11,13 @@ import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; -import mage.constants.Zone; +import mage.constants.SubType; import mage.game.Game; import mage.players.Player; +import java.util.UUID; + /** * * @author LevelX2 @@ -26,7 +25,7 @@ import mage.players.Player; public final class WardenOfTheBeyond extends CardImpl { public WardenOfTheBeyond(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add(SubType.HUMAN); this.subtype.add(SubType.WIZARD); @@ -35,9 +34,10 @@ public final class WardenOfTheBeyond extends CardImpl { // Vigilance this.addAbility(VigilanceAbility.getInstance()); + // Warden of the Beyond gets +2/+2 as long as an opponent owns a card in exile. this.addAbility(new SimpleStaticAbility( - new ConditionalContinuousEffect(new BoostSourceEffect(2,2,Duration.WhileOnBattlefield), OpponentOwnsCardInExileCondition.instance, + new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), WardenOfTheBeyondCondition.instance, "{this} gets +2/+2 as long as an opponent owns a card in exile"))); } @@ -51,15 +51,15 @@ public final class WardenOfTheBeyond extends CardImpl { } } -enum OpponentOwnsCardInExileCondition implements Condition { +enum WardenOfTheBeyondCondition implements Condition { - instance; + instance; @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { - for (Card card :game.getExile().getAllCards(game)) { + for (Card card : game.getExile().getCardsInRange(game, controller.getId())) { if (controller.hasOpponent(card.getOwnerId(), game)) { return true; } diff --git a/Mage.Sets/src/mage/cards/z/ZethiArcaneBlademaster.java b/Mage.Sets/src/mage/cards/z/ZethiArcaneBlademaster.java index 31f5819e3c0..bfcf9c62c51 100644 --- a/Mage.Sets/src/mage/cards/z/ZethiArcaneBlademaster.java +++ b/Mage.Sets/src/mage/cards/z/ZethiArcaneBlademaster.java @@ -115,7 +115,7 @@ class ZethiArcaneBlademasterCastEffect extends OneShotEffect { if (controller == null) { return false; } - Cards cards = new CardsImpl(game.getExile().getAllCards(game, source.getControllerId())); + Cards cards = new CardsImpl(game.getExile().getCardsOwned(game, source.getControllerId())); cards.removeIf(uuid -> !game.getCard(uuid).getCounters(game).containsKey(CounterType.KICK)); if (cards.isEmpty()) { return false; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java index 973291e4438..6cc8d660813 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java @@ -147,7 +147,7 @@ public class ManifestTest extends CardTestPlayerBase { runCode("after blink", 1, PhaseStep.PRECOMBAT_MAIN, playerA, (info, player, game) -> { if (cardAfterBlink == null) { Assert.assertEquals("after blink card must keep in exile", - 1, currentGame.getExile().getAllCardsByRange(currentGame, playerA.getId()).size()); + 1, currentGame.getExile().getCardsInRange(currentGame, playerA.getId()).size()); } else { String realPermanentName = currentGame.getBattlefield().getAllPermanents() .stream() diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/otc/DuneChanterTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/otc/DuneChanterTest.java index 0dc4b879caa..f749bd81cc6 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/otc/DuneChanterTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/otc/DuneChanterTest.java @@ -66,7 +66,7 @@ public class DuneChanterTest extends CardTestPlayerBase { private static void checkExile(String info, Player player, Game game, int count) { int amount = game .getExile() - .getAllCards(game, player.getId()) + .getCardsOwned(game, player.getId()) .stream() .filter(c -> c.getSubtype(game).contains(SubType.DESERT)) .mapToInt(k -> 1) diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/TokenImagesTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/TokenImagesTest.java index 8f645ad543f..8e27afb2ff5 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/TokenImagesTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/TokenImagesTest.java @@ -888,7 +888,7 @@ public class TokenImagesTest extends CardTestPlayerBase { // check face down card in exile runCode("on face down", 1, PhaseStep.PRECOMBAT_MAIN, playerA, (info, player, game) -> { - Card card = currentGame.getExile().getAllCards(currentGame, playerA.getId()).get(0); + Card card = currentGame.getExile().getCardsOwned(currentGame, playerA.getId()).get(0); GameView gameView = getGameView(playerA); CardView controllerCardView = gameView.getExile() .stream() @@ -941,7 +941,7 @@ public class TokenImagesTest extends CardTestPlayerBase { // check face down card runCode("on face down", 1, PhaseStep.PRECOMBAT_MAIN, playerA, (info, player, game) -> { - Card card = currentGame.getExile().getAllCards(currentGame, playerA.getId()).get(0); + Card card = currentGame.getExile().getCardsOwned(currentGame, playerA.getId()).get(0); GameView gameView = getGameView(playerA); CardView controllerCardView = gameView.getExile() .stream() diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/CardsInExileCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/CardsInExileCount.java index 2a6b6a1bfd7..0ae8141f665 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/CardsInExileCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/CardsInExileCount.java @@ -74,8 +74,8 @@ public enum CardsInExileCount implements DynamicValue { return playerIds.stream() .map(game::getPlayer) .filter(Objects::nonNull) - .map(player -> game.getExile().getAllCards(game, player.getId())) + .map(player -> game.getExile().getCardsOwned(game, player.getId())) .flatMap(Collection::stream) .filter(Objects::nonNull); } -} \ No newline at end of file +} diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java index ee7c48b8b20..b8de0842556 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java @@ -3,7 +3,6 @@ package mage.abilities.dynamicvalue.common; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; -import mage.cards.Card; import mage.filter.StaticFilters; import mage.game.Game; import mage.players.Player; @@ -17,18 +16,11 @@ public enum InstantSorceryExileGraveyardCount implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { Player player = game.getPlayer(sourceAbility.getControllerId()); - if (player != null) { - int exileCount = 0; - for (Card exiledCard : game.getExile().getAllCards(game)) { - if (exiledCard.getOwnerId().equals(player.getId()) && exiledCard.isInstantOrSorcery(game)) { - exileCount++; - } - } - return player.getGraveyard().count( - StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game - ) + exileCount; + if (player == null) { + return 0; } - return 0; + return game.getExile().getCardsOwned(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, player.getId(), sourceAbility, game).size() + + player.getGraveyard().count(StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, player.getId(), sourceAbility, game); } @Override diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/TotalCardsExiledOwnedManaValue.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/TotalCardsExiledOwnedManaValue.java index 400155b7708..8f70b4b7543 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/TotalCardsExiledOwnedManaValue.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/TotalCardsExiledOwnedManaValue.java @@ -26,7 +26,7 @@ public enum TotalCardsExiledOwnedManaValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { int totalCMC = 0; - List cards = game.getExile().getAllCards( + List cards = game.getExile().getCardsOwned( game, sourceAbility.getControllerId() ); diff --git a/Mage/src/main/java/mage/abilities/effects/common/WishEffect.java b/Mage/src/main/java/mage/abilities/effects/common/WishEffect.java index 9d76b9a82f3..b47a6302c96 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/WishEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/WishEffect.java @@ -99,7 +99,7 @@ public class WishEffect extends OneShotEffect { return false; } Cards cards = controller.getSideboard(); - List exile = game.getExile().getAllCards(game); + List exile = game.getExile().getCardsOwned(game, controller.getId()); boolean noTargets = cards.isEmpty() && (!alsoFromExile || exile.isEmpty()); if (noTargets) { game.informPlayer(controller, "You have no cards outside the game" + (alsoFromExile ? " or in exile" : "") + '.'); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCreatureSubTypeAllMultiZoneEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCreatureSubTypeAllMultiZoneEffect.java index 8367e9ceab7..5b73ab7e313 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCreatureSubTypeAllMultiZoneEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/AddCreatureSubTypeAllMultiZoneEffect.java @@ -98,7 +98,7 @@ public class AddCreatureSubTypeAllMultiZoneEffect extends ContinuousEffectImpl { } } // in Exile - for (Card card : game.getState().getExile().getAllCards(game, controllerId)) { + for (Card card : game.getState().getExile().getCardsOwned(game, controllerId)) { if (filterCard.match(card, controllerId, source, game) && !card.hasSubtype(subType, game)) { game.getState().getCreateMageObjectAttribute(card, game).getSubtype().add(subType); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityControlledSpellsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityControlledSpellsEffect.java index 7cef0dc05df..2947f24523e 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityControlledSpellsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainAbilityControlledSpellsEffect.java @@ -44,7 +44,7 @@ public class GainAbilityControlledSpellsEffect extends ContinuousEffectImpl { return false; } - for (Card card : game.getExile().getAllCardsByRange(game, source.getControllerId())) { + for (Card card : game.getExile().getCardsInRange(game, source.getControllerId())) { if (filter.match(card, player.getId(), source, game)) { game.getState().addOtherAbility(card, ability); } diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/NextSpellCastHasAbilityEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/NextSpellCastHasAbilityEffect.java index df157da49ef..8c14cf6353b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/NextSpellCastHasAbilityEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/NextSpellCastHasAbilityEffect.java @@ -93,7 +93,7 @@ public class NextSpellCastHasAbilityEffect extends ContinuousEffectImpl { discard(); // only one use return false; } - for (Card card : game.getExile().getAllCardsByRange(game, playerId)) { + for (Card card : game.getExile().getCardsInRange(game, playerId)) { if (filter.match(card, playerId, source, game)) { game.getState().addOtherAbility(card, ability); } diff --git a/Mage/src/main/java/mage/choices/ChoiceCreatureType.java b/Mage/src/main/java/mage/choices/ChoiceCreatureType.java index 733bb37ca78..7a71402bd62 100644 --- a/Mage/src/main/java/mage/choices/ChoiceCreatureType.java +++ b/Mage/src/main/java/mage/choices/ChoiceCreatureType.java @@ -79,7 +79,7 @@ public class ChoiceCreatureType extends ChoiceImpl { }); // exile - game.getExile().getAllCards(game, playerId).forEach(card -> { + game.getExile().getCardsOwned(game, playerId).forEach(card -> { list.addAll(card.getSubtype(game).stream().map(SubType::toString).collect(Collectors.toList())); }); }); diff --git a/Mage/src/main/java/mage/game/Exile.java b/Mage/src/main/java/mage/game/Exile.java index 7d8b7bd5660..4342443b321 100644 --- a/Mage/src/main/java/mage/game/Exile.java +++ b/Mage/src/main/java/mage/game/Exile.java @@ -1,5 +1,6 @@ package mage.game; +import mage.abilities.Ability; import mage.cards.Card; import mage.filter.FilterCard; import mage.util.Copyable; @@ -61,24 +62,33 @@ public class Exile implements Serializable, Copyable { return null; } + /** + * Returns all cards in exile matching the filter. Use only for test framework. + * For card effects, instead use a method that checks owner or range of influence. + */ + @Deprecated public List getCards(FilterCard filter, Game game) { List allCards = getAllCards(game); return allCards.stream().filter(card -> filter.match(card, game)).collect(Collectors.toList()); } - @Deprecated // TODO: must use related request due game range like getAllCardsByRange + /** + * Returns all cards in exile. Use only for test framework. + * For card effects, instead use a method that checks owner or range of influence. + */ + @Deprecated public List getAllCards(Game game) { - return getAllCards(game, null); + return getCardsOwned(game, null); } /** - * Return exiled cards owned by a specific player. Use it in effects to find all cards in range. + * Returns all cards in exile owned by the specified player */ - public List getAllCards(Game game, UUID fromPlayerId) { + public List getCardsOwned(Game game, UUID ownerId) { List res = new ArrayList<>(); for (ExileZone exile : exileZones.values()) { for (Card card : exile.getCards(game)) { - if (fromPlayerId == null || card.isOwnedBy(fromPlayerId)) { + if (ownerId == null || card.isOwnedBy(ownerId)) { res.add(card); } } @@ -86,14 +96,37 @@ public class Exile implements Serializable, Copyable { return res; } - public List getAllCardsByRange(Game game, UUID controllerId) { + /** + * Returns all cards in exile matching the filter, owned by the specified player + */ + public Set getCardsOwned(FilterCard filter, UUID playerId, Ability source, Game game) { + return getCardsOwned(game, playerId) + .stream() + .filter(card -> filter.match(card, playerId, source, game)) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + + /** + * Returns all cards in exile in range of the specified player + */ + public List getCardsInRange(Game game, UUID controllerId) { List res = new ArrayList<>(); for (UUID playerId : game.getState().getPlayersInRange(controllerId, game)) { - res.addAll(getAllCards(game, playerId)); + res.addAll(getCardsOwned(game, playerId)); } return res; } + /** + * Returns all cards in exile matching the filter, in range of the specified player + */ + public Set getCardsInRange(FilterCard filter, UUID playerId, Ability source, Game game) { + return getCardsInRange(game, playerId) + .stream() + .filter(card -> filter.match(card, playerId, source, game)) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + public boolean removeCard(Card card) { for (ExileZone exile : exileZones.values()) { if (exile.contains(card.getId())) { diff --git a/Mage/src/main/java/mage/game/command/emblems/KayaTheInexorableEmblem.java b/Mage/src/main/java/mage/game/command/emblems/KayaTheInexorableEmblem.java index 0dacb1e09cb..940744eddde 100644 --- a/Mage/src/main/java/mage/game/command/emblems/KayaTheInexorableEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/KayaTheInexorableEmblem.java @@ -48,7 +48,6 @@ public class KayaTheInexorableEmblem extends Emblem { class KayaTheInexorableEmblemEffect extends OneShotEffect { - private static final FilterCard filter = new FilterOwnedCard(); private static final FilterCard filter2 = new FilterCard(); private static final Set choices = new LinkedHashSet<>(); @@ -94,7 +93,7 @@ class KayaTheInexorableEmblemEffect extends OneShotEffect { cards.addAll(player.getGraveyard()); break; case "Exile": - cards.addAllCards(game.getExile().getCards(filter, game)); + cards.addAllCards(game.getExile().getCardsOwned(game, player.getId())); break; } return CardUtil.castSpellWithAttributesForFree(player, source, game, cards, filter2); diff --git a/Mage/src/main/java/mage/target/TargetCard.java b/Mage/src/main/java/mage/target/TargetCard.java index af7b05fc114..7824cfb22da 100644 --- a/Mage/src/main/java/mage/target/TargetCard.java +++ b/Mage/src/main/java/mage/target/TargetCard.java @@ -134,7 +134,7 @@ public class TargetCard extends TargetObject { protected static Set getAllPossibleTargetInExile(Game game, Player player, UUID sourceControllerId, Ability source, FilterCard filter, boolean isNotTarget) { Set possibleTargets = new HashSet<>(); UUID sourceId = source != null ? source.getSourceId() : null; - for (Card card : game.getExile().getAllCardsByRange(game, sourceControllerId)) { + for (Card card : game.getExile().getCardsInRange(game, sourceControllerId)) { if (filter.match(card, sourceControllerId, source, game)) { possibleTargets.add(card.getId()); } diff --git a/Mage/src/main/java/mage/target/TargetSource.java b/Mage/src/main/java/mage/target/TargetSource.java index 5ffbc7639f2..f1f7bc61194 100644 --- a/Mage/src/main/java/mage/target/TargetSource.java +++ b/Mage/src/main/java/mage/target/TargetSource.java @@ -115,7 +115,7 @@ public class TargetSource extends TargetObject { } } } - for (Card card : game.getExile().getAllCards(game)) { + for (Card card : game.getExile().getCardsInRange(game, sourceControllerId)) { if (filter.match(card, sourceControllerId, source, game)) { possibleTargets.add(card.getId()); } diff --git a/Mage/src/main/java/mage/target/common/TargetCardInExile.java b/Mage/src/main/java/mage/target/common/TargetCardInExile.java index 292e958cb1c..4cdfde920eb 100644 --- a/Mage/src/main/java/mage/target/common/TargetCardInExile.java +++ b/Mage/src/main/java/mage/target/common/TargetCardInExile.java @@ -52,7 +52,7 @@ public class TargetCardInExile extends TargetCard { Set possibleTargets = new HashSet<>(); if (zoneId == null) { // no specific exile zone - for (Card card : game.getExile().getAllCardsByRange(game, sourceControllerId)) { + for (Card card : game.getExile().getCardsInRange(game, sourceControllerId)) { if (filter.match(card, sourceControllerId, source, game)) { possibleTargets.add(card.getId()); } diff --git a/Mage/src/main/java/mage/target/common/TargetPermanentOrSuspendedCard.java b/Mage/src/main/java/mage/target/common/TargetPermanentOrSuspendedCard.java index 144b3aa29b3..a18a5ba90f9 100644 --- a/Mage/src/main/java/mage/target/common/TargetPermanentOrSuspendedCard.java +++ b/Mage/src/main/java/mage/target/common/TargetPermanentOrSuspendedCard.java @@ -66,7 +66,7 @@ public class TargetPermanentOrSuspendedCard extends TargetImpl { possibleTargets.add(permanent.getId()); } } - for (Card card : game.getExile().getAllCards(game)) { + for (Card card : game.getExile().getCardsInRange(game, sourceControllerId)) { if (filter.match(card, sourceControllerId, source, game)) { possibleTargets.add(card.getId()); }