From 8a12fa9b015b53f90acaa42e9e5d3ff48068b567 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 22 Jun 2014 18:26:06 +0200 Subject: [PATCH] * Fixed a bug of TargetCardInHand class, that could lead to game locked down situations (e.g. Force of Will). --- ...dHandLibraryForCardNameAndExileEffect.java | 11 +++--- .../mage/target/common/TargetCardInHand.java | 37 ++++++++++++++++++- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Mage/src/mage/abilities/effects/common/search/SearchTargetGraveyardHandLibraryForCardNameAndExileEffect.java b/Mage/src/mage/abilities/effects/common/search/SearchTargetGraveyardHandLibraryForCardNameAndExileEffect.java index 3ce9a485683..3a4aae4169f 100644 --- a/Mage/src/mage/abilities/effects/common/search/SearchTargetGraveyardHandLibraryForCardNameAndExileEffect.java +++ b/Mage/src/mage/abilities/effects/common/search/SearchTargetGraveyardHandLibraryForCardNameAndExileEffect.java @@ -30,20 +30,19 @@ package mage.abilities.effects.common.search; import java.util.List; import java.util.UUID; -import mage.constants.Outcome; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.Mode; import mage.abilities.effects.OneShotEffect; import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; +import mage.constants.Outcome; +import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.NamePredicate; import mage.game.Game; import mage.players.Player; -import mage.target.common.TargetCardInGraveyard; -import mage.target.common.TargetCardInHand; +import mage.target.TargetCard; import mage.target.common.TargetCardInLibrary; /** @@ -90,7 +89,7 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect int cardsCount = (cardName.isEmpty() ? 0 :targetPlayer.getGraveyard().count(filter, game)); if (cardsCount > 0) { filter.setMessage("card named " + cardName + " in the graveyard of " + targetPlayer.getName()); - TargetCardInGraveyard target = new TargetCardInGraveyard((graveyardExileOptional ? 0 :cardsCount), cardsCount, filter); + TargetCard target = new TargetCard((graveyardExileOptional ? 0 :cardsCount), cardsCount,Zone.GRAVEYARD, filter); if (controller.choose(Outcome.Exile, targetPlayer.getGraveyard(), target, game)) { List targets = target.getTargets(); for (UUID targetId : targets) { @@ -107,7 +106,7 @@ public abstract class SearchTargetGraveyardHandLibraryForCardNameAndExileEffect cardsCount = (cardName.isEmpty() ? 0 :targetPlayer.getHand().count(filter, game)); if (cardsCount > 0) { filter.setMessage("card named " + cardName + " in the hand of " + targetPlayer.getName()); - TargetCardInHand target = new TargetCardInHand(0, cardsCount, filter); + TargetCard target = new TargetCard(0, cardsCount, Zone.HAND, filter); if (controller.choose(Outcome.Exile, targetPlayer.getHand(), target, game)) { List targets = target.getTargets(); for (UUID targetId : targets) { diff --git a/Mage/src/mage/target/common/TargetCardInHand.java b/Mage/src/mage/target/common/TargetCardInHand.java index fee6d73a367..1d05599506f 100644 --- a/Mage/src/mage/target/common/TargetCardInHand.java +++ b/Mage/src/mage/target/common/TargetCardInHand.java @@ -28,12 +28,16 @@ package mage.target.common; +import java.util.HashSet; +import java.util.Set; import java.util.UUID; -import mage.constants.Zone; import mage.abilities.Ability; import mage.cards.Card; +import mage.constants.Zone; import mage.filter.FilterCard; import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; import mage.target.TargetCard; /** @@ -72,6 +76,37 @@ public class TargetCardInHand extends TargetCard { return false; } + @Override + public Set possibleTargets(UUID sourceId, UUID playerId, Game game) { + Set possibleTargets = new HashSet<>(); + Player player = game.getPlayer(playerId); + if (player != null) { + for (Card card : player.getHand().getCards(filter, game)) { + if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, playerId))) { + possibleTargets.add(card.getId()); + } + } + } + return possibleTargets; + } + + @Override + public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { + int possibleTargets = 0; + Player player = game.getPlayer(sourceControllerId); + if (player != null) { + for (Card card : player.getHand().getCards(filter, game)) { + if (sourceId == null || isNotTarget() || !game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.TARGET, card.getId(), sourceId, sourceControllerId))) { + possibleTargets++; + if (possibleTargets >= this.minNumberOfTargets) { + return true; + } + } + } + } + return false; + } + @Override public TargetCardInHand copy() { return new TargetCardInHand(this);