From ba69a038689e89b2648e1b29cb98f32e6f2846ea Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 21 Oct 2023 07:33:27 +0300 Subject: [PATCH] Improve AI for Sorin, Vengeful Broodlord and similar + Fix Roiling Vortex AI logic (#3932) * - DamageDealAi: allow beneficial PW abilities (e.g. Sorin, Vengeful Broodlord). * - Better place for the logic * - Fix AI logic for Roiling Vortex and similar. * - Simpler implementation --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 4 +++- forge-ai/src/main/java/forge/ai/ability/EffectAi.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 86446e186e5..e3959fbcf1e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -15,6 +15,7 @@ import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.cost.Cost; import forge.game.cost.CostPartMana; +import forge.game.cost.CostPutCounter; import forge.game.keyword.Keyword; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; @@ -735,7 +736,8 @@ public class DamageDealAi extends DamageAiBase { || (isSorcerySpeed(sa, ai) && phase.is(PhaseType.MAIN2)) || immediately) { boolean pingAfterAttack = "PingAfterAttack".equals(logic) && phase.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) && phase.isPlayerTurn(ai); - if ((pingAfterAttack && !avoidTargetP(ai, sa)) || shouldTgtP(ai, sa, dmg, noPrevention)) { + boolean isPWAbility = sa.isPwAbility() && sa.getPayCosts().hasSpecificCostType(CostPutCounter.class); + if (isPWAbility || (pingAfterAttack && !avoidTargetP(ai, sa)) || shouldTgtP(ai, sa, dmg, noPrevention)) { tcs.add(enemy); if (divided) { sa.addDividedAllocation(enemy, dmg); diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index c5c81824b52..9fd5e946bc5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -212,7 +212,8 @@ public class EffectAi extends SpellAbilityAi { return false; } final SpellAbility topStack = game.getStack().peekAbility(); - return topStack.getActivatingPlayer().isOpponentOf(ai) && topStack.getApi() == ApiType.GainLife; + final Player tgtPlayer = topStack.getActivatingPlayer(); + return tgtPlayer.isOpponentOf(ai) && tgtPlayer.canGainLife() && topStack.getApi() == ApiType.GainLife; } else if (logic.equals("Fight")) { return FightAi.canFightAi(ai, sa, 0, 0); } else if (logic.equals("Pump")) {