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
This commit is contained in:
SpeedProg 2020-05-02 16:34:04 +02:00
parent a91b210456
commit 9597e95b8d

View file

@ -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<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);