* Reworked some card movement to player methods (#4866).

This commit is contained in:
LevelX2 2020-07-15 00:42:08 +02:00
parent aad36dda19
commit 083c4bc5d4
27 changed files with 247 additions and 373 deletions

View file

@ -1,6 +1,6 @@
package mage.cards.d;
import java.util.UUID;
import mage.abilities.effects.common.ShuffleIntoLibraryTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
@ -8,8 +8,6 @@ import mage.constants.CardType;
import mage.filter.StaticFilters;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
*
* @author LevelX2
@ -17,7 +15,7 @@ import java.util.UUID;
public final class Deglamer extends CardImpl {
public Deglamer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{G}");
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}");
// Choose target artifact or enchantment. Its owner shuffles it into their library.
this.getSpellAbility().addEffect(new ShuffleIntoLibraryTargetEffect());
@ -32,4 +30,4 @@ public final class Deglamer extends CardImpl {
public Deglamer copy() {
return new Deglamer(this);
}
}
}

View file

@ -1,15 +1,12 @@
package mage.cards.m;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
@ -20,7 +17,7 @@ import mage.players.Player;
public final class MnemonicNexus extends CardImpl {
public MnemonicNexus(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{U}");
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{U}");
// Each player shuffles their graveyard into their library.
this.getSpellAbility().addEffect(new MnemonicNexusEffect());
@ -50,16 +47,13 @@ class MnemonicNexusEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player sourcePlayer = game.getPlayer(source.getControllerId());
if(sourcePlayer == null){
if (sourcePlayer == null) {
return false;
}
for (UUID playerId: game.getState().getPlayersInRange(sourcePlayer.getId(), game)) {
for (UUID playerId : game.getState().getPlayersInRange(sourcePlayer.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
for (Card card: player.getGraveyard().getCards(game)) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
player.shuffleLibrary(source, game);
player.shuffleCardsToLibrary(player.getGraveyard(), game, source);
}
}
return true;
@ -70,4 +64,4 @@ class MnemonicNexusEffect extends OneShotEffect {
return new MnemonicNexusEffect(this);
}
}
}

View file

@ -1,7 +1,7 @@
package mage.cards.p;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
@ -61,9 +61,10 @@ class PerishTheThoughtEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player targetOpponent = game.getPlayer(source.getFirstTarget());
if (targetOpponent != null) {
MageObject sourceObject = source.getSourceObject(game);
if (targetOpponent != null && sourceObject != null) {
if (!targetOpponent.getHand().isEmpty()) {
targetOpponent.revealCards("Perish the Thought", targetOpponent.getHand(), game);
targetOpponent.revealCards(sourceObject.getIdName(), targetOpponent.getHand(), game);
Player you = game.getPlayer(source.getControllerId());
if (you != null) {
TargetCard target = new TargetCard(Zone.HAND, filter);
@ -71,13 +72,13 @@ class PerishTheThoughtEffect extends OneShotEffect {
if (you.choose(Outcome.Neutral, targetOpponent.getHand(), target, game)) {
Card chosenCard = targetOpponent.getHand().get(target.getFirstTarget(), game);
if (chosenCard != null) {
chosenCard.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
targetOpponent.shuffleLibrary(source, game);
targetOpponent.shuffleCardsToLibrary(chosenCard, game, source);
}
}
return true;
}
}
return true;
}
return false;
}

View file

@ -1,15 +1,12 @@
package mage.cards.p;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
@ -21,8 +18,7 @@ import mage.target.TargetPlayer;
public final class PsychicSpiral extends CardImpl {
public PsychicSpiral(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{U}");
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{U}");
// Shuffle all cards from your graveyard into your library. Target player puts that many cards from the top of their library into their graveyard.
this.getSpellAbility().addTarget(new TargetPlayer());
@ -43,7 +39,7 @@ class PsychicSpiralEffect extends OneShotEffect {
public PsychicSpiralEffect() {
super(Outcome.GainLife);
staticText = "Shuffle all cards from your graveyard into your library. Target player puts that many cards from the top of their library into their graveyard";
staticText = "Shuffle all cards from your graveyard into your library. Target player mills that many cards";
}
public PsychicSpiralEffect(final PsychicSpiralEffect effect) {
@ -52,19 +48,13 @@ class PsychicSpiralEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
int cardsInGraveyard = player.getGraveyard().size();
for (Card card: player.getGraveyard().getCards(game)) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
player.shuffleLibrary(source, game);
Player controller = game.getPlayer(source.getControllerId());
Player targetPlayer = game.getPlayer(source.getFirstTarget());
if (controller != null && targetPlayer != null) {
int cardsInGraveyard = controller.getGraveyard().size();
controller.shuffleCardsToLibrary(controller.getGraveyard(), game, source);
if (cardsInGraveyard > 0) {
Player targetPlayer = game.getPlayer(source.getFirstTarget());
if (targetPlayer != null) {
targetPlayer.millCards(cardsInGraveyard, source, game);
}
targetPlayer.millCards(cardsInGraveyard, source, game);
}
return true;
}
@ -75,4 +65,4 @@ class PsychicSpiralEffect extends OneShotEffect {
public PsychicSpiralEffect copy() {
return new PsychicSpiralEffect(this);
}
}
}

View file

@ -1,21 +1,15 @@
package mage.cards.p;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import java.util.UUID;
import mage.abilities.effects.common.CounterTargetEffect;
import mage.abilities.effects.common.ShuffleIntoLibraryTargetEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.players.Player;
import mage.filter.StaticFilters;
import mage.target.TargetSpell;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
import mage.target.targetpointer.SecondTargetPointer;
/**
* @author jeffwadsworth
@ -25,11 +19,13 @@ public final class PutAway extends CardImpl {
public PutAway(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{U}");
// Counter target spell. You may shuffle up to one target card from your graveyard into your library.
this.getSpellAbility().addEffect(new PutAwayEffect());
this.getSpellAbility().addEffect(new CounterTargetEffect());
this.getSpellAbility().addEffect(new ShuffleIntoLibraryTargetEffect(true)
.setTargetPointer(new SecondTargetPointer())
.setText("you may shuffle up to one target card from your graveyard into your library"));
this.getSpellAbility().addTarget(new TargetSpell());
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, new FilterCard()));
this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 1, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD));
}
@ -42,41 +38,3 @@ public final class PutAway extends CardImpl {
return new PutAway(this);
}
}
class PutAwayEffect extends OneShotEffect {
boolean countered = false;
public PutAwayEffect() {
super(Outcome.Neutral);
this.staticText = "Counter target spell. You may shuffle up to one target card from your graveyard into your library";
}
public PutAwayEffect(final PutAwayEffect effect) {
super(effect);
}
@Override
public PutAwayEffect copy() {
return new PutAwayEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Spell spell = game.getStack().getSpell(source.getFirstTarget());
if (spell != null && game.getStack().counter(spell.getId(), source.getSourceId(), game)) {
countered = true;
}
Card card = game.getCard(source.getTargets().get(1).getFirstTarget());
Player you = game.getPlayer(source.getControllerId());
if (you != null && card != null) {
if (you.chooseUse(Outcome.Benefit, "Do you wish to shuffle up to one target card from your graveyard into your library?", source, game)
&& game.getState().getZone(card.getId()).match(Zone.GRAVEYARD)) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
you.shuffleLibrary(source, game);
}
}
return countered;
}
}

View file

@ -1,4 +1,3 @@
package mage.cards.r;
import java.util.UUID;

View file

@ -1,15 +1,12 @@
package mage.cards.r;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.target.TargetPlayer;
@ -21,7 +18,7 @@ import mage.target.TargetPlayer;
public final class Reminisce extends CardImpl {
public Reminisce(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}");
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}");
// Target player shuffles their graveyard into their library.
this.getSpellAbility().addEffect(new ReminisceEffect());
@ -39,29 +36,26 @@ public final class Reminisce extends CardImpl {
}
class ReminisceEffect extends OneShotEffect {
ReminisceEffect() {
super(Outcome.Neutral);
this.staticText = "Target player shuffles their graveyard into their library";
}
ReminisceEffect(final ReminisceEffect effect) {
super(effect);
}
@Override
public ReminisceEffect copy() {
return new ReminisceEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(this.getTargetPointer().getFirst(game, source));
if (player != null) {
for (Card card: player.getGraveyard().getCards(game)) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
player.shuffleLibrary(source, game);
player.shuffleCardsToLibrary(player.getGraveyard(), game, source);
return true;
}
return false;

View file

@ -1,17 +1,15 @@
package mage.cards.r;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.CyclingAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
@ -58,12 +56,9 @@ class RepopulateEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getFirstTarget());
if (player != null) {
Set<Card> cards = player.getGraveyard().getCards(StaticFilters.FILTER_CARD_CREATURE, game);
for (Card card : cards) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
player.shuffleLibrary(source, game);
return true;
return player.shuffleCardsToLibrary(
new CardsImpl(player.getGraveyard()
.getCards(StaticFilters.FILTER_CARD_CREATURE, game)), game, source);
}
return false;
}

View file

@ -1,5 +1,7 @@
package mage.cards.r;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
@ -14,9 +16,6 @@ import mage.game.permanent.token.ResearchDevelopmentToken;
import mage.players.Player;
import mage.target.TargetCard;
import java.util.Set;
import java.util.UUID;
/**
* @author magenoxx
*/
@ -44,10 +43,6 @@ public final class ResearchDevelopment extends SplitCard {
class ResearchEffect extends OneShotEffect {
private static final String choiceText = "Choose a card you own from outside the game";
private static final FilterCard filter = new FilterCard("card");
public ResearchEffect() {
super(Outcome.Benefit);
this.staticText = "Choose up to four cards you own from outside the game and shuffle them into your library";
@ -64,53 +59,20 @@ class ResearchEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
StringBuilder textToAsk = new StringBuilder(choiceText);
textToAsk.append(" (0)");
int count = 0;
while (player.chooseUse(Outcome.Benefit, textToAsk.toString(), source, game)) {
Cards cards = player.getSideboard();
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
if (controller.chooseUse(Outcome.Benefit, staticText + "?", source, game)) {
Cards cards = controller.getSideboard();
if (cards.isEmpty()) {
game.informPlayer(player, "You have no cards outside the game.");
break;
game.informPlayer(controller, "You have no cards outside the game.");
return true;
}
Set<Card> filtered = cards.getCards(filter, game);
if (filtered.isEmpty()) {
game.informPlayer(player, "You have no " + filter.getMessage() + " outside the game.");
break;
}
Cards filteredCards = new CardsImpl();
for (Card card : filtered) {
filteredCards.add(card.getId());
}
TargetCard target = new TargetCard(Zone.OUTSIDE, filter);
if (player.choose(Outcome.Benefit, filteredCards, target, game)) {
Card card = player.getSideboard().get(target.getFirstTarget(), game);
if (card != null) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
count++;
textToAsk = new StringBuilder(choiceText);
textToAsk.append(" (");
textToAsk.append(count);
textToAsk.append(')');
}
}
if (count == 4) {
break;
TargetCard target = new TargetCard(0, 4, Zone.OUTSIDE, new FilterCard("cards you own from outside the game"));
target.setNotTarget(true);
if (controller.choose(Outcome.Benefit, controller.getSideboard(), target, game)) {
controller.shuffleCardsToLibrary(new CardsImpl(target.getTargets()), game, source);
}
}
game.informPlayers(player.getLogName() + " has chosen " + count + " card(s) to shuffle into their library.");
if (count > 0) {
player.shuffleLibrary(source, game);
}
return true;
}

View file

@ -1,4 +1,3 @@
package mage.cards.r;
import java.util.UUID;
@ -12,11 +11,11 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.other.FaceDownPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInExile;
/**
@ -26,12 +25,13 @@ import mage.target.common.TargetCardInExile;
public final class Riftsweeper extends CardImpl {
private static final FilterCard filter = new FilterCard("face-up exiled card");
static {
filter.add(Predicates.not(FaceDownPredicate.instance));
}
public Riftsweeper(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{G}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.subtype.add(SubType.ELF);
this.subtype.add(SubType.SHAMAN);
@ -74,13 +74,12 @@ class RiftsweeperEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Card card = game.getCard(targetPointer.getFirst(game, source));
if (card != null) {
// remove exiting suspend counters
// remove existing suspend counters
card.getCounters(game).clear();
// move to exile
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
game.getPlayer(card.getOwnerId()).shuffleLibrary(source, game);
game.informPlayers("Riftsweeper: Choosen card was " + card.getName());
return true;
Player owner = game.getPlayer(card.getOwnerId());
if (owner != null) {
return owner.shuffleCardsToLibrary(card, game, source);
}
}
return false;
}

View file

@ -1,4 +1,3 @@
package mage.cards.s;
import java.util.UUID;
@ -16,6 +15,7 @@ import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
* @author LevelX
@ -24,7 +24,10 @@ public final class SenseisDiviningTop extends CardImpl {
public SenseisDiviningTop(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}");
// {1}: Look at the top three cards of your library, then put them back in any order.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new LookLibraryControllerEffect(3, false, true), new ManaCostsImpl("{1}")));
// {T}: Draw a card, then put Sensei's Divining Top on top of its owner's library.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new TapSourceCost());
ability.addEffect(new SenseisDiviningTopEffect());
this.addAbility(ability);
@ -45,7 +48,7 @@ class SenseisDiviningTopEffect extends OneShotEffect {
public SenseisDiviningTopEffect() {
super(Outcome.ReturnToHand);
staticText = ", then put Sensei's Divining Top on top of its owner's library";
staticText = ", then put {this} on top of its owner's library";
}
public SenseisDiviningTopEffect(final SenseisDiviningTopEffect effect) {
@ -60,8 +63,9 @@ class SenseisDiviningTopEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
return permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
Player owner = game.getPlayer(game.getOwnerId(source.getSourceId()));
if (permanent != null && owner != null) {
return owner.putCardsOnTopOfLibrary(permanent, game, source, true);
}
return false;
}

View file

@ -7,13 +7,14 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInASingleGraveyard;
import java.util.UUID;
import mage.cards.Cards;
import mage.cards.CardsImpl;
/**
* @author LevelX2
@ -43,7 +44,7 @@ class SereneRemembranceEffect extends OneShotEffect {
public SereneRemembranceEffect() {
super(Outcome.Benefit);
this.staticText = "Shuffle Serene Remembrance and up to three target cards from a single graveyard into their owners' libraries";
this.staticText = "Shuffle {this} and up to three target cards from a single graveyard into their owners' libraries";
}
public SereneRemembranceEffect(final SereneRemembranceEffect effect) {
@ -57,35 +58,21 @@ class SereneRemembranceEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
boolean result = false;
// 3 cards to graveyard
Player graveyardPlayer = null;
for (UUID cardInGraveyard : targetPointer.getTargets(game, source)) {
Card card = game.getCard(cardInGraveyard);
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Card card = game.getCard(source.getSourceId());
if (card != null) {
for (Player player : game.getPlayers().values()) {
if (player.getGraveyard().contains(card.getId())) {
graveyardPlayer = player;
result |= card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
controller.shuffleCardsToLibrary(card, game, source);
}
Cards cards = new CardsImpl(getTargetPointer().getTargets(game, source));
if (!cards.isEmpty()) {
Player owner = game.getPlayer(cards.getCards(game).iterator().next().getOwnerId());
if (owner != null) {
owner.shuffleCardsToLibrary(cards, game, source);
}
}
return true;
}
// source card to graveyard
Card card = game.getCard(source.getSourceId());
if (card != null) {
result |= card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
Player player = game.getPlayer(card.getOwnerId());
if (player != null) {
player.shuffleLibrary(source, game);
}
if (graveyardPlayer != null && !graveyardPlayer.equals(player)) {
graveyardPlayer.shuffleLibrary(source, game);
}
}
return result;
return false;
}
}

View file

@ -56,39 +56,36 @@ class SignalTheClansEffect extends SearchEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player == null) {
Player controller = game.getPlayer(source.getControllerId());
if (controller == null) {
return false;
}
//Search your library for three creature cards
if (player.searchLibrary(target, source, game)) {
if (controller.searchLibrary(target, source, game)) {
boolean shuffleDone = false;
if (!target.getTargets().isEmpty()) {
Cards cards = new CardsImpl();
for (UUID cardId : target.getTargets()) {
Card card = player.getLibrary().remove(cardId, game);
if (card != null) {
cards.add(card);
}
}
Cards cards = new CardsImpl(target.getTargets());
//Reveal them
player.revealCards("Reveal", cards, game);
controller.revealCards(source, cards, game);
Card cardsArray[] = cards.getCards(game).toArray(new Card[0]);
//If you reveal three cards with different names
if (Stream.of(cardsArray).map(MageObject::getName).collect(Collectors.toSet()).size() == 3) {
//Choose one of them at random and put that card into your hand
Card randomCard = cards.getRandom(game);
randomCard.moveToZone(Zone.HAND, source.getSourceId(), game, true);
controller.moveCards(randomCard, Zone.HAND, source, game);
cards.remove(randomCard);
}
//Shuffle the rest into your library
for (Card card : cards.getCards(game)) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
// Shuffle the rest into your library
if (!cards.isEmpty()) {
controller.shuffleCardsToLibrary(cards, game, source);
shuffleDone = true;
}
}
player.shuffleLibrary(source, game);
if (!shuffleDone) {
controller.shuffleLibrary(source, game);
}
return true;
}
player.shuffleLibrary(source, game);
return false;
}

View file

@ -1,11 +1,13 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
@ -16,9 +18,6 @@ import mage.players.Player;
import mage.target.TargetPlayer;
import mage.target.common.TargetCardInGraveyard;
import java.util.List;
import java.util.UUID;
/**
*
* @author LevelX2
@ -26,7 +25,7 @@ import java.util.UUID;
public final class StreamOfConsciousness extends CardImpl {
public StreamOfConsciousness(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{1}{U}");
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
this.subtype.add(SubType.ARCANE);
// Target player shuffles up to four target cards from their graveyard into their library.
@ -64,23 +63,11 @@ class StreamOfConsciousnessEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getFirstTarget());
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player != null) {
List<UUID> targets = source.getTargets().get(1).getTargets();
boolean shuffle = false;
for (UUID targetId : targets) {
Card card = game.getCard(targetId);
if (card != null) {
if (player.getGraveyard().contains(card.getId())) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
shuffle = true;
}
}
}
if (shuffle) {
player.shuffleLibrary(source, game);
}
return true;
Cards targets = new CardsImpl(source.getTargets().get(1).getTargets());
targets.retainAll(player.getGraveyard());
return player.shuffleCardsToLibrary(targets, game, source);
}
return false;
}

View file

@ -1,4 +1,3 @@
package mage.cards.s;
import java.util.UUID;
@ -8,14 +7,11 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.AftermathAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.SplitCard;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SpellAbilityType;
import mage.constants.Zone;
import mage.filter.common.FilterControlledLandPermanent;
import mage.game.Game;
import mage.players.Player;
@ -69,16 +65,11 @@ class SurviveEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player sourcePlayer = game.getPlayer(source.getControllerId());
if(sourcePlayer != null) {
if (sourcePlayer != null) {
for (UUID playerId : game.getState().getPlayersInRange(sourcePlayer.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
for (Card card : player.getGraveyard().getCards(game)) {
if(card != null) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
}
player.shuffleLibrary(source, game);
player.shuffleCardsToLibrary(player.getGraveyard(), game, source);
}
}
}

View file

@ -1,8 +1,6 @@
package mage.cards.s;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
@ -10,6 +8,8 @@ import mage.abilities.effects.common.DrawCardAllEffect;
import mage.abilities.effects.common.SetPlayerLifeAllEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
@ -50,7 +50,7 @@ class SwayOfTheStarsEffect extends OneShotEffect {
public SwayOfTheStarsEffect() {
super(Outcome.Neutral);
staticText = "Each player shuffles their hand, graveyard, and permanents they own into their library, then draws seven cards. Each player's life total becomes 7";
staticText = "Each player shuffles their hand, graveyard, and permanents they own into their library";
}
public SwayOfTheStarsEffect(final SwayOfTheStarsEffect effect) {
@ -68,10 +68,11 @@ class SwayOfTheStarsEffect extends OneShotEffect {
player.moveCards(player.getGraveyard(), Zone.LIBRARY, source, game);
FilterPermanent filter = new FilterPermanent();
filter.add(new OwnerIdPredicate(playerId));
Cards toLib = new CardsImpl();
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, controller.getId(), source.getSourceId(), game)) {
permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
toLib.add(permanent);
}
player.shuffleLibrary(source, game);
player.shuffleCardsToLibrary(toLib, game, source);
}
}
}

View file

@ -1,7 +1,5 @@
package mage.cards.t;
import java.util.List;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCostsImpl;
@ -9,12 +7,15 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.MiracleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.other.OwnerIdPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
*
@ -23,13 +24,11 @@ import mage.game.permanent.Permanent;
public final class Terminus extends CardImpl {
public Terminus(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{W}{W}");
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{W}{W}");
// Put all creatures on the bottom of their owners' libraries.
this.getSpellAbility().addEffect(new TerminusEffect());
// Miracle {W}
this.addAbility(new MiracleAbility(this, new ManaCostsImpl("{W}")));
}
@ -61,10 +60,18 @@ class TerminusEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
List<Permanent> permanents = game.getBattlefield().getActivePermanents(
StaticFilters.FILTER_PERMANENT_CREATURES, source.getControllerId(), source.getSourceId(), game);
for (Permanent permanent : permanents) {
permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
FilterCreaturePermanent filter = new FilterCreaturePermanent();
filter.add(new OwnerIdPredicate(player.getId()));
Cards toLib = new CardsImpl();
for (Permanent permanent : game.getBattlefield()
.getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
toLib.add(permanent);
}
player.putCardsOnBottomOfLibrary(toLib, game, source, true);
}
}
return true;
}

View file

@ -1,4 +1,3 @@
package mage.cards.t;
import java.util.UUID;
@ -8,12 +7,12 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DrawCardAllEffect;
import mage.abilities.effects.common.ExileSpellEffect;
import mage.abilities.effects.common.UntapLandsEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
@ -24,7 +23,7 @@ import mage.players.Player;
public final class TimeSpiral extends CardImpl {
public TimeSpiral(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{U}{U}");
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{U}{U}");
// Exile Time Spiral. Each player shuffles their graveyard and hand into their library, then draws seven cards. You untap up to six lands.
this.getSpellAbility().addEffect(ExileSpellEffect.getInstance());
@ -62,13 +61,9 @@ class TimeSpiralEffect extends OneShotEffect {
for (UUID playerId : game.getState().getPlayersInRange(sourcePlayer.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
for (Card card : player.getHand().getCards(game)) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
for (Card card : player.getGraveyard().getCards(game)) {
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
player.shuffleLibrary(source, game);
Cards toLib = new CardsImpl(player.getHand());
toLib.addAll(player.getGraveyard());
player.shuffleCardsToLibrary(toLib, game, source);
}
}
return true;

View file

@ -1,4 +1,3 @@
package mage.cards.u;
import java.util.UUID;
@ -10,10 +9,11 @@ import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
@ -23,7 +23,7 @@ import mage.players.Player;
public final class UndyingBeast extends CardImpl {
public UndyingBeast(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
this.subtype.add(SubType.BEAST);
this.power = new MageInt(3);
this.toughness = new MageInt(2);
@ -62,10 +62,17 @@ class UndyingBeastEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Card card = game.getCard(source.getSourceId());
if (card != null && game.getState().getZone(source.getSourceId()) == Zone.GRAVEYARD) {
Player owner = game.getPlayer(card.getOwnerId());
if(owner != null) {
return card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
Object object = this.getValue("permanentLeftBattlefield");
if (object instanceof Permanent) {
Permanent permanent = (Permanent) object;
if (permanent.getZoneChangeCounter(game) + 1 == card.getZoneChangeCounter(game)) {
Player owner = game.getPlayer(card.getOwnerId());
if (owner != null) {
return owner.putCardsOnTopOfLibrary(card, game, source, true);
}
}
}
}
return true;
}

View file

@ -1,6 +1,7 @@
package mage.cards.v;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
@ -11,8 +12,8 @@ import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
@ -26,7 +27,7 @@ import mage.target.common.TargetCreaturePermanent;
public final class VoidStalker extends CardImpl {
public VoidStalker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(2);
@ -50,6 +51,7 @@ public final class VoidStalker extends CardImpl {
}
class VoidStalkerEffect extends OneShotEffect {
VoidStalkerEffect() {
super(Outcome.ReturnToHand);
staticText = "Put {this} and target creature on top of their owners' libraries, then those players shuffle their libraries";
@ -61,19 +63,25 @@ class VoidStalkerEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent p = game.getPermanent(targetPointer.getFirst(game, source));
Permanent s = game.getPermanent(source.getSourceId());
if (p != null) {
p.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
Player pl = game.getPlayer(p.getControllerId());
if (pl != null)
pl.shuffleLibrary(source, game);
Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
Permanent sourcePermanent = game.getPermanent(source.getSourceId());
Set<Player> toShuffle = new LinkedHashSet<>();
if (targetCreature != null) {
Player owner = game.getPlayer(targetCreature.getOwnerId());
if (owner != null) {
owner.putCardsOnTopOfLibrary(targetCreature, game, source, true);
toShuffle.add(owner);
}
}
if (s != null) {
s.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
Player pl = game.getPlayer(s.getControllerId());
if (pl != null)
pl.shuffleLibrary(source, game);
if (sourcePermanent != null) {
Player owner = game.getPlayer(sourcePermanent.getOwnerId());
if (owner != null) {
owner.putCardsOnTopOfLibrary(sourcePermanent, game, source, true);
toShuffle.add(owner);
}
}
for (Player player : toShuffle) {
player.shuffleLibrary(source, game);
}
return true;
}
@ -82,4 +90,4 @@ class VoidStalkerEffect extends OneShotEffect {
public VoidStalkerEffect copy() {
return new VoidStalkerEffect(this);
}
}
}

View file

@ -1,4 +1,3 @@
package mage.cards.v;
import java.util.HashSet;
@ -12,9 +11,11 @@ import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.combat.MustBeBlockedByTargetSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.combat.Combat;
@ -30,7 +31,7 @@ import mage.target.common.TargetCreaturePermanent;
public final class VortexElemental extends CardImpl {
public VortexElemental(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{U}");
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}");
this.subtype.add(SubType.ELEMENTAL);
this.power = new MageInt(0);
@ -80,7 +81,7 @@ class VortexElementalEffect extends OneShotEffect {
Set<UUID> playersToShuffle = new HashSet<>();
creaturesToReturn.add(source.getSourceId());
if (combat != null) {
for(CombatGroup combatGroup: combat.getGroups()) {
for (CombatGroup combatGroup : combat.getGroups()) {
if (combatGroup.getAttackers().contains(source.getSourceId())) {
creaturesToReturn.addAll(combatGroup.getBlockers());
} else if (combatGroup.getBlockers().contains(source.getSourceId())) {
@ -88,14 +89,15 @@ class VortexElementalEffect extends OneShotEffect {
}
}
}
for (UUID creatureId: creaturesToReturn) {
for (UUID creatureId : creaturesToReturn) {
Permanent creature = game.getPermanent(creatureId);
if (creature != null) {
playersToShuffle.add(creature.getControllerId());
creature.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
}
}
for (UUID playerId: playersToShuffle){
Cards toLib = new CardsImpl(creaturesToReturn);
controller.putCardsOnTopOfLibrary(toLib, game, source, false);
for (UUID playerId : playersToShuffle) {
Player player = game.getPlayer(playerId);
if (player != null) {
player.shuffleLibrary(source, game);
@ -105,7 +107,6 @@ class VortexElementalEffect extends OneShotEffect {
return true;
}
return false;
}
}

View file

@ -1,4 +1,3 @@
package mage.cards.w;
import java.util.UUID;
@ -8,10 +7,10 @@ import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.filter.common.FilterAttackingOrBlockingCreature;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
/**
@ -19,11 +18,11 @@ import mage.target.common.TargetCreaturePermanent;
* @author fireshoes
*/
public final class WhiskAway extends CardImpl {
private static final FilterAttackingOrBlockingCreature filter = new FilterAttackingOrBlockingCreature();
public WhiskAway(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{U}");
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}");
// Put target attacking or blocking creature on top of its owner's library.
this.getSpellAbility().addEffect(new WhiskAwayEffect());
@ -53,10 +52,10 @@ class WhiskAwayEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent targetCreature = game.getPermanent(targetPointer.getFirst(game, source));
if (targetCreature != null) {
targetCreature.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
return true;
Permanent targetCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
if (targetCreature != null && controller != null) {
return controller.putCardsOnTopOfLibrary(targetCreature, game, source, true);
}
return false;
}
@ -65,4 +64,4 @@ class WhiskAwayEffect extends OneShotEffect {
public WhiskAwayEffect copy() {
return new WhiskAwayEffect(this);
}
}
}

View file

@ -1,4 +1,3 @@
package mage.cards.w;
import java.util.HashSet;
@ -78,16 +77,11 @@ class WorldpurgeEffect extends OneShotEffect {
int numberInHand = Math.min(7, hand.size());
TargetCardInHand target = new TargetCardInHand(0, numberInHand, new FilterCard("cards to keep in hand"));
Cards cardsToLibrary = new CardsImpl();
cardsToLibrary.addAll(player.getHand());
if (player.choose(Outcome.Benefit, target, source.getSourceId(), game)) {
for (Card card : hand.getCards(game)) {
if (!target.getTargets().contains(card.getId())) {
cardsToLibrary.add(card);
card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
}
}
cardsToLibrary.removeAll(target.getTargets());
}
player.putCardsOnTopOfLibrary(cardsToLibrary, game, source, false);
player.shuffleLibrary(source, game);
player.shuffleCardsToLibrary(cardsToLibrary, game, source);
}
}
game.emptyManaPools();

View file

@ -1,4 +1,3 @@
package mage.cards.w;
import java.util.UUID;
@ -84,12 +83,11 @@ class WriteIntoBeingEffect extends OneShotEffect {
new ManifestEffect(1).apply(game, source);
if (controller.getLibrary().hasCards()) {
Card cardToPutBack = controller.getLibrary().getFromTop(game);
String position = "on top";
if (controller.chooseUse(Outcome.Detriment, "Put " + cardToPutBack.getName() + " on bottom of library?", source, game)) {
cardToPutBack.moveToZone(Zone.LIBRARY, source.getSourceId(), game, false);
position = "on bottom";
controller.putCardsOnBottomOfLibrary(cardToPutBack, game, source, true);
} else {
controller.putCardsOnTopOfLibrary(cardToPutBack, game, source, true);
}
game.informPlayers(sourceObject.getLogName() + ": " + controller.getLogName() + " puts the other card " + position + " of their library");
}
return true;
}

View file

@ -1,17 +1,12 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mage.abilities.effects.common;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.constants.Outcome;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
/**
@ -20,17 +15,20 @@ import mage.players.Player;
*/
public class ShuffleIntoLibraryTargetEffect extends OneShotEffect {
boolean optional;
public ShuffleIntoLibraryTargetEffect() {
super(Outcome.Detriment);
this(false);
}
public ShuffleIntoLibraryTargetEffect(String effectText) {
public ShuffleIntoLibraryTargetEffect(boolean optional) {
super(Outcome.Detriment);
this.staticText = effectText;
this.optional = optional;
}
public ShuffleIntoLibraryTargetEffect(final ShuffleIntoLibraryTargetEffect effect) {
super(effect);
this.optional = effect.optional;
}
@Override
@ -40,19 +38,26 @@ public class ShuffleIntoLibraryTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
MageObject cardObject = game.getObject(getTargetPointer().getFirst(game, source));
Player controller = game.getPlayer(source.getControllerId());
if (permanent != null && controller != null) {
if (controller.moveCards(permanent, Zone.LIBRARY, source, game)) {
game.getPlayer(permanent.getOwnerId()).shuffleLibrary(source, game);
if (cardObject != null && controller != null && cardObject instanceof Card) {
if (!optional
|| controller.chooseUse(Outcome.Benefit, "Do you wish to shuffle " + cardObject.getIdName() + " into "
+ (((Card) cardObject).getOwnerId().equals(source.getControllerId()) ? "your" : "its owners")
+ " library?", source, game)) {
Player owner = game.getPlayer(((Card) cardObject).getOwnerId());
if (owner != null) {
return owner.shuffleCardsToLibrary(((Card) cardObject), game, source);
}
return true;
}
return true;
}
return false;
}
@Override
public String getText(Mode mode) {
public String getText(Mode mode
) {
if (staticText != null && !staticText.isEmpty()) {
return staticText;
} else {

View file

@ -1,8 +1,11 @@
package mage.players;
import java.io.Serializable;
import java.util.*;
import mage.MageItem;
import mage.MageObject;
import mage.MageObjectReference;
import mage.Mana;
import mage.abilities.*;
import mage.abilities.costs.AlternativeSourceCosts;
import mage.abilities.costs.Cost;
@ -38,10 +41,6 @@ import mage.target.TargetCard;
import mage.target.common.TargetCardInLibrary;
import mage.util.Copyable;
import java.io.Serializable;
import java.util.*;
import mage.Mana;
/**
* @author BetaSteward_at_googlemail.com
*/
@ -366,8 +365,9 @@ public interface Player extends MageItem, Copyable<Player> {
* @param game
* @param noMana if it's a spell i can be cast without paying mana
* @param ignoreTiming if it's cast during the resolution of another spell
* no sorcery or play land timing restriction are checked. For a land it has
* to be the turn of the player playing that card.
* no sorcery or play land timing restriction are
* checked. For a land it has to be the turn of the
* player playing that card.
* @param reference mage object that allows to play the card
* @return
*/
@ -377,8 +377,9 @@ public interface Player extends MageItem, Copyable<Player> {
* @param card the land card to play
* @param game
* @param ignoreTiming false - it won't be checked if the stack is empty and
* you are able to play a Sorcery. It's still checked, if you are able to
* play a land concerning the number of lands you already played.
* you are able to play a Sorcery. It's still checked,
* if you are able to play a land concerning the number
* of lands you already played.
* @return
*/
boolean playLand(Card card, Game game, boolean ignoreTiming);
@ -446,11 +447,11 @@ public interface Player extends MageItem, Copyable<Player> {
void revealCards(Ability source, Cards cards, Game game);
void revealCards(String name, Cards cards, Game game);
void revealCards(String titelSuffix, Cards cards, Game game);
void revealCards(Ability source, String name, Cards cards, Game game);
void revealCards(Ability source, String titelSuffix, Cards cards, Game game);
void revealCards(String name, Cards cards, Game game, boolean postToLog);
void revealCards(String titelSuffix, Cards cards, Game game, boolean postToLog);
/**
* Adds the cards to the reveal window and adds the source object's id name
@ -532,10 +533,11 @@ public interface Player extends MageItem, Copyable<Player> {
* @param cards - list of cards that have to be moved
* @param game - game
* @param anyOrder - true = if player can determine the order of the cards
* else false = random order
* 401.4. If an effect puts two or more cards in a specific position in a library
* at the same time, the owner of those cards may arrange them in any order.
* That librarys owner doesnt reveal the order in which the cards go into the library.
* else false = random order 401.4. If an effect puts two or
* more cards in a specific position in a library at the
* same time, the owner of those cards may arrange them in
* any order. That librarys owner doesnt reveal the order
* in which the cards go into the library.
* @param source - source ability
* @return
*/
@ -636,9 +638,9 @@ public interface Player extends MageItem, Copyable<Player> {
void untap(Game game);
ManaOptions getManaAvailable(Game game);
void addAvailableTriggeredMana(List<Mana> netManaAvailable);
List<List<Mana>> getAvailableTriggeredMana();
List<ActivatedAbility> getPlayable(Game game, boolean hidden);
@ -747,9 +749,10 @@ public interface Player extends MageItem, Copyable<Player> {
* @param game
* @param tapped the cards are tapped on the battlefield
* @param faceDown the cards are face down in the to zone
* @param byOwner the card is moved (or put onto battlefield) by the owner
* of the card and if target zone is battlefield controls the permanent
* (instead of the controller of the source)
* @param byOwner the card is moved (or put onto battlefield) by the
* owner of the card and if target zone is battlefield
* controls the permanent (instead of the controller
* of the source)
* @param appliedEffects
* @return
*/

View file

@ -967,7 +967,7 @@ public abstract class PlayerImpl implements Player, Serializable {
if (cards.isEmpty()) {
return true;
}
game.informPlayers(getName() + " shuffels " + CardUtil.numberToText(cards.size(), "a")
game.informPlayers(getLogName() + " shuffels " + CardUtil.numberToText(cards.size(), "a")
+ " card" + (cards.size() == 1 ? "" : "s")
+ " into their library.");
boolean status = moveCards(cards, Zone.LIBRARY, source, game);