diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index af21fda80da..79d933dd5e8 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -2602,24 +2602,6 @@ public class Card extends GameEntity implements Comparable { return sickness && isCreature(); } - /** - *

Setter for the field rarity.

- * - * @param s a {@link java.lang.String} object. - */ - public void setRarity(String s) { - rarity = s; - } - - /** - *

Getter for the field rarity.

- * - * @return a {@link java.lang.String} object. - */ - public String getRarity() { - return rarity; - } - /** *

Setter for the field imageName.

* diff --git a/src/main/java/forge/card/CardDb.java b/src/main/java/forge/card/CardDb.java index ad290676d10..01dcec510b5 100644 --- a/src/main/java/forge/card/CardDb.java +++ b/src/main/java/forge/card/CardDb.java @@ -8,6 +8,8 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Map.Entry; +import net.slightlymagic.braids.util.lambda.Lambda1; + import org.apache.commons.lang3.StringUtils; import forge.Card; @@ -48,6 +50,10 @@ public final class CardDb { // this is the same list in flat storage private final List allCardsFlat = new ArrayList(); + // Lambda to get rules for selects from list of printed cards + public static final Lambda1 fnGetCardPrintedByForgeCard = new Lambda1() { + @Override public CardPrinted apply(final Card from) { return CardDb.instance().getCard(from.getName()); } + }; private CardDb() { this(new MtgDataParser()); // I wish cardname.txt parser was be here. diff --git a/src/main/java/forge/card/CardPrinted.java b/src/main/java/forge/card/CardPrinted.java index a4a10417f8c..a403316867a 100644 --- a/src/main/java/forge/card/CardPrinted.java +++ b/src/main/java/forge/card/CardPrinted.java @@ -130,6 +130,9 @@ public final class CardPrinted implements Comparable { } public static Predicate printedInSets(final List value, final boolean shouldContain) { + if (value == null || value.isEmpty()) { + return Predicate.getTrue(CardPrinted.class); + } return new PredicateSets(value, shouldContain); } diff --git a/src/main/java/forge/card/cardFactory/CardFactory_Creatures.java b/src/main/java/forge/card/cardFactory/CardFactory_Creatures.java index b21ecf03663..c890bdba80a 100644 --- a/src/main/java/forge/card/cardFactory/CardFactory_Creatures.java +++ b/src/main/java/forge/card/cardFactory/CardFactory_Creatures.java @@ -3,6 +3,8 @@ package forge.card.cardFactory; import com.esotericsoftware.minlog.Log; import forge.*; +import forge.card.CardDb; +import forge.card.CardPrinted; import forge.card.abilityFactory.AbilityFactory; import forge.card.cost.Cost; import forge.card.spellability.*; @@ -13,7 +15,11 @@ import forge.gui.input.Input; import forge.gui.input.Input_PayManaCost; import javax.swing.*; + +import net.slightlymagic.maxmtg.Predicate; + import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Stack; @@ -1840,22 +1846,17 @@ public class CardFactory_Creatures { list.addAll(AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer())); list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer())); list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { + public boolean addCard(final Card c) { return !c.isLand() && !c.isUnCastable(); } }); if (list.size() > 0) { - CardList rare; - rare = list; - rare = rare.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getRarity().equals("Rare"); - } - }); + Predicate isRare = CardPrinted.Predicates.Presets.isRareOrMythic; + List rares = isRare.select(list, CardDb.fnGetCardPrintedByForgeCard, CardDb.fnGetCardPrintedByForgeCard); - if (rare.size() > 0) { - s = rare.get(CardUtil.getRandomIndex(rare)).getName(); + if (!rares.isEmpty()) { + s = Predicate.getTrue(CardPrinted.class).random(rares).getName(); } else { Card c = list.get(CardUtil.getRandomIndex(list)); //System.out.println(c + " - " + c.getRarity()); diff --git a/src/main/java/net/slightlymagic/maxmtg/Predicate.java b/src/main/java/net/slightlymagic/maxmtg/Predicate.java index 793e696fe35..82f7060bb44 100644 --- a/src/main/java/net/slightlymagic/maxmtg/Predicate.java +++ b/src/main/java/net/slightlymagic/maxmtg/Predicate.java @@ -43,35 +43,35 @@ public abstract class Predicate { // selects are fun public final List select(final Iterable source) { ArrayList result = new ArrayList(); - if (source != null) for (T c : source) { if (isTrue(c)) { result.add(c); } } + if (source != null) { for (T c : source) { if (isTrue(c)) { result.add(c); } } } return result; } public final List select(final Iterable source, final Lambda1 accessor) { ArrayList result = new ArrayList(); - if (source != null) for (U c : source) { if (isTrue(accessor.apply(c))) { result.add(c); } } + if (source != null) { for (U c : source) { if (isTrue(accessor.apply(c))) { result.add(c); } } } return result; } public final List select(final Iterable source, final Lambda1 cardAccessor, final Lambda1 transformer) { ArrayList result = new ArrayList(); - if (source != null) for (U c : source) { if (isTrue(cardAccessor.apply(c))) { result.add(transformer.apply(c)); } } + if (source != null) { for (U c : source) { if (isTrue(cardAccessor.apply(c))) { result.add(transformer.apply(c)); } } } return result; } // select top 1 public final T first(final Iterable source) { - if (source != null) for (T c : source) { if (isTrue(c)) { return c; } } + if (source != null) { for (T c : source) { if (isTrue(c)) { return c; } } } return null; } public final U first(final Iterable source, final Lambda1 accessor) { - if (source != null) for (U c : source) { if (isTrue(accessor.apply(c))) { return c; } } + if (source != null) { for (U c : source) { if (isTrue(accessor.apply(c))) { return c; } } } return null; } public final V first(final Iterable source, final Lambda1 cardAccessor, final Lambda1 transformer) { - if (source != null) for (U c : source) { if (isTrue(cardAccessor.apply(c))) { return transformer.apply(c); } } + if (source != null) { for (U c : source) { if (isTrue(cardAccessor.apply(c))) { return transformer.apply(c); } } } return null; } @@ -79,43 +79,46 @@ public abstract class Predicate { public final void split(final Iterable source, final List trueList, final List falseList) { - if (source != null) for (T c : source) { if (isTrue(c)) { trueList.add(c); } else { falseList.add(c); } } + if (source == null) { return; } + for (T c : source) { if (isTrue(c)) { trueList.add(c); } else { falseList.add(c); } } } public final void split(final Iterable source, final Lambda1 accessor, final List trueList, final List falseList) { - if (source != null) for (U c : source) { if (isTrue(accessor.apply(c))) { trueList.add(c); } else { falseList.add(c); } } + if (source == null) { return; } + for (U c : source) { if (isTrue(accessor.apply(c))) { trueList.add(c); } else { falseList.add(c); } } } public final void split(final Iterable source, final Lambda1 cardAccessor, final Lambda1 transformer, final List trueList, final List falseList) { - if (source != null) for (U c : source) { + if (source == null) { return; } + for (U c : source) { if (isTrue(cardAccessor.apply(c))) { trueList.add(transformer.apply(c)); } else { falseList.add(transformer.apply(c)); } } } - + // Count public final int count(final Iterable source) { int result = 0; - if (source != null) for (T c : source) { if (isTrue(c)) { result++; } } + if (source != null) { for (T c : source) { if (isTrue(c)) { result++; } } } return result; } public final int count(final Iterable source, final Lambda1 accessor) { int result = 0; - if (source != null) for (U c : source) { if (isTrue(accessor.apply(c))) { result++; } } + if (source != null) { for (U c : source) { if (isTrue(accessor.apply(c))) { result++; } } } return result; } - + // Aggregates? public final int aggregate(final Iterable source, final Lambda1 accessor, final Lambda1 valueAccessor) { int result = 0; - if (source != null) for (U c : source) { if (isTrue(accessor.apply(c))) { result += valueAccessor.apply(c); } } + if (source != null) { for (U c : source) { if (isTrue(accessor.apply(c))) { result += valueAccessor.apply(c); } } } return result; } - + // Random - algorithm adapted from Braid's GeneratorFunctions public final T random(final Iterable source) { int n = 0;