From 020c405a4226187661e7d9f600ff994d34b38c8f Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 31 Oct 2021 19:10:56 +0300 Subject: [PATCH] - Predict poison from triggers for Poisonous --- .../java/forge/ai/ComputerUtilCombat.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index ab6f76c8477..6ba6757a1aa 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -60,7 +60,7 @@ import forge.util.collect.FCollection; /** *

* ComputerCombatUtil class. - *

+ *

; * * @author Forge * @version $Id: ComputerUtil.java 19179 2013-01-25 18:48:29Z Max mtg $ @@ -253,9 +253,8 @@ public class ComputerUtilCombat { poison += pd; } } - if (attacker.hasKeyword(Keyword.POISONOUS) && damage > 0) { - // TODO need to check for magnitude 1, each of their triggers could be replaced to 0 - poison += attacker.getKeywordMagnitude(Keyword.POISONOUS); + if (damage > 0) { + poison += predictPoisonFromTriggers(attacker, attacked, damage); } return poison; } @@ -373,12 +372,11 @@ public class ComputerUtilCombat { unblocked.add(attacker); } else if (attacker.hasKeyword(Keyword.TRAMPLE) && (getAttack(attacker) > totalShieldDamage(attacker, blockers))) { + int trampleDamage = getAttack(attacker) - totalShieldDamage(attacker, blockers); if (attacker.hasKeyword(Keyword.INFECT)) { - poison += getAttack(attacker) - totalShieldDamage(attacker, blockers); - } - if (attacker.hasKeyword(Keyword.POISONOUS)) { - poison += attacker.getKeywordMagnitude(Keyword.POISONOUS); + poison += trampleDamage; } + poison += predictPoisonFromTriggers(attacker, ai, trampleDamage); } } @@ -2475,4 +2473,25 @@ public class ComputerUtilCombat { return false; } + + public static int predictPoisonFromTriggers(Card attacker, Player attacked, int damage) { + int pd = 0, poison = 0; + int damageAfterRepl = predictDamageTo(attacked, damage, attacker, true); + if (damageAfterRepl > 0) { + for (Trigger t : attacker.getTriggers()) { + if (t.getMode() == TriggerType.DamageDone && "True".equals(t.getParam("CombatDamage"))) { + SpellAbility ab = t.getOverridingAbility(); + if (ab.getApi() == ApiType.Poison && "TriggeredTarget".equals(ab.getParam("Defined"))) { + pd += AbilityUtils.calculateAmount(attacker, ab.getParam("Num"), ab); + } + } + } + poison += pd; + if (pd > 0 && attacker.hasKeyword(Keyword.DOUBLE_STRIKE)) { + poison += pd; + } + // TODO: Predict replacement effects for counters (doubled, reduced, additional counters, etc.) + } + return poison; + } }