From d071f4df6b94f3c2f04af88392e54a788342221b Mon Sep 17 00:00:00 2001 From: Sloth Date: Mon, 10 Jun 2013 20:13:59 +0000 Subject: [PATCH] - Added a variant of the Targeting AI SVar. --- res/cardsfolder/j/jetting_glasskite.txt | 1 + res/cardsfolder/l/lava_runner.txt | 1 + res/cardsfolder/r/retromancer.txt | 2 +- res/cardsfolder/s/shimmering_glasskite.txt | 1 + src/main/java/forge/card/ability/ai/AttachAi.java | 8 ++------ .../java/forge/card/ability/ai/ChangeZoneAi.java | 7 +------ src/main/java/forge/card/ability/ai/FightAi.java | 8 ++------ .../java/forge/card/ability/ai/ProtectAi.java | 9 ++------- src/main/java/forge/card/ability/ai/PumpAi.java | 7 +------ src/main/java/forge/game/ai/ComputerUtil.java | 15 +++++++++++++++ 10 files changed, 27 insertions(+), 32 deletions(-) diff --git a/res/cardsfolder/j/jetting_glasskite.txt b/res/cardsfolder/j/jetting_glasskite.txt index ebaebba6f4c..65d7818f7ce 100644 --- a/res/cardsfolder/j/jetting_glasskite.txt +++ b/res/cardsfolder/j/jetting_glasskite.txt @@ -5,6 +5,7 @@ PT:4/4 K:Flying T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | FirstTime$ True | Execute$ GlasskiteCounter | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability for the first time in a turn, counter that spell or ability. SVar:GlasskiteCounter:AB$ Counter | Cost$ 0 | Defined$ TriggeredSourceSA +SVar:Targeting:Counter SVar:Picture:http://www.wizards.com/global/images/magic/general/jetting_glasskite.jpg Oracle:Flying\nWhenever Jetting Glasskite becomes the target of a spell or ability for the first time in a turn, counter that spell or ability. SetInfo:BOK Uncommon \ No newline at end of file diff --git a/res/cardsfolder/l/lava_runner.txt b/res/cardsfolder/l/lava_runner.txt index 640cd89b3d1..a2a2a709936 100644 --- a/res/cardsfolder/l/lava_runner.txt +++ b/res/cardsfolder/l/lava_runner.txt @@ -7,6 +7,7 @@ T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | ValidControllingPlayer$ You T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigSacOpp | Secondary$ True | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, that spell or ability's controller sacrifices a land. SVar:TrigSacYou:AB$Sacrifice | Cost$ 0 | SacValid$ Land | ChangeNum$ 1 | Defined$ You SVar:TrigSacOpp:AB$Sacrifice | Cost$ 0 | SacValid$ Land | ChangeNum$ 1 | Defined$ Opponent +SVar:Targeting:Counter SVar:Picture:http://www.wizards.com/global/images/magic/general/lava_runner.jpg Oracle:Haste\nWhenever Lava Runner becomes the target of a spell or ability, that spell or ability's controller sacrifices a land. SetInfo:MMQ Rare \ No newline at end of file diff --git a/res/cardsfolder/r/retromancer.txt b/res/cardsfolder/r/retromancer.txt index fe6f8c7391b..6a4a3890105 100644 --- a/res/cardsfolder/r/retromancer.txt +++ b/res/cardsfolder/r/retromancer.txt @@ -4,7 +4,7 @@ Types:Creature Viashino Shaman PT:3/3 T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, CARDNAME deals 3 damage to that spell or ability's controller. SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 3 -SVar:RemAIDeck:True +SVar:Targeting:Counter SVar:Picture:http://www.wizards.com/global/images/magic/general/retromancer.jpg Oracle:Whenever Retromancer becomes the target of a spell or ability, Retromancer deals 3 damage to that spell or ability's controller. SetInfo:USG Common \ No newline at end of file diff --git a/res/cardsfolder/s/shimmering_glasskite.txt b/res/cardsfolder/s/shimmering_glasskite.txt index 0bd562a08ff..02d4a96edba 100644 --- a/res/cardsfolder/s/shimmering_glasskite.txt +++ b/res/cardsfolder/s/shimmering_glasskite.txt @@ -5,6 +5,7 @@ PT:2/3 K:Flying T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | FirstTime$ True | Execute$ GlasskiteCounter | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability for the first time in a turn, counter that spell or ability. SVar:GlasskiteCounter:AB$ Counter | Cost$ 0 | Defined$ TriggeredSourceSA +SVar:Targeting:Counter SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmering_glasskite.jpg Oracle:Flying\nWhenever Shimmering Glasskite becomes the target of a spell or ability for the first time in a turn, counter that spell or ability. SetInfo:BOK Common \ No newline at end of file diff --git a/src/main/java/forge/card/ability/ai/AttachAi.java b/src/main/java/forge/card/ability/ai/AttachAi.java index dc19c85d5a9..313b07f115c 100644 --- a/src/main/java/forge/card/ability/ai/AttachAi.java +++ b/src/main/java/forge/card/ability/ai/AttachAi.java @@ -22,6 +22,7 @@ import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.card.staticability.StaticAbility; +import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCost; import forge.game.ai.ComputerUtilMana; @@ -814,12 +815,7 @@ public class AttachAi extends SpellAbilityAi { } // Don't pump cards that will die. - prefList = CardLists.filter(prefList, new Predicate() { - @Override - public boolean apply(final Card c) { - return !c.getSVar("Targeting").equals("Dies"); - } - }); + prefList = ComputerUtil.getSafeTargets(ai, sa, prefList); if (attachSource.isAura() && !attachSource.getName().equals("Daybreak Coronet")) { // TODO For Auras like Rancor, that aren't as likely to lead to diff --git a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java index bd049cafdcc..41da4e64a45 100644 --- a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java +++ b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java @@ -722,12 +722,7 @@ public class ChangeZoneAi extends SpellAbilityAi { List aiPermanents = CardLists.filterControlledBy(list, ai); // Don't blink cards that will die. - aiPermanents = CardLists.filter(aiPermanents, new Predicate() { - @Override - public boolean apply(final Card c) { - return !c.getSVar("Targeting").equals("Dies"); - } - }); + aiPermanents = ComputerUtil.getSafeTargets(ai, sa, aiPermanents); // if it's blink or bounce, try to save my about to die stuff if ((destination.equals(ZoneType.Hand) || (destination.equals(ZoneType.Exile) diff --git a/src/main/java/forge/card/ability/ai/FightAi.java b/src/main/java/forge/card/ability/ai/FightAi.java index bd34b7d3143..14c4cf45929 100644 --- a/src/main/java/forge/card/ability/ai/FightAi.java +++ b/src/main/java/forge/card/ability/ai/FightAi.java @@ -10,6 +10,7 @@ import forge.CardLists; import forge.card.ability.SpellAbilityAi; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; +import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCombat; import forge.game.player.Player; import forge.util.MyRandom; @@ -26,12 +27,7 @@ public class FightAi extends SpellAbilityAi { List aiCreatures = ai.getCreaturesInPlay(); aiCreatures = CardLists.getTargetableCards(aiCreatures, sa); - aiCreatures = CardLists.filter(aiCreatures, new Predicate() { - @Override - public boolean apply(final Card c) { - return !c.getSVar("Targeting").equals("Dies"); - } - }); + aiCreatures = ComputerUtil.getSafeTargets(ai, sa, aiCreatures); List humCreatures = ai.getOpponent().getCreaturesInPlay(); humCreatures = CardLists.getTargetableCards(humCreatures, sa); diff --git a/src/main/java/forge/card/ability/ai/ProtectAi.java b/src/main/java/forge/card/ability/ai/ProtectAi.java index 4047555084f..2c7cf7b0d35 100644 --- a/src/main/java/forge/card/ability/ai/ProtectAi.java +++ b/src/main/java/forge/card/ability/ai/ProtectAi.java @@ -14,6 +14,7 @@ import forge.card.cost.Cost; import forge.card.spellability.SpellAbility; import forge.card.spellability.Target; import forge.game.Game; +import forge.game.ai.ComputerUtil; import forge.game.ai.ComputerUtilCard; import forge.game.ai.ComputerUtilCombat; import forge.game.ai.ComputerUtilCost; @@ -215,13 +216,7 @@ public class ProtectAi extends SpellAbilityAi { } // Don't target cards that will die. - list = CardLists.filter(list, new Predicate() { - @Override - public boolean apply(final Card c) { - System.out.println("Not Protecting"); - return !c.getSVar("Targeting").equals("Dies"); - } - }); + list = ComputerUtil.getSafeTargets(ai, sa, list); while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) { Card t = null; diff --git a/src/main/java/forge/card/ability/ai/PumpAi.java b/src/main/java/forge/card/ability/ai/PumpAi.java index 12e61530c70..533fa6c5d1b 100644 --- a/src/main/java/forge/card/ability/ai/PumpAi.java +++ b/src/main/java/forge/card/ability/ai/PumpAi.java @@ -250,12 +250,7 @@ public class PumpAi extends PumpAiBase { if (!sa.isCurse()) { // Don't target cards that will die. - list = CardLists.filter(list, new Predicate() { - @Override - public boolean apply(final Card c) { - return !c.getSVar("Targeting").equals("Dies"); - } - }); + list = ComputerUtil.getSafeTargets(ai, sa, list); } while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) { diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index 7e445968ed5..bf25ed49958 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -1663,4 +1663,19 @@ public class ComputerUtil { GuiChoose.one("Computer picked: ", new String[]{chosen}); return chosen; } + + public static List getSafeTargets(final Player ai, SpellAbility sa, List validCards) { + List safeCards = new ArrayList(validCards); + safeCards = CardLists.filter(safeCards, new Predicate() { + @Override + public boolean apply(final Card c) { + if (c.getController() == ai) { + if (c.getSVar("Targeting").equals("Dies") || c.getSVar("Targeting").equals("Counter")) + return false; + } + return true; + } + }); + return safeCards; + } }