- Added a variant of the Targeting AI SVar.

This commit is contained in:
Sloth
2013-06-10 20:13:59 +00:00
parent e52369f66d
commit d071f4df6b
10 changed files with 27 additions and 32 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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<Card>() {
@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

View File

@@ -722,12 +722,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
List<Card> aiPermanents = CardLists.filterControlledBy(list, ai);
// Don't blink cards that will die.
aiPermanents = CardLists.filter(aiPermanents, new Predicate<Card>() {
@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)

View File

@@ -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<Card> aiCreatures = ai.getCreaturesInPlay();
aiCreatures = CardLists.getTargetableCards(aiCreatures, sa);
aiCreatures = CardLists.filter(aiCreatures, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return !c.getSVar("Targeting").equals("Dies");
}
});
aiCreatures = ComputerUtil.getSafeTargets(ai, sa, aiCreatures);
List<Card> humCreatures = ai.getOpponent().getCreaturesInPlay();
humCreatures = CardLists.getTargetableCards(humCreatures, sa);

View File

@@ -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<Card>() {
@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;

View File

@@ -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<Card>() {
@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)) {

View File

@@ -1663,4 +1663,19 @@ public class ComputerUtil {
GuiChoose.one("Computer picked: ", new String[]{chosen});
return chosen;
}
public static List<Card> getSafeTargets(final Player ai, SpellAbility sa, List<Card> validCards) {
List<Card> safeCards = new ArrayList<Card>(validCards);
safeCards = CardLists.filter(safeCards, new Predicate<Card>() {
@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;
}
}