From f16a7ff0b0be6f71e1bea401b29b17fe2d1b4e68 Mon Sep 17 00:00:00 2001 From: Seravy Date: Sun, 18 Feb 2018 15:32:14 +0100 Subject: [PATCH 1/7] incomplete --- .../src/main/java/forge/ai/AiController.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 65a73a93cda..464a05b9bed 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -703,6 +703,36 @@ public class AiController { if ("True".equals(card.getSVar("NonStackingEffect")) && isNonDisabledCardInPlay(card.getName())) { return AiPlayDecision.NeedsToPlayCriteriaNotMet; } + // Trying to play a card that has Buyback without a Buyback cost + if (card.hasKeyword("Buyback")) { // This line does not work? + if (!sa.isBuyBackAbility()) { + boolean wastebuybackallowed = false; + // About to lose game : allow + if (ComputerUtil.aiLifeInDanger(player, true, 0)) { + wastebuybackallowed = true; + } + int copies = 0; + // Have two copies : allow + for (Card hand : player.getCardsIn(ZoneType.Hand)) { + if (hand.getName().equals(card.getName())) { + copies++; + } + } + if (copies >= 2) { + wastebuybackallowed = true; + } + // Won't be able to afford buyback any time soon + /* if ( ComputerUtilMana.getAvailableManaEstimate(player) >= + sa. + + + ) { wastebuybackallowed = true; } */ + + // If Buyback cost includes sacrifice, life, discard + + if (!wastebuybackallowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; + } + } // add any other necessary logic to play a basic spell here return ComputerUtilCard.checkNeedsToPlayReqs(card, sa); } From 537259989f659d292b484097583c09fd5bdb2fd0 Mon Sep 17 00:00:00 2001 From: Seravy Date: Sun, 18 Feb 2018 16:47:29 +0100 Subject: [PATCH 2/7] AI will avoid wasting a BUYBACK card without paying the buyback cost when able --- .../src/main/java/forge/ai/AiController.java | 26 ++++++++++++++----- 1 file changed, 19 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 464a05b9bed..7e9c6d31502 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -704,7 +704,9 @@ public class AiController { return AiPlayDecision.NeedsToPlayCriteriaNotMet; } // Trying to play a card that has Buyback without a Buyback cost - if (card.hasKeyword("Buyback")) { // This line does not work? + + if (card.hasStartOfKeyword("Buyback")) { + //if (card.getBuybackAbility()!=null) { if (!sa.isBuyBackAbility()) { boolean wastebuybackallowed = false; // About to lose game : allow @@ -722,13 +724,23 @@ public class AiController { wastebuybackallowed = true; } // Won't be able to afford buyback any time soon - /* if ( ComputerUtilMana.getAvailableManaEstimate(player) >= - sa. - - - ) { wastebuybackallowed = true; } */ - // If Buyback cost includes sacrifice, life, discard + int neededMana = 0; + for (SpellAbility sa2 : GameActionUtil.getOptionalCosts(sa)) { + if (sa2.isOptionalCostPaid(OptionalCost.Buyback)) { + neededMana = sa2.getPayCosts().getCostMana().getMana().getCMC(); + if (sa2.getPayCosts().hasSpecificCostType(CostPayLife.class) + || (sa2.getPayCosts().hasSpecificCostType(CostDiscard.class)) || + (sa2.getPayCosts().hasSpecificCostType(CostSacrifice.class)) + ) { + neededMana = 999; + } + } + } + int hasmana = ComputerUtilMana.getAvailableManaEstimate(player, false); + if (hasmana < neededMana - 1) { + wastebuybackallowed = true; + } if (!wastebuybackallowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; } From cbc0335d901972ac6e099536b363e3113dd60936 Mon Sep 17 00:00:00 2001 From: Seravy Date: Sun, 18 Feb 2018 18:43:23 +0100 Subject: [PATCH 3/7] Trying to get effective cost instead of original cost but doesn't seem to recognize Memory Crystal anyway. I guess it's not that important. --- forge-ai/src/main/java/forge/ai/AiController.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 7e9c6d31502..836bc320731 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -728,10 +728,12 @@ public class AiController { int neededMana = 0; for (SpellAbility sa2 : GameActionUtil.getOptionalCosts(sa)) { if (sa2.isOptionalCostPaid(OptionalCost.Buyback)) { - neededMana = sa2.getPayCosts().getCostMana().getMana().getCMC(); - if (sa2.getPayCosts().hasSpecificCostType(CostPayLife.class) - || (sa2.getPayCosts().hasSpecificCostType(CostDiscard.class)) || - (sa2.getPayCosts().hasSpecificCostType(CostSacrifice.class)) + Cost sac = sa2.getPayCosts(); + CostAdjustment.adjust(sac, sa2); // Does not recognize Memory Crystal anyway??? + neededMana = sac.getCostMana().getMana().getCMC(); + if (sac.hasSpecificCostType(CostPayLife.class) + || (sac.hasSpecificCostType(CostDiscard.class)) || + (sac.hasSpecificCostType(CostSacrifice.class)) ) { neededMana = 999; } From e3b4c59b9f7f51307a63c6064a40f8882c708dfb Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 12:50:15 +0000 Subject: [PATCH 4/7] Update AiController.java --- forge-ai/src/main/java/forge/ai/AiController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 836bc320731..3e86c849cfb 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -733,8 +733,7 @@ public class AiController { neededMana = sac.getCostMana().getMana().getCMC(); if (sac.hasSpecificCostType(CostPayLife.class) || (sac.hasSpecificCostType(CostDiscard.class)) || - (sac.hasSpecificCostType(CostSacrifice.class)) - ) { + (sac.hasSpecificCostType(CostSacrifice.class))) { neededMana = 999; } } From 3346cbf0c5dc05a74ec7eb130f27135281265ad5 Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 17:05:56 +0000 Subject: [PATCH 5/7] Update AiController.java --- forge-ai/src/main/java/forge/ai/AiController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 3e86c849cfb..0a9f51bd98d 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -708,10 +708,10 @@ public class AiController { if (card.hasStartOfKeyword("Buyback")) { //if (card.getBuybackAbility()!=null) { if (!sa.isBuyBackAbility()) { - boolean wastebuybackallowed = false; + boolean wasteBuybackAllowed = false; // About to lose game : allow if (ComputerUtil.aiLifeInDanger(player, true, 0)) { - wastebuybackallowed = true; + wasteBuybackAllowed = true; } int copies = 0; // Have two copies : allow @@ -721,7 +721,7 @@ public class AiController { } } if (copies >= 2) { - wastebuybackallowed = true; + wasteBuybackAllowed = true; } // Won't be able to afford buyback any time soon // If Buyback cost includes sacrifice, life, discard @@ -740,10 +740,10 @@ public class AiController { } int hasmana = ComputerUtilMana.getAvailableManaEstimate(player, false); if (hasmana < neededMana - 1) { - wastebuybackallowed = true; + wasteBuybackAllowed = true; } - if (!wastebuybackallowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; + if (!wasteBuybackAllowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; } } // add any other necessary logic to play a basic spell here From b3c8901aa1a7aa488d6f38c30b6d08dd5c31b05c Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 17:08:09 +0000 Subject: [PATCH 6/7] Update AiController.java --- forge-ai/src/main/java/forge/ai/AiController.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 0a9f51bd98d..4cba38a474f 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -713,13 +713,8 @@ public class AiController { if (ComputerUtil.aiLifeInDanger(player, true, 0)) { wasteBuybackAllowed = true; } - int copies = 0; + int copies = CardLists.filter(player.getCardsIn(ZoneType.Hand), CardPredicates.nameEquals(card.getName())).size(); // Have two copies : allow - for (Card hand : player.getCardsIn(ZoneType.Hand)) { - if (hand.getName().equals(card.getName())) { - copies++; - } - } if (copies >= 2) { wasteBuybackAllowed = true; } From b54e8461b8948323d9fda2e617758d1163b1dfe0 Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 17:10:13 +0000 Subject: [PATCH 7/7] Update AiController.java --- forge-ai/src/main/java/forge/ai/AiController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 4cba38a474f..aece8718126 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -733,8 +733,8 @@ public class AiController { } } } - int hasmana = ComputerUtilMana.getAvailableManaEstimate(player, false); - if (hasmana < neededMana - 1) { + int hasMana = ComputerUtilMana.getAvailableManaEstimate(player, false); + if (hasMana < neededMana - 1) { wasteBuybackAllowed = true; }