Some rework for "Name a nonland card" effects.

This commit is contained in:
LevelX2 2016-06-19 16:05:17 +02:00
parent 3edca4234a
commit 7563b0c30f
8 changed files with 40 additions and 212 deletions

View file

@ -56,9 +56,6 @@ public class ThoughtHemorrhage extends CardImpl {
super(ownerId, 47, "Thought Hemorrhage", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{B}{R}");
this.expansionSetCode = "ARB";
// Name a nonland card. Target player reveals his or her hand. Thought Hemorrhage deals 3 damage to that player for each card with that name revealed this way. Search that player's graveyard, hand, and library for all cards with that name and exile them. Then that player shuffles his or her library.
this.getSpellAbility().addTarget(new TargetPlayer());
this.getSpellAbility().addEffect(new NameACardEffect(NameACardEffect.TypeOfName.NON_LAND_NAME));
@ -123,7 +120,7 @@ class ThoughtHemorrhageEffect extends OneShotEffect {
// search cards in hand
TargetCardInHand targetCardsHand = new TargetCardInHand(0, Integer.MAX_VALUE, filterNamedCards);
controller.chooseTarget(outcome, targetPlayer.getGraveyard(), targetCardsHand, source, game);
for(UUID cardId: targetCardsHand.getTargets()) {
for (UUID cardId : targetCardsHand.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.HAND, true);
@ -134,7 +131,7 @@ class ThoughtHemorrhageEffect extends OneShotEffect {
// If the player has no nonland cards in his or her hand, you can still search that player's library and have him or her shuffle it.
TargetCardInLibrary targetCardsLibrary = new TargetCardInLibrary(0, Integer.MAX_VALUE, filterNamedCards);
controller.searchLibrary(targetCardsLibrary, game, targetPlayer.getId());
for(UUID cardId: targetCardsLibrary.getTargets()) {
for (UUID cardId : targetCardsLibrary.getTargets()) {
Card card = game.getCard(cardId);
if (card != null) {
controller.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.LIBRARY, true);

View file

@ -52,11 +52,10 @@ public class CranialExtraction extends CardImpl {
public CranialExtraction(UUID ownerId) {
super(ownerId, 105, "Cranial Extraction", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{B}");
this.expansionSetCode = "CHK";
this.subtype.add("Arcane");
this.subtype.add("Arcane");
/* Name a nonland card. Search target player's graveyard, hand, and library for
* all cards with that name and exile them. Then that player shuffles his or her library. */
/* Name a nonland card. Search target player's graveyard, hand, and library for
* all cards with that name and exile them. Then that player shuffles his or her library. */
this.getSpellAbility().addTarget(new TargetPlayer());
this.getSpellAbility().addEffect(new CranialExtractionEffect());
}

View file

@ -31,11 +31,9 @@ import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.NameACardEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.repository.CardRepository;
import mage.choices.Choice;
import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
@ -54,6 +52,7 @@ public class BrainPry extends CardImpl {
this.expansionSetCode = "DIS";
//Name a nonland card. Target player reveals his or her hand. That player discards a card with that name. If he or she can't, you draw a card.
this.getSpellAbility().addEffect((new NameACardEffect(NameACardEffect.TypeOfName.NON_LAND_NAME)));
this.getSpellAbility().addTarget(new TargetPlayer());
this.getSpellAbility().addEffect(new BrainPryEffect());
}
@ -72,7 +71,7 @@ class BrainPryEffect extends OneShotEffect {
public BrainPryEffect() {
super(Outcome.Discard);
staticText = "Name a nonland card. Target player reveals his or her hand. That player discards a card with that name. If he or she can't, you draw a card";
staticText = "Target player reveals his or her hand. That player discards a card with that name. If he or she can't, you draw a card";
}
public BrainPryEffect(final BrainPryEffect effect) {
@ -84,21 +83,9 @@ class BrainPryEffect extends OneShotEffect {
Player targetPlayer = game.getPlayer(targetPointer.getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = game.getObject(source.getSourceId());
if (targetPlayer != null && controller != null && sourceObject != null) {
Choice cardChoice = new ChoiceImpl(true);
cardChoice.setMessage("Name a nonland card.");
cardChoice.setChoices(CardRepository.instance.getNonLandNames());
cardChoice.clearChoice();
while (!controller.choose(Outcome.Discard, cardChoice, game)) {
if (!controller.canRespond()) {
return false;
}
}
String cardName = cardChoice.getChoice();
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY);
if (targetPlayer != null && controller != null && sourceObject != null && cardName != null) {
Boolean hasDiscarded = false;
game.informPlayers(sourceObject.getLogName() + ", named card: [" + cardName + "]");
for (Card card : targetPlayer.getHand().getCards(game)) {
if (card.getName().equals(cardName)) {
targetPlayer.discard(card, source, game);
@ -106,11 +93,9 @@ class BrainPryEffect extends OneShotEffect {
break;
}
}
if (!hasDiscarded) {
controller.drawCards(1, game);
}
controller.lookAtCards(sourceObject.getName() + " Hand", targetPlayer.getHand(), game);
}
return true;

View file

@ -29,19 +29,17 @@ package mage.sets.judgment;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.NameACardEffect;
import mage.abilities.keyword.FlashbackAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.TimingRule;
import mage.abilities.Ability;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlashbackAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.repository.CardRepository;
import mage.choices.Choice;
import mage.choices.ChoiceImpl;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.game.Game;
import mage.players.Player;
@ -59,12 +57,13 @@ public class CabalTherapy extends CardImpl {
this.expansionSetCode = "JUD";
// Name a nonland card. Target player reveals his or her hand and discards all cards with that name.
this.getSpellAbility().addEffect((new NameACardEffect(NameACardEffect.TypeOfName.NON_LAND_NAME)));
this.getSpellAbility().addTarget(new TargetPlayer());
this.getSpellAbility().addEffect(new CabalTherapyEffect());
// Flashback-Sacrifice a creature.
this.addAbility(new FlashbackAbility(
new SacrificeTargetCost(new TargetControlledCreaturePermanent(1,1,new FilterControlledCreaturePermanent("a creature"), true)),
new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("a creature"), true)),
TimingRule.SORCERY));
}
@ -95,25 +94,12 @@ class CabalTherapyEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
MageObject sourceObject = game.getObject(source.getSourceId());
if (targetPlayer != null && controller != null && sourceObject != null) {
Choice cardChoice = new ChoiceImpl(true);
cardChoice.setMessage("Name a nonland card.");
cardChoice.setChoices(CardRepository.instance.getNonLandNames());
cardChoice.clearChoice();
while (!controller.choose(Outcome.Discard, cardChoice, game)) {
if (!controller.canRespond()) {
return false;
}
}
String cardName = cardChoice.getChoice();
game.informPlayers(sourceObject.getLogName() + ", named card: [" + cardName + "]");
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY);
for (Card card : targetPlayer.getHand().getCards(game)) {
if (card.getName().equals(cardName)) {
targetPlayer.discard(card, source, game);
}
}
controller.lookAtCards(sourceObject.getName() + " Hand", targetPlayer.getHand(), game);
}
return true;

View file

@ -28,20 +28,14 @@
package mage.sets.magic2015;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.common.NameACardEffect;
import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect;
import mage.abilities.keyword.ConvokeAbility;
import mage.cards.CardImpl;
import mage.cards.repository.CardRepository;
import mage.choices.Choice;
import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
/**
@ -57,6 +51,7 @@ public class StainTheMind extends CardImpl {
// Convoke
this.addAbility(new ConvokeAbility());
// Name a nonland card. Search target player's graveyard, hand, and library for any number of card's with that name and exile them. Then that player shuffles his or her library.
this.getSpellAbility().addEffect((new NameACardEffect(NameACardEffect.TypeOfName.NON_LAND_NAME)));
this.getSpellAbility().addEffect(new StainTheMindEffect());
this.getSpellAbility().addTarget(new TargetPlayer());
}
@ -83,29 +78,8 @@ class StainTheMindEffect extends SearchTargetGraveyardHandLibraryForCardNameAndE
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
if (player != null && controller != null) {
Choice cardChoice = new ChoiceImpl();
cardChoice.setChoices(CardRepository.instance.getNonLandNames());
cardChoice.clearChoice();
cardChoice.setMessage("Name a nonland card");
while (!controller.choose(Outcome.Exile, cardChoice, game)) {
if (!controller.canRespond()) {
return false;
}
}
String cardName;
cardName = cardChoice.getChoice();
MageObject sourceObject = game.getObject(source.getSourceId());
if (sourceObject != null) {
game.informPlayers(sourceObject.getName() + " named card: [" + cardName + "]");
}
super.applySearchAndExile(game, source, cardName, player.getId());
}
return true;
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY);
return super.applySearchAndExile(game, source, cardName, targetPointer.getFirst(game, source));
}
@Override
@ -113,12 +87,4 @@ class StainTheMindEffect extends SearchTargetGraveyardHandLibraryForCardNameAndE
return new StainTheMindEffect(this);
}
@Override
public String getText(Mode mode) {
StringBuilder sb = new StringBuilder();
sb.append("Name a nonland card. ");
sb.append(super.getText(mode));
return sb.toString();
}
}

View file

@ -34,13 +34,9 @@ import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.NameACardEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.repository.CardRepository;
import mage.choices.Choice;
import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
@ -49,9 +45,6 @@ import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.util.CardUtil;
/**
*
@ -87,46 +80,6 @@ public class VoidstoneGargoyle extends CardImpl {
}
}
class VoidstoneGargoyleChooseCardEffect extends OneShotEffect {
public VoidstoneGargoyleChooseCardEffect() {
super(Outcome.Detriment);
staticText = "name a nonland card";
}
public VoidstoneGargoyleChooseCardEffect(final VoidstoneGargoyleChooseCardEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanentEntering(source.getSourceId());
if (controller != null && permanent != null) {
Choice cardChoice = new ChoiceImpl();
cardChoice.setChoices(CardRepository.instance.getNonLandNames());
cardChoice.clearChoice();
while (!controller.choose(Outcome.Detriment, cardChoice, game)) {
if (!controller.canRespond()) {
return false;
}
}
String cardName = cardChoice.getChoice();
game.informPlayers(permanent.getLogName() + ", named card: [" + cardName + "]");
game.getState().setValue(source.getSourceId().toString(), cardName);
permanent.addInfo("named card", CardUtil.addToolTipMarkTags("Named card: [" + cardName + "]"), game);
return true;
}
return false;
}
@Override
public VoidstoneGargoyleChooseCardEffect copy() {
return new VoidstoneGargoyleChooseCardEffect(this);
}
}
class VoidstoneGargoyleReplacementEffect1 extends ContinuousRuleModifyingEffectImpl {
public VoidstoneGargoyleReplacementEffect1() {

View file

@ -28,23 +28,17 @@
package mage.sets.returntoravnica;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CantBeCounteredSourceEffect;
import mage.abilities.effects.common.NameACardEffect;
import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect;
import mage.cards.CardImpl;
import mage.cards.repository.CardRepository;
import mage.choices.Choice;
import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetOpponent;
/**
@ -65,9 +59,9 @@ public class SlaughterGames extends CardImpl {
this.addAbility(ability);
// Name a nonland card. Search target opponent's graveyard, hand, and library for any number of cards with that name and exile them. Then that player shuffles his or her library.
this.getSpellAbility().addEffect(new NameACardEffect(NameACardEffect.TypeOfName.NON_LAND_NAME));
this.getSpellAbility().addEffect(new SlaughterGamesEffect());
this.getSpellAbility().addTarget(new TargetOpponent());
}
public SlaughterGames(final SlaughterGames card) {
@ -92,29 +86,8 @@ class SlaughterGamesEffect extends SearchTargetGraveyardHandLibraryForCardNameAn
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(targetPointer.getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
if (player != null && controller != null) {
Choice cardChoice = new ChoiceImpl();
cardChoice.setChoices(CardRepository.instance.getNonLandNames());
cardChoice.clearChoice();
cardChoice.setMessage("Name a nonland card");
while (!controller.choose(Outcome.Exile, cardChoice, game)) {
if (!controller.canRespond()) {
return false;
}
}
String cardName;
cardName = cardChoice.getChoice();
MageObject sourceObject = game.getObject(source.getSourceId());
if (sourceObject != null) {
game.informPlayers(sourceObject.getName() + " named card: [" + cardName + "]");
}
super.applySearchAndExile(game, source, cardName, player.getId());
}
return true;
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY);
return super.applySearchAndExile(game, source, cardName, targetPointer.getFirst(game, source));
}
@Override
@ -122,12 +95,4 @@ class SlaughterGamesEffect extends SearchTargetGraveyardHandLibraryForCardNameAn
return new SlaughterGamesEffect(this);
}
@Override
public String getText(Mode mode) {
StringBuilder sb = new StringBuilder();
sb.append("Name a nonland card. ");
sb.append(super.getText(mode));
return sb.toString();
}
}

View file

@ -28,19 +28,14 @@
package mage.sets.scarsofmirrodin;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.common.NameACardEffect;
import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect;
import mage.cards.CardImpl;
import mage.cards.repository.CardRepository;
import mage.choices.Choice;
import mage.choices.ChoiceImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
/**
@ -55,6 +50,7 @@ public class Memoricide extends CardImpl {
// Name a nonland card. Search target player's graveyard, hand, and library for any number of cards with
// that name and exile them. Then that player shuffles his or her library
this.getSpellAbility().addEffect((new NameACardEffect(NameACardEffect.TypeOfName.NON_LAND_NAME)));
this.getSpellAbility().addTarget(new TargetPlayer());
this.getSpellAbility().addEffect(new MemoricideEffect());
}
@ -82,27 +78,8 @@ class MemoricideEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExi
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
if (player != null && controller != null) {
Choice cardChoice = new ChoiceImpl();
cardChoice.setChoices(CardRepository.instance.getNonLandNames());
cardChoice.clearChoice();
cardChoice.setMessage("Name a nonland card");
while (!controller.choose(Outcome.Exile, cardChoice, game)) {
if (!controller.canRespond()) {
return false;
}
}
String cardName = cardChoice.getChoice();
MageObject sourceObject = game.getObject(source.getSourceId());
if (sourceObject != null) {
game.informPlayers(sourceObject.getName() + " named card: [" + cardName + "]");
}
super.applySearchAndExile(game, source, cardName, player.getId());
}
return true;
String cardName = (String) game.getState().getValue(source.getSourceId().toString() + NameACardEffect.INFO_KEY);
return super.applySearchAndExile(game, source, cardName, targetPointer.getFirst(game, source));
}
@Override