mirror of
https://github.com/correl/mage.git
synced 2024-11-28 19:19:55 +00:00
refactored and encapsulated card name choosing effects
This commit is contained in:
parent
0297a00156
commit
9604a9c3ea
16 changed files with 326 additions and 498 deletions
|
@ -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));
|
||||
|
|
|
@ -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:
|
||||
if (controller == null || sourceObject == null) {
|
||||
return false;
|
||||
}
|
||||
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;
|
||||
if (player == null || !player.getLibrary().hasCards()) {
|
||||
continue;
|
||||
}
|
||||
String cardName = cardChoice.getChoice();
|
||||
game.informPlayers(sourceObject.getLogName() + ", player: " + player.getLogName() + ", named: [" + cardName + ']');
|
||||
String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(player, game, source, false);
|
||||
Card card = player.getLibrary().getFromTop(game);
|
||||
if (card != null) {
|
||||
if (card == null) {
|
||||
continue;
|
||||
}
|
||||
Cards cards = new CardsImpl(card);
|
||||
player.revealCards(source, player.getName(), cards, game);
|
||||
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;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConundrumSphinxEffect copy() {
|
||||
return new ConundrumSphinxEffect(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
@ -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)) {
|
||||
if (player == null) {
|
||||
return true;
|
||||
}
|
||||
String cardName = ChooseACardNameEffect.TypeOfName.NON_LAND_NAME.getChoice(player, game, source, false);
|
||||
if (cardName == null) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)) {
|
||||
MageObject sourceObject = source.getSourceObject(game);
|
||||
if (controller == null || sourceObject == null) {
|
||||
return false;
|
||||
}
|
||||
String name = choice.getChoice();
|
||||
game.informPlayers("Card named: " + name);
|
||||
// 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 cardsToReaveal = new CardsImpl();
|
||||
Cards cardsToReveal = new CardsImpl();
|
||||
Card cardToHand = null;
|
||||
for (Card card : controller.getLibrary().getCards(game)) {
|
||||
if (card != null) {
|
||||
cardsToReaveal.add(card);
|
||||
cardsToReveal.add(card);
|
||||
// Put that card into your hand
|
||||
if (card.getName().equals(name)) {
|
||||
if (CardUtil.haveSameNames(card.getName(), cardName)) {
|
||||
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);
|
||||
controller.revealCards(sourceObject.getIdName(), cardsToReveal, game);
|
||||
cardsToReveal.remove(cardToHand);
|
||||
controller.moveCards(cardsToReveal, Zone.EXILED, source, game);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
if (controller == null || sourceObject == null) {
|
||||
return false;
|
||||
}
|
||||
String name = choice.getChoice();
|
||||
game.informPlayers("Card named: " + name);
|
||||
|
||||
// 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 cardsToReaveal = new CardsImpl();
|
||||
Cards cardsToReveal = new CardsImpl();
|
||||
Card cardToHand = null;
|
||||
for (Card card : controller.getLibrary().getCards(game)) {
|
||||
if (card != null) {
|
||||
cardsToReaveal.add(card);
|
||||
cardsToReveal.add(card);
|
||||
// Put that card into your hand
|
||||
if (CardUtil.haveSameNames(card, name, game)) {
|
||||
if (CardUtil.haveSameNames(card, cardName, 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);
|
||||
controller.revealCards(sourceObject.getIdName(), cardsToReveal, game);
|
||||
cardsToReveal.remove(cardToHand);
|
||||
controller.moveCards(cardsToReveal, Zone.EXILED, source, game);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
if (player == null || controller == null) {
|
||||
return true;
|
||||
}
|
||||
String cardName;
|
||||
cardName = cardChoice.getChoice();
|
||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||
if (sourceObject != null) {
|
||||
game.informPlayers(sourceObject.getName() + " named card: [" + cardName + ']');
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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,16 +64,11 @@ 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)) {
|
||||
if (controller == null || opponent == null) {
|
||||
return false;
|
||||
}
|
||||
String cardName = choice.getChoice();
|
||||
game.informPlayers("Card named: " + cardName);
|
||||
// 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)) {
|
||||
|
@ -98,7 +91,5 @@ class LiarsPendulumEffect extends OneShotEffect {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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,10 +67,9 @@ 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();
|
||||
if (player == null || playerControls == null || sourceObject == null) {
|
||||
return false;
|
||||
}
|
||||
Choice numberChoice = new ChoiceImpl();
|
||||
numberChoice.setMessage("Choose a number greater than 0");
|
||||
Set<String> numbers = new HashSet<>();
|
||||
|
@ -77,20 +78,15 @@ class MindblazeEffect extends OneShotEffect {
|
|||
}
|
||||
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() + ']');
|
||||
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(cardChoice.getChoice()));
|
||||
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);
|
||||
|
@ -98,12 +94,9 @@ class MindblazeEffect extends OneShotEffect {
|
|||
player.shuffleLibrary(source, game);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MindblazeEffect copy() {
|
||||
return new MindblazeEffect(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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,32 +66,26 @@ 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)) {
|
||||
if (controller == null || sourceObject == null) {
|
||||
return false;
|
||||
}
|
||||
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 + ']');
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
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 + ']');
|
||||
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) {
|
||||
|
@ -102,9 +93,6 @@ class NullChamberChooseEffect extends OneShotEffect {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NullChamberChooseEffect copy() {
|
||||
|
|
|
@ -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,18 +62,14 @@ 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;
|
||||
if (controller == null || player == null || !player.getLibrary().hasCards()) {
|
||||
return true;
|
||||
}
|
||||
String cardName = cardChoice.getChoice();
|
||||
game.informPlayers(CardUtil.createObjectRealtedWindowTitle(source, game, null) + ", player: " + player.getLogName() + ", named: [" + cardName + ']');
|
||||
String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(player, game, source, false);
|
||||
Card card = player.getLibrary().getFromTop(game);
|
||||
if (card != null) {
|
||||
if (card == null) {
|
||||
return true;
|
||||
}
|
||||
Cards cards = new CardsImpl(card);
|
||||
player.revealCards(source, cards, game);
|
||||
if (CardUtil.haveSameNames(card, cardName, game)) {
|
||||
|
@ -83,16 +77,11 @@ class PetraSphinxEffect extends OneShotEffect {
|
|||
} else {
|
||||
player.moveCards(cards, Zone.GRAVEYARD, source, game);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PetraSphinxEffect copy() {
|
||||
return new PetraSphinxEffect(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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,17 +61,14 @@ 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)) {
|
||||
if (sourceObject == null || player == null) {
|
||||
return false;
|
||||
}
|
||||
String cardName = cardChoice.getChoice();
|
||||
game.informPlayers(sourceObject.getLogName() + ", player: " + player.getLogName() + ", named: [" + cardName + ']');
|
||||
String cardName = ChooseACardNameEffect.TypeOfName.ALL.getChoice(player, game, source, false);
|
||||
Card card = player.getLibrary().getFromTop(game);
|
||||
if (card != null) {
|
||||
if (card == null) {
|
||||
return true;
|
||||
}
|
||||
Cards cards = new CardsImpl(card);
|
||||
player.revealCards(sourceObject.getIdName(), cards, game);
|
||||
if (CardUtil.haveSameNames(card, cardName, game)) {
|
||||
|
@ -80,15 +77,11 @@ class VexingArcanixEffect extends OneShotEffect {
|
|||
player.moveCards(cards, Zone.GRAVEYARD, source, game);
|
||||
player.damage(2, source.getSourceId(), source, game);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VexingArcanixEffect copy() {
|
||||
return new VexingArcanixEffect(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
MageObject sourceObject = source.getSourceObject(game);
|
||||
if (controller == null || sourceObject == null) {
|
||||
return false;
|
||||
}
|
||||
String cardName = cardChoice.getChoice();
|
||||
if (!game.isSimulation()) {
|
||||
game.informPlayers(sourceObject.getLogName() + ", named card: [" + cardName + ']');
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Set<String>> nameSupplier;
|
||||
|
||||
TypeOfName(String description, Supplier<Set<String>> nameSupplier) {
|
||||
this.description = description;
|
||||
this.nameSupplier = nameSupplier;
|
||||
}
|
||||
|
||||
private final String getMessage() {
|
||||
return "choose " + CardUtil.addArticle(description);
|
||||
}
|
||||
|
||||
private final Set<String> 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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -141,21 +141,6 @@ public enum CardRepository {
|
|||
return false;
|
||||
}
|
||||
|
||||
public Set<String> getNames() {
|
||||
Set<String> names = new TreeSet<>();
|
||||
try {
|
||||
QueryBuilder<CardInfo, Object> qb = cardDao.queryBuilder();
|
||||
qb.distinct().selectColumns("name", "modalDoubleFacesSecondSideName", "secondSideName", "flipCardName");
|
||||
List<CardInfo> 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<String> 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<String> getNames() {
|
||||
Set<String> names = new TreeSet<>();
|
||||
try {
|
||||
QueryBuilder<CardInfo, Object> qb = cardDao.queryBuilder();
|
||||
qb.distinct().selectColumns("name", "modalDoubleFacesSecondSideName", "secondSideName", "flipCardName");
|
||||
List<CardInfo> 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<String> getNonLandNames() {
|
||||
Set<String> 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<String> getNonbasicLandNames() {
|
||||
Set<String> names = new TreeSet<>();
|
||||
try {
|
||||
|
|
Loading…
Reference in a new issue