From 57a9fc27106e065ffd0a13ba39ce6e9feea658ac Mon Sep 17 00:00:00 2001 From: Sloth Date: Mon, 27 Oct 2014 20:15:44 +0000 Subject: [PATCH] - Added AI support for Blind Zealot and Necrite. --- .../java/forge/ai/PlayerControllerAi.java | 4 +-- .../main/java/forge/ai/ability/DestroyAi.java | 32 ++++++++++++++++--- forge-gui/res/cardsfolder/b/blind_zealot.txt | 3 +- forge-gui/res/cardsfolder/n/necrite.txt | 3 +- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 897354411a1..2b930e0882e 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -174,7 +174,7 @@ public class PlayerControllerAi extends PlayerController { @Override public boolean confirmTrigger(SpellAbility sa, Trigger regtrig, Map triggerParams, boolean isMandatory) { - if (triggerParams.containsKey("DelayedTrigger")) { + if (triggerParams.containsKey("DelayedTrigger") || isMandatory) { //TODO: The only card with an optional delayed trigger is Shirei, Shizo's Caretaker, // needs to be expanded when a more difficult cards comes up return true; @@ -197,7 +197,7 @@ public class PlayerControllerAi extends PlayerController { } // There is no way this doTrigger here will have the same target as stored above // So it's possible it's making a different decision here than will actually happen - if (!brains.doTrigger(sa, isMandatory)) { + if (!brains.doTrigger(sa, false)) { ret = false; } if (storeChoices) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index b65bcf52d01..94d0839f333 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -207,6 +207,8 @@ public class DestroyAi extends SpellAbilityAi { final Card source = sa.getHostCard(); final boolean noRegen = sa.hasParam("NoRegen"); if (tgt != null) { + sa.resetTargets(); + CardCollection list = CardLists.getTargetableCards(ai.getGame().getCardsIn(ZoneType.Battlefield), sa); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); @@ -214,8 +216,6 @@ public class DestroyAi extends SpellAbilityAi { return false; } - sa.resetTargets(); - CardCollection preferred = CardLists.getNotKeyword(list, "Indestructible"); preferred = CardLists.filterControlledBy(preferred, ai.getOpponents()); @@ -232,14 +232,38 @@ public class DestroyAi extends SpellAbilityAi { }); } + if (sa.hasParam("AITgts")) { + if (sa.getParam("AITgts").equals("BetterThanSource")) { + if (source.isEnchanted()) { + if (source.getEnchantedBy(false).get(0).getController().equals(ai)) { + preferred.clear(); + } + } else { + final int value = ComputerUtilCard.evaluateCreature(source); + preferred = CardLists.filter(preferred, new Predicate() { + @Override + public boolean apply(final Card c) { + return ComputerUtilCard.evaluateCreature(c) > value + 30; + } + }); + } + } else { + preferred = CardLists.getValidCards(preferred, sa.getParam("AITgts"), sa.getActivatingPlayer(), source); + } + } + for (final Card c : preferred) { list.remove(c); } + if (preferred.isEmpty() && !mandatory) { + return false; + } + while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(sa.getHostCard(), sa)) { if (preferred.isEmpty()) { - if ((sa.getTargets().getNumTargeted() == 0) - || (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa))) { + if (sa.getTargets().getNumTargeted() == 0 + || sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) { if (!mandatory) { sa.resetTargets(); return false; diff --git a/forge-gui/res/cardsfolder/b/blind_zealot.txt b/forge-gui/res/cardsfolder/b/blind_zealot.txt index 6e999050867..3037c75ed07 100644 --- a/forge-gui/res/cardsfolder/b/blind_zealot.txt +++ b/forge-gui/res/cardsfolder/b/blind_zealot.txt @@ -4,7 +4,6 @@ Types:Creature Human Cleric PT:2/2 K:Intimidate T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls | NoRegen$ False -SVar:RemAIDeck:True +SVar:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | AITgts$ BetterThanSource | TgtPrompt$ Select target creature defending player controls SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_zealot.jpg Oracle:Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)\nWhenever Blind Zealot deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls. diff --git a/forge-gui/res/cardsfolder/n/necrite.txt b/forge-gui/res/cardsfolder/n/necrite.txt index 49ef604cec5..864340ced86 100644 --- a/forge-gui/res/cardsfolder/n/necrite.txt +++ b/forge-gui/res/cardsfolder/n/necrite.txt @@ -3,7 +3,6 @@ ManaCost:1 B B Types:Creature Thrull PT:2/2 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature defending player controls. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls | NoRegen$ True -SVar:RemAIDeck:True +SVar:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | NoRegen$ True | AITgts$ BetterThanSource | TgtPrompt$ Select target creature defending player controls SVar:Picture:http://www.wizards.com/global/images/magic/general/necrite.jpg Oracle:Whenever Necrite attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature defending player controls. It can't be regenerated.