diff --git a/Mage/src/main/java/mage/target/common/TargetCardInOpponentsGraveyard.java b/Mage/src/main/java/mage/target/common/TargetCardInOpponentsGraveyard.java index 4ebbfa167f..84d34020f8 100644 --- a/Mage/src/main/java/mage/target/common/TargetCardInOpponentsGraveyard.java +++ b/Mage/src/main/java/mage/target/common/TargetCardInOpponentsGraveyard.java @@ -1,8 +1,11 @@ package mage.target.common; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; import mage.abilities.Ability; import mage.cards.Card; +import mage.cards.Cards; import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.Game; @@ -33,6 +36,23 @@ public class TargetCardInOpponentsGraveyard extends TargetCard { this.allFromOneOpponent = target.allFromOneOpponent; } + @Override + public boolean canTarget(UUID playerId, UUID id, Ability source, Game game) { + Card card = game.getCard(id); + if (card != null && zone.match(game.getState().getZone(id))) { + if (game.getPlayer(source.getControllerId()).hasOpponent(card.getOwnerId(), game)) { + if (allFromOneOpponent && !targets.isEmpty()) { + Card firstCard = game.getCard(targets.keySet().iterator().next()); + if (firstCard != null && !card.isOwnedBy(firstCard.getOwnerId())) { + return false; + } + } + return filter.match(card, source.getId(), playerId, game); + } + } + return false; + } + @Override public boolean canTarget(UUID id, Ability source, Game game) { Card card = game.getCard(id); @@ -69,7 +89,14 @@ public class TargetCardInOpponentsGraveyard extends TargetCard { if (getNumberOfTargets() == 0) { // if 0 target is valid, the canChoose is always true return true; } + Player sourceController = game.getPlayer(sourceControllerId); for (UUID playerId: game.getState().getPlayersInRange(sourceControllerId, game)) { + if (!sourceController.hasOpponent(playerId, game)) { + continue; + } + if (this.allFromOneOpponent) { + possibleTargets = 0; + } if (!playerId.equals(sourceControllerId)) { Player player = game.getPlayer(playerId); if (player != null) { @@ -86,6 +113,33 @@ public class TargetCardInOpponentsGraveyard extends TargetCard { } return false; } + + @Override + public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { + Set possibleTargets = new HashSet<>(); + Player sourceController = game.getPlayer(sourceControllerId); + for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) { + if (!sourceController.hasOpponent(playerId, game)) { + continue; + } + Player player = game.getPlayer(playerId); + if (player != null) { + Set targetsInThisGraveyeard = new HashSet<>(); + for (Card card : player.getGraveyard().getCards(filter, sourceId, sourceControllerId, game)) { + if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) { + targetsInThisGraveyeard.add(card.getId()); + } + } + // if there is not enough possible targets, the can't be any + if (this.allFromOneOpponent && targetsInThisGraveyeard.size() < this.minNumberOfTargets) { + continue; + } + possibleTargets.addAll(targetsInThisGraveyeard); + } + } + return possibleTargets; + } + @Override public TargetCardInOpponentsGraveyard copy() { return new TargetCardInOpponentsGraveyard(this);