diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index 3dd7825cad3..edf02ab304b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -75,10 +75,8 @@ public class ChooseCardAi extends SpellAbilityAi { return !choices.isEmpty(); } else if (aiLogic.equals("AtLeast2") || aiLogic.equals("BestBlocker")) { return choices.size() >= 2; - } else if (aiLogic.equals("Clone") || aiLogic.equals("Vesuva")) { - final String filter = aiLogic.equals("Clone") ? "Permanent.YouDontCtrl,Permanent.nonLegendary" - : "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva"; - + } else if (aiLogic.equals("Clone")) { + final String filter = "Permanent.YouDontCtrl,Permanent.nonLegendary"; choices = CardLists.getValidCards(choices, filter, host.getController(), host, sa); return !choices.isEmpty(); } else if (aiLogic.equals("Never")) { @@ -173,18 +171,13 @@ public class ChooseCardAi extends SpellAbilityAi { options = CardLists.filter(options, Presets.UNTAPPED); } choice = ComputerUtilCard.getBestCreatureAI(options); - } else if (logic.equals("Clone") || logic.equals("Vesuva")) { - final String filter = logic.equals("Clone") ? "Permanent.YouDontCtrl,Permanent.nonLegendary" : - "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva"; - + } else if (logic.equals("Clone")) { + final String filter = "Permanent.YouDontCtrl,Permanent.nonLegendary"; CardCollection newOptions = CardLists.getValidCards(options, filter.split(","), ctrl, host, sa); if (!newOptions.isEmpty()) { options = newOptions; } choice = ComputerUtilCard.getBestAI(options); - if (logic.equals("Vesuva") && "Vesuva".equals(choice.getName())) { - choice = null; - } } else if ("RandomNonLand".equals(logic)) { options = CardLists.getValidCards(options, "Card.nonLand", host.getController(), host, sa); choice = Aggregates.random(options); diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index 54601e39242..d6234051612 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -3,6 +3,8 @@ package forge.ai.ability; import java.util.List; import java.util.Map; +import com.google.common.base.Predicates; + import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.Game; @@ -11,6 +13,7 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; +import forge.game.card.CardPredicates; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -179,18 +182,18 @@ public class CloneAi extends SpellAbilityAi { @Override protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer, Map params) { - final Card host = sa.getHostCard(); + final String name = host.getName(); final Player ctrl = host.getController(); final Card cloneTarget = getCloneTarget(sa); final boolean isOpp = cloneTarget.getController().isOpponentOf(sa.getActivatingPlayer()); - final boolean isVesuva = "Vesuva".equals(host.getName()); + final boolean isVesuva = "Vesuva".equals(name) || "Sculpting Steel".equals(name); final boolean canCloneLegendary = "True".equalsIgnoreCase(sa.getParam("NonLegendary")); String filter = !isVesuva ? "Permanent.YouDontCtrl,Permanent.nonLegendary" - : "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva"; + : "Permanent.YouDontCtrl+notnamed" + name + ",Permanent.nonLegendary+notnamed" + name; // TODO: rewrite this block so that this is done somehow more elegantly if (canCloneLegendary) { @@ -209,12 +212,13 @@ public class CloneAi extends SpellAbilityAi { } } - Card choice = isOpp ? ComputerUtilCard.getWorstAI(options) : ComputerUtilCard.getBestAI(options); - - if (isVesuva && "Vesuva".equals(choice.getName())) { - choice = null; + // prevent loop of choosing copy of same card + if (isVesuva) { + options = CardLists.filter(options, Predicates.not(CardPredicates.sharesNameWith(host))); } + Card choice = isOpp ? ComputerUtilCard.getWorstAI(options) : ComputerUtilCard.getBestAI(options); + return choice; } diff --git a/forge-gui/res/cardsfolder/s/sculpting_steel.txt b/forge-gui/res/cardsfolder/s/sculpting_steel.txt index 6521ad86929..004e187870e 100644 --- a/forge-gui/res/cardsfolder/s/sculpting_steel.txt +++ b/forge-gui/res/cardsfolder/s/sculpting_steel.txt @@ -3,5 +3,5 @@ ManaCost:3 Types:Artifact K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Artifact.Other | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any artifact on the battlefield. -SVar:Picture:http://www.wizards.com/global/images/magic/general/sculpting_steel.jpg +SVar:NeedsToPlay:Artifact.YouDontCtrl+notnamedSculpting Steel,Artifact.YouCtrl+nonLegendary+notnamedSculpting Steel Oracle:You may have Sculpting Steel enter the battlefield as a copy of any artifact on the battlefield.