From 829b9069e2bcabddf3f7a1c3a814b51a1c04bf70 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Tue, 2 Nov 2021 22:12:17 +0300 Subject: [PATCH 1/3] - AiController: support AICheckSVar/AISVarCompare for ordinary SAs (abilities). --- .../src/main/java/forge/ai/AiController.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 1d98254322f..7a59be18717 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -712,6 +712,40 @@ public class AiController { return AiPlayDecision.CantPlaySa; } + // Check a predefined condition (maybe refactor it later to avoid code duplication with similar replacement effect code?) + if (sa.hasParam("AICheckSVar")) { + final Card host = sa.getHostCard(); + final String svarToCheck = sa.getParam("AICheckSVar"); + String comparator = "GE"; + int compareTo = 1; + + if (sa.hasParam("AISVarCompare")) { + final String fullCmp = sa.getParam("AISVarCompare"); + comparator = fullCmp.substring(0, 2); + final String strCmpTo = fullCmp.substring(2); + try { + compareTo = Integer.parseInt(strCmpTo); + } catch (final Exception ignored) { + if (sa == null) { + compareTo = AbilityUtils.calculateAmount(host, host.getSVar(strCmpTo), sa); + } else { + compareTo = AbilityUtils.calculateAmount(host, host.getSVar(strCmpTo), sa); + } + } + } + + int left = 0; + + if (sa == null) { + left = AbilityUtils.calculateAmount(host, svarToCheck, sa); + } else { + left = AbilityUtils.calculateAmount(host, svarToCheck, sa); + } + if (!Expressions.compare(left, comparator, compareTo)) { + return AiPlayDecision.AnotherTime; + } + } + int oldCMC = -1; boolean xCost = sa.getPayCosts().hasXInAnyCostPart() || sa.getHostCard().hasStartOfKeyword("Strive"); if (!xCost) { From 10cddb7c192a9a5d9b34ad752c9f1b71da21874c Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Tue, 2 Nov 2021 22:19:39 +0300 Subject: [PATCH 2/3] - Refactor AI SVar checking for both abilities and replacement effects. --- .../src/main/java/forge/ai/AiController.java | 92 +++++++------------ 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 7a59be18717..dd241251371 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -714,34 +714,7 @@ public class AiController { // Check a predefined condition (maybe refactor it later to avoid code duplication with similar replacement effect code?) if (sa.hasParam("AICheckSVar")) { - final Card host = sa.getHostCard(); - final String svarToCheck = sa.getParam("AICheckSVar"); - String comparator = "GE"; - int compareTo = 1; - - if (sa.hasParam("AISVarCompare")) { - final String fullCmp = sa.getParam("AISVarCompare"); - comparator = fullCmp.substring(0, 2); - final String strCmpTo = fullCmp.substring(2); - try { - compareTo = Integer.parseInt(strCmpTo); - } catch (final Exception ignored) { - if (sa == null) { - compareTo = AbilityUtils.calculateAmount(host, host.getSVar(strCmpTo), sa); - } else { - compareTo = AbilityUtils.calculateAmount(host, host.getSVar(strCmpTo), sa); - } - } - } - - int left = 0; - - if (sa == null) { - left = AbilityUtils.calculateAmount(host, svarToCheck, sa); - } else { - left = AbilityUtils.calculateAmount(host, svarToCheck, sa); - } - if (!Expressions.compare(left, comparator, compareTo)) { + if (!checkAISpecificSVarCondition(sa, sa.getHostCard())) { return AiPlayDecision.AnotherTime; } } @@ -1836,35 +1809,7 @@ public class AiController { } } if (effect.hasParam("AICheckSVar")) { - System.out.println("aiShouldRun?" + sa); - final String svarToCheck = effect.getParam("AICheckSVar"); - String comparator = "GE"; - int compareTo = 1; - - if (effect.hasParam("AISVarCompare")) { - final String fullCmp = effect.getParam("AISVarCompare"); - comparator = fullCmp.substring(0, 2); - final String strCmpTo = fullCmp.substring(2); - try { - compareTo = Integer.parseInt(strCmpTo); - } catch (final Exception ignored) { - if (sa == null) { - compareTo = AbilityUtils.calculateAmount(hostCard, hostCard.getSVar(strCmpTo), effect); - } else { - compareTo = AbilityUtils.calculateAmount(hostCard, hostCard.getSVar(strCmpTo), sa); - } - } - } - - int left = 0; - - if (sa == null) { - left = AbilityUtils.calculateAmount(hostCard, svarToCheck, effect); - } else { - left = AbilityUtils.calculateAmount(hostCard, svarToCheck, sa); - } - System.out.println("aiShouldRun?" + left + comparator + compareTo); - return Expressions.compare(left, comparator, compareTo); + return checkAISpecificSVarCondition(effect, hostCard); } else if (effect.hasParam("AICheckDredge")) { return player.getCardsIn(ZoneType.Library).size() > 8 || player.isCardInPlay("Laboratory Maniac"); } else return sa != null && doTrigger(sa, false); @@ -2370,4 +2315,37 @@ public class AiController { return Iterables.getFirst(list, null); } + private static boolean checkAISpecificSVarCondition(CardTraitBase ab, Card host) { + if (ab.hasParam("AICheckSVar")) { + final String svarToCheck = ab.getParam("AICheckSVar"); + String comparator = "GE"; + int compareTo = 1; + + if (ab.hasParam("AISVarCompare")) { + final String fullCmp = ab.getParam("AISVarCompare"); + comparator = fullCmp.substring(0, 2); + final String strCmpTo = fullCmp.substring(2); + try { + compareTo = Integer.parseInt(strCmpTo); + } catch (final Exception ignored) { + if (ab == null) { + compareTo = AbilityUtils.calculateAmount(host, host.getSVar(strCmpTo), ab); + } else { + compareTo = AbilityUtils.calculateAmount(host, host.getSVar(strCmpTo), ab); + } + } + } + + int left = 0; + + if (ab == null) { + left = AbilityUtils.calculateAmount(host, svarToCheck, ab); + } else { + left = AbilityUtils.calculateAmount(host, svarToCheck, ab); + } + return Expressions.compare(left, comparator, compareTo); + } + + return false; + } } From 7800d0c6a65d907ca35b0534e5c0c47630c37507 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Tue, 2 Nov 2021 22:25:09 +0300 Subject: [PATCH 3/3] - Tweak a comment. --- forge-ai/src/main/java/forge/ai/AiController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index dd241251371..24287a0c815 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -712,7 +712,7 @@ public class AiController { return AiPlayDecision.CantPlaySa; } - // Check a predefined condition (maybe refactor it later to avoid code duplication with similar replacement effect code?) + // Check a predefined condition if (sa.hasParam("AICheckSVar")) { if (!checkAISpecificSVarCondition(sa, sa.getHostCard())) { return AiPlayDecision.AnotherTime;