diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java index e5b3b2eeea4..aa20af794a3 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java @@ -94,8 +94,10 @@ public class ComputerPlayerMCTS extends ComputerPlayer { root = new MCTSNode(playerId, sim); } applyMCTS(game, action); - root = root.bestChild(); - root.emancipate(); + if (root != null && root.bestChild() != null) { + root = root.bestChild(); + root.emancipate(); + } } protected void getNextAction(Game game, NextAction nextAction) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/requirement/BecomeBlockTriggersMonteCarloAITest.java b/Mage.Tests/src/test/java/org/mage/test/cards/requirement/BecomeBlockTriggersMonteCarloAITest.java index f060372581e..503d3f2b52b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/requirement/BecomeBlockTriggersMonteCarloAITest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/requirement/BecomeBlockTriggersMonteCarloAITest.java @@ -2,15 +2,86 @@ package org.mage.test.cards.requirement; import mage.constants.PhaseStep; import mage.constants.Zone; +import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBaseWithMonteCarloAIHelps; /** * @author JayDi85 */ +@Ignore // TODO: research and fix attack/block simulations public class BecomeBlockTriggersMonteCarloAITest extends CardTestPlayerBaseWithMonteCarloAIHelps { - // continue from BecomeBlockTriggersTest + @Test + public void test_AI_Block_NoBlockers() { + addCard(Zone.BATTLEFIELD, playerA, "Grizzly Bears", 1); // 2/2 + + attack(1, playerA, "Grizzly Bears"); + + aiPlayStep(1, PhaseStep.DECLARE_BLOCKERS, playerB); + + setStopAt(1, PhaseStep.END_TURN); + setStrictChooseMode(true); + execute(); + + assertLife(playerB, 20 - 2); + assertPermanentCount(playerA, 1); + } + + @Test + public void test_AI_Block_KillAttackerAndAlive() { + addCard(Zone.BATTLEFIELD, playerA, "Grizzly Bears", 1); // 2/2 + // + addCard(Zone.BATTLEFIELD, playerB, "Apex Devastator", 1); // 10/10 + + attack(1, playerA, "Grizzly Bears"); + aiPlayStep(1, PhaseStep.DECLARE_BLOCKERS, playerB); + + setStopAt(1, PhaseStep.END_TURN); + setStrictChooseMode(true); + execute(); + + assertLife(playerB, 20); + assertPermanentCount(playerA, 0); + assertPermanentCount(playerB, 1); + } + + @Test + public void test_AI_Block_KillAttackerAndDie() { + addCard(Zone.BATTLEFIELD, playerA, "Atarka Efreet", 1); // 5/1 + // + addCard(Zone.BATTLEFIELD, playerB, "Aarakocra Sneak", 1); // 1/4 + + attack(1, playerA, "Atarka Efreet"); + aiPlayStep(1, PhaseStep.DECLARE_BLOCKERS, playerB); + + setStopAt(1, PhaseStep.END_TURN); + setStrictChooseMode(true); + execute(); + + assertLife(playerB, 20); + assertPermanentCount(playerA, 1); + assertPermanentCount(playerB, 1); + } + + @Test + public void test_AI_Block_BlockAttackerAndDie() { + addCard(Zone.BATTLEFIELD, playerA, "Apex Devastator", 1);// 10/10 + // + addCard(Zone.BATTLEFIELD, playerB, "Grizzly Bears", 1); // 2/2 + + attack(1, playerA, "Apex Devastator"); + aiPlayStep(1, PhaseStep.DECLARE_BLOCKERS, playerB); + + setStopAt(1, PhaseStep.END_TURN); + setStrictChooseMode(true); + execute(); + + assertLife(playerB, 20); + assertPermanentCount(playerA, 1); + assertPermanentCount(playerB, 0); + } + @Test public void test_AI_CantBlockAgain() { // Monte Carlo bug: Triggered ability triggered twice (should be once), see https://github.com/magefree/mage/issues/6367