From 6450c91b2b13c30e3be1dade70e060ce80c9e25a Mon Sep 17 00:00:00 2001 From: Sloth Date: Tue, 14 Feb 2012 14:36:36 +0000 Subject: [PATCH] - Added two new AI functions containsUsefulKeyword and isUsefulKeyword, to be used by AF Pump and Attach. WIP. --- src/main/java/forge/ComputerUtil.java | 38 +++++++++++++++++++ .../abilityfactory/AbilityFactoryAttach.java | 9 ++--- .../abilityfactory/AbilityFactoryPump.java | 28 +++----------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/main/java/forge/ComputerUtil.java b/src/main/java/forge/ComputerUtil.java index ebc0a797b0e..ee9e58489cd 100644 --- a/src/main/java/forge/ComputerUtil.java +++ b/src/main/java/forge/ComputerUtil.java @@ -1951,4 +1951,42 @@ public class ComputerUtil { } return prevented; } + + public static boolean containsUsefulKeyword(final ArrayList keywords, Card card) { + for (final String keyword : keywords) { + if (isUsefulKeyword(keyword, card)) { + return true; + } + } + return false; + } + + public static boolean isUsefulKeyword(final String keyword, Card card) { + if (keyword.equals("Defender") || keyword.endsWith("CARDNAME can't attack.")) { + if (card.getController().isComputer() + || AllZone.getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) + || !CombatUtil.canAttack(card) + || card.getNetCombatDamage() <= 0) { + return false; + } + } else if (keyword.contains("CARDNAME can't block.")) { + if (card.getController().isComputer() + || AllZone.getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer()) + || !CombatUtil.canBlock(card)) { + return false; + } + } else if (keyword.endsWith("This card doesn't untap during your next untap step.")) { + if (AllZone.getPhaseHandler().isBefore(Constant.Phase.MAIN2) + || AllZone.getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer())) { + return false; + } + } else if (keyword.endsWith("CARDNAME attacks each turn if able.")) { + if (AllZone.getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) + || !CombatUtil.canAttack(card) + || !CombatUtil.canBeBlocked(card)) { + return false; + } + } + return true; + } } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java index b6875cf12fb..416771385d2 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java @@ -713,12 +713,12 @@ public class AbilityFactoryAttach { if (!keywords.isEmpty()) { // Don't give Can't Attack or Defender to cards that can't do these // things to begin with - if (keywords.contains("CARDNAME can't attack") || keywords.contains("Defender") + if (keywords.contains("CARDNAME can't attack.") || keywords.contains("Defender") || keywords.contains("CARDNAME attacks each turn if able.")) { prefList = prefList.filter(new CardListFilter() { @Override public boolean addCard(final Card c) { - return !(c.hasKeyword("CARDNAME can't attack") || c.hasKeyword("Defender")); + return !(c.hasKeyword("CARDNAME can't attack.") || c.hasKeyword("Defender")); } }); } @@ -897,11 +897,10 @@ public class AbilityFactoryAttach { if (abCost != null) { // No Aura spells have Additional Costs - } // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= .6667; + boolean chance = r.nextFloat() <= .9; // Attach spells always have a target final Target tgt = sa.getTarget(); @@ -929,8 +928,6 @@ public class AbilityFactoryAttach { return false; } - chance &= r.nextFloat() <= .9; - return chance; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java index 7d0d1debdd0..cea0bcd8416 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java @@ -380,28 +380,14 @@ public class AbilityFactoryPump { }); // leaves all creatures that will be destroyed } // -X/-X end else if (!list.isEmpty()) { - String[] kwPump = { "none" }; - if (!this.keywords.get(0).equals("none")) { - kwPump = this.keywords.toArray(new String[this.keywords.size()]); - } - final String[] keywords = kwPump; + final ArrayList keywords = this.keywords; final boolean addsKeywords = this.keywords.size() > 0; if (addsKeywords) { - if (!this.containsCombatRelevantKeyword(this.keywords) - && AllZone.getPhaseHandler().isBefore(Constant.Phase.MAIN2)) { - list.clear(); // this keyword is not combat relevenat - } else if (this.keywords.get(0).equals("HIDDEN CARDNAME attacks each turn if able.") - && AllZone.getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer())) { - list.clear(); - } - list = list.filter(new CardListFilter() { @Override public boolean addCard(final Card c) { - return !c.hasAnyKeyword(keywords); // don't add - // duplicate - // negative keywords + return ComputerUtil.containsUsefulKeyword(keywords, c); } }); } @@ -517,7 +503,7 @@ public class AbilityFactoryPump { if (cards.size() == 0) { return false; } - + final boolean givesKws = !this.keywords.get(0).equals("none"); String[] kwPump = { "none" }; if (givesKws) { @@ -540,14 +526,10 @@ public class AbilityFactoryPump { if (card.getController().isComputer()) { return false; } - if (AllZone.getPhaseHandler().isPlayerTurn(AllZone.getComputerPlayer()) - && this.keywords.contains("Defender")) { - return false; - } - if (AllZone.getPhaseHandler().isPlayerTurn(AllZone.getHumanPlayer()) - && this.keywords.contains("HIDDEN CARDNAME can't block.")) { + if (!ComputerUtil.containsUsefulKeyword(this.keywords, card)) { return false; } + return (r.nextFloat() <= Math.pow(.6667, activations)); } if (((card.getNetDefense() + defense) > 0) && (!card.hasAnyKeyword(this.keywords))) {