From afd50154d17b9912d294d73dab9231386b6b9b72 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Tue, 2 Aug 2016 10:55:49 +0000 Subject: [PATCH] SetStateAi: add more logic for transforming, now use always evaluated value check unblocked should only care about transformed power for now. thats the next step in making the AI use Elusive Tormentor better. --- .../java/forge/ai/ability/SetStateAi.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index 10d092d4202..5c05be90129 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -76,15 +76,21 @@ public class SetStateAi extends SpellAbilityAi { } if("Transform".equals(sa.getParam("Mode"))) { + // need a copy for evaluation + Card transformed = CardUtil.getLKICopy(source); + transformed.getCurrentState().copyFrom(source, source.getAlternateState()); + transformed.updateStateForView(); + + int valueSource = ComputerUtilCard.evaluateCreature(source); + int valueTransformed = ComputerUtilCard.evaluateCreature(transformed); + + // it would not survive being transformed + if (transformed.getNetToughness() < 1) { + return false; + } + // check which state would be better for attacking if (ph.isPlayerTurn(ai) && ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - // need a copy for evaluation - Card transformed = CardUtil.getLKICopy(source); - transformed.getCurrentState().copyFrom(source, source.getAlternateState()); - transformed.updateStateForView(); - - int valueSource = ComputerUtilCard.evaluateCreature(source); - int valueTransformed = ComputerUtilCard.evaluateCreature(transformed); boolean transformAttack = false; // if an opponent can't block it, no need to transform (back) @@ -105,11 +111,15 @@ public class SetStateAi extends SpellAbilityAi { if (transformAttack) { return true; } - - // no clear way, alternate state is better, - // but for more cleaner way use Evaluate for check - return valueSource <= valueTransformed; + } else if (ph.isPlayerTurn(ai) && ph.getPhase().equals(PhaseType.COMBAT_DECLARE_BLOCKERS)) { + if (ph.inCombat() && ph.getCombat().isUnblocked(source)) { + // if source is unblocked, check for the power + return source.getNetPower() <= transformed.getNetPower(); + } } + // no clear way, alternate state is better, + // but for more cleaner way use Evaluate for check + return valueSource <= valueTransformed; } return true; }