From d3676ff1de314b28989eb89b26adc92498b8432d Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 25 Sep 2012 07:25:01 +0000 Subject: [PATCH] more specific methods removed from CardList --- src/main/java/forge/Card.java | 6 +- src/main/java/forge/CardColor.java | 29 +- src/main/java/forge/CardList.java | 106 +------ src/main/java/forge/CardListUtil.java | 269 +++--------------- src/main/java/forge/CardPredicates.java | 98 +++++-- src/main/java/forge/CardUtil.java | 7 +- .../abilityfactory/AbilityFactoryPump.java | 3 +- .../AbilityFactoryZoneAffecting.java | 4 +- .../card/cardfactory/CardFactoryUtil.java | 28 +- .../java/forge/game/player/ComputerUtil.java | 19 +- src/main/java/forge/game/player/Player.java | 2 +- .../java/forge/util/closures/Predicate.java | 17 +- 12 files changed, 183 insertions(+), 405 deletions(-) diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 85a3f101810..ae746befed3 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -1789,7 +1789,7 @@ public class Card extends GameEntity implements Comparable { j--; } - colors.addToCardColor(cc.toStringArray()); + colors.addToCardColor(cc); if (!cc.getAdditional()) { return colors; } @@ -1797,7 +1797,7 @@ public class Card extends GameEntity implements Comparable { while (i >= 0) { final CardColor cc = this.getCharacteristics().getCardColor().get(i); i--; - colors.addToCardColor(cc.toStringArray()); + colors.addToCardColor(cc); if (!cc.getAdditional()) { return colors; } @@ -1805,7 +1805,7 @@ public class Card extends GameEntity implements Comparable { while (j >= 0) { final CardColor cc = globalChanges.get(j); j--; - colors.addToCardColor(cc.toStringArray()); + colors.addToCardColor(cc); if (!cc.getAdditional()) { return colors; } diff --git a/src/main/java/forge/CardColor.java b/src/main/java/forge/CardColor.java index 1ca400c627e..769b32495a4 100644 --- a/src/main/java/forge/CardColor.java +++ b/src/main/java/forge/CardColor.java @@ -17,7 +17,10 @@ */ package forge; +import java.util.ArrayList; import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; import forge.card.mana.ManaCost; @@ -29,7 +32,15 @@ import forge.card.mana.ManaCost; * @author Forge * @version $Id$ */ -public class CardColor { +public class CardColor implements Iterable{ + /* (non-Javadoc) + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + return col.iterator(); + } + // takes care of individual card color, for global color change effects use // AllZone.getGameInfo().getColorChanges() private final EnumSet col; @@ -134,6 +145,14 @@ public class CardColor { } } + public final void addToCardColor(final Iterable cc) { + for( Color c : cc ) { + if (!this.col.contains(c)) { + this.col.add(c); + } + } + } + /** *

* fixColorless. @@ -188,4 +207,12 @@ public class CardColor { } return list; } + + public final List toStringList() { + final List list = new ArrayList(this.col.size()); + for (final Color c : this.col) { + list.add(c.toString()); + } + return list; + } } diff --git a/src/main/java/forge/CardList.java b/src/main/java/forge/CardList.java index c957d28af5c..946c6c48c30 100644 --- a/src/main/java/forge/CardList.java +++ b/src/main/java/forge/CardList.java @@ -22,7 +22,6 @@ import java.util.Collections; import java.util.Comparator; import forge.card.spellability.SpellAbility; -import forge.game.phase.CombatUtil; import forge.game.player.Player; import forge.util.MyRandom; import forge.util.closures.Predicate; @@ -58,9 +57,6 @@ public class CardList extends ArrayList { this.add(c); } - public final void sort(final Comparator c) { - Collections.sort(this, c); - } /** *

* toArray. @@ -68,6 +64,7 @@ public class CardList extends ArrayList { * * @return an array of {@link forge.Card} objects. */ + @Override public final Card[] toArray() { final Card[] c = new Card[this.size()]; this.toArray(c); @@ -230,22 +227,8 @@ public class CardList extends ArrayList { return this.filter(CardPredicates.isTargetableBy(source)); } - /** - *

- * getUnprotectedCards. - *

- * - * @param source - * a {@link forge.Card} object. - * @return a {@link forge.CardList} object. - */ public final CardList getUnprotectedCards(final Card source) { - return this.filter(new Predicate() { - @Override - public boolean isTrue(final Card c) { - return !c.hasProtectionFrom(source); - } - }); + return this.filter(Predicate.not(CardPredicates.isProtectedFrom(source))); } /** @@ -287,91 +270,6 @@ public class CardList extends ArrayList { }); } - /** - *

- * getPossibleAttackers. - *

- * - * @return a {@link forge.CardList} object. - */ - public final CardList getPossibleAttackers() { - return this.filter(new Predicate() { - @Override - public boolean isTrue(final Card c) { - return (c.isCreature() && CombatUtil.canAttack(c)); - } - }); - } - - /** - *

- * getHighestConvertedManaCost. - *

- * - * @return a int. - * @since 1.0.15 - */ - public final int getHighestConvertedManaCost() { - int total = 0; - for (int i = 0; i < this.size(); i++) { - total = Math.max(total, this.get(i).getCMC()); - } - return total; - } - - /** - *

- * getColored. - *

- * - * @return a {@link forge.CardList} object. - */ - public final CardList getColored() { - return this.filter(new Predicate() { - @Override - public boolean isTrue(final Card c) { - return (!c.isColorless()); - } - }); - } - - /** - *

- * getMonoColored. - *

- * @param includeColorless should colorless cards be included? - * - * @return a {@link forge.CardList} object. - */ - public final CardList getMonoColored(final boolean includeColorless) { - return this.filter(new Predicate() { - @Override - public boolean isTrue(final Card c) { - return (CardUtil.getColors(c).size() == 1 && (includeColorless || !c.isColorless())); - } - }); - } - - /** - *

- * getColor. - *

- * - * @param cardColor - * a {@link java.lang.String} object. - * @return a {@link forge.CardList} object. - */ - public final CardList getColor(final String cardColor) { - final CardList list = new CardList(); - for (final Card c : this) { - if (cardColor.equals("Multicolor") && (c.getColor().size() > 1)) { - list.add(c); - } else if (c.isColor(cardColor) && (c.getColor().size() == 1)) { - list.add(c); - } - } - return list; - } // getColor() } // end class CardList diff --git a/src/main/java/forge/CardListUtil.java b/src/main/java/forge/CardListUtil.java index 6695ffdb33f..a98b144ca75 100644 --- a/src/main/java/forge/CardListUtil.java +++ b/src/main/java/forge/CardListUtil.java @@ -17,11 +17,9 @@ */ package forge; -import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; -import com.esotericsoftware.minlog.Log; - import forge.card.cardfactory.CardFactoryUtil; import forge.util.closures.Predicate; @@ -74,20 +72,34 @@ public class CardListUtil { return CardFactoryUtil.evaluateCreature(b) - CardFactoryUtil.evaluateCreature(a); } }; - - - /** - *

- * Sorts a CardList by toughness, putting highest toughness first. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - public static void sortDefense(final CardList list) { - list.sort(DefenseComparator); - } // sortDefense() + public static final Comparator CmcComparator = new Comparator() { + @Override + public int compare(final Card a, final Card b) { + return b.getCMC() - a.getCMC(); + } + }; + + public static final Comparator TextLenReverseComparator = new Comparator() { + @Override + public int compare(final Card a, final Card b) { + final int aLen = a.getText().length(); + final int bLen = b.getText().length(); + return aLen - bLen; + } + }; + + public static final Comparator getKeywordComparator(final String kw) { + return new Comparator() { + @Override + public int compare(final Card a, final Card b) { + int aV = a.hasKeyword(kw) ? 1 : 0; + int bV = b.hasKeyword(kw) ? 1 : 0; + return bV - aV; + } + }; + } + // the higher the attack the better /** *

@@ -98,8 +110,7 @@ public class CardListUtil { * a {@link forge.CardList} object. */ public static void sortAttack(final CardList list) { - - list.sort(AttackComparator); + Collections.sort(list, AttackComparator); } // sortAttack() /** @@ -112,7 +123,7 @@ public class CardListUtil { * a {@link forge.CardList} object. */ public static void sortByEvaluateCreature(final CardList list) { - list.sort(EvaluateCreatureComparator); + Collections.sort(list, EvaluateCreatureComparator); } // sortByEvaluateCreature() /** @@ -124,13 +135,7 @@ public class CardListUtil { * a {@link forge.CardList} object. */ public static void sortByMostExpensive(final CardList list) { - final Comparator com = new Comparator() { - @Override - public int compare(final Card a, final Card b) { - return b.getCMC() - a.getCMC(); - } - }; - list.sort(com); + Collections.sort(list, CmcComparator); } // sortByMostExpensive() // the lower the attack the better @@ -143,13 +148,7 @@ public class CardListUtil { * a {@link forge.CardList} object. */ public static void sortAttackLowFirst(final CardList list) { - final Comparator com = new Comparator() { - @Override - public int compare(final Card a, final Card b) { - return a.getNetCombatDamage() - b.getNetCombatDamage(); - } - }; - list.sort(com); + Collections.sort(list, Collections.reverseOrder(AttackComparator)); } // sortAttackLowFirst() /** @@ -174,114 +173,9 @@ public class CardListUtil { * a {@link forge.CardList} object. */ public static void sortFlying(final CardList list) { - sortByKeyword(list, "Flying"); + Collections.sort(list, getKeywordComparator("Flying")); } // sortFlying() - /** - *

- * sortByKeyword. - *

- * - * @param list - * a {@link forge.CardList} object. - * @param kw - * a {@link java.lang.String} object. - */ - public static void sortByKeyword(final CardList list, final String kw) { - final String keyword = kw; - final Comparator com = new Comparator() { - @Override - public int compare(final Card a, final Card b) { - if (a.hasKeyword(keyword) && b.hasKeyword(keyword)) { - return 0; - } else if (a.hasKeyword(keyword)) { - return -1; - } else if (b.hasKeyword(keyword)) { - return 1; - } - - return 0; - } - }; - list.sort(com); - } // sortByKeyword() - - /** - *

- * sortByDestroyEffect. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - public static void sortByDestroyEffect(final CardList list) { - final Comparator com = new Comparator() { - @Override - public int compare(final Card a, final Card b) { - final ArrayList aKeywords = a.getKeyword(); - final ArrayList bKeywords = b.getKeyword(); - - boolean aContains = false; - boolean bContains = false; - - for (final String kw : aKeywords) { - if (kw.startsWith("Whenever") && kw.contains("into a graveyard from the battlefield,")) { - aContains = true; - break; - } - } - - for (final String kw : bKeywords) { - if (kw.startsWith("Whenever") && kw.contains("into a graveyard from the battlefield,")) { - bContains = true; - break; - } - } - if (aContains && bContains) { - return 0; - } else if (aContains) { - return 1; - } else if (bContains) { - return -1; - } - - return 0; - } - }; - list.sort(com); - } - - - - /** - *

- * sortByTextLen. - *

- * - * @param list - * a {@link forge.CardList} object. - */ - public static void sortByTextLen(final CardList list) { - final Comparator com = new Comparator() { - @Override - public int compare(final Card a, final Card b) { - final int aLen = a.getText().length(); - final int bLen = b.getText().length(); - - if (aLen == bLen) { - return 0; - } else if (aLen > bLen) { - return 1; - } else if (bLen > aLen) { - return -1; - } - - return 0; - } - }; - list.sort(com); - } - /** *

* Sorts a CardList from highest converted mana cost to lowest. @@ -291,26 +185,7 @@ public class CardListUtil { * a {@link forge.CardList} object. */ public static void sortCMC(final CardList list) { - final Comparator com = new Comparator() { - @Override - public int compare(final Card a, final Card b) { - final int cmcA = a.getManaCost().getCMC(); - final int cmcB = b.getManaCost().getCMC(); - - if (cmcA == cmcB) { - return 0; - } - if (cmcA > cmcB) { - return -1; - } - if (cmcB > cmcA) { - return 1; - } - - return 0; - } - }; - list.sort(com); + Collections.sort( list, CmcComparator ); } // sortCMC /** @@ -351,72 +226,6 @@ public class CardListUtil { }); } - /** - *

- * sumAttack. - *

- * - * @param c - * a {@link forge.CardList} object. - * @return a int. - */ - public static int sumAttack(final CardList c) { - int attack = 0; - - for (int i = 0; i < c.size(); i++) { - // if(c.get(i).isCreature() && c.get(i).hasSecondStrike()) { - if (c.get(i).isCreature() - && (!c.get(i).hasFirstStrike() || (c.get(i).hasDoubleStrike() && c.get(i).hasFirstStrike()))) { - attack += c.get(i).getNetCombatDamage(); - } - } - // System.out.println("Total attack: " +attack); - return attack; - } // sumAttack() - - /** - *

- * sumDefense. - *

- * - * @param c - * a {@link forge.CardList} object. - * @return a int. - */ - public static int sumDefense(final CardList c) { - int defense = 0; - - for (int i = 0; i < c.size(); i++) { - // if(c.get(i).isCreature() && c.get(i).hasSecondStrike()) { - if (c.get(i).isCreature()) { - defense += c.get(i).getNetDefense(); - } - } - // System.out.println("Total attack: " +attack); - return defense; - } // sumAttack() - - /** - *

- * sumFirstStrikeAttack. - *

- * - * @param c - * a {@link forge.CardList} object. - * @return a int. - */ - public static int sumFirstStrikeAttack(final CardList c) { - int attack = 0; - - for (int i = 0; i < c.size(); i++) { - if (c.get(i).isCreature() && (c.get(i).hasFirstStrike() || c.get(i).hasDoubleStrike())) { - attack += c.get(i).getNetCombatDamage(); - } - } - Log.debug("Total First Strike attack: " + attack); - return attack; - } // sumFirstStrikeAttack() - // Get the total converted mana cost of a card list /** *

@@ -428,15 +237,7 @@ public class CardListUtil { * @return a int. */ public static int sumCMC(final CardList c) { - int cmc = 0; - - for (int i = 0; i < c.size(); i++) { - cmc += c.get(i).getManaCost().getCMC(); - } - // System.out.println("Total CMC: " +cmc); - - return cmc; - + return CardPredicates.Presets.All.sum(c, CardPredicates.Accessors.fnGetCmc); } // sumCMC /** diff --git a/src/main/java/forge/CardPredicates.java b/src/main/java/forge/CardPredicates.java index 4d28ecf5739..60795cc8e30 100644 --- a/src/main/java/forge/CardPredicates.java +++ b/src/main/java/forge/CardPredicates.java @@ -20,6 +20,7 @@ package forge; import forge.card.spellability.SpellAbility; import forge.game.phase.CombatUtil; import forge.game.player.Player; +import forge.util.closures.Lambda1; import forge.util.closures.Predicate; import forge.util.closures.PredicateString; @@ -104,13 +105,30 @@ public final class CardPredicates { } }; } + + public static final Predicate possibleAttackers = new Predicate() { + @Override + public boolean isTrue(final Card c) { + return (c.isCreature() && CombatUtil.canAttack(c)); + } + }; + + public static Predicate isProtectedFrom(final Card source) { + return new Predicate() { + @Override + public boolean isTrue(final Card c) { + return !c.hasProtectionFrom(source); + } + }; + } + public static class Presets { /** * a Predicate to get all cards that are tapped. */ - public static Predicate TAPPED = new Predicate() { + public static final Predicate TAPPED = new Predicate() { @Override public boolean isTrue(Card c) { return c.isTapped(); @@ -119,7 +137,7 @@ public final class CardPredicates { /** * a Predicate to get all cards that are untapped. */ - public static Predicate UNTAPPED = new Predicate() { + public static final Predicate UNTAPPED = new Predicate() { @Override public boolean isTrue(Card c) { return c.isUntapped(); @@ -128,7 +146,7 @@ public final class CardPredicates { /** * a Predicate to get all creatures. */ - public static Predicate CREATURES = new Predicate() { + public static final Predicate CREATURES = new Predicate() { @Override public boolean isTrue(Card c) { return c.isCreature(); @@ -137,7 +155,7 @@ public final class CardPredicates { /** * a Predicate to get all enchantments. */ - public static Predicate ENCHANTMENTS = new Predicate() { + public static final Predicate ENCHANTMENTS = new Predicate() { @Override public boolean isTrue(Card c) { return c.isEnchantment(); @@ -146,7 +164,7 @@ public final class CardPredicates { /** * a Predicate to get all equipment. */ - public static Predicate EQUIPMENT = new Predicate() { + public static final Predicate EQUIPMENT = new Predicate() { @Override public boolean isTrue(Card c) { return c.isEquipment(); @@ -155,7 +173,7 @@ public final class CardPredicates { /** * a Predicate to get all unenchanted cards in a list. */ - public static Predicate UNENCHANTED = new Predicate() { + public static final Predicate UNENCHANTED = new Predicate() { @Override public boolean isTrue(Card c) { return !c.isEnchanted(); @@ -164,7 +182,7 @@ public final class CardPredicates { /** * a Predicate to get all enchanted cards in a list. */ - public static Predicate ENCHANTED = new Predicate() { + public static final Predicate ENCHANTED = new Predicate() { @Override public boolean isTrue(Card c) { return c.isEnchanted(); @@ -173,7 +191,7 @@ public final class CardPredicates { /** * a Predicate to get all nontoken cards. */ - public static Predicate NON_TOKEN = new Predicate() { + public static final Predicate NON_TOKEN = new Predicate() { @Override public boolean isTrue(Card c) { return !c.isToken(); @@ -182,7 +200,7 @@ public final class CardPredicates { /** * a Predicate to get all token cards. */ - public static Predicate TOKEN = new Predicate() { + public static final Predicate TOKEN = new Predicate() { @Override public boolean isTrue(Card c) { return c.isToken(); @@ -191,7 +209,7 @@ public final class CardPredicates { /** * a Predicate to get all nonbasic lands. */ - public static Predicate NON_BASIC_LAND = new Predicate() { + public static final Predicate NON_BASIC_LAND = new Predicate() { @Override public boolean isTrue(Card c) { return !c.isBasicLand(); @@ -200,7 +218,7 @@ public final class CardPredicates { /** * a Predicate to get all basicLands. */ - public static Predicate BASIC_LANDS = new Predicate() { + public static final Predicate BASIC_LANDS = new Predicate() { @Override public boolean isTrue(Card c) { // the isBasicLand() check here may be sufficient... @@ -210,7 +228,7 @@ public final class CardPredicates { /** * a Predicate to get all artifacts. */ - public static Predicate ARTIFACTS = new Predicate() { + public static final Predicate ARTIFACTS = new Predicate() { @Override public boolean isTrue(Card c) { return c.isArtifact(); @@ -219,7 +237,7 @@ public final class CardPredicates { /** * a Predicate to get all nonartifacts. */ - public static Predicate NON_ARTIFACTS = new Predicate() { + public static final Predicate NON_ARTIFACTS = new Predicate() { @Override public boolean isTrue(Card c) { return !c.isArtifact(); @@ -228,7 +246,7 @@ public final class CardPredicates { /** * a Predicate to get all lands. */ - public static Predicate LANDS = new Predicate() { + public static final Predicate LANDS = new Predicate() { @Override public boolean isTrue(Card c) { return c.isLand(); @@ -237,7 +255,7 @@ public final class CardPredicates { /** * a Predicate to get all nonlands. */ - public static Predicate NON_LANDS = new Predicate() { + public static final Predicate NON_LANDS = new Predicate() { @Override public boolean isTrue(Card c) { return !c.isLand(); @@ -246,7 +264,7 @@ public final class CardPredicates { /** * a Predicate to get all cards that are black. */ - public static Predicate BLACK = new Predicate() { + public static final Predicate BLACK = new Predicate() { @Override public boolean isTrue(Card c) { return c.isBlack(); @@ -255,7 +273,7 @@ public final class CardPredicates { /** * a Predicate to get all cards that are blue. */ - public static Predicate BLUE = new Predicate() { + public static final Predicate BLUE = new Predicate() { @Override public boolean isTrue(Card c) { return c.isBlue(); @@ -264,7 +282,7 @@ public final class CardPredicates { /** * a Predicate to get all cards that are green. */ - public static Predicate GREEN = new Predicate() { + public static final Predicate GREEN = new Predicate() { @Override public boolean isTrue(Card c) { return c.isGreen(); @@ -273,7 +291,7 @@ public final class CardPredicates { /** * a Predicate to get all cards that are red. */ - public static Predicate RED = new Predicate() { + public static final Predicate RED = new Predicate() { @Override public boolean isTrue(Card c) { return c.isRed(); @@ -282,13 +300,51 @@ public final class CardPredicates { /** * a Predicate to get all cards that are white. */ - public static Predicate WHITE = new Predicate() { + public static final Predicate WHITE = new Predicate() { @Override public boolean isTrue(Card c) { return c.isWhite(); } }; - } + public static final Predicate hasFirstStrike = new Predicate() { + @Override + public boolean isTrue(Card c) { + return c.isCreature() && (c.hasFirstStrike() || c.hasDoubleStrike()); + } + }; + public static final Predicate hasSecondStrike = new Predicate() { + @Override + public boolean isTrue(Card c) { + return c.isCreature() && (!c.hasFirstStrike() || c.hasDoubleStrike()); + } + }; + public static final Predicate All = Predicate.getTrue(Card.class); + + + } + + public static class Accessors { + public static final Lambda1 fnGetDefense = new Lambda1() { + @Override + public Integer apply(Card a) { + return a.getNetDefense(); + } + }; + + public static final Lambda1 fnGetAttack = new Lambda1() { + @Override + public Integer apply(Card a) { + return a.getNetCombatDamage(); + } + }; + + public static final Lambda1 fnGetCmc = new Lambda1() { + @Override + public Integer apply(Card a) { + return a.getCMC(); + } + }; + } } diff --git a/src/main/java/forge/CardUtil.java b/src/main/java/forge/CardUtil.java index 584a06061b5..d6b048d5957 100644 --- a/src/main/java/forge/CardUtil.java +++ b/src/main/java/forge/CardUtil.java @@ -19,7 +19,6 @@ package forge; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -134,7 +133,7 @@ public final class CardUtil { * @return a {@link java.util.ArrayList} object. */ public static List getColors(final Card c) { - return Arrays.asList(c.determineColor().toStringArray()); + return c.determineColor().toStringList(); } /** @@ -807,7 +806,7 @@ public final class CardUtil { final CardList res = new CardList(); for (final CardColor col : origin.getColor()) { - for (final String strCol : col.toStringArray()) { + for (final String strCol : col.toStringList()) { if (strCol.equalsIgnoreCase("Colorless")) { continue; } @@ -838,7 +837,7 @@ public final class CardUtil { usableColors.add("colorless"); } for (final CardColor col : cardToConvoke.getColor()) { - for (final String strCol : col.toStringArray()) { + for (final String strCol : col.toStringList()) { if (strCol.equals("colorless")) { continue; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java index e5e28fa0cd1..e3bdd623958 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java @@ -329,7 +329,8 @@ public class AbilityFactoryPump { || ph.getPhase().isBefore(PhaseType.MAIN1)) { return false; } - CardList attackers = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield).getPossibleAttackers(); + + CardList attackers = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield).filter(CardPredicates.possibleAttackers); if(!CombatUtil.canBlockAtLeastOne(card, attackers)) { return false; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java index d75cfa8b73f..989f7c87e69 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java @@ -19,6 +19,7 @@ package forge.card.abilityfactory; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Random; @@ -1402,8 +1403,7 @@ public class AbilityFactoryZoneAffecting { } } - CardListUtil.sortByTextLen(dPChHand); - dChoices.add(dPChHand.get(0)); + Collections.sort(dPChHand, CardListUtil.TextLenReverseComparator); CardListUtil.sortCMC(dPChHand); dChoices.add(dPChHand.get(0)); diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index b0592deeb06..aa500e481f9 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -33,6 +33,7 @@ import forge.Card; import forge.CardCharacteristicName; import forge.CardList; import forge.CardListUtil; +import forge.CardPredicates; import forge.CardPredicates.Presets; import forge.CardUtil; import forge.Command; @@ -2477,7 +2478,7 @@ public class CardFactoryUtil { list.add(AllZoneUtil.getCardState((Card) o)); } } - return CardListUtil.sumAttack(list); + return CardPredicates.Presets.hasSecondStrike.sum(list, CardPredicates.Accessors.fnGetAttack); } if (l[0].contains("RememberedSize")) { @@ -2567,7 +2568,7 @@ public class CardFactoryUtil { final String[] colors = { "green", "white", "red", "blue", "black" }; for (final String color : colors) { - if (someCards.getColor(color).size() > 0) { + if (!CardListUtil.getColor(someCards, color).isEmpty()) { n++; } } @@ -3033,16 +3034,7 @@ public class CardFactoryUtil { // "Clerics you control" - Count$TypeYouCtrl.Cleric if (sq[0].contains("Type")) { - someCards = someCards.filter(new Predicate() { - @Override - public boolean isTrue(final Card c) { - if (c.isType(sq[1])) { - return true; - } - - return false; - } - }); + someCards = someCards.filter(CardPredicates.isType(sq[1])); } // "Named in all graveyards" - Count$NamedAllYards. @@ -3051,17 +3043,7 @@ public class CardFactoryUtil { if (sq[1].equals("CARDNAME")) { sq[1] = c.getName(); } - - someCards = someCards.filter(new Predicate() { - @Override - public boolean isTrue(final Card c) { - if (c.getName().equals(sq[1])) { - return true; - } - - return false; - } - }); + someCards = someCards.filter(CardPredicates.nameEquals(sq[1])); } // Refined qualities diff --git a/src/main/java/forge/game/player/ComputerUtil.java b/src/main/java/forge/game/player/ComputerUtil.java index 8f069d2a397..dd3b655fb72 100644 --- a/src/main/java/forge/game/player/ComputerUtil.java +++ b/src/main/java/forge/game/player/ComputerUtil.java @@ -27,14 +27,12 @@ import forge.AllZoneUtil; import forge.Card; import forge.CardList; import forge.CardListUtil; -import forge.Constant; -import forge.Counters; +import forge.CardPredicates; import forge.CardPredicates.Presets; import forge.CardUtil; import forge.GameActionUtil; import forge.Singletons; import forge.card.abilityfactory.AbilityFactory; -import forge.card.abilityfactory.AbilityFactoryMana; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.Cost; import forge.card.cost.CostMana; @@ -1329,14 +1327,15 @@ public class ComputerUtil { // don't play the land if it has cycling and enough lands are // available final ArrayList spellAbilities = c.getSpellAbilities(); + + final CardList hand = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand); + CardList lands = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); + lands.addAll(hand); + lands = lands.getType("Land"); + int maxCmcInHand = Predicate.getTrue(Card.class).max(hand, CardPredicates.Accessors.fnGetCmc); for (final SpellAbility sa : spellAbilities) { if (sa.isCycling()) { - final CardList hand = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand); - CardList lands = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield); - lands.addAll(hand); - lands = lands.getType("Land"); - - if (lands.size() >= Math.max(hand.getHighestConvertedManaCost(), 6)) { + if (lands.size() >= Math.max(maxCmcInHand, 6)) { return false; } } @@ -2208,7 +2207,7 @@ public class ComputerUtil { final CardList landsInPlay = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield).getType("Land"); final CardList landsInHand = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand).getType("Land"); final CardList nonLandsInHand = AllZone.getComputerPlayer().getCardsIn(ZoneType.Hand).getNotType("Land"); - final int highestCMC = Math.max(6, nonLandsInHand.getHighestConvertedManaCost()); + final int highestCMC = Math.max(6, Predicate.getTrue(Card.class).max(nonLandsInHand, CardPredicates.Accessors.fnGetCmc)); final int discardCMC = discard.getCMC(); if (discard.isLand()) { if (landsInPlay.size() >= highestCMC diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 849a9278d54..051156b9ce7 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -1396,7 +1396,7 @@ public abstract class Player extends GameEntity implements Comparable { return result; } - public final CardList getCardsIn(final ZoneType[] zones) { + public final CardList getCardsIn(final ZoneType... zones) { final CardList result = new CardList(); for (final ZoneType z : zones) { if (this.getZone(z) != null) { diff --git a/src/main/java/forge/util/closures/Predicate.java b/src/main/java/forge/util/closures/Predicate.java index 42059de8efa..b4631a5105b 100644 --- a/src/main/java/forge/util/closures/Predicate.java +++ b/src/main/java/forge/util/closures/Predicate.java @@ -482,8 +482,23 @@ public abstract class Predicate { return result; } + // Returns the value matching predicate conditions with the maximum value of whatever valueAccessor returns. + public final Integer max(final Iterable source, final Lambda1 valueAccessor) { + if (source == null) { return null; } + int max = Integer.MIN_VALUE; + for (final T c : source) { + if (!this.isTrue(c)) { continue; } + + int value = valueAccessor.apply(c); + if ( value > max ) { + max = value; + } + } + return max; + } + // Returns the element matching predicate conditions with the maximum value of whatever valueAccessor returns. - public final T max(final Iterable source, final Lambda1 valueAccessor) { + public final T maxItem(final Iterable source, final Lambda1 valueAccessor) { if (source == null) { return null; } T result = null;