From 376d127d8b960a260fc608f15ad04993f7337bc4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 21 May 2017 06:35:17 +0000 Subject: [PATCH] - Adding a way to suppress testing canRegenerate from combat code temporarily to avoid re-entry from ComputerUtil#canRegenerate when testing cards such as Varolz, the Scar-Striped. --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 11 ++++++++--- .../src/main/java/forge/ai/ComputerUtilCombat.java | 8 +++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index aaa1d5a9bcb..69c479331d8 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -810,6 +810,9 @@ public class ComputerUtil { return false; } + boolean canRegen = false; + ComputerUtilCombat.setCombatRegenTestSuppression(true); // do not check canRegenerate recursively from combat code + final Player controller = card.getController(); final Game game = controller.getGame(); final CardCollectionView l = controller.getCardsIn(ZoneType.Battlefield); @@ -846,10 +849,10 @@ public class ComputerUtil { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { if (CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getHostCard(), sa).contains(card)) { - return true; + canRegen = true; } } else if (AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa).contains(card)) { - return true; + canRegen = true; } } catch (final Exception ex) { @@ -857,7 +860,9 @@ public class ComputerUtil { } } } - return false; + + ComputerUtilCombat.setCombatRegenTestSuppression(false); + return canRegen; } public static int possibleDamagePrevention(final Card card) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 86940618f5e..4f16a804bba 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -66,6 +66,12 @@ import forge.util.collect.FCollection; */ public class ComputerUtilCombat { + // A special flag used in ComputerUtil#canRegenerate to avoid recursive reentry and stack overflow + private static boolean dontTestRegen = false; + public static void setCombatRegenTestSuppression(boolean shouldSuppress) { + dontTestRegen = shouldSuppress; + } + /** *

* canAttackNextTurn. @@ -1840,7 +1846,7 @@ public class ComputerUtilCombat { } } // flanking - if (blocker.hasKeyword("Indestructible") || ComputerUtil.canRegenerate(blocker.getController(), blocker)) { + if (blocker.hasKeyword("Indestructible") || dontTestRegen || ComputerUtil.canRegenerate(blocker.getController(), blocker)) { return false; }