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
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<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
+ Set<UUID> 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<UUID> 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);
