From 297b543630a6ea301234a787e472baed6f73047b Mon Sep 17 00:00:00 2001 From: L_J Date: Thu, 4 Oct 2018 22:12:06 +0000 Subject: [PATCH 1/5] Jace, Architect of Thought ult fix --- .../mage/cards/j/JaceArchitectOfThought.java | 57 +++++++++++++++---- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java index 09ebb7644ef..e6c207f4d5a 100644 --- a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java @@ -2,6 +2,7 @@ package mage.cards.j; import java.util.ArrayList; +import java.util.List; import java.util.Set; import java.util.UUID; import mage.MageObjectReference; @@ -24,7 +25,10 @@ import mage.constants.SubType; import mage.constants.SuperType; import mage.constants.Zone; import mage.filter.FilterCard; +import mage.filter.FilterPlayer; import mage.filter.common.FilterNonlandCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.other.PlayerIdPredicate; import mage.game.ExileZone; import mage.game.Game; import mage.game.events.GameEvent; @@ -32,6 +36,7 @@ import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetCard; +import mage.target.TargetPlayer; import mage.target.common.TargetCardInExile; import mage.target.common.TargetCardInLibrary; import mage.target.common.TargetOpponent; @@ -239,21 +244,49 @@ class JaceArchitectOfThoughtEffect3 extends OneShotEffect { if (controller == null || sourcePermanent == null) { return false; } - for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { - Player player = game.getPlayer(playerId); - String playerName = new StringBuilder(player.getLogName()).append("'s").toString(); - if (source.isControlledBy(player.getId())) { - playerName = "your"; + List playerList = new ArrayList<>(); + playerList.addAll(game.getState().getPlayersInRange(controller.getId(), game)); + List checkList = new ArrayList<>(); + while (!playerList.isEmpty()) { + FilterPlayer filter = new FilterPlayer(); + List playerPredicates = new ArrayList<>(); + for (UUID playerId : playerList) { + playerPredicates.add(new PlayerIdPredicate(playerId)); } - TargetCardInLibrary target = new TargetCardInLibrary(new FilterNonlandCard(new StringBuilder("nonland card from ").append(playerName).append(" library").toString())); - if (controller.searchLibrary(target, game, playerId)) { - UUID targetId = target.getFirstTarget(); - Card card = player.getLibrary().remove(targetId, game); - if (card != null) { - controller.moveCardToExileWithInfo(card, CardUtil.getCardExileZoneId(game, source), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); + filter.add(Predicates.or(playerPredicates)); + TargetPlayer targetPlayer = new TargetPlayer(1, 1, true, filter); + targetPlayer.setRequired(!checkList.containsAll(playerList)); + if (controller.chooseTarget(outcome, targetPlayer, source, game)) { + UUID playerId = targetPlayer.getFirstTarget(); + Player player = game.getPlayer(playerId); + if (player != null) { + String playerName = new StringBuilder(player.getLogName()).append("'s").toString(); + if (source.isControlledBy(player.getId())) { + playerName = "your"; + } + TargetCardInLibrary target = new TargetCardInLibrary(new FilterNonlandCard(new StringBuilder("nonland card from ").append(playerName).append(" library").toString())); + if (controller.searchLibrary(target, game, playerId)) { + UUID targetId = target.getFirstTarget(); + Card card = player.getLibrary().remove(targetId, game); + if (card != null) { + controller.moveCardToExileWithInfo(card, CardUtil.getCardExileZoneId(game, source), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); + playerList.remove(playerId); + } + } + if (!checkList.contains(playerId)) { + player.shuffleLibrary(source, game); // only one shuffle per library (to prevent bad interactions with Psychogenic Probe etc.) + } + } + checkList.add(playerId); + } else { + break; + } + for (UUID playerId : playerList) { + Player player = game.getPlayer(playerId); + if (player == null || !player.canRespond()) { + playerList.remove(player); } } - player.shuffleLibrary(source, game); } ExileZone jaceExileZone = game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, source)); From 57fdae9c9235ce115e8b5d37fec99a82e892890d Mon Sep 17 00:00:00 2001 From: L_J Date: Thu, 4 Oct 2018 22:43:23 +0000 Subject: [PATCH 2/5] Minor shuffle fix --- Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java index e6c207f4d5a..770ae965aae 100644 --- a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java @@ -273,9 +273,6 @@ class JaceArchitectOfThoughtEffect3 extends OneShotEffect { playerList.remove(playerId); } } - if (!checkList.contains(playerId)) { - player.shuffleLibrary(source, game); // only one shuffle per library (to prevent bad interactions with Psychogenic Probe etc.) - } } checkList.add(playerId); } else { @@ -288,7 +285,12 @@ class JaceArchitectOfThoughtEffect3 extends OneShotEffect { } } } - + for (UUID playerId : checkList) { + Player player = game.getPlayer(playerId); + if (player != null) { + player.shuffleLibrary(source, game); + } + } ExileZone jaceExileZone = game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, source)); if (jaceExileZone == null) { return true; From bf4988382ed17befe1e3de59f6f8bdec8a67987c Mon Sep 17 00:00:00 2001 From: L_J Date: Thu, 4 Oct 2018 22:53:50 +0000 Subject: [PATCH 3/5] More edits --- Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java index 770ae965aae..88695547985 100644 --- a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java @@ -266,15 +266,19 @@ class JaceArchitectOfThoughtEffect3 extends OneShotEffect { } TargetCardInLibrary target = new TargetCardInLibrary(new FilterNonlandCard(new StringBuilder("nonland card from ").append(playerName).append(" library").toString())); if (controller.searchLibrary(target, game, playerId)) { + checkList.add(playerId); UUID targetId = target.getFirstTarget(); Card card = player.getLibrary().remove(targetId, game); if (card != null) { controller.moveCardToExileWithInfo(card, CardUtil.getCardExileZoneId(game, source), sourcePermanent.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); playerList.remove(playerId); } + } else { + playerList.remove(playerId); } + } else { + playerList.remove(playerId); } - checkList.add(playerId); } else { break; } From b67107b1b5de09bc0dd0e4c402f39fb782daaaf5 Mon Sep 17 00:00:00 2001 From: L_J Date: Wed, 10 Oct 2018 22:55:42 +0000 Subject: [PATCH 4/5] Prevent arbitrary library search triggers from Jace ultimate --- Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java index 88695547985..2dd15baf2d1 100644 --- a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java @@ -265,7 +265,7 @@ class JaceArchitectOfThoughtEffect3 extends OneShotEffect { playerName = "your"; } TargetCardInLibrary target = new TargetCardInLibrary(new FilterNonlandCard(new StringBuilder("nonland card from ").append(playerName).append(" library").toString())); - if (controller.searchLibrary(target, game, playerId)) { + if (controller.searchLibrary(target, game, playerId, !checkList.contains(playerId))) { checkList.add(playerId); UUID targetId = target.getFirstTarget(); Card card = player.getLibrary().remove(targetId, game); From 9939af89683b6a9cad560899084dcbe8e0ae6322 Mon Sep 17 00:00:00 2001 From: L_J Date: Wed, 10 Oct 2018 23:09:49 +0000 Subject: [PATCH 5/5] Prevent arbitrary shuffles from Jace ultimate --- Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java index 2dd15baf2d1..f5f54108041 100644 --- a/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java +++ b/Mage.Sets/src/mage/cards/j/JaceArchitectOfThought.java @@ -2,6 +2,7 @@ package mage.cards.j; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.UUID; @@ -246,7 +247,7 @@ class JaceArchitectOfThoughtEffect3 extends OneShotEffect { } List playerList = new ArrayList<>(); playerList.addAll(game.getState().getPlayersInRange(controller.getId(), game)); - List checkList = new ArrayList<>(); + Set checkList = new HashSet<>(); while (!playerList.isEmpty()) { FilterPlayer filter = new FilterPlayer(); List playerPredicates = new ArrayList<>();