From 2ddf38a60e4004ef32b7b96661ef8f93fd6002c4 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Thu, 4 Nov 2021 10:59:49 +0300 Subject: [PATCH] - Improve AI logic for bouncing creatures, e.g. Restoration Angel. --- .../java/forge/ai/ability/ChangeZoneAi.java | 45 ++++++++++++++++--- .../res/cardsfolder/r/restoration_angel.txt | 2 +- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 2c22a67411d..207d81d6aed 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -2,6 +2,8 @@ package forge.ai.ability; import java.util.*; +import forge.game.card.*; +import forge.game.keyword.Keyword; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicate; @@ -32,14 +34,7 @@ import forge.game.GlobalRuleChange; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates; import forge.game.card.CardPredicates.Presets; -import forge.game.card.CardUtil; -import forge.game.card.CounterEnumType; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.cost.CostDiscard; @@ -1397,6 +1392,42 @@ public class ChangeZoneAi extends SpellAbilityAi { } } } + // Reload Undying and Persist, get rid of -1/-1 counters, get rid of enemy auras if able + for (Card c : aiPermanents) { + if (c.isCreature()) { + boolean hasValuableAttachments = false; + boolean hasOppAttachments = false; + int numNegativeCounters = 0; + int numTotalCounters = 0; + for (Card attached : c.getAttachedCards()) { + if (attached.isAura()) { + if (attached.getController() == c.getController()) { + hasValuableAttachments = true; + } else if (attached.getController().isOpponentOf(c.getController())) { + hasOppAttachments = true; + } + } + } + Map counters = c.getCounters(); + for (CounterType ct : counters.keySet()) { + int amount = counters.get(ct); + if (ComputerUtil.isNegativeCounter(ct, c)) { + numNegativeCounters += amount; + } + numTotalCounters += amount; + } + if (hasValuableAttachments || (ComputerUtilCard.isUselessCreature(ai, c) && !hasOppAttachments)) { + continue; + } + + if ((c.hasKeyword(Keyword.PERSIST) || c.hasKeyword(Keyword.UNDYING)) + && !ComputerUtilCard.hasActiveUndyingOrPersist(c)) { + return c; + } else if (hasOppAttachments || (numTotalCounters > 0 && numNegativeCounters > numTotalCounters / 2)) { + return c; + } + } + } return null; } diff --git a/forge-gui/res/cardsfolder/r/restoration_angel.txt b/forge-gui/res/cardsfolder/r/restoration_angel.txt index 4768ef5fc76..96811a8d1e2 100644 --- a/forge-gui/res/cardsfolder/r/restoration_angel.txt +++ b/forge-gui/res/cardsfolder/r/restoration_angel.txt @@ -5,7 +5,7 @@ PT:3/4 K:Flash K:Flying T:Mode$ ChangesZone | ValidCard$ Creature.Self | Origin$ Any | Destination$ Battlefield | Execute$ RestorationExile | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target non-Angel creature you control, then return that creature to the battlefield under your control. -SVar:RestorationExile:DB$ ChangeZone | ValidTgts$ Creature.nonAngel+YouCtrl | TgtPrompt$ Select target non-Angel creature you control | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | AILogic$ BounceOnce | SubAbility$ RestorationReturn +SVar:RestorationExile:DB$ ChangeZone | ValidTgts$ Creature.nonAngel+YouCtrl | TgtPrompt$ Select target non-Angel creature you control | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ RestorationReturn SVar:RestorationReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/restoration_angel.jpg Oracle:Flash\nFlying\nWhen Restoration Angel enters the battlefield, you may exile target non-Angel creature you control, then return that card to the battlefield under your control.