diff --git a/Mage.Sets/src/mage/cards/p/PathOfAncestry.java b/Mage.Sets/src/mage/cards/p/PathOfAncestry.java index aea19fa06c9..6350f97c25c 100644 --- a/Mage.Sets/src/mage/cards/p/PathOfAncestry.java +++ b/Mage.Sets/src/mage/cards/p/PathOfAncestry.java @@ -12,6 +12,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.CommanderCardType; import mage.constants.Duration; +import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -93,7 +94,7 @@ class PathOfAncestryTriggeredAbility extends DelayedTriggeredAbility { } // share creature type with commander - for (Card commander : game.getCommanderCardsFromAnyZones(player, CommanderCardType.COMMANDER_OR_OATHBREAKER)) { + for (Card commander : game.getCommanderCardsFromAnyZones(player, CommanderCardType.COMMANDER_OR_OATHBREAKER, Zone.ALL)) { if (spell.getCard().shareCreatureTypes(game, commander)) { return true; } diff --git a/Mage.Sets/src/mage/cards/s/StingingStudy.java b/Mage.Sets/src/mage/cards/s/StingingStudy.java index 250ed39c8cd..ccee4735dec 100644 --- a/Mage.Sets/src/mage/cards/s/StingingStudy.java +++ b/Mage.Sets/src/mage/cards/s/StingingStudy.java @@ -10,6 +10,7 @@ import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.CommanderCardType; import mage.constants.Outcome; +import mage.constants.Zone; import mage.game.Game; import mage.players.Player; @@ -64,7 +65,7 @@ class StingingStudyEffect extends OneShotEffect { return false; } Set manaValues = new HashSet<>(); - for (Card commander : game.getCommanderCardsFromAnyZones(player, CommanderCardType.ANY)) { + for (Card commander : game.getCommanderCardsFromAnyZones(player, CommanderCardType.ANY, Zone.BATTLEFIELD, Zone.COMMAND)) { manaValues.add(commander.getManaValue()); } int chosenValue = 0; diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index d4d83971fc8..1e17fcaf0cc 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -542,15 +542,71 @@ public interface Game extends MageItem, Serializable { * @param commanderCardType commander or signature spell * @return */ - default Set getCommanderCardsFromAnyZones(Player player, CommanderCardType commanderCardType) { - // from command zone - Set res = getCommanderCardsFromCommandZone(player, commanderCardType); - - // from battlefield - this.getCommandersIds(player, commanderCardType, true).stream() - .map(this::getPermanent) + default Set getCommanderCardsFromAnyZones(Player player, CommanderCardType commanderCardType, Zone... searchZones) { + Set needZones = Arrays.stream(searchZones).collect(Collectors.toSet()); + if (needZones.isEmpty()) { + throw new IllegalArgumentException("Empty zones list in searching commanders"); + } + Set needCommandersIds = this.getCommandersIds(player, commanderCardType, true); + Set needCommandersCards = needCommandersIds.stream() + .map(this::getCard) .filter(Objects::nonNull) - .forEach(res::add); + .collect(Collectors.toSet()); + Set res = new HashSet<>(); + + // hand + if (needZones.contains(Zone.ALL) || needZones.contains(Zone.HAND)) { + needCommandersCards.stream() + .filter(card -> Zone.HAND.equals(this.getState().getZone(card.getId()))) + .forEach(res::add); + } + + // graveyard + if (needZones.contains(Zone.ALL) || needZones.contains(Zone.GRAVEYARD)) { + needCommandersCards.stream() + .filter(card -> Zone.GRAVEYARD.equals(this.getState().getZone(card.getId()))) + .forEach(res::add); + } + + // library + if (needZones.contains(Zone.ALL) || needZones.contains(Zone.LIBRARY)) { + needCommandersCards.stream() + .filter(card -> Zone.LIBRARY.equals(this.getState().getZone(card.getId()))) + .forEach(res::add); + } + + // battlefield (need permanent card) + if (needZones.contains(Zone.ALL) || needZones.contains(Zone.BATTLEFIELD)) { + needCommandersIds.stream() + .map(this::getPermanent) + .filter(Objects::nonNull) + .forEach(res::add); + } + + // stack + if (needZones.contains(Zone.ALL) || needZones.contains(Zone.STACK)) { + needCommandersCards.stream() + .filter(card -> Zone.STACK.equals(this.getState().getZone(card.getId()))) + .forEach(res::add); + } + + // exiled + if (needZones.contains(Zone.ALL) || needZones.contains(Zone.EXILED)) { + needCommandersCards.stream() + .filter(card -> Zone.EXILED.equals(this.getState().getZone(card.getId()))) + .forEach(res::add); + } + + // command + if (needZones.contains(Zone.ALL) || needZones.contains(Zone.COMMAND)) { + res.addAll(getCommanderCardsFromCommandZone(player, commanderCardType)); + } + + // outside must be ignored (example: second side of MDFC commander after cast) + if (needZones.contains(Zone.OUTSIDE)) { + throw new IllegalArgumentException("Outside zone doesn't supported in searching commanders"); + } + return res; }