- Fixed Shimian Specter

This commit is contained in:
jeffwadsworth 2020-02-12 10:08:56 -06:00
parent 7923564f7c
commit 8e4080ce7c

View file

@ -1,4 +1,3 @@
package mage.cards.s;
import java.util.UUID;
@ -22,6 +21,7 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.NamePredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardInHand;
import mage.target.common.TargetCardInLibrary;
@ -41,7 +41,10 @@ public final class ShimianSpecter extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever Shimian Specter deals combat damage to a player, that player reveals their hand. You choose a nonland card from it. Search that player's graveyard, hand, and library for all cards with the same name as that card and exile them. Then that player shuffles their library.
// Whenever Shimian Specter deals combat damage to a player, that player
// reveals their hand. You choose a nonland card from it. Search that player's
// graveyard, hand, and library for all cards with the same name as that card
// and exile them. Then that player shuffles their library.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ShimianSpecterEffect(), false, true));
}
@ -65,7 +68,10 @@ class ShimianSpecterEffect extends OneShotEffect {
public ShimianSpecterEffect() {
super(Outcome.Benefit);
staticText = "that player reveals their hand. You choose a nonland card from it. Search that player's graveyard, hand, and library for all cards with the same name as that card and exile them. Then that player shuffles their library";
staticText = "that player reveals their hand. You choose a nonland card from it. "
+ "Search that player's graveyard, hand, and library for all cards "
+ "with the same name as that card and exile them. Then that "
+ "player shuffles their library";
}
public ShimianSpecterEffect(final ShimianSpecterEffect effect) {
@ -77,16 +83,19 @@ class ShimianSpecterEffect extends OneShotEffect {
Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = source.getSourceObject(game);
if (targetPlayer != null && sourceObject != null && controller != null) {
if (targetPlayer != null
&& sourceObject != null
&& controller != null) {
// reveal hand of target player
targetPlayer.revealCards(sourceObject.getName(), targetPlayer.getHand(), game);
// You choose a nonland card from it
TargetCardInHand target = new TargetCardInHand(new FilterNonlandCard());
TargetCard target = new TargetCard(Zone.HAND, new FilterNonlandCard());
target.setNotTarget(true);
Card chosenCard = null;
if (controller.choose(Outcome.Benefit, targetPlayer.getHand(), target, game)) {
if (target.canChoose(controller.getId(), game)
&& controller.chooseTarget(Outcome.Benefit, targetPlayer.getHand(), target, source, game)) {
chosenCard = game.getCard(target.getFirstTarget());
}
@ -95,34 +104,42 @@ class ShimianSpecterEffect extends OneShotEffect {
FilterCard filterNamedCards = new FilterCard();
String nameToSearch = "---";// so no card matches
if (chosenCard != null) {
nameToSearch = chosenCard.isSplitCard() ? ((SplitCard) chosenCard).getLeftHalfCard().getName() : chosenCard.getName();
nameToSearch = chosenCard.isSplitCard()
? ((SplitCard) chosenCard).getLeftHalfCard().getName()
: chosenCard.getName();
}
filterNamedCards.add(new NamePredicate(nameToSearch));
// The cards you're searching for must be found and exiled if they're in the graveyard because it's a public zone.
// Finding those cards in the hand and library is optional, because those zones are hidden (even if the hand is temporarily revealed).
// The cards you're searching for must be found and exiled if they're
// in the graveyard because it's a public zone.
// Finding those cards in the hand and library is optional, because
// those zones are hidden (even if the hand is temporarily revealed).
// search cards in graveyard
if (chosenCard != null) {
for (Card checkCard : targetPlayer.getGraveyard().getCards(game)) {
if (checkCard.getName().equals(chosenCard.getName())) {
controller.moveCardToExileWithInfo(checkCard, null, "", source.getSourceId(), game, Zone.GRAVEYARD, true);
controller.moveCardToExileWithInfo(checkCard, null, "",
source.getSourceId(), game, Zone.GRAVEYARD, true);
}
}
// search cards in hand
TargetCardInHand targetHandCards = new TargetCardInHand(0, Integer.MAX_VALUE, filterNamedCards);
controller.chooseTarget(outcome, targetPlayer.getHand(), targetHandCards, source, game);
TargetCard targetHandCards = new TargetCard(0, Integer.MAX_VALUE, Zone.HAND, filterNamedCards);
controller.chooseTarget(Outcome.Benefit, targetPlayer.getHand(), targetHandCards, source, game);
for (UUID cardId : targetHandCards.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.HAND, true);
controller.moveCardToExileWithInfo(card, null, "",
source.getSourceId(), game, Zone.HAND, true);
}
}
}
// search cards in Library
// If the player has no nonland cards in their hand, you can still search that player's library and have that player shuffle it.
if (chosenCard != null || controller.chooseUse(outcome, "Search library anyway?", source, game)) {
// If the player has no nonland cards in their hand, you can still search
// that player's library and have that player shuffle it.
if (chosenCard != null
|| controller.chooseUse(outcome, "Search library anyway?", source, game)) {
TargetCardInLibrary targetCardsLibrary = new TargetCardInLibrary(0, Integer.MAX_VALUE, filterNamedCards);
controller.searchLibrary(targetCardsLibrary, source, game, targetPlayer.getId());
for (UUID cardId : targetCardsLibrary.getTargets()) {