From 3da525520c4cc49d538c990a5bfb22c2a28f26fa Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Wed, 18 Aug 2021 11:02:30 +0400 Subject: [PATCH] * Author of Shadows - added window with exiled and castable cards; --- .../src/mage/cards/a/AuthorOfShadows.java | 20 +++++++++++++----- Mage/src/main/java/mage/game/Exile.java | 21 ++++++++++++++++++- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AuthorOfShadows.java b/Mage.Sets/src/mage/cards/a/AuthorOfShadows.java index 6ba8b90fba2..272b6acf96b 100644 --- a/Mage.Sets/src/mage/cards/a/AuthorOfShadows.java +++ b/Mage.Sets/src/mage/cards/a/AuthorOfShadows.java @@ -7,6 +7,7 @@ import mage.abilities.effects.OneShotEffect; import mage.cards.*; import mage.constants.*; import mage.filter.StaticFilters; +import mage.game.ExileZone; import mage.game.Game; import mage.players.Player; import mage.target.TargetCard; @@ -63,8 +64,8 @@ class AuthorOfShadowsEffect extends OneShotEffect { @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; } Cards cards = new CardsImpl(); @@ -78,18 +79,27 @@ class AuthorOfShadowsEffect extends OneShotEffect { if (cards.isEmpty()) { return false; } - player.moveCards(cards, Zone.EXILED, source, game); + + controller.moveCards(cards, Zone.EXILED, source, game); cards.retainZone(Zone.EXILED, game); if (cards.isEmpty()) { return false; } + TargetCard target = new TargetCardInExile(StaticFilters.FILTER_CARD_A_NON_LAND); target.setNotTarget(true); - player.choose(outcome, cards, target, game); + controller.choose(outcome, cards, target, game); Card card = game.getCard(target.getFirstTarget()); if (card == null) { - return false; + return true; } + + // use same player's zone for all Author of Shadows instances + String exileZoneName = controller.getName() + " - Author of Shadows - cast with any color"; + UUID exileZoneId = CardUtil.getExileZoneId(exileZoneName, game); + ExileZone exileZone = game.getExile().createZone(exileZoneId, exileZoneName); + game.getExile().moveToAnotherZone(card, game, exileZone); + CardUtil.makeCardPlayable(game, source, card, Duration.Custom, true); return true; } diff --git a/Mage/src/main/java/mage/game/Exile.java b/Mage/src/main/java/mage/game/Exile.java index 0ffaf01f1ba..4f842fd5ded 100644 --- a/Mage/src/main/java/mage/game/Exile.java +++ b/Mage/src/main/java/mage/game/Exile.java @@ -16,7 +16,7 @@ public class Exile implements Serializable, Copyable { private static final UUID PERMANENT = UUID.randomUUID(); - private Map exileZones = new HashMap<>(); + private final Map exileZones = new HashMap<>(); public Exile() { createZone(PERMANENT, "Permanent"); @@ -88,6 +88,25 @@ public class Exile implements Serializable, Copyable { return false; } + /** + * Move card from one exile zone to another. Use case example: create special zone for exiled and castable card. + * + * @param card + * @param game + * @param toZoneId + */ + public void moveToAnotherZone(Card card, Game game, ExileZone exileZone) { + if (getCard(card.getId(), game) == null) { + throw new IllegalArgumentException("Card must be in exile zone: " + card.getIdName()); + } + if (exileZone == null) { + throw new IllegalArgumentException("Exile zone must exists: " + card.getIdName()); + } + + removeCard(card, game); + exileZone.add(card); + } + @Override public Exile copy() { return new Exile(this);