From 840d0788a7150ae93a2b242e315c3c2369937e06 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 9 Aug 2023 07:17:44 +0200 Subject: [PATCH] PumpAi: check if creature would die through damage and check for regeneration --- .../main/java/forge/ai/ability/PumpAi.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 6a312bb1da9..2b41e7b86ac 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -7,7 +7,9 @@ import com.google.common.collect.Maps; import forge.ai.*; +import forge.game.CardTraitPredicates; import forge.game.Game; +import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; @@ -19,6 +21,9 @@ import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; +import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementLayer; +import forge.game.replacement.ReplacementType; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.staticability.StaticAbility; @@ -526,10 +531,27 @@ public boolean apply(Card input) { // check if switching PT causes it to be lethal Card lki = CardUtil.getLKICopy(input); lki.addSwitchPT(-1, 0); - if (input.getLethal() - input.getDamage() <= 0) { - return true; + + // check if creature could regenerate + Map runParams = AbilityKey.mapFromAffected(input); + runParams.put(AbilityKey.Regeneration, true); + List repDestoryList = game.getReplacementHandler().getReplacementList(ReplacementType.Destroy, runParams, ReplacementLayer.Other); + // non-Regeneration one like Totem-Armor + // should do it anyway to destroy the aura? + if (Iterables.any(repDestoryList, Predicates.not(CardTraitPredicates.hasParam("Regeneration")))) { + return false; } - return false; + // TODO make it force to use regen? + // should check phase and make it before combat damage or better before blocker? + if (Iterables.any(repDestoryList, CardTraitPredicates.hasParam("Regeneration")) && input.canBeShielded()) { + return false; + } + + // maybe do it anyway to reduce its power? + if (input.getLethal() - input.getDamage() > 0) { + return false; + } + return true; } });