forge icon indicating copy to clipboard operation
forge copied to clipboard

StackOverflow error when using "Pteron Ghost" to block "Grimclaw Bats"

Open wesleyer opened this issue 1 year ago • 2 comments

Describe the bug StackOverflow error (see stack below).

Java.lang.StackOverflowError at java.base/java.util.HashMap.hash(HashMap.java:337) at java.base/java.util.HashMap.put(HashMap.java:609) at java.base/java.util.HashSet.add(HashSet.java:221) at forge.util.collect.FCollection.add(FCollection.java:251) at forge.util.collect.FCollection.addAll(FCollection.java:311) at forge.game.player.PlayerCollection.getCardsIn(PlayerCollection.java:34) at forge.game.Game.getCardsIn(Game.java:552) at forge.game.Game.getCardsIn(Game.java:570) at forge.game.staticability.StaticAbilityCastWithFlash.anyWithFlashNeedsInfo(StaticAbilityCastWithFlash.java:16) at forge.game.spellability.SpellAbilityRestriction.canPlay(SpellAbilityRestriction.java:580) at forge.game.spellability.AbilityActivated.canPlay(AbilityActivated.java:89) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1055) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canRegenerate(ComputerUtil.java:1066) at forge.ai.ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(ComputerUtilCombat.java:1833) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1679) at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1666) at forge.ai.ComputerUtilCombat.attackerWouldBeDestroyed(ComputerUtilCombat.java:721) at forge.ai.ComputerUtilCombat.combatantWouldBeDestroyed(ComputerUtilCombat.java:697) at forge.ai.ComputerUtilCombat.willOpposingCreatureDieInCombat(ComputerUtilCombat.java:2591) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:372) at forge.ai.ComputerUtilCost.checkSacrificeCost(ComputerUtilCost.java:415) at forge.ai.ComputerUtil.canR ... (truncated)

To Reproduce Steps to reproduce the behavior: 1- Duel against AI 2- AI attacks with "Grimclaw Bats" 3- Opponent blocks with "Pteron Ghost".

Expected behavior No crash.

Desktop (please complete the following information): MacOS, Forge version 1.6.59

Additional context Add any other context about the problem here.

wesleyer avatar Jan 20 '24 04:01 wesleyer

This is related to #4014

We need a cleaner and robust recursion bailout method

tool4ever avatar Jan 20 '24 09:01 tool4ever

This issue has not been updated in a while and has now been marked as stale. Stale messages will be auto closed.

github-actions[bot] avatar Feb 20 '24 09:02 github-actions[bot]