- Added AI support for Blind Zealot and Necrite.

This commit is contained in:
Sloth
2014-10-27 20:15:44 +00:00
parent 7ff491bfd3
commit 57a9fc2710
4 changed files with 32 additions and 10 deletions

View File

@@ -174,7 +174,7 @@ public class PlayerControllerAi extends PlayerController {
@Override @Override
public boolean confirmTrigger(SpellAbility sa, Trigger regtrig, Map<String, String> triggerParams, boolean isMandatory) { public boolean confirmTrigger(SpellAbility sa, Trigger regtrig, Map<String, String> 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, //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 // needs to be expanded when a more difficult cards comes up
return true; 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 // 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 // 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; ret = false;
} }
if (storeChoices) { if (storeChoices) {

View File

@@ -207,6 +207,8 @@ public class DestroyAi extends SpellAbilityAi {
final Card source = sa.getHostCard(); final Card source = sa.getHostCard();
final boolean noRegen = sa.hasParam("NoRegen"); final boolean noRegen = sa.hasParam("NoRegen");
if (tgt != null) { if (tgt != null) {
sa.resetTargets();
CardCollection list = CardLists.getTargetableCards(ai.getGame().getCardsIn(ZoneType.Battlefield), sa); CardCollection list = CardLists.getTargetableCards(ai.getGame().getCardsIn(ZoneType.Battlefield), sa);
list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source);
@@ -214,8 +216,6 @@ public class DestroyAi extends SpellAbilityAi {
return false; return false;
} }
sa.resetTargets();
CardCollection preferred = CardLists.getNotKeyword(list, "Indestructible"); CardCollection preferred = CardLists.getNotKeyword(list, "Indestructible");
preferred = CardLists.filterControlledBy(preferred, ai.getOpponents()); 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<Card>() {
@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) { for (final Card c : preferred) {
list.remove(c); list.remove(c);
} }
if (preferred.isEmpty() && !mandatory) {
return false;
}
while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(sa.getHostCard(), sa)) { while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(sa.getHostCard(), sa)) {
if (preferred.isEmpty()) { if (preferred.isEmpty()) {
if ((sa.getTargets().getNumTargeted() == 0) if (sa.getTargets().getNumTargeted() == 0
|| (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa))) { || sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) {
if (!mandatory) { if (!mandatory) {
sa.resetTargets(); sa.resetTargets();
return false; return false;

View File

@@ -4,7 +4,6 @@ Types:Creature Human Cleric
PT:2/2 PT:2/2
K:Intimidate 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. 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:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | AITgts$ BetterThanSource | TgtPrompt$ Select target creature defending player controls
SVar:RemAIDeck:True
SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_zealot.jpg 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. 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.

View File

@@ -3,7 +3,6 @@ ManaCost:1 B B
Types:Creature Thrull Types:Creature Thrull
PT:2/2 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. 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:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | NoRegen$ True | AITgts$ BetterThanSource | TgtPrompt$ Select target creature defending player controls
SVar:RemAIDeck:True
SVar:Picture:http://www.wizards.com/global/images/magic/general/necrite.jpg 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. 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.