checkstyle

This commit is contained in:
jendave
2011-10-26 08:44:16 +00:00
parent 21cdab9414
commit 7836c89dbe
8 changed files with 692 additions and 223 deletions

View File

@@ -4,57 +4,96 @@ import java.util.List;
import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.braids.util.lambda.Lambda1;
import net.slightlymagic.maxmtg.Predicate; import net.slightlymagic.maxmtg.Predicate;
import forge.SetUtils; import forge.SetUtils;
import forge.card.BoosterGenerator; import forge.card.BoosterGenerator;
import forge.card.CardRules; import forge.card.CardRules;
import forge.card.CardSet; import forge.card.CardSet;
/** /**
* TODO: Write javadoc for this type. * TODO Write javadoc for this type.
* *
*/ */
public class BoosterPack implements InventoryItemFromSet { public class BoosterPack implements InventoryItemFromSet {
public final static Lambda1<BoosterPack, CardSet> fnFromSet = new Lambda1<BoosterPack, CardSet>() { /** The Constant fnFromSet. */
@Override public BoosterPack apply(CardSet arg1) { return new BoosterPack(arg1); } }; public static final Lambda1<BoosterPack, CardSet> fnFromSet = new Lambda1<BoosterPack, CardSet>() {
@Override
public BoosterPack apply(final CardSet arg1) {
return new BoosterPack(arg1);
}
};
private final CardSet cardSet; private final CardSet cardSet;
private final String name; private final String name;
private List<CardPrinted> cards = null; private List<CardPrinted> cards = null;
public BoosterPack(String set) { /**
* Instantiates a new booster pack.
*
* @param set the set
*/
public BoosterPack(final String set) {
this(SetUtils.getSetByCodeOrThrow(set)); this(SetUtils.getSetByCodeOrThrow(set));
} }
public BoosterPack(CardSet set) { /**
* Instantiates a new booster pack.
*
* @param set the set
*/
public BoosterPack(final CardSet set) {
cardSet = set; cardSet = set;
name = cardSet.getName() + " Booster Pack"; name = cardSet.getName() + " Booster Pack";
} }
/* (non-Javadoc)
* @see forge.item.InventoryItemFromSet#getSet()
*/
/**
* @return String
*/
@Override
public final String getSet() {
return cardSet.getCode();
}
@Override public String getSet() { return cardSet.getCode(); } /* (non-Javadoc)
@Override public String getName() { return name; } * @see forge.item.InventoryItemFromSet#getName()
*/
/**
* @return String
*/
@Override
public final String getName() {
return name;
}
@Override public String getImageFilename() { /* (non-Javadoc)
* @see forge.item.InventoryItemFromSet#getImageFilename()
*/
/**
* @return String
*/
@Override
public final String getImageFilename() {
return "booster/" + cardSet.getCode() + ".png"; return "booster/" + cardSet.getCode() + ".png";
} }
private CardPrinted getRandomBasicLand(CardSet set) { private CardPrinted getRandomBasicLand(final CardSet set) {
return Predicate.and(CardPrinted.Predicates.printedInSets(set.getCode()), return Predicate.and(CardPrinted.Predicates.printedInSets(set.getCode()),
CardRules.Predicates.Presets.isBasicLand, CardRules.Predicates.Presets.isBasicLand, CardPrinted.fnGetRules).random(
CardPrinted.fnGetRules).random(CardDb.instance().getAllCards()); CardDb.instance().getAllCards());
} }
private CardPrinted getLandFromNearestSet() private CardPrinted getLandFromNearestSet() {
{
List<CardSet> sets = SetUtils.getAllSets(); List<CardSet> sets = SetUtils.getAllSets();
int iThisSet = sets.indexOf(cardSet); int iThisSet = sets.indexOf(cardSet);
for (int iSet = iThisSet; iSet < sets.size(); iSet++) for (int iSet = iThisSet; iSet < sets.size(); iSet++) {
{
CardPrinted land = getRandomBasicLand(sets.get(iSet)); CardPrinted land = getRandomBasicLand(sets.get(iSet));
if (null != land) return land; if (null != land) {
return land;
}
} }
// if not found (though that's impossible) // if not found (though that's impossible)
return getRandomBasicLand(SetUtils.getSetByCode("M12")); return getRandomBasicLand(SetUtils.getSetByCode("M12"));
@@ -69,42 +108,79 @@ public class BoosterPack implements InventoryItemFromSet {
cards.add(getLandFromNearestSet()); cards.add(getLandFromNearestSet());
} }
} }
public List<CardPrinted> getCards() {
if (null == cards) { generate(); } /**
* Gets the cards.
*
* @return the cards
*/
public final List<CardPrinted> getCards() {
if (null == cards) {
generate();
}
return cards; return cards;
} }
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
/**
* @return int
*/
@Override @Override
public int hashCode() { public final int hashCode() {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ((cardSet == null) ? 0 : cardSet.hashCode()); result = prime * result + ((cardSet == null) ? 0 : cardSet.hashCode());
return result; return result;
} }
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override @Override
public boolean equals(Object obj) { public final boolean equals(final Object obj) {
if (this == obj) if (this == obj) {
return true; return true;
if (obj == null) }
if (obj == null) {
return false; return false;
if (getClass() != obj.getClass()) }
if (getClass() != obj.getClass()) {
return false; return false;
}
BoosterPack other = (BoosterPack) obj; BoosterPack other = (BoosterPack) obj;
if (cardSet == null) { if (cardSet == null) {
if (other.cardSet != null) if (other.cardSet != null) {
return false; return false;
} else if (!cardSet.equals(other.cardSet)) }
} else if (!cardSet.equals(other.cardSet)) {
return false; return false;
}
return true; return true;
} }
@Override public String getType() { return "Booster Pack"; } /* (non-Javadoc)
@Override public Object clone() { * @see forge.item.InventoryItem#getType()
return new BoosterPack(cardSet); // it's ok to share a reference to cardSet which is static anyway */
/**
* @return String
*/
@Override
public final String getType() {
return "Booster Pack";
} }
/* (non-Javadoc)
* @see java.lang.Object#clone()
*/
/**
* @return Object
*/
@Override
public final Object clone() {
return new BoosterPack(cardSet); // it's ok to share a reference to
// cardSet which is static anyway
}
} }

View File

@@ -5,58 +5,81 @@ import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.NoSuchElementException;
import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.braids.util.lambda.Lambda1;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutablePair;
import forge.Card; import forge.Card;
import forge.card.CardInSet; import forge.card.CardInSet;
import forge.card.CardRules; import forge.card.CardRules;
import forge.card.MtgDataParser; import forge.card.MtgDataParser;
/** /**
* <p>CardDb class.</p> * <p>
* CardDb class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id: CardDb.java 9708 2011-08-09 19:34:12Z jendave $ * @version $Id: CardDb.java 9708 2011-08-09 19:34:12Z jendave $
*/ */
public final class CardDb { public final class CardDb {
private static volatile CardDb onlyInstance = null; // 'volatile' keyword makes this working private static volatile CardDb onlyInstance = null; // 'volatile' keyword
// makes this working
/**
* Instance.
*
* @return the card db
*/
public static CardDb instance() { public static CardDb instance() {
if (onlyInstance == null) { if (onlyInstance == null) {
throw new NullPointerException("CardDb has not yet been initialized, run setup() first"); throw new NullPointerException("CardDb has not yet been initialized, run setup() first");
} }
return onlyInstance; return onlyInstance;
} }
/**
* Sets the up.
*
* @param list the new up
*/
public static void setup(final Iterator<CardRules> list) { public static void setup(final Iterator<CardRules> list) {
if (onlyInstance != null) { if (onlyInstance != null) {
throw new RuntimeException("CardDb has already been initialized, don't do it twice please"); throw new RuntimeException("CardDb has already been initialized, don't do it twice please");
} }
synchronized (CardDb.class) { synchronized (CardDb.class) {
if (onlyInstance == null) { // It's broken under 1.4 and below, on 1.5+ works again! if (onlyInstance == null) { // It's broken under 1.4 and below, on
// 1.5+ works again!
onlyInstance = new CardDb(list); onlyInstance = new CardDb(list);
} }
} }
} }
// Here oracle cards // Here oracle cards
//private final Map<String, CardRules> cards = new Hashtable<String, CardRules>(); // private final Map<String, CardRules> cards = new Hashtable<String,
// CardRules>();
// Here are refs, get them by name // Here are refs, get them by name
private final Map<String, CardPrinted> uniqueCards = new Hashtable<String, CardPrinted>(); private final Map<String, CardPrinted> uniqueCards = new Hashtable<String, CardPrinted>();
// need this to obtain cardReference by name+set+artindex // need this to obtain cardReference by name+set+artindex
private final Map<String, Map<String, CardPrinted[]>> allCardsBySet = new Hashtable<String, Map<String, CardPrinted[]>>(); private final Map<String, Map<String, CardPrinted[]>> allCardsBySet =
new Hashtable<String, Map<String, CardPrinted[]>>();
// this is the same list in flat storage // this is the same list in flat storage
private final List<CardPrinted> allCardsFlat = new ArrayList<CardPrinted>(); private final List<CardPrinted> allCardsFlat = new ArrayList<CardPrinted>();
// Lambda to get rules for selects from list of printed cards // Lambda to get rules for selects from list of printed cards
public static final Lambda1<CardPrinted, Card> fnGetCardPrintedByForgeCard = new Lambda1<CardPrinted, Card>() { /** The Constant fnGetCardPrintedByForgeCard. */
@Override public CardPrinted apply(final Card from) { return CardDb.instance().getCard(from.getName()); } public static final Lambda1<CardPrinted, Card> fnGetCardPrintedByForgeCard =
new Lambda1<CardPrinted, Card>() {
@Override
public CardPrinted apply(final Card from) {
return CardDb.instance().getCard(from.getName());
}
}; };
private CardDb() { private CardDb() {
@@ -67,18 +90,26 @@ public final class CardDb {
while (parser.hasNext()) { while (parser.hasNext()) {
addNewCard(parser.next()); addNewCard(parser.next());
} }
// TODO: consider using Collections.unmodifiableList wherever possible // TODO consider using Collections.unmodifiableList wherever possible
} }
/**
* Adds the new card.
*
* @param card the card
*/
public void addNewCard(final CardRules card) { public void addNewCard(final CardRules card) {
if (null == card) { return; } // consider that a success if (null == card) {
return;
} // consider that a success
// System.out.println(card.getName()); // System.out.println(card.getName());
String cardName = card.getName().toLowerCase(); String cardName = card.getName().toLowerCase();
// 1. register among oracle uniques // 1. register among oracle uniques
// cards.put(cardName, card); // cards.put(cardName, card);
// 2. Save refs into two lists: one flat and other keyed with sets & name // 2. Save refs into two lists: one flat and other keyed with sets &
// name
CardPrinted lastAdded = null; CardPrinted lastAdded = null;
for (Entry<String, CardInSet> s : card.getSetsPrinted()) { for (Entry<String, CardInSet> s : card.getSetsPrinted()) {
lastAdded = addToLists(card, cardName, s); lastAdded = addToLists(card, cardName, s);
@@ -86,6 +117,14 @@ public final class CardDb {
uniqueCards.put(cardName, lastAdded); uniqueCards.put(cardName, lastAdded);
} }
/**
* Adds the to lists.
*
* @param card the card
* @param cardName the card name
* @param s the s
* @return the card printed
*/
public CardPrinted addToLists(final CardRules card, final String cardName, final Entry<String, CardInSet> s) { public CardPrinted addToLists(final CardRules card, final String cardName, final Entry<String, CardInSet> s) {
CardPrinted lastAdded = null; CardPrinted lastAdded = null;
String set = s.getKey(); String set = s.getKey();
@@ -101,7 +140,8 @@ public final class CardDb {
CardPrinted[] cardCopies = new CardPrinted[count]; CardPrinted[] cardCopies = new CardPrinted[count];
setMap.put(cardName, cardCopies); setMap.put(cardName, cardCopies);
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
lastAdded = CardPrinted.build(card, set, s.getValue().getRarity(), i, card.isAltState(),card.isDoubleFaced()); lastAdded = CardPrinted.build(card, set, s.getValue().getRarity(), i, card.isAltState(),
card.isDoubleFaced());
allCardsFlat.add(lastAdded); allCardsFlat.add(lastAdded);
cardCopies[i] = lastAdded; cardCopies[i] = lastAdded;
} }
@@ -109,19 +149,29 @@ public final class CardDb {
return lastAdded; return lastAdded;
} }
/**
* Checks if is card supported.
*
* @param cardName the card name
* @return true, if is card supported
*/
public boolean isCardSupported(final String cardName) { public boolean isCardSupported(final String cardName) {
ImmutablePair<String, String> nameWithSet = splitCardName(cardName); ImmutablePair<String, String> nameWithSet = splitCardName(cardName);
if ( nameWithSet.right == null ) { return uniqueCards.containsKey(nameWithSet.left.toLowerCase()); } if (nameWithSet.right == null) {
return uniqueCards.containsKey(nameWithSet.left.toLowerCase());
}
// Set exists? // Set exists?
Map<String, CardPrinted[]> cardsFromset = allCardsBySet.get(nameWithSet.right.toUpperCase()); Map<String, CardPrinted[]> cardsFromset = allCardsBySet.get(nameWithSet.right.toUpperCase());
if (cardsFromset == null) return false; if (cardsFromset == null) {
return false;
}
// Card exists? // Card exists?
CardPrinted[] cardCopies = cardsFromset.get(nameWithSet.left.toLowerCase()); CardPrinted[] cardCopies = cardsFromset.get(nameWithSet.left.toLowerCase());
return cardCopies != null && cardCopies.length > 0; return cardCopies != null && cardCopies.length > 0;
} }
/** /**
* Splits cardname into Name and set whenever deck line reads as name|set * Splits cardname into Name and set whenever deck line reads as name|set.
*/ */
private static ImmutablePair<String, String> splitCardName(final String name) { private static ImmutablePair<String, String> splitCardName(final String name) {
String cardName = name; // .trim() ? String cardName = name; // .trim() ?
@@ -139,17 +189,47 @@ public final class CardDb {
} }
// Single fetch // Single fetch
/**
* Gets the card.
*
* @param name the name
* @return the card
*/
public CardPrinted getCard(final String name) { public CardPrinted getCard(final String name) {
// Sometimes they read from decks things like "CardName|Set" - but we can handle it // Sometimes they read from decks things like "CardName|Set" - but we
// can handle it
ImmutablePair<String, String> nameWithSet = splitCardName(name); ImmutablePair<String, String> nameWithSet = splitCardName(name);
if (nameWithSet.right != null) { return getCard(nameWithSet.left, nameWithSet.right); } if (nameWithSet.right != null) {
return getCard(nameWithSet.left, nameWithSet.right);
}
// OK, plain name here // OK, plain name here
CardPrinted card = uniqueCards.get(nameWithSet.left.toLowerCase()); CardPrinted card = uniqueCards.get(nameWithSet.left.toLowerCase());
if (card != null) { return card; } if (card != null) {
return card;
}
throw new NoSuchElementException(String.format("Card '%s' not found in our database.", name)); throw new NoSuchElementException(String.format("Card '%s' not found in our database.", name));
} }
// Advanced fetch by name+set // Advanced fetch by name+set
public CardPrinted getCard(final String name, final String set) { return getCard(name, set, 0); } /**
* Gets the card.
*
* @param name the name
* @param set the set
* @return the card
*/
public CardPrinted getCard(final String name, final String set) {
return getCard(name, set, 0);
}
/**
* Gets the card.
*
* @param name the name
* @param set the set
* @param artIndex the art index
* @return the card
*/
public CardPrinted getCard(final String name, final String set, final int artIndex) { public CardPrinted getCard(final String name, final String set, final int artIndex) {
// 1. get set // 1. get set
Map<String, CardPrinted[]> cardsFromset = allCardsBySet.get(set.toUpperCase()); Map<String, CardPrinted[]> cardsFromset = allCardsBySet.get(set.toUpperCase());
@@ -164,29 +244,64 @@ public final class CardDb {
throw new NoSuchElementException(err); throw new NoSuchElementException(err);
} }
// 3. Get the proper copy // 3. Get the proper copy
if (artIndex >= 0 && artIndex <= cardCopies.length) { return cardCopies[artIndex]; } if (artIndex >= 0 && artIndex <= cardCopies.length) {
return cardCopies[artIndex];
}
String err = String.format("Asked for '%s' from '%s' #%d: db didn't find that copy.", name, set, artIndex); String err = String.format("Asked for '%s' from '%s' #%d: db didn't find that copy.", name, set, artIndex);
throw new NoSuchElementException(err); throw new NoSuchElementException(err);
} }
// Fetch from Forge's Card instance. Well, there should be no errors, but we'll still check // Fetch from Forge's Card instance. Well, there should be no errors, but
// we'll still check
/**
* Gets the card.
*
* @param forgeCard the forge card
* @return the card
*/
public CardPrinted getCard(final Card forgeCard) { public CardPrinted getCard(final Card forgeCard) {
String name = forgeCard.getName(); String name = forgeCard.getName();
String set = forgeCard.getCurSetCode(); String set = forgeCard.getCurSetCode();
if (StringUtils.isNotBlank(set)) { return getCard(name, set); } if (StringUtils.isNotBlank(set)) {
return getCard(name, set);
}
return getCard(name); return getCard(name);
} }
// Multiple fetch // Multiple fetch
/**
* Gets the cards.
*
* @param names the names
* @return the cards
*/
public List<CardPrinted> getCards(final Iterable<String> names) { public List<CardPrinted> getCards(final Iterable<String> names) {
List<CardPrinted> result = new ArrayList<CardPrinted>(); List<CardPrinted> result = new ArrayList<CardPrinted>();
for (String name : names) { result.add(getCard(name)); } for (String name : names) {
result.add(getCard(name));
}
return result; return result;
} }
// returns a list of all cards from their respective latest editions // returns a list of all cards from their respective latest editions
public Iterable<CardPrinted> getAllUniqueCards() { return uniqueCards.values(); } /**
//public Iterable<CardRules> getAllCardRules() { return cards.values(); } // still not needed * Gets the all unique cards.
public Iterable<CardPrinted> getAllCards() { return allCardsFlat; } *
* @return the all unique cards
*/
public Iterable<CardPrinted> getAllUniqueCards() {
return uniqueCards.values();
}
// public Iterable<CardRules> getAllCardRules() { return cards.values(); }
// // still not needed
/**
* Gets the all cards.
*
* @return the all cards
*/
public Iterable<CardPrinted> getAllCards() {
return allCardsFlat;
}
} }

View File

@@ -3,11 +3,12 @@ package forge.item;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.ArrayUtils;
import net.slightlymagic.braids.util.lambda.Lambda1; import net.slightlymagic.braids.util.lambda.Lambda1;
import net.slightlymagic.maxmtg.Predicate; import net.slightlymagic.maxmtg.Predicate;
import net.slightlymagic.maxmtg.PredicateString; import net.slightlymagic.maxmtg.PredicateString;
import org.apache.commons.lang3.ArrayUtils;
import forge.AllZone; import forge.AllZone;
import forge.Card; import forge.Card;
import forge.CardUtil; import forge.CardUtil;
@@ -15,7 +16,9 @@ import forge.card.CardRarity;
import forge.card.CardRules; import forge.card.CardRules;
/** /**
* <p>CardReference class.</p> * <p>
* CardReference class.
* </p>
* *
* @author Forge * @author Forge
* @version $Id: CardReference.java 9708 2011-08-09 19:34:12Z jendave $ * @version $Id: CardReference.java 9708 2011-08-09 19:34:12Z jendave $
@@ -33,35 +36,108 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
private final boolean isDoubleFaced; private final boolean isDoubleFaced;
// Calculated fields are below: // Calculated fields are below:
private final transient CardRarity rarity; // rarity is given in ctor when set is assigned private final transient CardRarity rarity; // rarity is given in ctor when
// set is assigned
// need this to be sure that different cased names won't break the system (and create uniqie cardref entries) // need this to be sure that different cased names won't break the system
// (and create uniqie cardref entries)
private final transient String nameLcase; private final transient String nameLcase;
// image filename is calculated only after someone request it // image filename is calculated only after someone request it
private transient String imageFilename = null; private transient String imageFilename = null;
// field RO accessors // field RO accessors
public String getName() { return name; } /* (non-Javadoc)
public String getSet() { return cardSet; } * @see forge.item.InventoryItemFromSet#getName()
public int getArtIndex() { return artIndex; } */
public boolean isFoil() { return foiled; } /**
public CardRules getCard() { return card; } * @return String
public CardRarity getRarity() { return rarity; } */
public String getName() {
return name;
}
/* (non-Javadoc)
* @see forge.item.InventoryItemFromSet#getSet()
*/
/**
* @return String
*/
public String getSet() {
return cardSet;
}
/**
* Gets the art index.
*
* @return the art index
*/
public int getArtIndex() {
return artIndex;
}
/**
* Checks if is foil.
*
* @return true, if is foil
*/
public boolean isFoil() {
return foiled;
}
/**
* Gets the card.
*
* @return the card
*/
public CardRules getCard() {
return card;
}
/**
* Gets the rarity.
*
* @return the rarity
*/
public CardRarity getRarity() {
return rarity;
}
/* (non-Javadoc)
* @see forge.item.InventoryItemFromSet#getImageFilename()
*/
/**
* @return String
*/
public String getImageFilename() { public String getImageFilename() {
if (imageFilename == null) { imageFilename = CardUtil.buildFilename(this); } if (imageFilename == null) {
imageFilename = CardUtil.buildFilename(this);
}
return imageFilename; return imageFilename;
} }
public String getType() { return card.getType().toString(); }
/* (non-Javadoc)
* @see forge.item.InventoryItem#getType()
*/
/**
* @return String
*/
public String getType() {
return card.getType().toString();
}
// Lambda to get rules for selects from list of printed cards // Lambda to get rules for selects from list of printed cards
/** The Constant fnGetRules. */
public static final Lambda1<CardRules, CardPrinted> fnGetRules = new Lambda1<CardRules, CardPrinted>() { public static final Lambda1<CardRules, CardPrinted> fnGetRules = new Lambda1<CardRules, CardPrinted>() {
@Override public CardRules apply(final CardPrinted from) { return from.card; } @Override
public CardRules apply(final CardPrinted from) {
return from.card;
}
}; };
// Constructor is private. All non-foiled instances are stored in CardDb // Constructor is private. All non-foiled instances are stored in CardDb
private CardPrinted(final CardRules c, final String set, final CardRarity rare, private CardPrinted(final CardRules c, final String set, final CardRarity rare, final int index,
final int index, final boolean foil, final boolean isAlt, final boolean isDF) final boolean foil, final boolean isAlt, final boolean isDF)
{ {
card = c; card = c;
name = c.getName(); name = c.getName();
@@ -75,37 +151,79 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
} }
/* package visibility */ /* package visibility */
static CardPrinted build(final CardRules c, final String set, final CardRarity rare, final int index, final boolean isAlt, final boolean isDF) { /**
* Builds the.
*
* @param c the c
* @param set the set
* @param rare the rare
* @param index the index
* @param isAlt the is alt
* @param isDF the is df
* @return the card printed
*/
static CardPrinted build(final CardRules c, final String set, final CardRarity rare, final int index,
final boolean isAlt, final boolean isDF)
{
return new CardPrinted(c, set, rare, index, false, isAlt, isDF); return new CardPrinted(c, set, rare, index, false, isAlt, isDF);
} }
/* foiled don't need to stay in CardDb's structures, so u'r free to create */ /* foiled don't need to stay in CardDb's structures, so u'r free to create */
/**
* Make foiled.
*
* @param c the c
* @return the card printed
*/
public static CardPrinted makeFoiled(final CardPrinted c) { public static CardPrinted makeFoiled(final CardPrinted c) {
return new CardPrinted(c.card, c.cardSet, c.rarity, c.artIndex, true, c.isAlternate, c.isDoubleFaced); return new CardPrinted(c.card, c.cardSet, c.rarity, c.artIndex, true, c.isAlternate, c.isDoubleFaced);
} }
// Want this class to be a key for HashTable // Want this class to be a key for HashTable
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override @Override
public boolean equals(final Object obj) { public boolean equals(final Object obj) {
if (this == obj) { return true; } if (this == obj) {
if (obj == null) { return false; } return true;
if (getClass() != obj.getClass()) { return false; } }
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
CardPrinted other = (CardPrinted) obj; CardPrinted other = (CardPrinted) obj;
if (!name.equals(other.name)) { return false; } if (!name.equals(other.name)) {
if (!cardSet.equals(other.cardSet)) { return false; } return false;
if (other.foiled != this.foiled || other.artIndex != this.artIndex) { return false; } }
if (!cardSet.equals(other.cardSet)) {
return false;
}
if (other.foiled != this.foiled || other.artIndex != this.artIndex) {
return false;
}
return true; return true;
} }
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override @Override
public int hashCode() { public int hashCode() {
int code = nameLcase.hashCode() * 11 + cardSet.hashCode() * 59 + artIndex * 2; int code = nameLcase.hashCode() * 11 + cardSet.hashCode() * 59 + artIndex * 2;
if (foiled) { return code + 1; } if (foiled) {
return code + 1;
}
return code; return code;
} }
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override @Override
public String toString() { public String toString() {
return name; return name;
@@ -113,6 +231,11 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
// return String.format("%s|%s", name, cardSet); // return String.format("%s|%s", name, cardSet);
} }
/**
* To forge card.
*
* @return the card
*/
public Card toForgeCard() { public Card toForgeCard() {
Card c = AllZone.getCardFactory().getCard(name, null); Card c = AllZone.getCardFactory().getCard(name, null);
if (c != null) { if (c != null) {
@@ -129,18 +252,33 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
return c; return c;
} }
/* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override @Override
public int compareTo(final CardPrinted o) { public int compareTo(final CardPrinted o) {
int nameCmp = nameLcase.compareTo(o.nameLcase); int nameCmp = nameLcase.compareTo(o.nameLcase);
if (0 != nameCmp) { return nameCmp; } if (0 != nameCmp) {
// TODO: compare sets properly return nameCmp;
}
// TODO compare sets properly
return cardSet.compareTo(o.cardSet); return cardSet.compareTo(o.cardSet);
} }
/**
* Checks if is alternate.
*
* @return true, if is alternate
*/
public boolean isAlternate() { public boolean isAlternate() {
return isAlternate; return isAlternate;
} }
/**
* Checks if is double faced.
*
* @return true, if is double faced
*/
public boolean isDoubleFaced() { public boolean isDoubleFaced() {
return isDoubleFaced; return isDoubleFaced;
} }
@@ -149,29 +287,72 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
* Number of filters based on CardPrinted values. * Number of filters based on CardPrinted values.
*/ */
public abstract static class Predicates { public abstract static class Predicates {
public static Predicate<CardPrinted> rarity(final boolean isEqual, final CardRarity value)
{ /**
* Rarity.
*
* @param isEqual the is equal
* @param value the value
* @return the predicate
*/
public static Predicate<CardPrinted> rarity(final boolean isEqual, final CardRarity value) {
return new PredicateRarity(value, isEqual); return new PredicateRarity(value, isEqual);
} }
public static Predicate<CardPrinted> printedInSets(final List<String> value, final boolean shouldContain)
{ /**
* Printed in sets.
*
* @param value the value
* @param shouldContain the should contain
* @return the predicate
*/
public static Predicate<CardPrinted> printedInSets(final List<String> value, final boolean shouldContain) {
if (value == null || value.isEmpty()) { if (value == null || value.isEmpty()) {
return Predicate.getTrue(CardPrinted.class); return Predicate.getTrue(CardPrinted.class);
} }
return new PredicateSets(value, shouldContain); return new PredicateSets(value, shouldContain);
} }
/**
* Printed in sets.
*
* @param value the value
* @return the predicate
*/
public static Predicate<CardPrinted> printedInSets(final String value) { public static Predicate<CardPrinted> printedInSets(final String value) {
if (value == null || value.isEmpty()) { if (value == null || value.isEmpty()) {
return Predicate.getTrue(CardPrinted.class); return Predicate.getTrue(CardPrinted.class);
} }
return new PredicateSets(Arrays.asList(new String[] {value}), true); return new PredicateSets(Arrays.asList(new String[] {value}), true);
} }
/**
* Name.
*
* @param what the what
* @return the predicate
*/
public static Predicate<CardPrinted> name(final String what) { public static Predicate<CardPrinted> name(final String what) {
return new PredicateName(PredicateString.StringOp.EQUALS, what); return new PredicateName(PredicateString.StringOp.EQUALS, what);
} }
/**
* Name.
*
* @param op the op
* @param what the what
* @return the predicate
*/
public static Predicate<CardPrinted> name(final PredicateString.StringOp op, final String what) { public static Predicate<CardPrinted> name(final PredicateString.StringOp op, final String what) {
return new PredicateName(op, what); return new PredicateName(op, what);
} }
/**
* Names except.
*
* @param what the what
* @return the predicate
*/
public static Predicate<CardPrinted> namesExcept(final List<String> what) { public static Predicate<CardPrinted> namesExcept(final List<String> what) {
return new PredicateNamesExcept(what); return new PredicateNamesExcept(what);
} }
@@ -201,9 +382,12 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
private static class PredicateSets extends Predicate<CardPrinted> { private static class PredicateSets extends Predicate<CardPrinted> {
private final List<String> sets; private final List<String> sets;
private final boolean mustContain; private final boolean mustContain;
@Override public boolean isTrue(final CardPrinted card) {
@Override
public boolean isTrue(final CardPrinted card) {
return sets.contains(card.cardSet) == mustContain; return sets.contains(card.cardSet) == mustContain;
} }
public PredicateSets(final List<String> wantSets, final boolean shouldContain) { public PredicateSets(final List<String> wantSets, final boolean shouldContain) {
sets = wantSets; // maybe should make a copy here? sets = wantSets; // maybe should make a copy here?
mustContain = shouldContain; mustContain = shouldContain;
@@ -218,8 +402,7 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
return op(card.getName(), operand); return op(card.getName(), operand);
} }
public PredicateName(final PredicateString.StringOp operator, final String operand) public PredicateName(final PredicateString.StringOp operator, final String operand) {
{
super(operator); super(operator);
this.operand = operand; this.operand = operand;
} }
@@ -232,32 +415,51 @@ public final class CardPrinted implements Comparable<CardPrinted>, InventoryItem
public boolean isTrue(final CardPrinted card) { public boolean isTrue(final CardPrinted card) {
String cardName = card.getName(); String cardName = card.getName();
for (int i = 0; i < operand.length; i++) { for (int i = 0; i < operand.length; i++) {
if ( op(cardName, operand[i]) ) return false; if (op(cardName, operand[i])) {
return false;
}
} }
return true; return true;
} }
public PredicateNamesExcept(final List<String> operand) public PredicateNamesExcept(final List<String> operand) {
{
super(StringOp.EQUALS); super(StringOp.EQUALS);
this.operand = operand.toArray(ArrayUtils.EMPTY_STRING_ARRAY); this.operand = operand.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
} }
} }
/** /**
* Pre-built predicates are stored here to allow their re-usage and easier access from code. * Pre-built predicates are stored here to allow their re-usage and
* easier access from code.
*/ */
public abstract static class Presets { public abstract static class Presets {
// Think twice before using these, since rarity is a prop of printed card. // Think twice before using these, since rarity is a prop of printed
// card.
/** The Constant isCommon. */
public static final Predicate<CardPrinted> isCommon = rarity(true, CardRarity.Common); public static final Predicate<CardPrinted> isCommon = rarity(true, CardRarity.Common);
/** The Constant isUncommon. */
public static final Predicate<CardPrinted> isUncommon = rarity(true, CardRarity.Uncommon); public static final Predicate<CardPrinted> isUncommon = rarity(true, CardRarity.Uncommon);
/** The Constant isRare. */
public static final Predicate<CardPrinted> isRare = rarity(true, CardRarity.Rare); public static final Predicate<CardPrinted> isRare = rarity(true, CardRarity.Rare);
/** The Constant isMythicRare. */
public static final Predicate<CardPrinted> isMythicRare = rarity(true, CardRarity.MythicRare); public static final Predicate<CardPrinted> isMythicRare = rarity(true, CardRarity.MythicRare);
/** The Constant isRareOrMythic. */
public static final Predicate<CardPrinted> isRareOrMythic = Predicate.or(isRare, isMythicRare); public static final Predicate<CardPrinted> isRareOrMythic = Predicate.or(isRare, isMythicRare);
/** The Constant isSpecial. */
public static final Predicate<CardPrinted> isSpecial = rarity(true, CardRarity.Special); public static final Predicate<CardPrinted> isSpecial = rarity(true, CardRarity.Special);
/** The Constant exceptLands. */
public static final Predicate<CardPrinted> exceptLands = rarity(false, CardRarity.BasicLand); public static final Predicate<CardPrinted> exceptLands = rarity(false, CardRarity.BasicLand);
/** The Constant isTrue. */
public static final Predicate<CardPrinted> isTrue = Predicate.getTrue(CardPrinted.class); public static final Predicate<CardPrinted> isTrue = Predicate.getTrue(CardPrinted.class);
/** The Constant nonAlternate. */
public static final Predicate<CardPrinted> nonAlternate = new PredicateNotAlternate(); public static final Predicate<CardPrinted> nonAlternate = new PredicateNotAlternate();
} }
} }

View File

@@ -1,34 +1,46 @@
package forge.item; package forge.item;
/** /**
* TODO: Write javadoc for this type. *
* *
*/ */
public class CardPrintedCharacteristics { public class CardPrintedCharacteristics {
private String name; private String name;
private String cardSet; private String cardSet;
/** /**
* Gets the name.
*
* @return the name * @return the name
*/ */
public String getName() { public final String getName() {
return name; return name;
} }
/** /**
* Sets the name.
*
* @param name0 the name to set * @param name0 the name to set
*/ */
public void setName(String name0) { public final void setName(final String name0) {
this.name = name0; // TODO: Add 0 to parameter's name. this.name = name0; // TODO Add 0 to parameter's name.
} }
/** /**
* Gets the card set.
*
* @return the cardSet * @return the cardSet
*/ */
public String getCardSet() { public final String getCardSet() {
return cardSet; return cardSet;
} }
/** /**
* Sets the card set.
*
* @param cardSet0 the cardSet to set * @param cardSet0 the cardSet to set
*/ */
public void setCardSet(String cardSet0) { public final void setCardSet(final String cardSet0) {
this.cardSet = cardSet0; // TODO: Add 0 to parameter's name. this.cardSet = cardSet0; // TODO: Add 0 to parameter's name.
} }
} }

View File

@@ -1,14 +1,29 @@
package forge.item; package forge.item;
/** /**
* Interface to define a player's inventory may hold. * Interface to define a player's inventory may hold. Should include
* Should include CardPrinted, Booster, Pets, Plants... etc * CardPrinted, Booster, Pets, Plants... etc
*/ */
public interface InventoryItem /* extends Comparable */{ public interface InventoryItem /* extends Comparable */{
/** An inventory item has to provide a name. */
/**
* An inventory item has to provide a name.
*
* @return the name
*/
String getName(); String getName();
/** An inventory item has to provide a picture. */
/**
* An inventory item has to provide a picture.
*
* @return the image filename
*/
String getImageFilename(); String getImageFilename();
/** Return type as a string */
/**
* Return type as a string.
*
* @return the type
*/
String getType(); String getType();
} }

View File

@@ -1,14 +1,29 @@
package forge.item; package forge.item;
/** /**
* Interface to define a player's inventory may hold. * Interface to define a player's inventory may hold. Should include
* Should include CardPrinted, Booster, Pets, Plants... etc * CardPrinted, Booster, Pets, Plants... etc
*/ */
public interface InventoryItemFromSet extends InventoryItem { public interface InventoryItemFromSet extends InventoryItem {
/** An inventory item has to provide a name. */
/**
* An inventory item has to provide a name.
*
* @return the name
*/
String getName(); String getName();
/** An inventory item has to provide a picture. */
/**
* An inventory item has to provide a picture.
*
* @return the image filename
*/
String getImageFilename(); String getImageFilename();
/** An item belonging to a set should return its set as well*/
/**
* An item belonging to a set should return its set as well.
*
* @return the sets the
*/
String getSet(); String getSet();
} }

View File

@@ -7,120 +7,136 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import net.slightlymagic.braids.util.lambda.Lambda1;
import forge.CardList; import forge.CardList;
import forge.card.CardRules; import forge.card.CardRules;
import net.slightlymagic.braids.util.lambda.Lambda1;
/** /**
* <p>CardPoolView class.</p> * <p>
* CardPoolView class.
* </p>
* *
* @param <T> an InventoryItem
* @author Forge * @author Forge
* @version $Id: CardPoolView.java 9708 2011-08-09 19:34:12Z jendave $ * @version $Id: CardPoolView.java 9708 2011-08-09 19:34:12Z jendave $
* @param <T> an InventoryItem
*/ */
public class ItemPoolView<T extends InventoryItem> implements Iterable<Entry<T, Integer>> { public class ItemPoolView<T extends InventoryItem> implements Iterable<Entry<T, Integer>> {
// Field Accessors for select/aggregate operations with filters. // Field Accessors for select/aggregate operations with filters.
/** /** The fn to card. */
* public final Lambda1<CardRules, Entry<T, Integer>> fnToCard = new Lambda1<CardRules, Entry<T, Integer>>() {
*/ @Override
public final Lambda1<CardRules, Entry<T, Integer>> fnToCard = public CardRules apply(final Entry<T, Integer> from) {
new Lambda1<CardRules, Entry<T, Integer>>() {
@Override public CardRules apply(final Entry<T, Integer> from) {
T item = from.getKey(); T item = from.getKey();
return item instanceof CardPrinted ? ((CardPrinted) item).getCard() : null; return item instanceof CardPrinted ? ((CardPrinted) item).getCard() : null;
} }
}; };
/** /** The fn to printed. */
* public final Lambda1<T, Entry<T, Integer>> fnToPrinted = new Lambda1<T, Entry<T, Integer>>() {
*/ @Override
public final Lambda1<T, Entry<T, Integer>> fnToPrinted = public T apply(final Entry<T, Integer> from) {
new Lambda1<T, Entry<T, Integer>>() { return from.getKey();
@Override public T apply(final Entry<T, Integer> from) { return from.getKey(); } }
}; };
/** /** The fn to card name. */
* public final Lambda1<String, Entry<T, Integer>> fnToCardName = new Lambda1<String, Entry<T, Integer>>() {
*/ @Override
public final Lambda1<String, Entry<T, Integer>> fnToCardName = public String apply(final Entry<T, Integer> from) {
new Lambda1<String, Entry<T, Integer>>() { return from.getKey().getName();
@Override public String apply(final Entry<T, Integer> from) { return from.getKey().getName(); } }
}; };
/** /** The fn to count. */
* public final Lambda1<Integer, Entry<T, Integer>> fnToCount = new Lambda1<Integer, Entry<T, Integer>>() {
*/ @Override
public final Lambda1<Integer, Entry<T, Integer>> fnToCount = public Integer apply(final Entry<T, Integer> from) {
new Lambda1<Integer, Entry<T, Integer>>() { return from.getValue();
@Override public Integer apply(final Entry<T, Integer> from) { return from.getValue(); } }
}; };
// Constructors // Constructors
/** /**
* *
* ItemPoolView. * ItemPoolView.
* @param cls a Class<T> *
* @param cls
* a Class<T>
*/ */
public ItemPoolView(final Class<T> cls) { cards = new Hashtable<T, Integer>(); myClass = cls; } public ItemPoolView(final Class<T> cls) {
cards = new Hashtable<T, Integer>();
myClass = cls;
}
/** /**
* *
* ItemPoolView. * ItemPoolView.
* @param inMap a Map<T, Integer> *
* @param cls a Class<T> * @param inMap
* a Map<T, Integer>
* @param cls
* a Class<T>
*/ */
public ItemPoolView(final Map<T, Integer> inMap, final Class<T> cls) { cards = inMap; myClass = cls; } public ItemPoolView(final Map<T, Integer> inMap, final Class<T> cls) {
cards = inMap;
myClass = cls;
}
// Data members // Data members
/** /** The cards. */
*
*/
protected Map<T, Integer> cards; protected Map<T, Integer> cards;
/**
*
*/
protected final Class<T> myClass; // class does not keep this in runtime by itself
// same thing as above, it was copied to provide sorting (needed by table views in deck editors) /** The my class. */
/** protected final Class<T> myClass; // class does not keep this in runtime by
* // itself
*/
// same thing as above, it was copied to provide sorting (needed by table
// views in deck editors)
/** The cards list ordered. */
protected List<Entry<T, Integer>> cardsListOrdered = new ArrayList<Map.Entry<T, Integer>>(); protected List<Entry<T, Integer>> cardsListOrdered = new ArrayList<Map.Entry<T, Integer>>();
/** /** The is list in sync. */
*
*/
protected boolean isListInSync = false; protected boolean isListInSync = false;
/** /**
* iterator. * iterator.
*
* @return Iterator<Entry<T, Integer>> * @return Iterator<Entry<T, Integer>>
*/ */
@Override @Override
public final Iterator<Entry<T, Integer>> iterator() { return cards.entrySet().iterator(); } public final Iterator<Entry<T, Integer>> iterator() {
return cards.entrySet().iterator();
}
// Cards read only operations // Cards read only operations
/** /**
* *
* contains. * contains.
* @param card a T *
* @param card
* a T
* @return boolean * @return boolean
*/ */
public final boolean contains(final T card) { public final boolean contains(final T card) {
if (cards == null) { return false; } if (cards == null) {
return false;
}
return cards.containsKey(card); return cards.containsKey(card);
} }
/** /**
* *
* count. * count.
* @param card a T *
* @param card
* a T
* @return int * @return int
*/ */
public final int count(final T card) { public final int count(final T card) {
if (cards == null) { return 0; } if (cards == null) {
return 0;
}
Integer boxed = cards.get(card); Integer boxed = cards.get(card);
return boxed == null ? 0 : boxed.intValue(); return boxed == null ? 0 : boxed.intValue();
} }
@@ -128,35 +144,49 @@ public class ItemPoolView<T extends InventoryItem> implements Iterable<Entry<T,
/** /**
* *
* countAll. * countAll.
*
* @return int * @return int
*/ */
public final int countAll() { public final int countAll() {
int result = 0; int result = 0;
if (cards != null) { for (Integer n : cards.values()) { result += n; } } if (cards != null) {
for (Integer n : cards.values()) {
result += n;
}
}
return result; return result;
} }
/** /**
* *
* countDistinct. * countDistinct.
*
* @return int * @return int
*/ */
public final int countDistinct() { return cards.size(); } public final int countDistinct() {
return cards.size();
}
/** /**
* *
* isEmpty. * isEmpty.
*
* @return boolean * @return boolean
*/ */
public final boolean isEmpty() { return cards == null || cards.isEmpty(); } public final boolean isEmpty() {
return cards == null || cards.isEmpty();
}
/** /**
* *
* getOrderedList. * getOrderedList.
*
* @return List<Entry<T, Integer>> * @return List<Entry<T, Integer>>
*/ */
public final List<Entry<T, Integer>> getOrderedList() { public final List<Entry<T, Integer>> getOrderedList() {
if (!isListInSync) { rebuildOrderedList(); } if (!isListInSync) {
rebuildOrderedList();
}
return cardsListOrdered; return cardsListOrdered;
} }
@@ -173,12 +203,15 @@ public class ItemPoolView<T extends InventoryItem> implements Iterable<Entry<T,
/** /**
* *
* toFlatList. * toFlatList.
*
* @return List<T> * @return List<T>
*/ */
public final List<T> toFlatList() { public final List<T> toFlatList() {
List<T> result = new ArrayList<T>(); List<T> result = new ArrayList<T>();
for (Entry<T, Integer> e : this) { for (Entry<T, Integer> e : this) {
for (int i = 0; i < e.getValue(); i++) { result.add(e.getKey()); } for (int i = 0; i < e.getValue(); i++) {
result.add(e.getKey());
}
} }
return result; return result;
} }
@@ -186,6 +219,7 @@ public class ItemPoolView<T extends InventoryItem> implements Iterable<Entry<T,
/** /**
* *
* toForgeCardList. * toForgeCardList.
*
* @return CardList * @return CardList
*/ */
public final CardList toForgeCardList() { public final CardList toForgeCardList() {

View File

@@ -1,2 +1,2 @@
/** Forge Card Game */ /** Forge Card Game. */
package forge.item; package forge.item;