From 478d1e83cbd1d672cf7cb0c50c96d87dc928edf5 Mon Sep 17 00:00:00 2001 From: Sloth Date: Sun, 1 Mar 2015 11:38:03 +0000 Subject: [PATCH] - Added AI support for Mox Diamond. --- .../src/main/java/forge/ai/AiController.java | 5 ++++- .../game/ability/effects/DiscardEffect.java | 17 ++++++++--------- forge-gui/res/cardsfolder/m/mox_diamond.txt | 4 +++- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 298da8e5986..150a99080a0 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -825,7 +825,7 @@ public class AiController { return getCardsToDiscard(numDiscard, numDiscard, hand, sa); } - public CardCollection getCardsToDiscard(final int min, final int max, final CardCollection validCards, final SpellAbility sa) { + public CardCollection getCardsToDiscard(int min, final int max, final CardCollection validCards, final SpellAbility sa) { if (validCards.size() < min) { return null; } @@ -835,6 +835,9 @@ public class AiController { int count = 0; if (sa != null) { sourceCard = sa.getHostCard(); + if ("Always".equals(sa.getParam("AILogic")) && !validCards.isEmpty()) { + min = 1; + } } // look for good discards diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java index aa6b2d83959..5f2eee8be97 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.List; public class DiscardEffect extends SpellAbilityEffect { + @Override protected String getStackDescription(SpellAbility sa) { final String mode = sa.getParam("Mode"); @@ -31,7 +32,7 @@ public class DiscardEffect extends SpellAbilityEffect { final List tgtPlayers = getTargetPlayers(sa); - if (tgtPlayers.size() > 0) { + if (!tgtPlayers.isEmpty()) { for (final Player p : tgtPlayers) { sb.append(p.toString()).append(" "); @@ -113,14 +114,14 @@ public class DiscardEffect extends SpellAbilityEffect { for (final Player p : discarders) { - if ((mode.equals("RevealTgtChoose") && firstTarget != null) - || tgt == null || p.canBeTargetedBy(sa)) { + if ((mode.equals("RevealTgtChoose") && firstTarget != null) || tgt == null || p.canBeTargetedBy(sa)) { if (sa.hasParam("RememberDiscarder")) { source.addRemembered(p); } final int numCardsInHand = p.getCardsIn(ZoneType.Hand).size(); if (mode.equals("Defined")) { - boolean runDiscard = !sa.hasParam("Optional") || p.getController().confirmAction(sa, PlayerActionConfirmMode.Random, sa.getParam("DiscardMessage")); + boolean runDiscard = !sa.hasParam("Optional") + || p.getController().confirmAction(sa, PlayerActionConfirmMode.Random, sa.getParam("DiscardMessage")); if (runDiscard) { final List toDiscard = AbilityUtils.getDefinedCards(source, sa.getParam("DefinedCards"), sa); for (final Card c : toDiscard) { @@ -150,8 +151,7 @@ public class DiscardEffect extends SpellAbilityEffect { } if (mode.equals("NotRemembered")) { - final List dPHand = - CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), "Card.IsNotRemembered", source.getController(), source); + final List dPHand = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), "Card.IsNotRemembered", p, source); for (final Card c : dPHand) { p.discard(c, sa); discarded.add(c); @@ -161,8 +161,7 @@ public class DiscardEffect extends SpellAbilityEffect { int numCards = 1; if (sa.hasParam("NumCards")) { numCards = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa); - if (p.getCardsIn(ZoneType.Hand).size() > 0 - && p.getCardsIn(ZoneType.Hand).size() < numCards) { + if (!p.getCardsIn(ZoneType.Hand).isEmpty() && p.getCardsIn(ZoneType.Hand).size() < numCards) { // System.out.println("Scale down discard from " + numCards + " to " + p.getCardsIn(ZoneType.Hand).size()); numCards = p.getCardsIn(ZoneType.Hand).size(); } @@ -174,7 +173,7 @@ public class DiscardEffect extends SpellAbilityEffect { if (runDiscard) { final String valid = sa.hasParam("DiscardValid") ? sa.getParam("DiscardValid") : "Card"; - List list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), valid, sa.getHostCard().getController(), sa.getHostCard()); + List list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), valid, source.getController(), source); list = CardLists.filter(list, Presets.NON_TOKEN); for (int i = 0; i < numCards; i++) { if (list.isEmpty()) diff --git a/forge-gui/res/cardsfolder/m/mox_diamond.txt b/forge-gui/res/cardsfolder/m/mox_diamond.txt index e6f2e5224c3..70873b9f681 100644 --- a/forge-gui/res/cardsfolder/m/mox_diamond.txt +++ b/forge-gui/res/cardsfolder/m/mox_diamond.txt @@ -3,11 +3,13 @@ ManaCost:0 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color to your mana pool. R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | ReplaceWith$ PayBeforeETB | Description$ If CARDNAME would enter the battlefield, you may discard a land card instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. -SVar:PayBeforeETB:AB$ Discard | Cost$ 0 | DiscardValid$ Card.Land | Mode$ TgtChoose | RememberDiscarded$ True | Optional$ True | SubAbility$ MoveToGraveyard +SVar:PayBeforeETB:AB$ Discard | Cost$ 0 | DiscardValid$ Land | Mode$ TgtChoose | RememberDiscarded$ True | Optional$ True | AILogic$ Always | SubAbility$ MoveToGraveyard SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ MoveToBattlefield SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount +SVar:NeedsToPlayVar:Y GE1 +SVar:Y:Count$ValidHand Land.YouCtrl SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mox_diamond.jpg Oracle:If Mox Diamond would enter the battlefield, you may discard a land card instead. If you do, put Mox Diamond onto the battlefield. If you don't, put it into its owner's graveyard.\n{T}: Add one mana of any color to your mana pool.