From 9604a9c3ea6f8ad769ff3b849169e04642f972e8 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 29 Apr 2021 19:42:50 -0400 Subject: [PATCH] refactored and encapsulated card name choosing effects --- Mage.Sets/src/mage/cards/a/AchHansRun.java | 17 +- .../src/mage/cards/c/ConundrumSphinx.java | 60 +++---- .../src/mage/cards/c/CranialExtraction.java | 37 ++-- .../src/mage/cards/d/DemonicConsultation.java | 72 ++++---- .../src/mage/cards/d/DivinersLockbox.java | 15 +- Mage.Sets/src/mage/cards/d/DiviningWitch.java | 63 +++---- .../mage/cards/i/InfiniteObliteration.java | 31 +--- Mage.Sets/src/mage/cards/l/LiarsPendulum.java | 61 +++---- Mage.Sets/src/mage/cards/m/Mindblaze.java | 65 ++++--- Mage.Sets/src/mage/cards/n/NullChamber.java | 62 +++---- Mage.Sets/src/mage/cards/p/PetraSphinx.java | 41 ++--- .../mage/cards/t/TamiyoCollectorOfTales.java | 15 +- Mage.Sets/src/mage/cards/v/VexingArcanix.java | 45 +++-- Mage.Sets/src/mage/cards/w/WoodSage.java | 42 ++--- .../effects/common/ChooseACardNameEffect.java | 160 +++++++----------- .../mage/cards/repository/CardRepository.java | 38 ++--- 16 files changed, 326 insertions(+), 498 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AchHansRun.java b/Mage.Sets/src/mage/cards/a/AchHansRun.java index 1c6eb303ac..619615a29a 100644 --- a/Mage.Sets/src/mage/cards/a/AchHansRun.java +++ b/Mage.Sets/src/mage/cards/a/AchHansRun.java @@ -6,14 +6,13 @@ import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.repository.CardRepository; -import mage.choices.ChoiceImpl; import mage.constants.*; import mage.filter.FilterCard; import mage.filter.predicate.mageobject.NamePredicate; @@ -34,7 +33,7 @@ public final class AchHansRun extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{R}{R}{G}{G}"); // At the beginning of your upkeep, you may say "Ach! Hans, run! It’s the …" and the name of a creature card. If you do, search your library for a card with that name, put it onto the battlefield, then shuffle your library. That creature gains haste. Exile it at the beginning of the next end step. - this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new AchHansRunEffect(), TargetController.YOU, true)); + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AchHansRunEffect(), TargetController.YOU, true)); } private AchHansRun(final AchHansRun card) { @@ -51,7 +50,9 @@ class AchHansRunEffect extends OneShotEffect { AchHansRunEffect() { super(Outcome.PutCreatureInPlay); - this.staticText = "you may say \"Ach! Hans, run! It's the …\" and the name of a creature card. If you do, search your library for a card with that name, put it onto the battlefield, then shuffle. That creature gains haste. Exile it at the beginning of the next end step"; + this.staticText = "you may say \"Ach! Hans, run! It's the …\" and the name of a creature card. " + + "If you do, search your library for a card with that name, put it onto the battlefield, " + + "then shuffle. That creature gains haste. Exile it at the beginning of the next end step"; } private AchHansRunEffect(final AchHansRunEffect effect) { @@ -69,13 +70,7 @@ class AchHansRunEffect extends OneShotEffect { if (controller == null) { return false; } - ChoiceImpl cardChoice = new ChoiceImpl(true); - cardChoice.setChoices(CardRepository.instance.getCreatureNames()); - cardChoice.setMessage("Choose a creature card name"); - if (!controller.choose(Outcome.Detriment, cardChoice, game)) { - return false; - } - String cardName = cardChoice.getChoice(); + String cardName = ChooseACardNameEffect.TypeOfName.CREATURE_NAME.getChoice(controller, game, source, false); game.informPlayers(controller.getLogName() + ": \"Ach! Hans, run! It's the " + cardName + "!\""); FilterCard nameFilter = new FilterCard(); nameFilter.add(new NamePredicate(cardName)); diff --git a/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java b/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java index 8472a475a7..41a050d5d5 100644 --- a/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java +++ b/Mage.Sets/src/mage/cards/c/ConundrumSphinx.java @@ -5,11 +5,9 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.*; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; @@ -55,7 +53,9 @@ class ConundrumSphinxEffect extends OneShotEffect { public ConundrumSphinxEffect() { super(Outcome.DrawCard); - staticText = "each player names a card. Then each player reveals the top card of their library. If the card a player revealed is the card they named, that player puts it into their hand. If it's not, that player puts it on the bottom of their library"; + staticText = "each player chooses a card name. Then each player reveals the top card of their library. " + + "If the card a player revealed has the name they chose, that player puts it into their hand. " + + "If it doesn’t, that player puts it on the bottom of their library"; } public ConundrumSphinxEffect(final ConundrumSphinxEffect effect) { @@ -66,42 +66,32 @@ class ConundrumSphinxEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { MageObject sourceObject = source.getSourceObject(game); Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && sourceObject != null) { - Choice cardChoice = new ChoiceImpl(); - cardChoice.setChoices(CardRepository.instance.getNames()); - Players: - for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { - Player player = game.getPlayer(playerId); - if (player != null) { - if (player.getLibrary().hasCards()) { - cardChoice.clearChoice(); - cardChoice.setMessage("Name a card"); - if (!player.choose(Outcome.DrawCard, cardChoice, game) && player.canRespond()) { - continue Players; - } - String cardName = cardChoice.getChoice(); - game.informPlayers(sourceObject.getLogName() + ", player: " + player.getLogName() + ", named: [" + cardName + ']'); - Card card = player.getLibrary().getFromTop(game); - if (card != null) { - Cards cards = new CardsImpl(card); - player.revealCards(source, player.getName(), cards, game); - if (CardUtil.haveSameNames(card, cardName, game)) { - player.moveCards(cards, Zone.HAND, source, game); - } else { - player.putCardsOnBottomOfLibrary(cards, game, source, false); - } - } - } - } - } - return true; + if (controller == null || sourceObject == null) { + return false; } - return false; + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player == null || !player.getLibrary().hasCards()) { + continue; + } + String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(player, game, source, false); + Card card = player.getLibrary().getFromTop(game); + if (card == null) { + continue; + } + Cards cards = new CardsImpl(card); + player.revealCards(source, cards, game); + if (CardUtil.haveSameNames(card, cardName, game)) { + player.moveCards(cards, Zone.HAND, source, game); + } else { + player.putCardsOnBottomOfLibrary(cards, game, source, false); + } + } + return true; } @Override public ConundrumSphinxEffect copy() { return new ConundrumSphinxEffect(this); } - } diff --git a/Mage.Sets/src/mage/cards/c/CranialExtraction.java b/Mage.Sets/src/mage/cards/c/CranialExtraction.java index 283ce176dd..c858222855 100644 --- a/Mage.Sets/src/mage/cards/c/CranialExtraction.java +++ b/Mage.Sets/src/mage/cards/c/CranialExtraction.java @@ -1,26 +1,21 @@ - package mage.cards.c; -import java.util.UUID; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.SubType; import mage.game.Game; import mage.players.Player; import mage.target.TargetPlayer; import mage.util.CardUtil; +import java.util.UUID; + /** - * * @author BetaSteward_at_googlemail.com */ public final class CranialExtraction extends CardImpl { @@ -30,7 +25,7 @@ public final class CranialExtraction extends CardImpl { this.subtype.add(SubType.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 their library. */ + * all cards with that name and exile them. Then that player shuffles their library. */ this.getSpellAbility().addTarget(new TargetPlayer()); this.getSpellAbility().addEffect(new CranialExtractionEffect()); } @@ -43,7 +38,6 @@ public final class CranialExtraction extends CardImpl { public CranialExtraction copy() { return new CranialExtraction(this); } - } class CranialExtractionEffect extends SearchTargetGraveyardHandLibraryForCardNameAndExileEffect { @@ -59,23 +53,14 @@ class CranialExtractionEffect extends SearchTargetGraveyardHandLibraryForCardNam @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"); - - if (!controller.choose(Outcome.Exile, cardChoice, game)) { - 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()); + if (player == null) { + return true; } + String cardName = ChooseACardNameEffect.TypeOfName.NON_LAND_NAME.getChoice(player, game, source, false); + if (cardName == null) { + return false; + } + super.applySearchAndExile(game, source, cardName, player.getId()); return true; } diff --git a/Mage.Sets/src/mage/cards/d/DemonicConsultation.java b/Mage.Sets/src/mage/cards/d/DemonicConsultation.java index 91f619f316..0472d9e80b 100644 --- a/Mage.Sets/src/mage/cards/d/DemonicConsultation.java +++ b/Mage.Sets/src/mage/cards/d/DemonicConsultation.java @@ -1,22 +1,20 @@ - package mage.cards.d; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.cards.*; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; + +import java.util.UUID; /** - * * @author emerald000 */ public final class DemonicConsultation extends CardImpl { @@ -42,7 +40,9 @@ class DemonicConsultationEffect extends OneShotEffect { DemonicConsultationEffect() { super(Outcome.Benefit); - this.staticText = "Name a card. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal the named card. Put that card into your hand and exile all other cards revealed this way"; + this.staticText = "choose a card name. Exile the top six cards of your library, " + + "then reveal cards from the top of your library until you reveal a card with the chosen name. " + + "Put that card into your hand and exile all other cards revealed this way"; } DemonicConsultationEffect(final DemonicConsultationEffect effect) { @@ -57,39 +57,31 @@ class DemonicConsultationEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - // Name a card. - Choice choice = new ChoiceImpl(); - choice.setChoices(CardRepository.instance.getNames()); - if (!controller.choose(Outcome.Benefit, choice, game)) { - return false; - } - String name = choice.getChoice(); - game.informPlayers("Card named: " + name); - - // Exile the top six cards of your library, - controller.moveCards(controller.getLibrary().getTopCards(game, 6), Zone.EXILED, source, game); - - // then reveal cards from the top of your library until you reveal the named card. - Cards cardsToReaveal = new CardsImpl(); - Card cardToHand = null; - for (Card card : controller.getLibrary().getCards(game)) { - if (card != null) { - cardsToReaveal.add(card); - // Put that card into your hand - if (card.getName().equals(name)) { - cardToHand = card; - break; - } - } - } - controller.moveCards(cardToHand, Zone.HAND, source, game); - controller.revealCards(sourceObject.getIdName(), cardsToReaveal, game); - cardsToReaveal.remove(cardToHand); - controller.moveCards(cardsToReaveal, Zone.EXILED, source, game); - return true; + MageObject sourceObject = source.getSourceObject(game); + if (controller == null || sourceObject == null) { + return false; } - return false; + // Name a card. + String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(controller, game, source, false); + + // Exile the top six cards of your library, + controller.moveCards(controller.getLibrary().getTopCards(game, 6), Zone.EXILED, source, game); + + // then reveal cards from the top of your library until you reveal the named card. + Cards cardsToReveal = new CardsImpl(); + Card cardToHand = null; + for (Card card : controller.getLibrary().getCards(game)) { + cardsToReveal.add(card); + // Put that card into your hand + if (CardUtil.haveSameNames(card.getName(), cardName)) { + cardToHand = card; + break; + } + } + controller.moveCards(cardToHand, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName(), cardsToReveal, game); + cardsToReveal.remove(cardToHand); + controller.moveCards(cardsToReveal, Zone.EXILED, source, game); + return true; } } diff --git a/Mage.Sets/src/mage/cards/d/DivinersLockbox.java b/Mage.Sets/src/mage/cards/d/DivinersLockbox.java index 908abf91cd..3d5efe1804 100644 --- a/Mage.Sets/src/mage/cards/d/DivinersLockbox.java +++ b/Mage.Sets/src/mage/cards/d/DivinersLockbox.java @@ -6,19 +6,18 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.SacrificeSourceEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.players.Player; +import mage.util.CardUtil; import java.util.UUID; @@ -73,16 +72,10 @@ class DivinersLockboxEffect extends OneShotEffect { if (player == null) { return false; } - Choice choice = new ChoiceImpl(); - choice.setChoices(CardRepository.instance.getNames()); - choice.setMessage("Choose a card name"); - if (!player.choose(outcome, choice, game)) { - return false; - } - game.informPlayers(source.getSourceObject(game).getLogName() + ", chosen name: [" + choice.getChoice() + ']'); + String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(player, game, source, false); Card card = player.getLibrary().getFromTop(game); player.revealCards(source, new CardsImpl(card), game); - if (choice.getChoice().equals(card.getName())) { + if (CardUtil.haveSameNames(card, cardName, game)) { sacEffect.apply(game, source); player.drawCards(3, source, game); } diff --git a/Mage.Sets/src/mage/cards/d/DiviningWitch.java b/Mage.Sets/src/mage/cards/d/DiviningWitch.java index beeb862b70..af7cab017d 100644 --- a/Mage.Sets/src/mage/cards/d/DiviningWitch.java +++ b/Mage.Sets/src/mage/cards/d/DiviningWitch.java @@ -8,10 +8,8 @@ import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.cards.*; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; @@ -56,7 +54,9 @@ public final class DiviningWitch extends CardImpl { DiviningWitchEffect() { super(Outcome.Benefit); - this.staticText = "Name a card. Exile the top six cards of your library. Reveal cards from the top of your library until you reveal the named card, then put that card into your hand. Exile all other cards revealed this way"; + this.staticText = "choose a card name. Exile the top six cards of your library, " + + "then reveal cards from the top of your library until you reveal a card with the chosen name. " + + "Put that card into your hand and exile all other cards revealed this way"; } DiviningWitchEffect(final DiviningWitchEffect effect) { @@ -72,39 +72,30 @@ public final class DiviningWitch extends CardImpl { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - // Name a card. - Choice choice = new ChoiceImpl(); - choice.setChoices(CardRepository.instance.getNames()); - if (!controller.choose(Outcome.Benefit, choice, game)) { - return false; - } - String name = choice.getChoice(); - game.informPlayers("Card named: " + name); - - // Exile the top six cards of your library, - controller.moveCards(controller.getLibrary().getTopCards(game, 6), Zone.EXILED, source, game); - - // then reveal cards from the top of your library until you reveal the named card. - Cards cardsToReaveal = new CardsImpl(); - Card cardToHand = null; - for (Card card : controller.getLibrary().getCards(game)) { - if (card != null) { - cardsToReaveal.add(card); - // Put that card into your hand - if (CardUtil.haveSameNames(card, name, game)) { - cardToHand = card; - break; - } - } - } - controller.moveCards(cardToHand, Zone.HAND, source, game); - controller.revealCards(sourceObject.getIdName(), cardsToReaveal, game); - cardsToReaveal.remove(cardToHand); - controller.moveCards(cardsToReaveal, Zone.EXILED, source, game); - return true; + if (controller == null || sourceObject == null) { + return false; } - return false; + // Name a card. + String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(controller, game, source, false); + // Exile the top six cards of your library, + controller.moveCards(controller.getLibrary().getTopCards(game, 6), Zone.EXILED, source, game); + + // then reveal cards from the top of your library until you reveal the named card. + Cards cardsToReveal = new CardsImpl(); + Card cardToHand = null; + for (Card card : controller.getLibrary().getCards(game)) { + cardsToReveal.add(card); + // Put that card into your hand + if (CardUtil.haveSameNames(card, cardName, game)) { + cardToHand = card; + break; + } + } + controller.moveCards(cardToHand, Zone.HAND, source, game); + controller.revealCards(sourceObject.getIdName(), cardsToReveal, game); + cardsToReveal.remove(cardToHand); + controller.moveCards(cardsToReveal, Zone.EXILED, source, game); + return true; } } } diff --git a/Mage.Sets/src/mage/cards/i/InfiniteObliteration.java b/Mage.Sets/src/mage/cards/i/InfiniteObliteration.java index eae9bd6c43..b528df0631 100644 --- a/Mage.Sets/src/mage/cards/i/InfiniteObliteration.java +++ b/Mage.Sets/src/mage/cards/i/InfiniteObliteration.java @@ -1,24 +1,21 @@ package mage.cards.i; -import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.Mode; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.search.SearchTargetGraveyardHandLibraryForCardNameAndExileEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; -import mage.constants.Outcome; import mage.game.Game; import mage.players.Player; import mage.target.common.TargetOpponent; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class InfiniteObliteration extends CardImpl { @@ -56,24 +53,11 @@ class InfiniteObliterationEffect extends SearchTargetGraveyardHandLibraryForCard public boolean apply(Game game, Ability source) { Player player = game.getPlayer(getTargetPointer().getFirst(game, source)); Player controller = game.getPlayer(source.getControllerId()); - if (player != null && controller != null) { - Choice cardChoice = new ChoiceImpl(); - cardChoice.setChoices(CardRepository.instance.getCreatureNames()); - cardChoice.clearChoice(); - cardChoice.setMessage("Name a creature card"); - - if (!controller.choose(Outcome.Exile, cardChoice, game)) { - 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()); + if (player == null || controller == null) { + return true; } + String cardName = ChooseACardNameEffect.TypeOfName.CREATURE_NAME.getChoice(player, game, source, false); + super.applySearchAndExile(game, source, cardName, player.getId()); return true; } @@ -86,5 +70,4 @@ class InfiniteObliterationEffect extends SearchTargetGraveyardHandLibraryForCard public String getText(Mode mode) { return "Choose a creature card name. " + super.getText(mode); } - } diff --git a/Mage.Sets/src/mage/cards/l/LiarsPendulum.java b/Mage.Sets/src/mage/cards/l/LiarsPendulum.java index b1087476cc..3fa9821078 100644 --- a/Mage.Sets/src/mage/cards/l/LiarsPendulum.java +++ b/Mage.Sets/src/mage/cards/l/LiarsPendulum.java @@ -5,12 +5,10 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -66,39 +64,32 @@ class LiarsPendulumEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player opponent = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - if (controller != null && opponent != null) { - // Name a card. - Choice choice = new ChoiceImpl(); - choice.setChoices(CardRepository.instance.getNames()); - choice.setMessage("Choose a card name"); - if (!controller.choose(Outcome.Benefit, choice, game)) { - return false; - } - String cardName = choice.getChoice(); - game.informPlayers("Card named: " + cardName); - boolean opponentGuess = false; - - if (opponent.chooseUse(Outcome.Neutral, "Is the chosen card (" + cardName + ") in " + controller.getLogName() + "'s hand?", source, game)) { - opponentGuess = true; - } - boolean rightGuess = !opponentGuess; - - for (Card card : controller.getHand().getCards(game)) { - if (CardUtil.haveSameNames(card, cardName, game)) { - rightGuess = opponentGuess; - } - } - game.informPlayers(opponent.getLogName() + " guesses that " + cardName + " is " + (opponentGuess ? "" : "not") + " in " + controller.getLogName() + "'s hand"); - - if (controller.chooseUse(outcome, "Reveal your hand?", source, game)) { - controller.revealCards("hand of " + controller.getName(), controller.getHand(), game); - if (!rightGuess) { - controller.drawCards(1, source, game); - } - } - return true; + if (controller == null || opponent == null) { + return false; } - return false; + // Name a card. + String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(controller, game, source, false); + boolean opponentGuess = false; + + if (opponent.chooseUse(Outcome.Neutral, "Is the chosen card (" + cardName + ") in " + controller.getLogName() + "'s hand?", source, game)) { + opponentGuess = true; + } + boolean rightGuess = !opponentGuess; + + for (Card card : controller.getHand().getCards(game)) { + if (CardUtil.haveSameNames(card, cardName, game)) { + rightGuess = opponentGuess; + } + } + game.informPlayers(opponent.getLogName() + " guesses that " + cardName + " is " + (opponentGuess ? "" : "not") + " in " + controller.getLogName() + "'s hand"); + + if (controller.chooseUse(outcome, "Reveal your hand?", source, game)) { + controller.revealCards("hand of " + controller.getName(), controller.getHand(), game); + if (!rightGuess) { + controller.drawCards(1, source, game); + } + } + return true; } } diff --git a/Mage.Sets/src/mage/cards/m/Mindblaze.java b/Mage.Sets/src/mage/cards/m/Mindblaze.java index c332bca81a..7ae2e1f661 100644 --- a/Mage.Sets/src/mage/cards/m/Mindblaze.java +++ b/Mage.Sets/src/mage/cards/m/Mindblaze.java @@ -3,11 +3,11 @@ package mage.cards.m; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; import mage.cards.CardsImpl; -import mage.cards.repository.CardRepository; import mage.choices.Choice; import mage.choices.ChoiceImpl; import mage.constants.CardType; @@ -53,7 +53,9 @@ class MindblazeEffect extends OneShotEffect { MindblazeEffect() { super(Outcome.Damage); - staticText = "Choose a nonland card name and a number greater than 0. Target player reveals their library. If that library contains exactly the chosen number of cards with the chosen name, {this} deals 8 damage to that player. Then that player shuffles"; + staticText = "Choose a nonland card name and a number greater than 0. Target player reveals their library. " + + "If that library contains exactly the chosen number of cards with the chosen name, " + + "{this} deals 8 damage to that player. Then that player shuffles"; } MindblazeEffect(final MindblazeEffect effect) { @@ -65,45 +67,36 @@ class MindblazeEffect extends OneShotEffect { Player player = game.getPlayer(targetPointer.getFirst(game, source)); Player playerControls = game.getPlayer(source.getControllerId()); MageObject sourceObject = source.getSourceObject(game); - if (player != null && playerControls != null && sourceObject != null) { - Choice cardChoice = new ChoiceImpl(); - cardChoice.setChoices(CardRepository.instance.getNonLandNames()); - cardChoice.clearChoice(); - Choice numberChoice = new ChoiceImpl(); - numberChoice.setMessage("Choose a number greater than 0"); - Set numbers = new HashSet<>(); - for (int i = 1; i <= 4; i++) { - numbers.add(Integer.toString(i)); - } - numberChoice.setChoices(numbers); - - if (!playerControls.choose(Outcome.Neutral, cardChoice, game)) { - return false; - } - if (!playerControls.choose(Outcome.Neutral, numberChoice, game)) { - return false; - } - - game.informPlayers(sourceObject.getIdName() + " - Named card: [" + cardChoice.getChoice() + "] - Chosen number: [" + numberChoice.getChoice() + ']'); - - Cards cards = new CardsImpl(); - cards.addAll(player.getLibrary().getCards(game)); - playerControls.revealCards("Library", cards, game); - FilterCard filter = new FilterCard(); - filter.add(new NamePredicate(cardChoice.getChoice())); - int count = Integer.parseInt(numberChoice.getChoice()); - if (player.getLibrary().count(filter, game) == count) { - player.damage(8, source.getSourceId(), source, game); - } - player.shuffleLibrary(source, game); - return true; + if (player == null || playerControls == null || sourceObject == null) { + return false; } - return false; + Choice numberChoice = new ChoiceImpl(); + numberChoice.setMessage("Choose a number greater than 0"); + Set numbers = new HashSet<>(); + for (int i = 1; i <= 4; i++) { + numbers.add(Integer.toString(i)); + } + numberChoice.setChoices(numbers); + + String cardName = ChooseACardNameEffect.TypeOfName.NON_LAND_NAME.getChoice(playerControls, game, source, false); + playerControls.choose(Outcome.Neutral, numberChoice, game); + game.informPlayers(sourceObject.getIdName() + " - Chosen number: [" + numberChoice.getChoice() + ']'); + + Cards cards = new CardsImpl(); + cards.addAll(player.getLibrary().getCards(game)); + playerControls.revealCards("Library", cards, game); + FilterCard filter = new FilterCard(); + filter.add(new NamePredicate(cardName)); + int count = Integer.parseInt(numberChoice.getChoice()); + if (player.getLibrary().count(filter, game) == count) { + player.damage(8, source.getSourceId(), source, game); + } + player.shuffleLibrary(source, game); + return true; } @Override public MindblazeEffect copy() { return new MindblazeEffect(this); } - } diff --git a/Mage.Sets/src/mage/cards/n/NullChamber.java b/Mage.Sets/src/mage/cards/n/NullChamber.java index 58b25db9c1..41202c8d10 100644 --- a/Mage.Sets/src/mage/cards/n/NullChamber.java +++ b/Mage.Sets/src/mage/cards/n/NullChamber.java @@ -6,15 +6,12 @@ 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.ChooseACardNameEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.*; 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.target.common.TargetOpponent; @@ -56,7 +53,7 @@ class NullChamberChooseEffect extends OneShotEffect { public NullChamberChooseEffect() { super(Outcome.AIDontUseIt); - staticText = "you and an opponent each name a card other than a basic land card"; + staticText = "you and an opponent each choose a card name other than a basic land card name"; } public NullChamberChooseEffect(final NullChamberChooseEffect effect) { @@ -69,41 +66,32 @@ class NullChamberChooseEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); MageObject sourceObject = game.getPermanentEntering(source.getSourceId()); if (sourceObject == null) { - sourceObject = game.getObject(source.getSourceId()); + sourceObject = source.getSourceObject(game); } - if (controller != null - && sourceObject != null - && controller.choose(Outcome.Neutral, chosenOpponent, source.getSourceId(), game)) { - Player opponent = game.getPlayer(chosenOpponent.getFirstTarget()); - Choice cardChoice = new ChoiceImpl(); - cardChoice.setChoices(CardRepository.instance.getNotBasicLandNames()); - cardChoice.setMessage("Choose a card name other than a basic land card name"); - cardChoice.clearChoice(); - if (controller.choose(Outcome.Detriment, cardChoice, game)) { - String cardName = cardChoice.getChoice(); - if (!game.isSimulation()) { - game.informPlayers(sourceObject.getLogName() + ", controller named card: [" + cardName + ']'); - } - game.getState().setValue(source.getSourceId().toString() + INFO_KEY_CONTROLLER, cardName); - if (sourceObject instanceof Permanent) { - ((Permanent) sourceObject).addInfo(INFO_KEY_CONTROLLER, CardUtil.addToolTipMarkTags("Named card (Controller): " + cardName), game); - } - } - cardChoice.clearChoice(); - if (opponent != null - && opponent.choose(Outcome.Detriment, cardChoice, game)) { - String cardName = cardChoice.getChoice(); - if (!game.isSimulation()) { - game.informPlayers(sourceObject.getLogName() + ",chosen opponent named card: [" + cardName + ']'); - } - game.getState().setValue(source.getSourceId().toString() + INFO_KEY_OPPONENT, cardName); - if (sourceObject instanceof Permanent) { - ((Permanent) sourceObject).addInfo(INFO_KEY_OPPONENT, CardUtil.addToolTipMarkTags("Named card (Opponent): " + cardName), game); - } - return true; + if (controller == null || sourceObject == null) { + return false; + } + controller.choose(Outcome.Neutral, chosenOpponent, source.getSourceId(), game); + Player opponent = game.getPlayer(chosenOpponent.getFirstTarget()); + String cardName = ChooseACardNameEffect.TypeOfName.NOT_BASIC_LAND_NAME.getChoice(controller, game, source, false); + if (cardName != null) { + game.getState().setValue(source.getSourceId().toString() + INFO_KEY_CONTROLLER, cardName); + if (sourceObject instanceof Permanent) { + ((Permanent) sourceObject).addInfo(INFO_KEY_CONTROLLER, CardUtil.addToolTipMarkTags("Named card (Controller): " + cardName), game); } } - return false; + if (opponent == null) { + return true; + } + cardName = ChooseACardNameEffect.TypeOfName.NOT_BASIC_LAND_NAME.getChoice(opponent, game, source, false); + if (cardName == null) { + return true; + } + game.getState().setValue(source.getSourceId().toString() + INFO_KEY_OPPONENT, cardName); + if (sourceObject instanceof Permanent) { + ((Permanent) sourceObject).addInfo(INFO_KEY_OPPONENT, CardUtil.addToolTipMarkTags("Named card (Opponent): " + cardName), game); + } + return true; } @Override diff --git a/Mage.Sets/src/mage/cards/p/PetraSphinx.java b/Mage.Sets/src/mage/cards/p/PetraSphinx.java index 9e04ad8b03..938b8570cc 100644 --- a/Mage.Sets/src/mage/cards/p/PetraSphinx.java +++ b/Mage.Sets/src/mage/cards/p/PetraSphinx.java @@ -5,10 +5,8 @@ import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.cards.*; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; @@ -64,35 +62,26 @@ class PetraSphinxEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Player player = game.getPlayer(targetPointer.getFirst(game, source)); - if (controller != null && player != null) { - if (player.getLibrary().hasCards()) { - Choice cardChoice = new ChoiceImpl(); - cardChoice.setChoices(CardRepository.instance.getNames()); - cardChoice.setMessage("Name a card"); - if (!player.choose(Outcome.DrawCard, cardChoice, game)) { - return false; - } - String cardName = cardChoice.getChoice(); - game.informPlayers(CardUtil.createObjectRealtedWindowTitle(source, game, null) + ", player: " + player.getLogName() + ", named: [" + cardName + ']'); - Card card = player.getLibrary().getFromTop(game); - if (card != null) { - Cards cards = new CardsImpl(card); - player.revealCards(source, cards, game); - if (CardUtil.haveSameNames(card, cardName, game)) { - player.moveCards(cards, Zone.HAND, source, game); - } else { - player.moveCards(cards, Zone.GRAVEYARD, source, game); - } - } - } + if (controller == null || player == null || !player.getLibrary().hasCards()) { return true; } - return false; + String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(player, game, source, false); + Card card = player.getLibrary().getFromTop(game); + if (card == null) { + return true; + } + Cards cards = new CardsImpl(card); + player.revealCards(source, cards, game); + if (CardUtil.haveSameNames(card, cardName, game)) { + player.moveCards(cards, Zone.HAND, source, game); + } else { + player.moveCards(cards, Zone.GRAVEYARD, source, game); + } + return true; } @Override public PetraSphinxEffect copy() { return new PetraSphinxEffect(this); } - } diff --git a/Mage.Sets/src/mage/cards/t/TamiyoCollectorOfTales.java b/Mage.Sets/src/mage/cards/t/TamiyoCollectorOfTales.java index 40a6d01f92..11e4b8bff8 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoCollectorOfTales.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoCollectorOfTales.java @@ -6,11 +6,9 @@ import mage.abilities.common.PlaneswalkerEntersWithLoyaltyCountersAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.cards.*; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; @@ -121,18 +119,12 @@ class TamiyoCollectorOfTalesEffect extends OneShotEffect { if (player == null) { return false; } - Choice choice = new ChoiceImpl(); - choice.setChoices(CardRepository.instance.getNonLandNames()); - choice.setMessage("Choose a nonland card name"); - if (!player.choose(outcome, choice, game)) { - return false; - } - game.informPlayers(source.getSourceObject(game).getLogName() + ", chosen name: [" + choice.getChoice() + ']'); + String cardName = ChooseACardNameEffect.TypeOfName.NON_LAND_NAME.getChoice(player, game, source, false); Cards cards = new CardsImpl(player.getLibrary().getTopCards(game, 4)); Cards cards2 = new CardsImpl(); player.revealCards(source, cards, game); for (Card card : cards.getCards(game)) { - if (CardUtil.haveSameNames(card, choice.getChoice(), game)) { + if (CardUtil.haveSameNames(card, cardName, game)) { cards2.add(card); } } @@ -141,5 +133,4 @@ class TamiyoCollectorOfTalesEffect extends OneShotEffect { player.moveCards(cards2, Zone.HAND, source, game); return true; } - } diff --git a/Mage.Sets/src/mage/cards/v/VexingArcanix.java b/Mage.Sets/src/mage/cards/v/VexingArcanix.java index 4cfc2a9436..3d656f09f8 100644 --- a/Mage.Sets/src/mage/cards/v/VexingArcanix.java +++ b/Mage.Sets/src/mage/cards/v/VexingArcanix.java @@ -6,10 +6,8 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.cards.*; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; @@ -50,7 +48,9 @@ class VexingArcanixEffect extends OneShotEffect { public VexingArcanixEffect() { super(Outcome.DrawCard); - staticText = "Target player chooses a card name, then reveals the top card of their library. If that card has the chosen name, the player puts it into their hand. Otherwise, the player puts it into their graveyard and {this} deals 2 damage to them"; + staticText = "Target player chooses a card name, then reveals the top card of their library. " + + "If that card has the chosen name, the player puts it into their hand. Otherwise, " + + "the player puts it into their graveyard and {this} deals 2 damage to them"; } public VexingArcanixEffect(final VexingArcanixEffect effect) { @@ -61,34 +61,27 @@ class VexingArcanixEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { MageObject sourceObject = source.getSourceObject(game); Player player = game.getPlayer(targetPointer.getFirst(game, source)); - if (sourceObject != null && player != null) { - Choice cardChoice = new ChoiceImpl(); - cardChoice.setChoices(CardRepository.instance.getNames()); - cardChoice.setMessage("Name a card"); - if (!player.choose(Outcome.DrawCard, cardChoice, game)) { - return false; - } - String cardName = cardChoice.getChoice(); - game.informPlayers(sourceObject.getLogName() + ", player: " + player.getLogName() + ", named: [" + cardName + ']'); - Card card = player.getLibrary().getFromTop(game); - if (card != null) { - Cards cards = new CardsImpl(card); - player.revealCards(sourceObject.getIdName(), cards, game); - if (CardUtil.haveSameNames(card, cardName, game)) { - player.moveCards(cards, Zone.HAND, source, game); - } else { - player.moveCards(cards, Zone.GRAVEYARD, source, game); - player.damage(2, source.getSourceId(), source, game); - } - } + if (sourceObject == null || player == null) { + return false; + } + String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(player, game, source, false); + Card card = player.getLibrary().getFromTop(game); + if (card == null) { return true; } - return false; + Cards cards = new CardsImpl(card); + player.revealCards(sourceObject.getIdName(), cards, game); + if (CardUtil.haveSameNames(card, cardName, game)) { + player.moveCards(cards, Zone.HAND, source, game); + } else { + player.moveCards(cards, Zone.GRAVEYARD, source, game); + player.damage(2, source.getSourceId(), source, game); + } + return true; } @Override public VexingArcanixEffect copy() { return new VexingArcanixEffect(this); } - } diff --git a/Mage.Sets/src/mage/cards/w/WoodSage.java b/Mage.Sets/src/mage/cards/w/WoodSage.java index 9ef3eb49da..144febc0b2 100644 --- a/Mage.Sets/src/mage/cards/w/WoodSage.java +++ b/Mage.Sets/src/mage/cards/w/WoodSage.java @@ -1,19 +1,15 @@ - package mage.cards.w; -import java.util.UUID; import mage.MageInt; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.cards.repository.CardRepository; -import mage.choices.Choice; -import mage.choices.ChoiceImpl; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; @@ -23,8 +19,9 @@ import mage.filter.predicate.mageobject.NamePredicate; import mage.game.Game; import mage.players.Player; +import java.util.UUID; + /** - * * @author LevelX2 */ public final class WoodSage extends CardImpl { @@ -37,8 +34,7 @@ public final class WoodSage extends CardImpl { this.toughness = new MageInt(1); // {tap}: Name a creature card. Reveal the top four cards of your library and put all of them with that name into your hand. Put the rest into your graveyard. - this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new WoodSageEffect(), new TapSourceCost())); - + this.addAbility(new SimpleActivatedAbility(new WoodSageEffect(), new TapSourceCost())); } private WoodSage(final WoodSage card) { @@ -55,7 +51,8 @@ class WoodSageEffect extends OneShotEffect { public WoodSageEffect() { super(Outcome.DrawCard); - this.staticText = "Name a creature card. Reveal the top four cards of your library and put all of them with that name into your hand. Put the rest into your graveyard"; + this.staticText = "choose a creature card name. Reveal the top four cards of your library " + + "and put all of them with that name into your hand. Put the rest into your graveyard"; } public WoodSageEffect(final WoodSageEffect effect) { @@ -70,26 +67,15 @@ class WoodSageEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getObject(source.getSourceId()); - if (controller != null && sourceObject != null) { - Choice cardChoice = new ChoiceImpl(); - cardChoice.setChoices(CardRepository.instance.getCreatureNames()); - cardChoice.setMessage("Name a creature card"); - if (!controller.choose(Outcome.Detriment, cardChoice, game)) { - return false; - } - String cardName = cardChoice.getChoice(); - if (!game.isSimulation()) { - game.informPlayers(sourceObject.getLogName() + ", named card: [" + cardName + ']'); - } - - FilterCreatureCard filter = new FilterCreatureCard("all of them with that name"); - filter.add(new NamePredicate(cardName)); - new RevealLibraryPutIntoHandEffect(4, filter, Zone.GRAVEYARD).apply(game, source); - - return true; + MageObject sourceObject = source.getSourceObject(game); + if (controller == null || sourceObject == null) { + return false; } + String cardName = ChooseACardNameEffect.TypeOfName.CREATURE_NAME.getChoice(controller, game, source, false); + FilterCreatureCard filter = new FilterCreatureCard("all of them with that name"); + filter.add(new NamePredicate(cardName)); + new RevealLibraryPutIntoHandEffect(4, filter, Zone.GRAVEYARD).apply(game, source); + return true; - return false; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ChooseACardNameEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ChooseACardNameEffect.java index 1389baca3c..741e7eb3c1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ChooseACardNameEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ChooseACardNameEffect.java @@ -12,6 +12,9 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.util.CardUtil; +import java.util.Set; +import java.util.function.Supplier; + /** * @author LevelX2 */ @@ -20,14 +23,65 @@ public class ChooseACardNameEffect extends OneShotEffect { public static final String INFO_KEY = "NAMED_CARD"; public enum TypeOfName { - ALL, - NOT_BASIC_LAND_NAME, - NONBASIC_LAND_NAME, - NON_ARTIFACT_AND_NON_LAND_NAME, - NON_LAND_NAME, - NON_LAND_AND_NON_CREATURE_NAME, - CREATURE_NAME, - ARTIFACT_NAME + ALL("card name", CardRepository.instance::getNames), + NOT_BASIC_LAND_NAME("card name other than a basic land card", CardRepository.instance::getNotBasicLandNames), + NONBASIC_LAND_NAME("nonbasic land card name", CardRepository.instance::getNonbasicLandNames), + NON_ARTIFACT_AND_NON_LAND_NAME("nonartifact, nonland card name", CardRepository.instance::getNonArtifactAndNonLandNames), + NON_LAND_AND_NON_CREATURE_NAME("nonland and non creature name", CardRepository.instance::getNonLandAndNonCreatureNames), + NON_LAND_NAME("nonland card name", CardRepository.instance::getNonLandNames), + CREATURE_NAME("creature card name", CardRepository.instance::getCreatureNames), + ARTIFACT_NAME("artifact card name", CardRepository.instance::getArtifactNames); + + private final String description; + private final Supplier> nameSupplier; + + TypeOfName(String description, Supplier> nameSupplier) { + this.description = description; + this.nameSupplier = nameSupplier; + } + + private final String getMessage() { + return "choose " + CardUtil.addArticle(description); + } + + private final Set getNames() { + return nameSupplier.get(); + } + + public String getChoice(Game game, Ability source) { + return getChoice(game.getPlayer(source.getControllerId()), game, source, true); + } + + public String getChoice(Player player, Game game, Ability source, boolean setValue) { + if (player == null) { + return null; + } + Choice cardChoice = new ChoiceImpl(true); + cardChoice.setChoices(this.getNames()); + cardChoice.setMessage(CardUtil.getTextWithFirstCharUpperCase(this.getMessage())); + cardChoice.clearChoice(); + player.choose(Outcome.Detriment, cardChoice, game); + String cardName = cardChoice.getChoice(); + if (cardName == null) { + return null; + } + MageObject sourceObject = game.getPermanentEntering(source.getSourceId()); + if (sourceObject == null) { + sourceObject = source.getSourceObject(game); + } + if (sourceObject == null) { + return cardName; + } + game.informPlayers(sourceObject.getLogName() + ": " + player.getName() + ", chosen name: [" + cardName + ']'); + if (!setValue) { + return cardName; + } + game.getState().setValue(source.getSourceId().toString() + INFO_KEY, cardName); + if (sourceObject instanceof Permanent) { + ((Permanent) sourceObject).addInfo(INFO_KEY, CardUtil.addToolTipMarkTags("Chosen name: " + cardName), game); + } + return cardName; + } } private final TypeOfName typeOfName; @@ -35,7 +89,7 @@ public class ChooseACardNameEffect extends OneShotEffect { public ChooseACardNameEffect(TypeOfName typeOfName) { super(Outcome.Detriment); this.typeOfName = typeOfName; - staticText = setText(); + staticText = "choose " + CardUtil.addArticle(typeOfName.description); } public ChooseACardNameEffect(final ChooseACardNameEffect effect) { @@ -45,97 +99,11 @@ public class ChooseACardNameEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - MageObject sourceObject = game.getPermanentEntering(source.getSourceId()); - if (sourceObject == null) { - sourceObject = game.getObject(source.getSourceId()); - } - if (controller != null && sourceObject != null) { - Choice cardChoice = new ChoiceImpl(true); - switch (typeOfName) { - case ALL: - cardChoice.setChoices(CardRepository.instance.getNames()); - cardChoice.setMessage("Choose a card name"); - break; - case NOT_BASIC_LAND_NAME: - cardChoice.setChoices(CardRepository.instance.getNotBasicLandNames()); - cardChoice.setMessage("Choose a card name other than a basic land card name"); - break; - case NONBASIC_LAND_NAME: - cardChoice.setChoices(CardRepository.instance.getNonbasicLandNames()); - cardChoice.setMessage("Choose a nonbasic land card name"); - break; - case NON_ARTIFACT_AND_NON_LAND_NAME: - cardChoice.setChoices(CardRepository.instance.getNonArtifactAndNonLandNames()); - cardChoice.setMessage("Choose a nonartifact, nonland card name"); - break; - case NON_LAND_AND_NON_CREATURE_NAME: - cardChoice.setChoices(CardRepository.instance.getNonLandAndNonCreatureNames()); - cardChoice.setMessage("Choose a nonland and non creature card"); - break; - case NON_LAND_NAME: - cardChoice.setChoices(CardRepository.instance.getNonLandNames()); - cardChoice.setMessage("Choose a nonland card name"); - break; - case CREATURE_NAME: - cardChoice.setChoices(CardRepository.instance.getCreatureNames()); - cardChoice.setMessage("Choose a creature card name"); - break; - case ARTIFACT_NAME: - cardChoice.setChoices(CardRepository.instance.getArtifactNames()); - cardChoice.setMessage("Choose an artifact card name"); - break; - } - cardChoice.clearChoice(); - if (controller.choose(Outcome.Detriment, cardChoice, game)) { - String cardName = cardChoice.getChoice(); - if (!game.isSimulation()) { - game.informPlayers(sourceObject.getLogName() + ", chosen name: [" + cardName + ']'); - } - game.getState().setValue(source.getSourceId().toString() + INFO_KEY, cardName); - if (sourceObject instanceof Permanent) { - ((Permanent) sourceObject).addInfo(INFO_KEY, CardUtil.addToolTipMarkTags("Chosen name: " + cardName), game); - } - return true; - } - } - return false; + return typeOfName.getChoice(game, source) != null; } @Override public ChooseACardNameEffect copy() { return new ChooseACardNameEffect(this); } - - private String setText() { - StringBuilder sb = new StringBuilder("choose a "); - switch (typeOfName) { - case ALL: - sb.append("card"); - break; - case NOT_BASIC_LAND_NAME: - sb.append("card name other than a basic land card"); - break; - case NONBASIC_LAND_NAME: - sb.append("nonbasic land card name"); - break; - case NON_ARTIFACT_AND_NON_LAND_NAME: - sb.append("nonartifact, nonland card"); - break; - case NON_LAND_AND_NON_CREATURE_NAME: - sb.append("noncreature, nonland card"); - break; - case NON_LAND_NAME: - sb.append("nonland card"); - break; - case CREATURE_NAME: - sb.append("creature card"); - break; - case ARTIFACT_NAME: - sb.append("artifact card"); - break; - } - sb.append(" name"); - return sb.toString(); - } } diff --git a/Mage/src/main/java/mage/cards/repository/CardRepository.java b/Mage/src/main/java/mage/cards/repository/CardRepository.java index e96c6174c9..1edd6bb9c1 100644 --- a/Mage/src/main/java/mage/cards/repository/CardRepository.java +++ b/Mage/src/main/java/mage/cards/repository/CardRepository.java @@ -141,21 +141,6 @@ public enum CardRepository { return false; } - public Set getNames() { - Set names = new TreeSet<>(); - try { - QueryBuilder qb = cardDao.queryBuilder(); - qb.distinct().selectColumns("name", "modalDoubleFacesSecondSideName", "secondSideName", "flipCardName"); - List results = cardDao.query(qb.prepare()); - for (CardInfo card : results) { - addNewNames(card, names); - } - } catch (SQLException ex) { - Logger.getLogger(CardRepository.class).error("Error getting names from DB : " + ex); - } - return names; - } - private void addNewNames(CardInfo card, Set namesList) { // require before call: qb.distinct().selectColumns("name", "modalDoubleFacesSecondSideName"...); @@ -180,6 +165,25 @@ public enum CardRepository { } } + public static Boolean haveSnowLands(String setCode) { + return snowLandSetCodes.contains(setCode); + } + + public Set getNames() { + Set names = new TreeSet<>(); + try { + QueryBuilder qb = cardDao.queryBuilder(); + qb.distinct().selectColumns("name", "modalDoubleFacesSecondSideName", "secondSideName", "flipCardName"); + List results = cardDao.query(qb.prepare()); + for (CardInfo card : results) { + addNewNames(card, names); + } + } catch (SQLException ex) { + Logger.getLogger(CardRepository.class).error("Error getting names from DB : " + ex); + } + return names; + } + public Set getNonLandNames() { Set names = new TreeSet<>(); try { @@ -197,10 +201,6 @@ public enum CardRepository { return names; } - public static Boolean haveSnowLands(String setCode) { - return snowLandSetCodes.contains(setCode); - } - public Set getNonbasicLandNames() { Set names = new TreeSet<>(); try {