From c40d5cd4c5cdde34463e5ad8447de85b9448992f Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 26 Nov 2019 18:28:18 +0300 Subject: [PATCH] - Basic CantUntapTurnAi logic. --- .../src/main/java/forge/ai/SpellApiToAi.java | 1 + .../forge/ai/ability/CantUntapTurnAi.java | 64 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 forge-ai/src/main/java/forge/ai/ability/CantUntapTurnAi.java diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index f3b3421c40b..ad44ea104e8 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -33,6 +33,7 @@ public enum SpellApiToAi { .put(ApiType.BidLife, BidLifeAi.class) .put(ApiType.Bond, BondAi.class) .put(ApiType.Branch, AlwaysPlayAi.class) + .put(ApiType.CantUntapTurn, CantUntapTurnAi.class) .put(ApiType.ChangeCombatants, CannotPlayAi.class) .put(ApiType.ChangeTargets, ChangeTargetsAi.class) .put(ApiType.ChangeX, AlwaysPlayAi.class) diff --git a/forge-ai/src/main/java/forge/ai/ability/CantUntapTurnAi.java b/forge-ai/src/main/java/forge/ai/ability/CantUntapTurnAi.java new file mode 100644 index 00000000000..9b8f609d0b5 --- /dev/null +++ b/forge-ai/src/main/java/forge/ai/ability/CantUntapTurnAi.java @@ -0,0 +1,64 @@ +package forge.ai.ability; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import forge.ai.ComputerUtilCard; +import forge.ai.SpellAbilityAi; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CardLists; +import forge.game.card.CardPredicates; +import forge.game.cost.CostPutCounter; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.game.zone.ZoneType; + +public class CantUntapTurnAi extends SpellAbilityAi { + @Override + protected boolean canPlayAI(Player ai, SpellAbility sa) { + if (sa.usesTargeting()) { + CardCollection oppCards = ai.getOpponents().getCardsIn(ZoneType.Battlefield); + + CardCollection relevantToHold = CardLists.filter(oppCards, + Predicates.and(CardPredicates.Presets.TAPPED, new Predicate() { + @Override + public boolean apply(Card card) { + if (card.isCreature()) { + return true; + } + for (final SpellAbility ab : card.getSpellAbilities()) { + if (ab.isAbility() && (ab.getPayCosts() != null) && ab.getPayCosts().hasTapCost()) { + return true; + } + } + return false; + } + })); + + Card bestToTap = ComputerUtilCard.getBestAI(relevantToHold); + Card validTarget = ComputerUtilCard.getBestAI(CardLists.filter(oppCards, CardPredicates.Presets.TAPPED)); + if (validTarget == null) { + validTarget = ComputerUtilCard.getBestAI(oppCards); + } + + if (bestToTap != null) { + sa.getTargets().add(bestToTap); + return true; + } else if (sa.hasParam("Planeswalker") + && sa.getPayCosts() != null && sa.getPayCosts().hasSpecificCostType(CostPutCounter.class)) { + sa.getTargets().add(validTarget); + return true; + } + + return false; + } + + + return true; + } + + @Override + protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { + return mandatory || canPlayAI(aiPlayer, sa); + } +}