Merge pull request #6504 from SpeedProg/fix_target_card_in_opponent_graveyard

fixed TargetCardInOpponentsGraveyard not working properly
This commit is contained in:
LevelX2 2020-06-19 00:34:37 +02:00 committed by GitHub
commit 1a8d325710
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

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