From cbaa40d499ca748f2dec3e091383a81595fa419b Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 23 Sep 2016 14:36:21 +0000 Subject: [PATCH] - Adding AI for Combustible Gearhulk based upon known information. - Adding current Energy count to payenergy cost --- .../ai/ability/ChooseGenericEffectAi.java | 24 +++++++++++++++---- .../cardsfolder/c/combustible_gearhulk.txt | 2 +- .../java/forge/player/HumanCostDecision.java | 3 ++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index 59b3c71e828..5f872096c2f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -5,12 +5,8 @@ import forge.ai.ComputerUtilCost; import forge.ai.SpellAbilityAi; import forge.card.MagicColor; import forge.game.Game; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardLists; +import forge.game.card.*; import forge.game.card.CardPredicates.Presets; -import forge.game.card.CardUtil; -import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.Cost; @@ -274,6 +270,24 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { int evalToken = ComputerUtilCard.evaluateCreatureList(tokenList); return evalToken >= evalCounter ? tokenSA : counterSA; + } else if ("CombustibleGearhulk".equals(logic)) { + Player controller = sa.getActivatingPlayer(); + List zones = ZoneType.listValueOf("Graveyard, Battlefield, Exile"); + int life = player.getLife(); + CardCollectionView revealedCards = controller.getCardsIn(zones); + + if (revealedCards.size() < 5) { + // Not very many revealed cards, just guess based on lifetotal + return life < 7 ? spells.get(0) : spells.get(1); + } + + int totalCMC = 0; + for(Card c : revealedCards) { + totalCMC += c.getCMC(); + } + + int bestGuessDamage = totalCMC * 3 / revealedCards.size(); + return life <= bestGuessDamage ? spells.get(0) : spells.get(1); } return spells.get(0); // return first choice if no logic found } diff --git a/forge-gui/res/cardsfolder/c/combustible_gearhulk.txt b/forge-gui/res/cardsfolder/c/combustible_gearhulk.txt index 620cb66d803..2293b1c7c13 100644 --- a/forge-gui/res/cardsfolder/c/combustible_gearhulk.txt +++ b/forge-gui/res/cardsfolder/c/combustible_gearhulk.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Construct PT:6/6 K:First Strike T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBChoice | TriggerDescription$ When CARDNAME enters the battlefield, target opponent may have you draw three cards. If the player doesn't, put the top three cards of your library into your graveyard, then CARDNAME deals damage to that player equal to the total converted mana cost of those cards. -SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ CombustDraw,CombustDamage +SVar:DBChoice:DB$ GenericChoice | ValidTgts$ Opponent | Choices$ CombustDraw,CombustDamage | AILogic$ CombustibleGearhulk SVar:CombustDraw:DB$ Draw | Defined$ You | NumCards$ 3 | SpellDescription$ Controller draws three cards SVar:CombustDamage:DB$ Mill | Defined$ You | NumCards$ 3 | RememberMilled$ True | SubAbility$ DamageOpponent | SpellDescription$ Mill 3 and take damage equal to total converted mana cost. SVar:DamageOpponent:DB$ DealDamage | Defined$ ParentTarget | NumDmg$ X | References$ X | SubAbility$ DBCleanup diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 1fd6f418f71..482d3e57e23 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -581,7 +581,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { } } - if (player.canPayEnergy(c) && player.getController().confirmPayment(cost, "Pay " + c + " Energy?")) { + if (player.canPayEnergy(c) && + player.getController().confirmPayment(cost, "Pay " + c + " Energy? (You have " + player.getCounters(CounterType.ENERGY) + ")")) { return PaymentDecision.number(c); } return null;