From 71e417dd8a9f30193cc59bb578aa33784d095c7b Mon Sep 17 00:00:00 2001 From: excessum Date: Sun, 11 Oct 2015 09:31:41 +0000 Subject: [PATCH] - Implemented AI for more Converge cards --- .../src/main/java/forge/ai/AiController.java | 22 ++++++++++++++++--- .../main/java/forge/ai/ComputerUtilMana.java | 12 ++++++++++ .../java/forge/ai/ability/DamageAllAi.java | 4 +++- .../main/java/forge/ai/ability/TokenAi.java | 3 +++ .../res/cardsfolder/r/radiant_flames.txt | 1 - forge-gui/res/cardsfolder/s/skyrider_elf.txt | 1 - forge-gui/res/cardsfolder/u/unified_front.txt | 1 - 7 files changed, 37 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index ec8b246d429..e26942e8f59 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -667,10 +667,26 @@ public class AiController { if (mana.countX() > 0) { // Set PayX here to maximum value. final int xPay = ComputerUtilMana.determineLeftoverMana(sa, player); - if (xPay <= 0) { - return AiPlayDecision.CantAffordX; + final Card source = sa.getHostCard(); + if (source.hasConverge()) { + card.setSVar("PayX", Integer.toString(0)); + int nColors = ComputerUtilMana.getConvergeCount(sa, player); + for (int i = 1; i <= xPay; i++) { + card.setSVar("PayX", Integer.toString(i)); + int newColors = ComputerUtilMana.getConvergeCount(sa, player); + if (newColors > nColors) { + nColors = newColors; + } else { + card.setSVar("PayX", Integer.toString(i - 1)); + break; + } + } + } else { + if (xPay <= 0) { + return AiPlayDecision.CantAffordX; + } + card.setSVar("PayX", Integer.toString(xPay)); } - card.setSVar("PayX", Integer.toString(xPay)); } // Check for valid targets before casting diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index bdcca49a83d..a1ecf52c689 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -58,6 +58,18 @@ public class ComputerUtilMana { public static boolean canPayManaCost(final SpellAbility sa, final Player ai, final int extraMana) { return payManaCost(sa, ai, true, extraMana, true); } + + /** + * Return the number of colors used for payment for Converge + */ + public static int getConvergeCount(final SpellAbility sa, final Player ai) { + ManaCostBeingPaid cost = ComputerUtilMana.calculateManaCost(sa, true, 0); + if (payManaCost(cost, sa, ai, true, true)) { + return cost.getSunburst(); + } else { + return 0; + } + } // Does not check if mana sources can be used right now, just checks for potential chance. public static boolean hasEnoughManaSourcesToCast(final SpellAbility sa, final Player ai) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java index 58a260c6a35..84a96f53b4c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java @@ -29,7 +29,9 @@ public class DamageAllAi extends SpellAbilityAi { final String damage = sa.getParam("NumDmg"); int dmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa); - + if (damage.equals("X") && sa.getSVar(damage).equals("Count$Converge")) { + dmg = ComputerUtilMana.getConvergeCount(sa, ai); + } if (damage.equals("X") && sa.getSVar(damage).equals("Count$xPaid")) { // Set PayX here to maximum value. dmg = ComputerUtilMana.determineLeftoverMana(sa, ai); diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index 32b8e3c06db..29b3e067532 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -235,6 +235,9 @@ public class TokenAi extends SpellAbilityAi { if (this.tokenAmount.equals("X") || this.tokenPower.equals("X") || this.tokenToughness.equals("X")) { int x = AbilityUtils.calculateAmount(sa.getHostCard(), this.tokenAmount, sa); + if (source.getSVar("X").equals("Count$Converge")) { + x = ComputerUtilMana.getConvergeCount(sa, ai); + } if (source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. x = ComputerUtilMana.determineLeftoverMana(sa, ai); diff --git a/forge-gui/res/cardsfolder/r/radiant_flames.txt b/forge-gui/res/cardsfolder/r/radiant_flames.txt index 9762d345eed..0460fb9ddab 100644 --- a/forge-gui/res/cardsfolder/r/radiant_flames.txt +++ b/forge-gui/res/cardsfolder/r/radiant_flames.txt @@ -3,6 +3,5 @@ ManaCost:2 R Types:Sorcery A:SP$ DamageAll | Cost$ 2 R | NumDmg$ X | ValidCards$ Creature | ValidDescription$ each creature. | References$ X | SpellDescription$ Converge — CARDNAME deals X damage to each creature, where X is the number of colors of mana spent to cast CARDNAME. SVar:X:Count$Converge -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/radiant_flames.jpg Oracle:Converge — Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames. diff --git a/forge-gui/res/cardsfolder/s/skyrider_elf.txt b/forge-gui/res/cardsfolder/s/skyrider_elf.txt index f38833f9eda..32cb6dc2b9f 100644 --- a/forge-gui/res/cardsfolder/s/skyrider_elf.txt +++ b/forge-gui/res/cardsfolder/s/skyrider_elf.txt @@ -6,6 +6,5 @@ K:Flying K:etbCounter:P1P1:Y:no Condition:Converge — CARDNAME enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. SVar:X:Count$xPaid SVar:Y:Count$Converge -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/skyrider_elf.jpg Oracle:Flying\nConverge — Skyrider Elf enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. diff --git a/forge-gui/res/cardsfolder/u/unified_front.txt b/forge-gui/res/cardsfolder/u/unified_front.txt index 07464863494..24af25e2e3f 100644 --- a/forge-gui/res/cardsfolder/u/unified_front.txt +++ b/forge-gui/res/cardsfolder/u/unified_front.txt @@ -3,6 +3,5 @@ ManaCost:3 W Types:Sorcery A:SP$ Token | Cost$ 3 W | TokenAmount$ X | References$ X | TokenName$ Kor Ally | TokenTypes$ Creature,Kor,Ally | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Converge — Put a 1/1 white Kor Ally creature token onto the battlefield for each color of mana spent to cast CARDNAME. SVar:X:Count$Converge -SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/unified_front.jpg Oracle:Converge — Put a 1/1 white Kor Ally creature token onto the battlefield for each color of mana spent to cast Unified Front.