From 9597e95b8dc4582f84c35c48aab830126a26b06b Mon Sep 17 00:00:00 2001 From: SpeedProg Date: Sat, 2 May 2020 16:34:04 +0200 Subject: [PATCH] fixed TargetCardInOpponentsGraveyard not working properly fixed ignoring allFromOneOpponent in canChoose fixed including own graveyard in canChoose fixed including own graveyard for possibleTargets fixed not overriding one canTarget at all which allowed targeting cards in different graveyards should also fix #6472 --- .../TargetCardInOpponentsGraveyard.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) 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);