diff --git a/Mage.Sets/src/mage/cards/a/AtraxaGrandUnifier.java b/Mage.Sets/src/mage/cards/a/AtraxaGrandUnifier.java index 3c6526b2621..73da1e6530a 100644 --- a/Mage.Sets/src/mage/cards/a/AtraxaGrandUnifier.java +++ b/Mage.Sets/src/mage/cards/a/AtraxaGrandUnifier.java @@ -89,8 +89,7 @@ class AtraxaGrandUnifierEffect extends OneShotEffect { TargetCard target = new AtraxaGrandUnifierTarget(); player.choose(outcome, cards, target, game); Cards toHand = new CardsImpl(target.getTargets()); - player.revealCards(source, toHand, game); - player.moveCards(toHand, Zone.HAND, source, game); + player.moveCardsToHandWithInfo(toHand, source, game, true); cards.retainZone(Zone.LIBRARY, game); player.putCardsOnBottomOfLibrary(cards, game, source, false); return true; diff --git a/Mage.Sets/src/mage/cards/b/BountyOfSkemfar.java b/Mage.Sets/src/mage/cards/b/BountyOfSkemfar.java index f433f8d2fc1..ed088be5899 100644 --- a/Mage.Sets/src/mage/cards/b/BountyOfSkemfar.java +++ b/Mage.Sets/src/mage/cards/b/BountyOfSkemfar.java @@ -84,7 +84,7 @@ class BountyOfSkemfarEffect extends OneShotEffect { player.choose(outcome, cards, target, game); Card elf = cards.get(target.getFirstTarget(), game); if (elf != null) { - player.moveCards(elf, Zone.HAND, source, game); + player.moveCardToHandWithInfo(elf, source, game, true); } cards.removeIf(uuid -> game.getState().getZone(uuid) != Zone.LIBRARY); player.putCardsOnBottomOfLibrary(cards, game, source, false); diff --git a/Mage.Sets/src/mage/cards/h/HurkylMasterWizard.java b/Mage.Sets/src/mage/cards/h/HurkylMasterWizard.java index db49e104b81..ec5e2d1dd4d 100644 --- a/Mage.Sets/src/mage/cards/h/HurkylMasterWizard.java +++ b/Mage.Sets/src/mage/cards/h/HurkylMasterWizard.java @@ -94,7 +94,7 @@ class HurkylMasterWizardEffect extends OneShotEffect { TargetCard target = new HurkylMasterWizardTarget(source, game); player.choose(outcome, cards, target, game); Cards toHand = new CardsImpl(target.getTargets()); - player.moveCards(toHand, Zone.HAND, source, game); + player.moveCardsToHandWithInfo(toHand, source, game, true); cards.retainZone(Zone.LIBRARY, game); player.putCardsOnBottomOfLibrary(cards, game, source, false); return true; diff --git a/Mage.Sets/src/mage/cards/i/InscribedTablet.java b/Mage.Sets/src/mage/cards/i/InscribedTablet.java index ccf642d56ba..541b893c2eb 100644 --- a/Mage.Sets/src/mage/cards/i/InscribedTablet.java +++ b/Mage.Sets/src/mage/cards/i/InscribedTablet.java @@ -78,7 +78,7 @@ class InscribedTabletEffect extends OneShotEffect { Card land = game.getCard(target.getFirstTarget()); if (land != null) { cards.remove(land); - landToHand = controller.moveCards(land, Zone.HAND, source, game); + landToHand = controller.moveCardToHandWithInfo(land, source, game, true); } } controller.putCardsOnBottomOfLibrary(cards, game, source, false); diff --git a/Mage.Sets/src/mage/cards/n/NivMizzetReborn.java b/Mage.Sets/src/mage/cards/n/NivMizzetReborn.java index b39ee01e093..6aefab1505a 100644 --- a/Mage.Sets/src/mage/cards/n/NivMizzetReborn.java +++ b/Mage.Sets/src/mage/cards/n/NivMizzetReborn.java @@ -86,10 +86,7 @@ class NivMizzetRebornEffect extends OneShotEffect { TargetCard target = new NivMizzetRebornTarget(); player.choose(outcome, cards, target, game); Cards toHand = new CardsImpl(target.getTargets()); - player.moveCards(toHand, Zone.HAND, source, game); - game.informPlayers(player.getLogName() + " moves " + CardUtil.concatWithAnd( - toHand.getCards(game).stream().map(MageObject::getName).collect(Collectors.toList()) - ) + " to hand"); + player.moveCardsToHandWithInfo(toHand, source, game, true); cards.retainZone(Zone.LIBRARY, game); player.putCardsOnBottomOfLibrary(cards, game, source, false); return true; diff --git a/Mage.Sets/src/mage/cards/t/TajuruParagon.java b/Mage.Sets/src/mage/cards/t/TajuruParagon.java index 05210227a75..b283dedc60d 100644 --- a/Mage.Sets/src/mage/cards/t/TajuruParagon.java +++ b/Mage.Sets/src/mage/cards/t/TajuruParagon.java @@ -95,7 +95,7 @@ class TajuruParagonEffect extends OneShotEffect { player.choose(outcome, cards, target, game); Card card = game.getCard(target.getFirstTarget()); if (card != null) { - player.moveCards(card, Zone.HAND, source, game); + player.moveCardToHandWithInfo(card, source, game, true); cards.remove(card); } } diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 8cd9ac70731..7f59787625a 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -3813,6 +3813,11 @@ public class TestPlayer implements Player { return computerPlayer.moveCardToHandWithInfo(card, source, game, withName); } + @Override + public boolean moveCardsToHandWithInfo(Cards cards, Ability source, Game game, boolean withName) { + return computerPlayer.moveCardsToHandWithInfo(cards, source, game, withName); + } + @Override public boolean moveCardsToExile(Card card, Ability source, Game game, boolean withName, UUID exileId, String exileZoneName) { return computerPlayer.moveCardsToExile(card, source, game, withName, exileId, exileZoneName); diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java index 5af173b539f..56cf85952a0 100644 --- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java +++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java @@ -1204,6 +1204,11 @@ public class PlayerStub implements Player { return false; } + @Override + public boolean moveCardsToHandWithInfo(Cards cards, Ability source, Game game, boolean withName) { + return false; + } + @Override public boolean moveCardToExileWithInfo(Card card, UUID exileId, String exileName, Ability source, Game game, Zone fromZone, boolean withName) { return false; diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index cafd9f0ff74..093f11c5160 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -908,6 +908,17 @@ public interface Player extends MageItem, Copyable { */ boolean moveCardToHandWithInfo(Card card, Ability source, Game game, boolean withName); + /** + * Iterates through a set of cards and runs moveCardToHandWithInfo on each item + * + * @param cards + * @param source + * @param game + * @param withName show the card names in the log + * @return + */ + boolean moveCardsToHandWithInfo(Cards cards, Ability source, Game game, boolean withName); + /** * Uses card.moveToExile and posts a inform message about moving the card to * exile into the game log. Don't use this in replacement effects, because diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index ac1b7f4636e..b92b82ba0ad 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -4642,6 +4642,15 @@ public abstract class PlayerImpl implements Player, Serializable { return result; } + @Override + public boolean moveCardsToHandWithInfo(Cards cards, Ability source, Game game, boolean withName) { + Player player = this; + for (Card card : cards.getCards(game)) { + player.moveCardToHandWithInfo(card, source, game, withName); + } + return true; + } + @Override public boolean moveCardToHandWithInfo(Card card, Ability source, Game game, boolean withName) { boolean result = false;