diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 72eee16326a..3bcc46a222d 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -857,7 +857,7 @@ public class AiAttackController { public final static int countExaltedBonus(final Player player) { int bonus = 0; for (Card c : player.getCardsIn(ZoneType.Battlefield)) { - bonus += c.getKeywordAmount("Exalted"); + bonus += c.getAmountOfKeyword("Exalted"); } return bonus; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 2bf6bea71e5..221955e31ec 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -1140,7 +1140,7 @@ public class ComputerUtilCombat { //check Exalted only for the first attacker if (combat != null && combat.getAttackers().isEmpty()) { for (Card card : attacker.getController().getCardsIn(ZoneType.Battlefield)) { - power += card.getKeywordAmount("Exalted"); + power += card.getAmountOfKeyword("Exalted"); } } @@ -1323,7 +1323,7 @@ public class ComputerUtilCombat { //check Exalted only for the first attacker if (combat != null && combat.getAttackers().isEmpty()) { for (Card card : attacker.getController().getCardsIn(ZoneType.Battlefield)) { - toughness += card.getKeywordAmount("Exalted"); + toughness += card.getAmountOfKeyword("Exalted"); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index c8627ff088b..2d8f1db7d4e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -362,8 +362,8 @@ public abstract class PumpAiBase extends SpellAbilityAi { || !ph.getPhase().equals(PhaseType.COMBAT_DECLARE_ATTACKERS)) { return false; } - int canBlockNum = 1 + card.getKeywordAmount("CARDNAME can block an additional creature.") + - card.getKeywordAmount("CARDNAME can block an additional ninety-nine creatures.") * 99; + int canBlockNum = 1 + card.getAmountOfKeyword("CARDNAME can block an additional creature.") + + card.getAmountOfKeyword("CARDNAME can block an additional ninety-nine creatures.") * 99; int possibleBlockNum = 0; for (Card attacker : game.getCombat().getAttackers()) { if (CombatUtil.canBlock(attacker, card)) { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 440d52b2a16..6ff58e14851 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2754,16 +2754,6 @@ public class Card extends GameEntity implements Comparable { visitHiddenExtreinsicKeywords(visitor); } - public final int getKeywordAmount(String keyword) { - return getKeywordAmount(currentState, keyword); - } - - public final int getKeywordAmount(CardState state, String keyword) { - CountKeywordVisitor visitor = new CountKeywordVisitor(keyword); - visitKeywords(state, visitor); - return visitor.getCount(); - } - @Override public final boolean hasKeyword(String keyword) { return hasKeyword(keyword, currentState); @@ -3334,26 +3324,18 @@ public class Card extends GameEntity implements Comparable { return hasStartOfKeyword(keyword, currentState); } public final boolean hasStartOfKeyword(String keyword, CardState state) { - final List a = getKeywords(state); - for (int i = 0; i < a.size(); i++) { - if (a.get(i).toString().startsWith(keyword)) { - return true; - } - } - return false; + CountKeywordVisitor visitor = new CountKeywordVisitor(keyword, true); + visitKeywords(state, visitor); + return visitor.getCount() > 0; } public final boolean hasStartOfUnHiddenKeyword(String keyword) { return hasStartOfUnHiddenKeyword(keyword, currentState); } public final boolean hasStartOfUnHiddenKeyword(String keyword, CardState state) { - final List a = getUnhiddenKeywords(state); - for (int i = 0; i < a.size(); i++) { - if (a.get(i).toString().startsWith(keyword)) { - return true; - } - } - return false; + CountKeywordVisitor visitor = new CountKeywordVisitor(keyword, true); + visitUnhiddenKeywords(state, visitor); + return visitor.getCount() > 0; } public final int getKeywordPosition(String k) { @@ -3386,13 +3368,9 @@ public class Card extends GameEntity implements Comparable { return getAmountOfKeyword(k, currentState); } public final int getAmountOfKeyword(final String k, CardState state) { - int count = 0; - for (String kw : getKeywords(state)) { - if (kw.equals(k)) { - count++; - } - } - return count; + CountKeywordVisitor visitor = new CountKeywordVisitor(k); + visitKeywords(state, visitor); + return visitor.getCount(); } // This is for keywords with a number like Bushido, Annihilator and Rampage. @@ -6404,15 +6382,22 @@ public class Card extends GameEntity implements Comparable { private static final class CountKeywordVisitor extends Visitor { private String keyword; private int count; + private boolean startOf; public CountKeywordVisitor(String keyword) { this.keyword = keyword; this.count = 0; + this.startOf = false; + } + + public CountKeywordVisitor(String keyword, boolean startOf) { + this(keyword); + this.startOf = startOf; } @Override public void visit(String kw) { - if (kw.equals(keyword)) { + if ((startOf && kw.startsWith(keyword)) || kw.equals(keyword)) { count++; } } diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index ec0b3965d3b..0e61af7d59f 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -437,8 +437,8 @@ public class CombatUtil { if (blockedBy.isEmpty() || blocker.hasKeyword("CARDNAME can block any number of creatures.")) { return true; } - int canBlockMore = blocker.getKeywordAmount("CARDNAME can block an additional creature.") - + blocker.getKeywordAmount("CARDNAME can block an additional ninety-nine creatures.") * 99; + int canBlockMore = blocker.getAmountOfKeyword("CARDNAME can block an additional creature.") + + blocker.getAmountOfKeyword("CARDNAME can block an additional ninety-nine creatures.") * 99; return canBlockMore >= blockedBy.size(); } @@ -1029,7 +1029,7 @@ public class CombatUtil { public static void handleFlankingKeyword(final Game game, final Card attacker, final List blockers) { for (final Card blocker : blockers) { if (attacker.hasKeyword("Flanking") && !blocker.hasKeyword("Flanking")) { - final int flankingMagnitude = attacker.getKeywordAmount("Flanking"); + final int flankingMagnitude = attacker.getAmountOfKeyword("Flanking"); // Rule 702.23b: If a creature has multiple instances of flanking, each triggers separately. for (int i = 0; i < flankingMagnitude; i++) { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 8e6aab3fe23..6ea0f7604ee 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -386,7 +386,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { && !activator.canCastSorcery()) { return false; } - final int limits = c.getKeywordAmount("May activate CARDNAME's loyalty abilities once"); + final int limits = c.getAmountOfKeyword("May activate CARDNAME's loyalty abilities once"); int numActivates = 0; for (final SpellAbility pwAbs : c.getAllSpellAbilities()) { // check all abilities on card that have their planeswalker