From 53e291c9bcecc053d84ff0375e1055225f9cd25c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Jun 2017 15:26:48 +0000 Subject: [PATCH] - Consolidate Sarkhan the Mad specific AI logic in SpecialCardAi until it is generalized. --- .../src/main/java/forge/ai/SpecialCardAi.java | 38 +++++++++++++++++++ .../java/forge/ai/ability/DamageDealAi.java | 2 +- .../java/forge/ai/ability/DamageEachAi.java | 11 +----- .../main/java/forge/ai/ability/DestroyAi.java | 16 +------- .../src/main/java/forge/ai/ability/DigAi.java | 3 +- 5 files changed, 45 insertions(+), 25 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index d8a4334a809..f3735e43f7e 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -17,6 +17,7 @@ */ package forge.ai; +import com.google.common.base.Predicate; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -409,6 +410,43 @@ public class SpecialCardAi { return new CardCollection(toKeep); } } + + // Sarkhan the Mad + public static class SarkhanTheMad { + public static boolean considerDig(Player ai, SpellAbility sa) { + return sa.getHostCard().getCounters(CounterType.LOYALTY) == 1; + } + + public static boolean considerMakeDragon(Player ai, SpellAbility sa) { + // TODO: expand this logic to make the AI force the opponent to sacrifice a big threat bigger than a 5/5 flier? + CardCollection creatures = ai.getCreaturesInPlay(); + boolean hasValidTgt = !CardLists.filter(creatures, new Predicate() { + @Override + public boolean apply(Card t) { + return t.getCurrentPower() < 5 && t.getCurrentToughness() < 5; + } + }).isEmpty(); + if (hasValidTgt) { + Card worstCreature = ComputerUtilCard.getWorstCreatureAI(creatures); + sa.getTargets().add(worstCreature); + return true; + } + return false; + } + + public static boolean considerUltimate(Player ai, SpellAbility sa, Player weakestOpp) { + int minLife = weakestOpp.getLife(); + + int dragonPower = 0; + CardCollection dragons = CardLists.filter(ai.getCreaturesInPlay(), CardPredicates.isType("Dragon")); + for (Card c : dragons) { + dragonPower += c.getCurrentPower(); + } + + return dragonPower >= minLife; + } + } + // Timetwister public static class Timetwister { public static boolean consider(Player ai, SpellAbility sa) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 8a3a358a8d6..ece7040dad4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -38,7 +38,7 @@ public class DamageDealAi extends DamageAiBase { Card source = sa.getHostCard(); if ("MadSarkhanDigDmg".equals(logic)) { - return source.getCounters(CounterType.LOYALTY) == 1; + return SpecialCardAi.SarkhanTheMad.considerDig(ai, sa); } if (damage.equals("X") && sa.getSVar(damage).equals("Count$ChosenNumber")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageEachAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageEachAi.java index f3081ab7003..f2f14bc67c9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageEachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageEachAi.java @@ -1,6 +1,7 @@ package forge.ai.ability; +import forge.ai.SpecialCardAi; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollection; @@ -31,15 +32,7 @@ public class DamageEachAi extends DamageAiBase { } if ("MadSarkhanUltimate".equals(logic)) { - int minLife = weakestOpp.getLife(); - - int dragonPower = 0; - CardCollection dragons = CardLists.filter(ai.getCreaturesInPlay(), CardPredicates.isType("Dragon")); - for (Card c : dragons) { - dragonPower += c.getCurrentPower(); - } - - return dragonPower >= minLife; + return SpecialCardAi.SarkhanTheMad.considerUltimate(ai, sa, weakestOpp); } final String damage = sa.getParam("NumDmg"); diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index 3960a560235..73210efb7a7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -9,6 +9,7 @@ import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCost; import forge.ai.ComputerUtilMana; import forge.ai.PlayerControllerAi; +import forge.ai.SpecialCardAi; import forge.ai.SpellAbilityAi; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; @@ -76,20 +77,7 @@ public class DestroyAi extends SpellAbilityAi { return targetingPlayer.getController().chooseTargetsFor(sa); } if ("MadSarkhanDragon".equals(logic)) { - // TODO: expand this logic to make the AI force the opponent to sacrifice a big threat bigger than a 5/5 flier? - CardCollection creatures = ai.getCreaturesInPlay(); - boolean hasValidTgt = !CardLists.filter(creatures, new Predicate() { - @Override - public boolean apply(Card t) { - return t.getCurrentPower() < 5 && t.getCurrentToughness() < 5; - } - }).isEmpty(); - if (hasValidTgt) { - Card worstCreature = ComputerUtilCard.getWorstCreatureAI(creatures); - sa.getTargets().add(worstCreature); - return true; - } - return false; + return SpecialCardAi.SarkhanTheMad.considerMakeDragon(ai, sa); } else if ("Polymorph".equals(logic)) { list = CardLists.getTargetableCards(ai.getCardsIn(ZoneType.Battlefield), sa); if (list.isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DigAi.java b/forge-ai/src/main/java/forge/ai/ability/DigAi.java index a5b4c853c5e..ad6bdb43b88 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java @@ -4,6 +4,7 @@ import forge.ai.ComputerUtil; import forge.ai.ComputerUtilAbility; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; +import forge.ai.SpecialCardAi; import forge.ai.SpellAbilityAi; import forge.game.Game; import forge.game.ability.AbilityUtils; @@ -94,7 +95,7 @@ public class DigAi extends SpellAbilityAi { } if ("MadSarkhanDigDmg".equals(sa.getParam("AILogic"))) { - return host.getCounters(CounterType.LOYALTY) == 1; + return SpecialCardAi.SarkhanTheMad.considerDig(ai, sa); } return !ComputerUtil.preventRunAwayActivations(sa);